unicode_utils 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ 0000c0000041000300xxxxxx0000c1000041000301xxxxxx0000c2000041000302xxxxxx0000c3000041000303xxxxxx0000c4000041000308xxxxxx0000c500004100030axxxxxx0000c7000043000327xxxxxx0000c8000045000300xxxxxx0000c9000045000301xxxxxx0000ca000045000302xxxxxx0000cb000045000308xxxxxx0000cc000049000300xxxxxx0000cd000049000301xxxxxx0000ce000049000302xxxxxx0000cf000049000308xxxxxx0000d100004e000303xxxxxx0000d200004f000300xxxxxx0000d300004f000301xxxxxx0000d400004f000302xxxxxx0000d500004f000303xxxxxx0000d600004f000308xxxxxx0000d9000055000300xxxxxx0000da000055000301xxxxxx0000db000055000302xxxxxx0000dc000055000308xxxxxx0000dd000059000301xxxxxx0000e0000061000300xxxxxx0000e1000061000301xxxxxx0000e2000061000302xxxxxx0000e3000061000303xxxxxx0000e4000061000308xxxxxx0000e500006100030axxxxxx0000e7000063000327xxxxxx0000e8000065000300xxxxxx0000e9000065000301xxxxxx0000ea000065000302xxxxxx0000eb000065000308xxxxxx0000ec000069000300xxxxxx0000ed000069000301xxxxxx0000ee000069000302xxxxxx0000ef000069000308xxxxxx0000f100006e000303xxxxxx0000f200006f000300xxxxxx0000f300006f000301xxxxxx0000f400006f000302xxxxxx0000f500006f000303xxxxxx0000f600006f000308xxxxxx0000f9000075000300xxxxxx0000fa000075000301xxxxxx0000fb000075000302xxxxxx0000fc000075000308xxxxxx0000fd000079000301xxxxxx0000ff000079000308xxxxxx000100000041000304xxxxxx000101000061000304xxxxxx000102000041000306xxxxxx000103000061000306xxxxxx000104000041000328xxxxxx000105000061000328xxxxxx000106000043000301xxxxxx000107000063000301xxxxxx000108000043000302xxxxxx000109000063000302xxxxxx00010a000043000307xxxxxx00010b000063000307xxxxxx00010c00004300030cxxxxxx00010d00006300030cxxxxxx00010e00004400030cxxxxxx00010f00006400030cxxxxxx000112000045000304xxxxxx000113000065000304xxxxxx000114000045000306xxxxxx000115000065000306xxxxxx000116000045000307xxxxxx000117000065000307xxxxxx000118000045000328xxxxxx000119000065000328xxxxxx00011a00004500030cxxxxxx00011b00006500030cxxxxxx00011c000047000302xxxxxx00011d000067000302xxxxxx00011e000047000306xxxxxx00011f000067000306xxxxxx000120000047000307xxxxxx000121000067000307xxxxxx000122000047000327xxxxxx000123000067000327xxxxxx000124000048000302xxxxxx000125000068000302xxxxxx000128000049000303xxxxxx000129000069000303xxxxxx00012a000049000304xxxxxx00012b000069000304xxxxxx00012c000049000306xxxxxx00012d000069000306xxxxxx00012e000049000328xxxxxx00012f000069000328xxxxxx000130000049000307xxxxxx00013400004a000302xxxxxx00013500006a000302xxxxxx00013600004b000327xxxxxx00013700006b000327xxxxxx00013900004c000301xxxxxx00013a00006c000301xxxxxx00013b00004c000327xxxxxx00013c00006c000327xxxxxx00013d00004c00030cxxxxxx00013e00006c00030cxxxxxx00014300004e000301xxxxxx00014400006e000301xxxxxx00014500004e000327xxxxxx00014600006e000327xxxxxx00014700004e00030cxxxxxx00014800006e00030cxxxxxx00014c00004f000304xxxxxx00014d00006f000304xxxxxx00014e00004f000306xxxxxx00014f00006f000306xxxxxx00015000004f00030bxxxxxx00015100006f00030bxxxxxx000154000052000301xxxxxx000155000072000301xxxxxx000156000052000327xxxxxx000157000072000327xxxxxx00015800005200030cxxxxxx00015900007200030cxxxxxx00015a000053000301xxxxxx00015b000073000301xxxxxx00015c000053000302xxxxxx00015d000073000302xxxxxx00015e000053000327xxxxxx00015f000073000327xxxxxx00016000005300030cxxxxxx00016100007300030cxxxxxx000162000054000327xxxxxx000163000074000327xxxxxx00016400005400030cxxxxxx00016500007400030cxxxxxx000168000055000303xxxxxx000169000075000303xxxxxx00016a000055000304xxxxxx00016b000075000304xxxxxx00016c000055000306xxxxxx00016d000075000306xxxxxx00016e00005500030axxxxxx00016f00007500030axxxxxx00017000005500030bxxxxxx00017100007500030bxxxxxx000172000055000328xxxxxx000173000075000328xxxxxx000174000057000302xxxxxx000175000077000302xxxxxx000176000059000302xxxxxx000177000079000302xxxxxx000178000059000308xxxxxx00017900005a000301xxxxxx00017a00007a000301xxxxxx00017b00005a000307xxxxxx00017c00007a000307xxxxxx00017d00005a00030cxxxxxx00017e00007a00030cxxxxxx0001a000004f00031bxxxxxx0001a100006f00031bxxxxxx0001af00005500031bxxxxxx0001b000007500031bxxxxxx0001cd00004100030cxxxxxx0001ce00006100030cxxxxxx0001cf00004900030cxxxxxx0001d000006900030cxxxxxx0001d100004f00030cxxxxxx0001d200006f00030cxxxxxx0001d300005500030cxxxxxx0001d400007500030cxxxxxx0001d50000dc000304xxxxxx0001d60000fc000304xxxxxx0001d70000dc000301xxxxxx0001d80000fc000301xxxxxx0001d90000dc00030cxxxxxx0001da0000fc00030cxxxxxx0001db0000dc000300xxxxxx0001dc0000fc000300xxxxxx0001de0000c4000304xxxxxx0001df0000e4000304xxxxxx0001e0000226000304xxxxxx0001e1000227000304xxxxxx0001e20000c6000304xxxxxx0001e30000e6000304xxxxxx0001e600004700030cxxxxxx0001e700006700030cxxxxxx0001e800004b00030cxxxxxx0001e900006b00030cxxxxxx0001ea00004f000328xxxxxx0001eb00006f000328xxxxxx0001ec0001ea000304xxxxxx0001ed0001eb000304xxxxxx0001ee0001b700030cxxxxxx0001ef00029200030cxxxxxx0001f000006a00030cxxxxxx0001f4000047000301xxxxxx0001f5000067000301xxxxxx0001f800004e000300xxxxxx0001f900006e000300xxxxxx0001fa0000c5000301xxxxxx0001fb0000e5000301xxxxxx0001fc0000c6000301xxxxxx0001fd0000e6000301xxxxxx0001fe0000d8000301xxxxxx0001ff0000f8000301xxxxxx00020000004100030fxxxxxx00020100006100030fxxxxxx000202000041000311xxxxxx000203000061000311xxxxxx00020400004500030fxxxxxx00020500006500030fxxxxxx000206000045000311xxxxxx000207000065000311xxxxxx00020800004900030fxxxxxx00020900006900030fxxxxxx00020a000049000311xxxxxx00020b000069000311xxxxxx00020c00004f00030fxxxxxx00020d00006f00030fxxxxxx00020e00004f000311xxxxxx00020f00006f000311xxxxxx00021000005200030fxxxxxx00021100007200030fxxxxxx000212000052000311xxxxxx000213000072000311xxxxxx00021400005500030fxxxxxx00021500007500030fxxxxxx000216000055000311xxxxxx000217000075000311xxxxxx000218000053000326xxxxxx000219000073000326xxxxxx00021a000054000326xxxxxx00021b000074000326xxxxxx00021e00004800030cxxxxxx00021f00006800030cxxxxxx000226000041000307xxxxxx000227000061000307xxxxxx000228000045000327xxxxxx000229000065000327xxxxxx00022a0000d6000304xxxxxx00022b0000f6000304xxxxxx00022c0000d5000304xxxxxx00022d0000f5000304xxxxxx00022e00004f000307xxxxxx00022f00006f000307xxxxxx00023000022e000304xxxxxx00023100022f000304xxxxxx000232000059000304xxxxxx000233000079000304xxxxxx000340000300xxxxxx000341000301xxxxxx000343000313xxxxxx000344000308000301xxxxxx0003740002b9xxxxxx00037e00003bxxxxxx0003850000a8000301xxxxxx000386000391000301xxxxxx0003870000b7xxxxxx000388000395000301xxxxxx000389000397000301xxxxxx00038a000399000301xxxxxx00038c00039f000301xxxxxx00038e0003a5000301xxxxxx00038f0003a9000301xxxxxx0003900003ca000301xxxxxx0003aa000399000308xxxxxx0003ab0003a5000308xxxxxx0003ac0003b1000301xxxxxx0003ad0003b5000301xxxxxx0003ae0003b7000301xxxxxx0003af0003b9000301xxxxxx0003b00003cb000301xxxxxx0003ca0003b9000308xxxxxx0003cb0003c5000308xxxxxx0003cc0003bf000301xxxxxx0003cd0003c5000301xxxxxx0003ce0003c9000301xxxxxx0003d30003d2000301xxxxxx0003d40003d2000308xxxxxx000400000415000300xxxxxx000401000415000308xxxxxx000403000413000301xxxxxx000407000406000308xxxxxx00040c00041a000301xxxxxx00040d000418000300xxxxxx00040e000423000306xxxxxx000419000418000306xxxxxx000439000438000306xxxxxx000450000435000300xxxxxx000451000435000308xxxxxx000453000433000301xxxxxx000457000456000308xxxxxx00045c00043a000301xxxxxx00045d000438000300xxxxxx00045e000443000306xxxxxx00047600047400030fxxxxxx00047700047500030fxxxxxx0004c1000416000306xxxxxx0004c2000436000306xxxxxx0004d0000410000306xxxxxx0004d1000430000306xxxxxx0004d2000410000308xxxxxx0004d3000430000308xxxxxx0004d6000415000306xxxxxx0004d7000435000306xxxxxx0004da0004d8000308xxxxxx0004db0004d9000308xxxxxx0004dc000416000308xxxxxx0004dd000436000308xxxxxx0004de000417000308xxxxxx0004df000437000308xxxxxx0004e2000418000304xxxxxx0004e3000438000304xxxxxx0004e4000418000308xxxxxx0004e5000438000308xxxxxx0004e600041e000308xxxxxx0004e700043e000308xxxxxx0004ea0004e8000308xxxxxx0004eb0004e9000308xxxxxx0004ec00042d000308xxxxxx0004ed00044d000308xxxxxx0004ee000423000304xxxxxx0004ef000443000304xxxxxx0004f0000423000308xxxxxx0004f1000443000308xxxxxx0004f200042300030bxxxxxx0004f300044300030bxxxxxx0004f4000427000308xxxxxx0004f5000447000308xxxxxx0004f800042b000308xxxxxx0004f900044b000308xxxxxx000622000627000653xxxxxx000623000627000654xxxxxx000624000648000654xxxxxx000625000627000655xxxxxx00062600064a000654xxxxxx0006c00006d5000654xxxxxx0006c20006c1000654xxxxxx0006d30006d2000654xxxxxx00092900092800093cxxxxxx00093100093000093cxxxxxx00093400093300093cxxxxxx00095800091500093cxxxxxx00095900091600093cxxxxxx00095a00091700093cxxxxxx00095b00091c00093cxxxxxx00095c00092100093cxxxxxx00095d00092200093cxxxxxx00095e00092b00093cxxxxxx00095f00092f00093cxxxxxx0009cb0009c70009bexxxxxx0009cc0009c70009d7xxxxxx0009dc0009a10009bcxxxxxx0009dd0009a20009bcxxxxxx0009df0009af0009bcxxxxxx000a33000a32000a3cxxxxxx000a36000a38000a3cxxxxxx000a59000a16000a3cxxxxxx000a5a000a17000a3cxxxxxx000a5b000a1c000a3cxxxxxx000a5e000a2b000a3cxxxxxx000b48000b47000b56xxxxxx000b4b000b47000b3exxxxxx000b4c000b47000b57xxxxxx000b5c000b21000b3cxxxxxx000b5d000b22000b3cxxxxxx000b94000b92000bd7xxxxxx000bca000bc6000bbexxxxxx000bcb000bc7000bbexxxxxx000bcc000bc6000bd7xxxxxx000c48000c46000c56xxxxxx000cc0000cbf000cd5xxxxxx000cc7000cc6000cd5xxxxxx000cc8000cc6000cd6xxxxxx000cca000cc6000cc2xxxxxx000ccb000cca000cd5xxxxxx000d4a000d46000d3exxxxxx000d4b000d47000d3exxxxxx000d4c000d46000d57xxxxxx000dda000dd9000dcaxxxxxx000ddc000dd9000dcfxxxxxx000ddd000ddc000dcaxxxxxx000dde000dd9000ddfxxxxxx000f43000f42000fb7xxxxxx000f4d000f4c000fb7xxxxxx000f52000f51000fb7xxxxxx000f57000f56000fb7xxxxxx000f5c000f5b000fb7xxxxxx000f69000f40000fb5xxxxxx000f73000f71000f72xxxxxx000f75000f71000f74xxxxxx000f76000fb2000f80xxxxxx000f78000fb3000f80xxxxxx000f81000f71000f80xxxxxx000f93000f92000fb7xxxxxx000f9d000f9c000fb7xxxxxx000fa2000fa1000fb7xxxxxx000fa7000fa6000fb7xxxxxx000fac000fab000fb7xxxxxx000fb9000f90000fb5xxxxxx00102600102500102exxxxxx001b06001b05001b35xxxxxx001b08001b07001b35xxxxxx001b0a001b09001b35xxxxxx001b0c001b0b001b35xxxxxx001b0e001b0d001b35xxxxxx001b12001b11001b35xxxxxx001b3b001b3a001b35xxxxxx001b3d001b3c001b35xxxxxx001b40001b3e001b35xxxxxx001b41001b3f001b35xxxxxx001b43001b42001b35xxxxxx001e00000041000325xxxxxx001e01000061000325xxxxxx001e02000042000307xxxxxx001e03000062000307xxxxxx001e04000042000323xxxxxx001e05000062000323xxxxxx001e06000042000331xxxxxx001e07000062000331xxxxxx001e080000c7000301xxxxxx001e090000e7000301xxxxxx001e0a000044000307xxxxxx001e0b000064000307xxxxxx001e0c000044000323xxxxxx001e0d000064000323xxxxxx001e0e000044000331xxxxxx001e0f000064000331xxxxxx001e10000044000327xxxxxx001e11000064000327xxxxxx001e1200004400032dxxxxxx001e1300006400032dxxxxxx001e14000112000300xxxxxx001e15000113000300xxxxxx001e16000112000301xxxxxx001e17000113000301xxxxxx001e1800004500032dxxxxxx001e1900006500032dxxxxxx001e1a000045000330xxxxxx001e1b000065000330xxxxxx001e1c000228000306xxxxxx001e1d000229000306xxxxxx001e1e000046000307xxxxxx001e1f000066000307xxxxxx001e20000047000304xxxxxx001e21000067000304xxxxxx001e22000048000307xxxxxx001e23000068000307xxxxxx001e24000048000323xxxxxx001e25000068000323xxxxxx001e26000048000308xxxxxx001e27000068000308xxxxxx001e28000048000327xxxxxx001e29000068000327xxxxxx001e2a00004800032exxxxxx001e2b00006800032exxxxxx001e2c000049000330xxxxxx001e2d000069000330xxxxxx001e2e0000cf000301xxxxxx001e2f0000ef000301xxxxxx001e3000004b000301xxxxxx001e3100006b000301xxxxxx001e3200004b000323xxxxxx001e3300006b000323xxxxxx001e3400004b000331xxxxxx001e3500006b000331xxxxxx001e3600004c000323xxxxxx001e3700006c000323xxxxxx001e38001e36000304xxxxxx001e39001e37000304xxxxxx001e3a00004c000331xxxxxx001e3b00006c000331xxxxxx001e3c00004c00032dxxxxxx001e3d00006c00032dxxxxxx001e3e00004d000301xxxxxx001e3f00006d000301xxxxxx001e4000004d000307xxxxxx001e4100006d000307xxxxxx001e4200004d000323xxxxxx001e4300006d000323xxxxxx001e4400004e000307xxxxxx001e4500006e000307xxxxxx001e4600004e000323xxxxxx001e4700006e000323xxxxxx001e4800004e000331xxxxxx001e4900006e000331xxxxxx001e4a00004e00032dxxxxxx001e4b00006e00032dxxxxxx001e4c0000d5000301xxxxxx001e4d0000f5000301xxxxxx001e4e0000d5000308xxxxxx001e4f0000f5000308xxxxxx001e5000014c000300xxxxxx001e5100014d000300xxxxxx001e5200014c000301xxxxxx001e5300014d000301xxxxxx001e54000050000301xxxxxx001e55000070000301xxxxxx001e56000050000307xxxxxx001e57000070000307xxxxxx001e58000052000307xxxxxx001e59000072000307xxxxxx001e5a000052000323xxxxxx001e5b000072000323xxxxxx001e5c001e5a000304xxxxxx001e5d001e5b000304xxxxxx001e5e000052000331xxxxxx001e5f000072000331xxxxxx001e60000053000307xxxxxx001e61000073000307xxxxxx001e62000053000323xxxxxx001e63000073000323xxxxxx001e6400015a000307xxxxxx001e6500015b000307xxxxxx001e66000160000307xxxxxx001e67000161000307xxxxxx001e68001e62000307xxxxxx001e69001e63000307xxxxxx001e6a000054000307xxxxxx001e6b000074000307xxxxxx001e6c000054000323xxxxxx001e6d000074000323xxxxxx001e6e000054000331xxxxxx001e6f000074000331xxxxxx001e7000005400032dxxxxxx001e7100007400032dxxxxxx001e72000055000324xxxxxx001e73000075000324xxxxxx001e74000055000330xxxxxx001e75000075000330xxxxxx001e7600005500032dxxxxxx001e7700007500032dxxxxxx001e78000168000301xxxxxx001e79000169000301xxxxxx001e7a00016a000308xxxxxx001e7b00016b000308xxxxxx001e7c000056000303xxxxxx001e7d000076000303xxxxxx001e7e000056000323xxxxxx001e7f000076000323xxxxxx001e80000057000300xxxxxx001e81000077000300xxxxxx001e82000057000301xxxxxx001e83000077000301xxxxxx001e84000057000308xxxxxx001e85000077000308xxxxxx001e86000057000307xxxxxx001e87000077000307xxxxxx001e88000057000323xxxxxx001e89000077000323xxxxxx001e8a000058000307xxxxxx001e8b000078000307xxxxxx001e8c000058000308xxxxxx001e8d000078000308xxxxxx001e8e000059000307xxxxxx001e8f000079000307xxxxxx001e9000005a000302xxxxxx001e9100007a000302xxxxxx001e9200005a000323xxxxxx001e9300007a000323xxxxxx001e9400005a000331xxxxxx001e9500007a000331xxxxxx001e96000068000331xxxxxx001e97000074000308xxxxxx001e9800007700030axxxxxx001e9900007900030axxxxxx001e9b00017f000307xxxxxx001ea0000041000323xxxxxx001ea1000061000323xxxxxx001ea2000041000309xxxxxx001ea3000061000309xxxxxx001ea40000c2000301xxxxxx001ea50000e2000301xxxxxx001ea60000c2000300xxxxxx001ea70000e2000300xxxxxx001ea80000c2000309xxxxxx001ea90000e2000309xxxxxx001eaa0000c2000303xxxxxx001eab0000e2000303xxxxxx001eac001ea0000302xxxxxx001ead001ea1000302xxxxxx001eae000102000301xxxxxx001eaf000103000301xxxxxx001eb0000102000300xxxxxx001eb1000103000300xxxxxx001eb2000102000309xxxxxx001eb3000103000309xxxxxx001eb4000102000303xxxxxx001eb5000103000303xxxxxx001eb6001ea0000306xxxxxx001eb7001ea1000306xxxxxx001eb8000045000323xxxxxx001eb9000065000323xxxxxx001eba000045000309xxxxxx001ebb000065000309xxxxxx001ebc000045000303xxxxxx001ebd000065000303xxxxxx001ebe0000ca000301xxxxxx001ebf0000ea000301xxxxxx001ec00000ca000300xxxxxx001ec10000ea000300xxxxxx001ec20000ca000309xxxxxx001ec30000ea000309xxxxxx001ec40000ca000303xxxxxx001ec50000ea000303xxxxxx001ec6001eb8000302xxxxxx001ec7001eb9000302xxxxxx001ec8000049000309xxxxxx001ec9000069000309xxxxxx001eca000049000323xxxxxx001ecb000069000323xxxxxx001ecc00004f000323xxxxxx001ecd00006f000323xxxxxx001ece00004f000309xxxxxx001ecf00006f000309xxxxxx001ed00000d4000301xxxxxx001ed10000f4000301xxxxxx001ed20000d4000300xxxxxx001ed30000f4000300xxxxxx001ed40000d4000309xxxxxx001ed50000f4000309xxxxxx001ed60000d4000303xxxxxx001ed70000f4000303xxxxxx001ed8001ecc000302xxxxxx001ed9001ecd000302xxxxxx001eda0001a0000301xxxxxx001edb0001a1000301xxxxxx001edc0001a0000300xxxxxx001edd0001a1000300xxxxxx001ede0001a0000309xxxxxx001edf0001a1000309xxxxxx001ee00001a0000303xxxxxx001ee10001a1000303xxxxxx001ee20001a0000323xxxxxx001ee30001a1000323xxxxxx001ee4000055000323xxxxxx001ee5000075000323xxxxxx001ee6000055000309xxxxxx001ee7000075000309xxxxxx001ee80001af000301xxxxxx001ee90001b0000301xxxxxx001eea0001af000300xxxxxx001eeb0001b0000300xxxxxx001eec0001af000309xxxxxx001eed0001b0000309xxxxxx001eee0001af000303xxxxxx001eef0001b0000303xxxxxx001ef00001af000323xxxxxx001ef10001b0000323xxxxxx001ef2000059000300xxxxxx001ef3000079000300xxxxxx001ef4000059000323xxxxxx001ef5000079000323xxxxxx001ef6000059000309xxxxxx001ef7000079000309xxxxxx001ef8000059000303xxxxxx001ef9000079000303xxxxxx001f000003b1000313xxxxxx001f010003b1000314xxxxxx001f02001f00000300xxxxxx001f03001f01000300xxxxxx001f04001f00000301xxxxxx001f05001f01000301xxxxxx001f06001f00000342xxxxxx001f07001f01000342xxxxxx001f08000391000313xxxxxx001f09000391000314xxxxxx001f0a001f08000300xxxxxx001f0b001f09000300xxxxxx001f0c001f08000301xxxxxx001f0d001f09000301xxxxxx001f0e001f08000342xxxxxx001f0f001f09000342xxxxxx001f100003b5000313xxxxxx001f110003b5000314xxxxxx001f12001f10000300xxxxxx001f13001f11000300xxxxxx001f14001f10000301xxxxxx001f15001f11000301xxxxxx001f18000395000313xxxxxx001f19000395000314xxxxxx001f1a001f18000300xxxxxx001f1b001f19000300xxxxxx001f1c001f18000301xxxxxx001f1d001f19000301xxxxxx001f200003b7000313xxxxxx001f210003b7000314xxxxxx001f22001f20000300xxxxxx001f23001f21000300xxxxxx001f24001f20000301xxxxxx001f25001f21000301xxxxxx001f26001f20000342xxxxxx001f27001f21000342xxxxxx001f28000397000313xxxxxx001f29000397000314xxxxxx001f2a001f28000300xxxxxx001f2b001f29000300xxxxxx001f2c001f28000301xxxxxx001f2d001f29000301xxxxxx001f2e001f28000342xxxxxx001f2f001f29000342xxxxxx001f300003b9000313xxxxxx001f310003b9000314xxxxxx001f32001f30000300xxxxxx001f33001f31000300xxxxxx001f34001f30000301xxxxxx001f35001f31000301xxxxxx001f36001f30000342xxxxxx001f37001f31000342xxxxxx001f38000399000313xxxxxx001f39000399000314xxxxxx001f3a001f38000300xxxxxx001f3b001f39000300xxxxxx001f3c001f38000301xxxxxx001f3d001f39000301xxxxxx001f3e001f38000342xxxxxx001f3f001f39000342xxxxxx001f400003bf000313xxxxxx001f410003bf000314xxxxxx001f42001f40000300xxxxxx001f43001f41000300xxxxxx001f44001f40000301xxxxxx001f45001f41000301xxxxxx001f4800039f000313xxxxxx001f4900039f000314xxxxxx001f4a001f48000300xxxxxx001f4b001f49000300xxxxxx001f4c001f48000301xxxxxx001f4d001f49000301xxxxxx001f500003c5000313xxxxxx001f510003c5000314xxxxxx001f52001f50000300xxxxxx001f53001f51000300xxxxxx001f54001f50000301xxxxxx001f55001f51000301xxxxxx001f56001f50000342xxxxxx001f57001f51000342xxxxxx001f590003a5000314xxxxxx001f5b001f59000300xxxxxx001f5d001f59000301xxxxxx001f5f001f59000342xxxxxx001f600003c9000313xxxxxx001f610003c9000314xxxxxx001f62001f60000300xxxxxx001f63001f61000300xxxxxx001f64001f60000301xxxxxx001f65001f61000301xxxxxx001f66001f60000342xxxxxx001f67001f61000342xxxxxx001f680003a9000313xxxxxx001f690003a9000314xxxxxx001f6a001f68000300xxxxxx001f6b001f69000300xxxxxx001f6c001f68000301xxxxxx001f6d001f69000301xxxxxx001f6e001f68000342xxxxxx001f6f001f69000342xxxxxx001f700003b1000300xxxxxx001f710003acxxxxxx001f720003b5000300xxxxxx001f730003adxxxxxx001f740003b7000300xxxxxx001f750003aexxxxxx001f760003b9000300xxxxxx001f770003afxxxxxx001f780003bf000300xxxxxx001f790003ccxxxxxx001f7a0003c5000300xxxxxx001f7b0003cdxxxxxx001f7c0003c9000300xxxxxx001f7d0003cexxxxxx001f80001f00000345xxxxxx001f81001f01000345xxxxxx001f82001f02000345xxxxxx001f83001f03000345xxxxxx001f84001f04000345xxxxxx001f85001f05000345xxxxxx001f86001f06000345xxxxxx001f87001f07000345xxxxxx001f88001f08000345xxxxxx001f89001f09000345xxxxxx001f8a001f0a000345xxxxxx001f8b001f0b000345xxxxxx001f8c001f0c000345xxxxxx001f8d001f0d000345xxxxxx001f8e001f0e000345xxxxxx001f8f001f0f000345xxxxxx001f90001f20000345xxxxxx001f91001f21000345xxxxxx001f92001f22000345xxxxxx001f93001f23000345xxxxxx001f94001f24000345xxxxxx001f95001f25000345xxxxxx001f96001f26000345xxxxxx001f97001f27000345xxxxxx001f98001f28000345xxxxxx001f99001f29000345xxxxxx001f9a001f2a000345xxxxxx001f9b001f2b000345xxxxxx001f9c001f2c000345xxxxxx001f9d001f2d000345xxxxxx001f9e001f2e000345xxxxxx001f9f001f2f000345xxxxxx001fa0001f60000345xxxxxx001fa1001f61000345xxxxxx001fa2001f62000345xxxxxx001fa3001f63000345xxxxxx001fa4001f64000345xxxxxx001fa5001f65000345xxxxxx001fa6001f66000345xxxxxx001fa7001f67000345xxxxxx001fa8001f68000345xxxxxx001fa9001f69000345xxxxxx001faa001f6a000345xxxxxx001fab001f6b000345xxxxxx001fac001f6c000345xxxxxx001fad001f6d000345xxxxxx001fae001f6e000345xxxxxx001faf001f6f000345xxxxxx001fb00003b1000306xxxxxx001fb10003b1000304xxxxxx001fb2001f70000345xxxxxx001fb30003b1000345xxxxxx001fb40003ac000345xxxxxx001fb60003b1000342xxxxxx001fb7001fb6000345xxxxxx001fb8000391000306xxxxxx001fb9000391000304xxxxxx001fba000391000300xxxxxx001fbb000386xxxxxx001fbc000391000345xxxxxx001fbe0003b9xxxxxx001fc10000a8000342xxxxxx001fc2001f74000345xxxxxx001fc30003b7000345xxxxxx001fc40003ae000345xxxxxx001fc60003b7000342xxxxxx001fc7001fc6000345xxxxxx001fc8000395000300xxxxxx001fc9000388xxxxxx001fca000397000300xxxxxx001fcb000389xxxxxx001fcc000397000345xxxxxx001fcd001fbf000300xxxxxx001fce001fbf000301xxxxxx001fcf001fbf000342xxxxxx001fd00003b9000306xxxxxx001fd10003b9000304xxxxxx001fd20003ca000300xxxxxx001fd3000390xxxxxx001fd60003b9000342xxxxxx001fd70003ca000342xxxxxx001fd8000399000306xxxxxx001fd9000399000304xxxxxx001fda000399000300xxxxxx001fdb00038axxxxxx001fdd001ffe000300xxxxxx001fde001ffe000301xxxxxx001fdf001ffe000342xxxxxx001fe00003c5000306xxxxxx001fe10003c5000304xxxxxx001fe20003cb000300xxxxxx001fe30003b0xxxxxx001fe40003c1000313xxxxxx001fe50003c1000314xxxxxx001fe60003c5000342xxxxxx001fe70003cb000342xxxxxx001fe80003a5000306xxxxxx001fe90003a5000304xxxxxx001fea0003a5000300xxxxxx001feb00038exxxxxx001fec0003a1000314xxxxxx001fed0000a8000300xxxxxx001fee000385xxxxxx001fef000060xxxxxx001ff2001f7c000345xxxxxx001ff30003c9000345xxxxxx001ff40003ce000345xxxxxx001ff60003c9000342xxxxxx001ff7001ff6000345xxxxxx001ff800039f000300xxxxxx001ff900038cxxxxxx001ffa0003a9000300xxxxxx001ffb00038fxxxxxx001ffc0003a9000345xxxxxx001ffd0000b4xxxxxx002000002002xxxxxx002001002003xxxxxx0021260003a9xxxxxx00212a00004bxxxxxx00212b0000c5xxxxxx00219a002190000338xxxxxx00219b002192000338xxxxxx0021ae002194000338xxxxxx0021cd0021d0000338xxxxxx0021ce0021d4000338xxxxxx0021cf0021d2000338xxxxxx002204002203000338xxxxxx002209002208000338xxxxxx00220c00220b000338xxxxxx002224002223000338xxxxxx002226002225000338xxxxxx00224100223c000338xxxxxx002244002243000338xxxxxx002247002245000338xxxxxx002249002248000338xxxxxx00226000003d000338xxxxxx002262002261000338xxxxxx00226d00224d000338xxxxxx00226e00003c000338xxxxxx00226f00003e000338xxxxxx002270002264000338xxxxxx002271002265000338xxxxxx002274002272000338xxxxxx002275002273000338xxxxxx002278002276000338xxxxxx002279002277000338xxxxxx00228000227a000338xxxxxx00228100227b000338xxxxxx002284002282000338xxxxxx002285002283000338xxxxxx002288002286000338xxxxxx002289002287000338xxxxxx0022ac0022a2000338xxxxxx0022ad0022a8000338xxxxxx0022ae0022a9000338xxxxxx0022af0022ab000338xxxxxx0022e000227c000338xxxxxx0022e100227d000338xxxxxx0022e2002291000338xxxxxx0022e3002292000338xxxxxx0022ea0022b2000338xxxxxx0022eb0022b3000338xxxxxx0022ec0022b4000338xxxxxx0022ed0022b5000338xxxxxx002329003008xxxxxx00232a003009xxxxxx002adc002add000338xxxxxx00304c00304b003099xxxxxx00304e00304d003099xxxxxx00305000304f003099xxxxxx003052003051003099xxxxxx003054003053003099xxxxxx003056003055003099xxxxxx003058003057003099xxxxxx00305a003059003099xxxxxx00305c00305b003099xxxxxx00305e00305d003099xxxxxx00306000305f003099xxxxxx003062003061003099xxxxxx003065003064003099xxxxxx003067003066003099xxxxxx003069003068003099xxxxxx00307000306f003099xxxxxx00307100306f00309axxxxxx003073003072003099xxxxxx00307400307200309axxxxxx003076003075003099xxxxxx00307700307500309axxxxxx003079003078003099xxxxxx00307a00307800309axxxxxx00307c00307b003099xxxxxx00307d00307b00309axxxxxx003094003046003099xxxxxx00309e00309d003099xxxxxx0030ac0030ab003099xxxxxx0030ae0030ad003099xxxxxx0030b00030af003099xxxxxx0030b20030b1003099xxxxxx0030b40030b3003099xxxxxx0030b60030b5003099xxxxxx0030b80030b7003099xxxxxx0030ba0030b9003099xxxxxx0030bc0030bb003099xxxxxx0030be0030bd003099xxxxxx0030c00030bf003099xxxxxx0030c20030c1003099xxxxxx0030c50030c4003099xxxxxx0030c70030c6003099xxxxxx0030c90030c8003099xxxxxx0030d00030cf003099xxxxxx0030d10030cf00309axxxxxx0030d30030d2003099xxxxxx0030d40030d200309axxxxxx0030d60030d5003099xxxxxx0030d70030d500309axxxxxx0030d90030d8003099xxxxxx0030da0030d800309axxxxxx0030dc0030db003099xxxxxx0030dd0030db00309axxxxxx0030f40030a6003099xxxxxx0030f70030ef003099xxxxxx0030f80030f0003099xxxxxx0030f90030f1003099xxxxxx0030fa0030f2003099xxxxxx0030fe0030fd003099xxxxxx00f900008c48xxxxxx00f9010066f4xxxxxx00f902008ecaxxxxxx00f903008cc8xxxxxx00f904006ed1xxxxxx00f905004e32xxxxxx00f9060053e5xxxxxx00f907009f9cxxxxxx00f908009f9cxxxxxx00f909005951xxxxxx00f90a0091d1xxxxxx00f90b005587xxxxxx00f90c005948xxxxxx00f90d0061f6xxxxxx00f90e007669xxxxxx00f90f007f85xxxxxx00f91000863fxxxxxx00f9110087baxxxxxx00f9120088f8xxxxxx00f91300908fxxxxxx00f914006a02xxxxxx00f915006d1bxxxxxx00f9160070d9xxxxxx00f9170073dexxxxxx00f91800843dxxxxxx00f91900916axxxxxx00f91a0099f1xxxxxx00f91b004e82xxxxxx00f91c005375xxxxxx00f91d006b04xxxxxx00f91e00721bxxxxxx00f91f00862dxxxxxx00f920009e1exxxxxx00f921005d50xxxxxx00f922006febxxxxxx00f9230085cdxxxxxx00f924008964xxxxxx00f9250062c9xxxxxx00f9260081d8xxxxxx00f92700881fxxxxxx00f928005ecaxxxxxx00f929006717xxxxxx00f92a006d6axxxxxx00f92b0072fcxxxxxx00f92c0090cexxxxxx00f92d004f86xxxxxx00f92e0051b7xxxxxx00f92f0052dexxxxxx00f9300064c4xxxxxx00f931006ad3xxxxxx00f932007210xxxxxx00f9330076e7xxxxxx00f934008001xxxxxx00f935008606xxxxxx00f93600865cxxxxxx00f937008defxxxxxx00f938009732xxxxxx00f939009b6fxxxxxx00f93a009dfaxxxxxx00f93b00788cxxxxxx00f93c00797fxxxxxx00f93d007da0xxxxxx00f93e0083c9xxxxxx00f93f009304xxxxxx00f940009e7fxxxxxx00f941008ad6xxxxxx00f9420058dfxxxxxx00f943005f04xxxxxx00f944007c60xxxxxx00f94500807exxxxxx00f946007262xxxxxx00f9470078caxxxxxx00f948008cc2xxxxxx00f9490096f7xxxxxx00f94a0058d8xxxxxx00f94b005c62xxxxxx00f94c006a13xxxxxx00f94d006ddaxxxxxx00f94e006f0fxxxxxx00f94f007d2fxxxxxx00f950007e37xxxxxx00f95100964bxxxxxx00f9520052d2xxxxxx00f95300808bxxxxxx00f9540051dcxxxxxx00f9550051ccxxxxxx00f956007a1cxxxxxx00f957007dbexxxxxx00f9580083f1xxxxxx00f959009675xxxxxx00f95a008b80xxxxxx00f95b0062cfxxxxxx00f95c006a02xxxxxx00f95d008afexxxxxx00f95e004e39xxxxxx00f95f005be7xxxxxx00f960006012xxxxxx00f961007387xxxxxx00f962007570xxxxxx00f963005317xxxxxx00f9640078fbxxxxxx00f965004fbfxxxxxx00f966005fa9xxxxxx00f967004e0dxxxxxx00f968006cccxxxxxx00f969006578xxxxxx00f96a007d22xxxxxx00f96b0053c3xxxxxx00f96c00585exxxxxx00f96d007701xxxxxx00f96e008449xxxxxx00f96f008aaaxxxxxx00f970006bbaxxxxxx00f971008fb0xxxxxx00f972006c88xxxxxx00f9730062fexxxxxx00f9740082e5xxxxxx00f9750063a0xxxxxx00f976007565xxxxxx00f977004eaexxxxxx00f978005169xxxxxx00f9790051c9xxxxxx00f97a006881xxxxxx00f97b007ce7xxxxxx00f97c00826fxxxxxx00f97d008ad2xxxxxx00f97e0091cfxxxxxx00f97f0052f5xxxxxx00f980005442xxxxxx00f981005973xxxxxx00f982005eecxxxxxx00f9830065c5xxxxxx00f984006ffexxxxxx00f98500792axxxxxx00f9860095adxxxxxx00f987009a6axxxxxx00f988009e97xxxxxx00f989009ecexxxxxx00f98a00529bxxxxxx00f98b0066c6xxxxxx00f98c006b77xxxxxx00f98d008f62xxxxxx00f98e005e74xxxxxx00f98f006190xxxxxx00f990006200xxxxxx00f99100649axxxxxx00f992006f23xxxxxx00f993007149xxxxxx00f994007489xxxxxx00f9950079caxxxxxx00f996007df4xxxxxx00f99700806fxxxxxx00f998008f26xxxxxx00f9990084eexxxxxx00f99a009023xxxxxx00f99b00934axxxxxx00f99c005217xxxxxx00f99d0052a3xxxxxx00f99e0054bdxxxxxx00f99f0070c8xxxxxx00f9a00088c2xxxxxx00f9a1008aaaxxxxxx00f9a2005ec9xxxxxx00f9a3005ff5xxxxxx00f9a400637bxxxxxx00f9a5006baexxxxxx00f9a6007c3exxxxxx00f9a7007375xxxxxx00f9a8004ee4xxxxxx00f9a90056f9xxxxxx00f9aa005be7xxxxxx00f9ab005dbaxxxxxx00f9ac00601cxxxxxx00f9ad0073b2xxxxxx00f9ae007469xxxxxx00f9af007f9axxxxxx00f9b0008046xxxxxx00f9b1009234xxxxxx00f9b20096f6xxxxxx00f9b3009748xxxxxx00f9b4009818xxxxxx00f9b5004f8bxxxxxx00f9b60079aexxxxxx00f9b70091b4xxxxxx00f9b80096b8xxxxxx00f9b90060e1xxxxxx00f9ba004e86xxxxxx00f9bb0050daxxxxxx00f9bc005beexxxxxx00f9bd005c3fxxxxxx00f9be006599xxxxxx00f9bf006a02xxxxxx00f9c00071cexxxxxx00f9c1007642xxxxxx00f9c20084fcxxxxxx00f9c300907cxxxxxx00f9c4009f8dxxxxxx00f9c5006688xxxxxx00f9c600962exxxxxx00f9c7005289xxxxxx00f9c800677bxxxxxx00f9c90067f3xxxxxx00f9ca006d41xxxxxx00f9cb006e9cxxxxxx00f9cc007409xxxxxx00f9cd007559xxxxxx00f9ce00786bxxxxxx00f9cf007d10xxxxxx00f9d000985exxxxxx00f9d100516dxxxxxx00f9d200622exxxxxx00f9d3009678xxxxxx00f9d400502bxxxxxx00f9d5005d19xxxxxx00f9d6006deaxxxxxx00f9d7008f2axxxxxx00f9d8005f8bxxxxxx00f9d9006144xxxxxx00f9da006817xxxxxx00f9db007387xxxxxx00f9dc009686xxxxxx00f9dd005229xxxxxx00f9de00540fxxxxxx00f9df005c65xxxxxx00f9e0006613xxxxxx00f9e100674exxxxxx00f9e20068a8xxxxxx00f9e3006ce5xxxxxx00f9e4007406xxxxxx00f9e50075e2xxxxxx00f9e6007f79xxxxxx00f9e70088cfxxxxxx00f9e80088e1xxxxxx00f9e90091ccxxxxxx00f9ea0096e2xxxxxx00f9eb00533fxxxxxx00f9ec006ebaxxxxxx00f9ed00541dxxxxxx00f9ee0071d0xxxxxx00f9ef007498xxxxxx00f9f00085faxxxxxx00f9f10096a3xxxxxx00f9f2009c57xxxxxx00f9f3009e9fxxxxxx00f9f4006797xxxxxx00f9f5006dcbxxxxxx00f9f60081e8xxxxxx00f9f7007acbxxxxxx00f9f8007b20xxxxxx00f9f9007c92xxxxxx00f9fa0072c0xxxxxx00f9fb007099xxxxxx00f9fc008b58xxxxxx00f9fd004ec0xxxxxx00f9fe008336xxxxxx00f9ff00523axxxxxx00fa00005207xxxxxx00fa01005ea6xxxxxx00fa020062d3xxxxxx00fa03007cd6xxxxxx00fa04005b85xxxxxx00fa05006d1exxxxxx00fa060066b4xxxxxx00fa07008f3bxxxxxx00fa0800884cxxxxxx00fa0900964dxxxxxx00fa0a00898bxxxxxx00fa0b005ed3xxxxxx00fa0c005140xxxxxx00fa0d0055c0xxxxxx00fa1000585axxxxxx00fa12006674xxxxxx00fa150051dexxxxxx00fa1600732axxxxxx00fa170076caxxxxxx00fa1800793cxxxxxx00fa1900795exxxxxx00fa1a007965xxxxxx00fa1b00798fxxxxxx00fa1c009756xxxxxx00fa1d007cbexxxxxx00fa1e007fbdxxxxxx00fa20008612xxxxxx00fa22008af8xxxxxx00fa25009038xxxxxx00fa260090fdxxxxxx00fa2a0098efxxxxxx00fa2b0098fcxxxxxx00fa2c009928xxxxxx00fa2d009db4xxxxxx00fa30004faexxxxxx00fa310050e7xxxxxx00fa3200514dxxxxxx00fa330052c9xxxxxx00fa340052e4xxxxxx00fa35005351xxxxxx00fa3600559dxxxxxx00fa37005606xxxxxx00fa38005668xxxxxx00fa39005840xxxxxx00fa3a0058a8xxxxxx00fa3b005c64xxxxxx00fa3c005c6exxxxxx00fa3d006094xxxxxx00fa3e006168xxxxxx00fa3f00618exxxxxx00fa400061f2xxxxxx00fa4100654fxxxxxx00fa420065e2xxxxxx00fa43006691xxxxxx00fa44006885xxxxxx00fa45006d77xxxxxx00fa46006e1axxxxxx00fa47006f22xxxxxx00fa4800716exxxxxx00fa4900722bxxxxxx00fa4a007422xxxxxx00fa4b007891xxxxxx00fa4c00793exxxxxx00fa4d007949xxxxxx00fa4e007948xxxxxx00fa4f007950xxxxxx00fa50007956xxxxxx00fa5100795dxxxxxx00fa5200798dxxxxxx00fa5300798exxxxxx00fa54007a40xxxxxx00fa55007a81xxxxxx00fa56007bc0xxxxxx00fa57007df4xxxxxx00fa58007e09xxxxxx00fa59007e41xxxxxx00fa5a007f72xxxxxx00fa5b008005xxxxxx00fa5c0081edxxxxxx00fa5d008279xxxxxx00fa5e008279xxxxxx00fa5f008457xxxxxx00fa60008910xxxxxx00fa61008996xxxxxx00fa62008b01xxxxxx00fa63008b39xxxxxx00fa64008cd3xxxxxx00fa65008d08xxxxxx00fa66008fb6xxxxxx00fa67009038xxxxxx00fa680096e3xxxxxx00fa690097ffxxxxxx00fa6a00983bxxxxxx00fa70004e26xxxxxx00fa710051b5xxxxxx00fa72005168xxxxxx00fa73004f80xxxxxx00fa74005145xxxxxx00fa75005180xxxxxx00fa760052c7xxxxxx00fa770052faxxxxxx00fa7800559dxxxxxx00fa79005555xxxxxx00fa7a005599xxxxxx00fa7b0055e2xxxxxx00fa7c00585axxxxxx00fa7d0058b3xxxxxx00fa7e005944xxxxxx00fa7f005954xxxxxx00fa80005a62xxxxxx00fa81005b28xxxxxx00fa82005ed2xxxxxx00fa83005ed9xxxxxx00fa84005f69xxxxxx00fa85005fadxxxxxx00fa860060d8xxxxxx00fa8700614exxxxxx00fa88006108xxxxxx00fa8900618exxxxxx00fa8a006160xxxxxx00fa8b0061f2xxxxxx00fa8c006234xxxxxx00fa8d0063c4xxxxxx00fa8e00641cxxxxxx00fa8f006452xxxxxx00fa90006556xxxxxx00fa91006674xxxxxx00fa92006717xxxxxx00fa9300671bxxxxxx00fa94006756xxxxxx00fa95006b79xxxxxx00fa96006bbaxxxxxx00fa97006d41xxxxxx00fa98006edbxxxxxx00fa99006ecbxxxxxx00fa9a006f22xxxxxx00fa9b00701exxxxxx00fa9c00716exxxxxx00fa9d0077a7xxxxxx00fa9e007235xxxxxx00fa9f0072afxxxxxx00faa000732axxxxxx00faa1007471xxxxxx00faa2007506xxxxxx00faa300753bxxxxxx00faa400761dxxxxxx00faa500761fxxxxxx00faa60076caxxxxxx00faa70076dbxxxxxx00faa80076f4xxxxxx00faa900774axxxxxx00faaa007740xxxxxx00faab0078ccxxxxxx00faac007ab1xxxxxx00faad007bc0xxxxxx00faae007c7bxxxxxx00faaf007d5bxxxxxx00fab0007df4xxxxxx00fab1007f3exxxxxx00fab2008005xxxxxx00fab3008352xxxxxx00fab40083efxxxxxx00fab5008779xxxxxx00fab6008941xxxxxx00fab7008986xxxxxx00fab8008996xxxxxx00fab9008abfxxxxxx00faba008af8xxxxxx00fabb008acbxxxxxx00fabc008b01xxxxxx00fabd008afexxxxxx00fabe008aedxxxxxx00fabf008b39xxxxxx00fac0008b8axxxxxx00fac1008d08xxxxxx00fac2008f38xxxxxx00fac3009072xxxxxx00fac4009199xxxxxx00fac5009276xxxxxx00fac600967cxxxxxx00fac70096e3xxxxxx00fac8009756xxxxxx00fac90097dbxxxxxx00faca0097ffxxxxxx00facb00980bxxxxxx00facc00983bxxxxxx00facd009b12xxxxxx00face009f9cxxxxxx00facf02284axxxxxx00fad0022844xxxxxx00fad10233d5xxxxxx00fad2003b9dxxxxxx00fad3004018xxxxxx00fad4004039xxxxxx00fad5025249xxxxxx00fad6025cd0xxxxxx00fad7027ed3xxxxxx00fad8009f43xxxxxx00fad9009f8exxxxxx00fb1d0005d90005b4xxxxxx00fb1f0005f20005b7xxxxxx00fb2a0005e90005c1xxxxxx00fb2b0005e90005c2xxxxxx00fb2c00fb490005c1xxxxxx00fb2d00fb490005c2xxxxxx00fb2e0005d00005b7xxxxxx00fb2f0005d00005b8xxxxxx00fb300005d00005bcxxxxxx00fb310005d10005bcxxxxxx00fb320005d20005bcxxxxxx00fb330005d30005bcxxxxxx00fb340005d40005bcxxxxxx00fb350005d50005bcxxxxxx00fb360005d60005bcxxxxxx00fb380005d80005bcxxxxxx00fb390005d90005bcxxxxxx00fb3a0005da0005bcxxxxxx00fb3b0005db0005bcxxxxxx00fb3c0005dc0005bcxxxxxx00fb3e0005de0005bcxxxxxx00fb400005e00005bcxxxxxx00fb410005e10005bcxxxxxx00fb430005e30005bcxxxxxx00fb440005e40005bcxxxxxx00fb460005e60005bcxxxxxx00fb470005e70005bcxxxxxx00fb480005e80005bcxxxxxx00fb490005e90005bcxxxxxx00fb4a0005ea0005bcxxxxxx00fb4b0005d50005b9xxxxxx00fb4c0005d10005bfxxxxxx00fb4d0005db0005bfxxxxxx00fb4e0005e40005bfxxxxxx01d15e01d15701d165xxxxxx01d15f01d15801d165xxxxxx01d16001d15f01d16exxxxxx01d16101d15f01d16fxxxxxx01d16201d15f01d170xxxxxx01d16301d15f01d171xxxxxx01d16401d15f01d172xxxxxx01d1bb01d1b901d165xxxxxx01d1bc01d1ba01d165xxxxxx01d1bd01d1bb01d16exxxxxx01d1be01d1bc01d16exxxxxx01d1bf01d1bb01d16fxxxxxx01d1c001d1bc01d16fxxxxxx02f800004e3dxxxxxx02f801004e38xxxxxx02f802004e41xxxxxx02f803020122xxxxxx02f804004f60xxxxxx02f805004faexxxxxx02f806004fbbxxxxxx02f807005002xxxxxx02f80800507axxxxxx02f809005099xxxxxx02f80a0050e7xxxxxx02f80b0050cfxxxxxx02f80c00349exxxxxx02f80d02063axxxxxx02f80e00514dxxxxxx02f80f005154xxxxxx02f810005164xxxxxx02f811005177xxxxxx02f81202051cxxxxxx02f8130034b9xxxxxx02f814005167xxxxxx02f81500518dxxxxxx02f81602054bxxxxxx02f817005197xxxxxx02f8180051a4xxxxxx02f819004eccxxxxxx02f81a0051acxxxxxx02f81b0051b5xxxxxx02f81c0291dfxxxxxx02f81d0051f5xxxxxx02f81e005203xxxxxx02f81f0034dfxxxxxx02f82000523bxxxxxx02f821005246xxxxxx02f822005272xxxxxx02f823005277xxxxxx02f824003515xxxxxx02f8250052c7xxxxxx02f8260052c9xxxxxx02f8270052e4xxxxxx02f8280052faxxxxxx02f829005305xxxxxx02f82a005306xxxxxx02f82b005317xxxxxx02f82c005349xxxxxx02f82d005351xxxxxx02f82e00535axxxxxx02f82f005373xxxxxx02f83000537dxxxxxx02f83100537fxxxxxx02f83200537fxxxxxx02f83300537fxxxxxx02f834020a2cxxxxxx02f835007070xxxxxx02f8360053caxxxxxx02f8370053dfxxxxxx02f838020b63xxxxxx02f8390053ebxxxxxx02f83a0053f1xxxxxx02f83b005406xxxxxx02f83c00549exxxxxx02f83d005438xxxxxx02f83e005448xxxxxx02f83f005468xxxxxx02f8400054a2xxxxxx02f8410054f6xxxxxx02f842005510xxxxxx02f843005553xxxxxx02f844005563xxxxxx02f845005584xxxxxx02f846005584xxxxxx02f847005599xxxxxx02f8480055abxxxxxx02f8490055b3xxxxxx02f84a0055c2xxxxxx02f84b005716xxxxxx02f84c005606xxxxxx02f84d005717xxxxxx02f84e005651xxxxxx02f84f005674xxxxxx02f850005207xxxxxx02f8510058eexxxxxx02f8520057cexxxxxx02f8530057f4xxxxxx02f85400580dxxxxxx02f85500578bxxxxxx02f856005832xxxxxx02f857005831xxxxxx02f8580058acxxxxxx02f8590214e4xxxxxx02f85a0058f2xxxxxx02f85b0058f7xxxxxx02f85c005906xxxxxx02f85d00591axxxxxx02f85e005922xxxxxx02f85f005962xxxxxx02f8600216a8xxxxxx02f8610216eaxxxxxx02f8620059ecxxxxxx02f863005a1bxxxxxx02f864005a27xxxxxx02f8650059d8xxxxxx02f866005a66xxxxxx02f8670036eexxxxxx02f8680036fcxxxxxx02f869005b08xxxxxx02f86a005b3exxxxxx02f86b005b3exxxxxx02f86c0219c8xxxxxx02f86d005bc3xxxxxx02f86e005bd8xxxxxx02f86f005be7xxxxxx02f870005bf3xxxxxx02f871021b18xxxxxx02f872005bffxxxxxx02f873005c06xxxxxx02f874005f53xxxxxx02f875005c22xxxxxx02f876003781xxxxxx02f877005c60xxxxxx02f878005c6exxxxxx02f879005cc0xxxxxx02f87a005c8dxxxxxx02f87b021de4xxxxxx02f87c005d43xxxxxx02f87d021de6xxxxxx02f87e005d6exxxxxx02f87f005d6bxxxxxx02f880005d7cxxxxxx02f881005de1xxxxxx02f882005de2xxxxxx02f88300382fxxxxxx02f884005dfdxxxxxx02f885005e28xxxxxx02f886005e3dxxxxxx02f887005e69xxxxxx02f888003862xxxxxx02f889022183xxxxxx02f88a00387cxxxxxx02f88b005eb0xxxxxx02f88c005eb3xxxxxx02f88d005eb6xxxxxx02f88e005ecaxxxxxx02f88f02a392xxxxxx02f890005efexxxxxx02f891022331xxxxxx02f892022331xxxxxx02f893008201xxxxxx02f894005f22xxxxxx02f895005f22xxxxxx02f8960038c7xxxxxx02f8970232b8xxxxxx02f8980261daxxxxxx02f899005f62xxxxxx02f89a005f6bxxxxxx02f89b0038e3xxxxxx02f89c005f9axxxxxx02f89d005fcdxxxxxx02f89e005fd7xxxxxx02f89f005ff9xxxxxx02f8a0006081xxxxxx02f8a100393axxxxxx02f8a200391cxxxxxx02f8a3006094xxxxxx02f8a40226d4xxxxxx02f8a50060c7xxxxxx02f8a6006148xxxxxx02f8a700614cxxxxxx02f8a800614exxxxxx02f8a900614cxxxxxx02f8aa00617axxxxxx02f8ab00618exxxxxx02f8ac0061b2xxxxxx02f8ad0061a4xxxxxx02f8ae0061afxxxxxx02f8af0061dexxxxxx02f8b00061f2xxxxxx02f8b10061f6xxxxxx02f8b2006210xxxxxx02f8b300621bxxxxxx02f8b400625dxxxxxx02f8b50062b1xxxxxx02f8b60062d4xxxxxx02f8b7006350xxxxxx02f8b8022b0cxxxxxx02f8b900633dxxxxxx02f8ba0062fcxxxxxx02f8bb006368xxxxxx02f8bc006383xxxxxx02f8bd0063e4xxxxxx02f8be022bf1xxxxxx02f8bf006422xxxxxx02f8c00063c5xxxxxx02f8c10063a9xxxxxx02f8c2003a2exxxxxx02f8c3006469xxxxxx02f8c400647exxxxxx02f8c500649dxxxxxx02f8c6006477xxxxxx02f8c7003a6cxxxxxx02f8c800654fxxxxxx02f8c900656cxxxxxx02f8ca02300axxxxxx02f8cb0065e3xxxxxx02f8cc0066f8xxxxxx02f8cd006649xxxxxx02f8ce003b19xxxxxx02f8cf006691xxxxxx02f8d0003b08xxxxxx02f8d1003ae4xxxxxx02f8d2005192xxxxxx02f8d3005195xxxxxx02f8d4006700xxxxxx02f8d500669cxxxxxx02f8d60080adxxxxxx02f8d70043d9xxxxxx02f8d8006717xxxxxx02f8d900671bxxxxxx02f8da006721xxxxxx02f8db00675exxxxxx02f8dc006753xxxxxx02f8dd0233c3xxxxxx02f8de003b49xxxxxx02f8df0067faxxxxxx02f8e0006785xxxxxx02f8e1006852xxxxxx02f8e2006885xxxxxx02f8e302346dxxxxxx02f8e400688exxxxxx02f8e500681fxxxxxx02f8e6006914xxxxxx02f8e7003b9dxxxxxx02f8e8006942xxxxxx02f8e90069a3xxxxxx02f8ea0069eaxxxxxx02f8eb006aa8xxxxxx02f8ec0236a3xxxxxx02f8ed006adbxxxxxx02f8ee003c18xxxxxx02f8ef006b21xxxxxx02f8f00238a7xxxxxx02f8f1006b54xxxxxx02f8f2003c4exxxxxx02f8f3006b72xxxxxx02f8f4006b9fxxxxxx02f8f5006bbaxxxxxx02f8f6006bbbxxxxxx02f8f7023a8dxxxxxx02f8f8021d0bxxxxxx02f8f9023afaxxxxxx02f8fa006c4exxxxxx02f8fb023cbcxxxxxx02f8fc006cbfxxxxxx02f8fd006ccdxxxxxx02f8fe006c67xxxxxx02f8ff006d16xxxxxx02f900006d3exxxxxx02f901006d77xxxxxx02f902006d41xxxxxx02f903006d69xxxxxx02f904006d78xxxxxx02f905006d85xxxxxx02f906023d1exxxxxx02f907006d34xxxxxx02f908006e2fxxxxxx02f909006e6exxxxxx02f90a003d33xxxxxx02f90b006ecbxxxxxx02f90c006ec7xxxxxx02f90d023ed1xxxxxx02f90e006df9xxxxxx02f90f006f6exxxxxx02f910023f5exxxxxx02f911023f8exxxxxx02f912006fc6xxxxxx02f913007039xxxxxx02f91400701exxxxxx02f91500701bxxxxxx02f916003d96xxxxxx02f91700704axxxxxx02f91800707dxxxxxx02f919007077xxxxxx02f91a0070adxxxxxx02f91b020525xxxxxx02f91c007145xxxxxx02f91d024263xxxxxx02f91e00719cxxxxxx02f91f0243abxxxxxx02f920007228xxxxxx02f921007235xxxxxx02f922007250xxxxxx02f923024608xxxxxx02f924007280xxxxxx02f925007295xxxxxx02f926024735xxxxxx02f927024814xxxxxx02f92800737axxxxxx02f92900738bxxxxxx02f92a003eacxxxxxx02f92b0073a5xxxxxx02f92c003eb8xxxxxx02f92d003eb8xxxxxx02f92e007447xxxxxx02f92f00745cxxxxxx02f930007471xxxxxx02f931007485xxxxxx02f9320074caxxxxxx02f933003f1bxxxxxx02f934007524xxxxxx02f935024c36xxxxxx02f93600753exxxxxx02f937024c92xxxxxx02f938007570xxxxxx02f93902219fxxxxxx02f93a007610xxxxxx02f93b024fa1xxxxxx02f93c024fb8xxxxxx02f93d025044xxxxxx02f93e003ffcxxxxxx02f93f004008xxxxxx02f9400076f4xxxxxx02f9410250f3xxxxxx02f9420250f2xxxxxx02f943025119xxxxxx02f944025133xxxxxx02f94500771exxxxxx02f94600771fxxxxxx02f94700771fxxxxxx02f94800774axxxxxx02f949004039xxxxxx02f94a00778bxxxxxx02f94b004046xxxxxx02f94c004096xxxxxx02f94d02541dxxxxxx02f94e00784exxxxxx02f94f00788cxxxxxx02f9500078ccxxxxxx02f9510040e3xxxxxx02f952025626xxxxxx02f953007956xxxxxx02f95402569axxxxxx02f9550256c5xxxxxx02f95600798fxxxxxx02f9570079ebxxxxxx02f95800412fxxxxxx02f959007a40xxxxxx02f95a007a4axxxxxx02f95b007a4fxxxxxx02f95c02597cxxxxxx02f95d025aa7xxxxxx02f95e025aa7xxxxxx02f95f007aeexxxxxx02f960004202xxxxxx02f961025babxxxxxx02f962007bc6xxxxxx02f963007bc9xxxxxx02f964004227xxxxxx02f965025c80xxxxxx02f966007cd2xxxxxx02f9670042a0xxxxxx02f968007ce8xxxxxx02f969007ce3xxxxxx02f96a007d00xxxxxx02f96b025f86xxxxxx02f96c007d63xxxxxx02f96d004301xxxxxx02f96e007dc7xxxxxx02f96f007e02xxxxxx02f970007e45xxxxxx02f971004334xxxxxx02f972026228xxxxxx02f973026247xxxxxx02f974004359xxxxxx02f9750262d9xxxxxx02f976007f7axxxxxx02f97702633exxxxxx02f978007f95xxxxxx02f979007ffaxxxxxx02f97a008005xxxxxx02f97b0264daxxxxxx02f97c026523xxxxxx02f97d008060xxxxxx02f97e0265a8xxxxxx02f97f008070xxxxxx02f98002335fxxxxxx02f9810043d5xxxxxx02f9820080b2xxxxxx02f983008103xxxxxx02f98400440bxxxxxx02f98500813exxxxxx02f986005ab5xxxxxx02f9870267a7xxxxxx02f9880267b5xxxxxx02f989023393xxxxxx02f98a02339cxxxxxx02f98b008201xxxxxx02f98c008204xxxxxx02f98d008f9exxxxxx02f98e00446bxxxxxx02f98f008291xxxxxx02f99000828bxxxxxx02f99100829dxxxxxx02f9920052b3xxxxxx02f9930082b1xxxxxx02f9940082b3xxxxxx02f9950082bdxxxxxx02f9960082e6xxxxxx02f997026b3cxxxxxx02f9980082e5xxxxxx02f99900831dxxxxxx02f99a008363xxxxxx02f99b0083adxxxxxx02f99c008323xxxxxx02f99d0083bdxxxxxx02f99e0083e7xxxxxx02f99f008457xxxxxx02f9a0008353xxxxxx02f9a10083caxxxxxx02f9a20083ccxxxxxx02f9a30083dcxxxxxx02f9a4026c36xxxxxx02f9a5026d6bxxxxxx02f9a6026cd5xxxxxx02f9a700452bxxxxxx02f9a80084f1xxxxxx02f9a90084f3xxxxxx02f9aa008516xxxxxx02f9ab0273caxxxxxx02f9ac008564xxxxxx02f9ad026f2cxxxxxx02f9ae00455dxxxxxx02f9af004561xxxxxx02f9b0026fb1xxxxxx02f9b10270d2xxxxxx02f9b200456bxxxxxx02f9b3008650xxxxxx02f9b400865cxxxxxx02f9b5008667xxxxxx02f9b6008669xxxxxx02f9b70086a9xxxxxx02f9b8008688xxxxxx02f9b900870exxxxxx02f9ba0086e2xxxxxx02f9bb008779xxxxxx02f9bc008728xxxxxx02f9bd00876bxxxxxx02f9be008786xxxxxx02f9bf0045d7xxxxxx02f9c00087e1xxxxxx02f9c1008801xxxxxx02f9c20045f9xxxxxx02f9c3008860xxxxxx02f9c4008863xxxxxx02f9c5027667xxxxxx02f9c60088d7xxxxxx02f9c70088dexxxxxx02f9c8004635xxxxxx02f9c90088faxxxxxx02f9ca0034bbxxxxxx02f9cb0278aexxxxxx02f9cc027966xxxxxx02f9cd0046bexxxxxx02f9ce0046c7xxxxxx02f9cf008aa0xxxxxx02f9d0008aedxxxxxx02f9d1008b8axxxxxx02f9d2008c55xxxxxx02f9d3027ca8xxxxxx02f9d4008cabxxxxxx02f9d5008cc1xxxxxx02f9d6008d1bxxxxxx02f9d7008d77xxxxxx02f9d8027f2fxxxxxx02f9d9020804xxxxxx02f9da008dcbxxxxxx02f9db008dbcxxxxxx02f9dc008df0xxxxxx02f9dd0208dexxxxxx02f9de008ed4xxxxxx02f9df008f38xxxxxx02f9e00285d2xxxxxx02f9e10285edxxxxxx02f9e2009094xxxxxx02f9e30090f1xxxxxx02f9e4009111xxxxxx02f9e502872exxxxxx02f9e600911bxxxxxx02f9e7009238xxxxxx02f9e80092d7xxxxxx02f9e90092d8xxxxxx02f9ea00927cxxxxxx02f9eb0093f9xxxxxx02f9ec009415xxxxxx02f9ed028bfaxxxxxx02f9ee00958bxxxxxx02f9ef004995xxxxxx02f9f00095b7xxxxxx02f9f1028d77xxxxxx02f9f20049e6xxxxxx02f9f30096c3xxxxxx02f9f4005db2xxxxxx02f9f5009723xxxxxx02f9f6029145xxxxxx02f9f702921axxxxxx02f9f8004a6exxxxxx02f9f9004a76xxxxxx02f9fa0097e0xxxxxx02f9fb02940axxxxxx02f9fc004ab2xxxxxx02f9fd029496xxxxxx02f9fe00980bxxxxxx02f9ff00980bxxxxxx02fa00009829xxxxxx02fa010295b6xxxxxx02fa020098e2xxxxxx02fa03004b33xxxxxx02fa04009929xxxxxx02fa050099a7xxxxxx02fa060099c2xxxxxx02fa070099fexxxxxx02fa08004bcexxxxxx02fa09029b30xxxxxx02fa0a009b12xxxxxx02fa0b009c40xxxxxx02fa0c009cfdxxxxxx02fa0d004ccexxxxxx02fa0e004cedxxxxxx02fa0f009d67xxxxxx02fa1002a0cexxxxxx02fa11004cf8xxxxxx02fa1202a105xxxxxx02fa1302a20exxxxxx02fa1402a291xxxxxx02fa15009ebbxxxxxx02fa16004d56xxxxxx02fa17009ef9xxxxxx02fa18009efexxxxxx02fa19009f05xxxxxx02fa1a009f0fxxxxxx02fa1b009f16xxxxxx02fa1c009f3bxxxxxx02fa1d02a600xxxxxx
@@ -0,0 +1 @@
1
+ 00034000034100034300034400037400037e00038700095800095900095a00095b00095c00095d00095e00095f0009dc0009dd0009df000a33000a36000a59000a5a000a5b000a5e000b5c000b5d000f43000f4d000f52000f57000f5c000f69000f73000f75000f76000f78000f81000f93000f9d000fa2000fa7000fac000fb9001f71001f73001f75001f77001f79001f7b001f7d001fbb001fbe001fc9001fcb001fd3001fdb001fe3001feb001fee001fef001ff9001ffb001ffd00200000200100212600212a00212b00232900232a002adc00f90000f90100f90200f90300f90400f90500f90600f90700f90800f90900f90a00f90b00f90c00f90d00f90e00f90f00f91000f91100f91200f91300f91400f91500f91600f91700f91800f91900f91a00f91b00f91c00f91d00f91e00f91f00f92000f92100f92200f92300f92400f92500f92600f92700f92800f92900f92a00f92b00f92c00f92d00f92e00f92f00f93000f93100f93200f93300f93400f93500f93600f93700f93800f93900f93a00f93b00f93c00f93d00f93e00f93f00f94000f94100f94200f94300f94400f94500f94600f94700f94800f94900f94a00f94b00f94c00f94d00f94e00f94f00f95000f95100f95200f95300f95400f95500f95600f95700f95800f95900f95a00f95b00f95c00f95d00f95e00f95f00f96000f96100f96200f96300f96400f96500f96600f96700f96800f96900f96a00f96b00f96c00f96d00f96e00f96f00f97000f97100f97200f97300f97400f97500f97600f97700f97800f97900f97a00f97b00f97c00f97d00f97e00f97f00f98000f98100f98200f98300f98400f98500f98600f98700f98800f98900f98a00f98b00f98c00f98d00f98e00f98f00f99000f99100f99200f99300f99400f99500f99600f99700f99800f99900f99a00f99b00f99c00f99d00f99e00f99f00f9a000f9a100f9a200f9a300f9a400f9a500f9a600f9a700f9a800f9a900f9aa00f9ab00f9ac00f9ad00f9ae00f9af00f9b000f9b100f9b200f9b300f9b400f9b500f9b600f9b700f9b800f9b900f9ba00f9bb00f9bc00f9bd00f9be00f9bf00f9c000f9c100f9c200f9c300f9c400f9c500f9c600f9c700f9c800f9c900f9ca00f9cb00f9cc00f9cd00f9ce00f9cf00f9d000f9d100f9d200f9d300f9d400f9d500f9d600f9d700f9d800f9d900f9da00f9db00f9dc00f9dd00f9de00f9df00f9e000f9e100f9e200f9e300f9e400f9e500f9e600f9e700f9e800f9e900f9ea00f9eb00f9ec00f9ed00f9ee00f9ef00f9f000f9f100f9f200f9f300f9f400f9f500f9f600f9f700f9f800f9f900f9fa00f9fb00f9fc00f9fd00f9fe00f9ff00fa0000fa0100fa0200fa0300fa0400fa0500fa0600fa0700fa0800fa0900fa0a00fa0b00fa0c00fa0d00fa1000fa1200fa1500fa1600fa1700fa1800fa1900fa1a00fa1b00fa1c00fa1d00fa1e00fa2000fa2200fa2500fa2600fa2a00fa2b00fa2c00fa2d00fa3000fa3100fa3200fa3300fa3400fa3500fa3600fa3700fa3800fa3900fa3a00fa3b00fa3c00fa3d00fa3e00fa3f00fa4000fa4100fa4200fa4300fa4400fa4500fa4600fa4700fa4800fa4900fa4a00fa4b00fa4c00fa4d00fa4e00fa4f00fa5000fa5100fa5200fa5300fa5400fa5500fa5600fa5700fa5800fa5900fa5a00fa5b00fa5c00fa5d00fa5e00fa5f00fa6000fa6100fa6200fa6300fa6400fa6500fa6600fa6700fa6800fa6900fa6a00fa7000fa7100fa7200fa7300fa7400fa7500fa7600fa7700fa7800fa7900fa7a00fa7b00fa7c00fa7d00fa7e00fa7f00fa8000fa8100fa8200fa8300fa8400fa8500fa8600fa8700fa8800fa8900fa8a00fa8b00fa8c00fa8d00fa8e00fa8f00fa9000fa9100fa9200fa9300fa9400fa9500fa9600fa9700fa9800fa9900fa9a00fa9b00fa9c00fa9d00fa9e00fa9f00faa000faa100faa200faa300faa400faa500faa600faa700faa800faa900faaa00faab00faac00faad00faae00faaf00fab000fab100fab200fab300fab400fab500fab600fab700fab800fab900faba00fabb00fabc00fabd00fabe00fabf00fac000fac100fac200fac300fac400fac500fac600fac700fac800fac900faca00facb00facc00facd00face00facf00fad000fad100fad200fad300fad400fad500fad600fad700fad800fad900fb1d00fb1f00fb2a00fb2b00fb2c00fb2d00fb2e00fb2f00fb3000fb3100fb3200fb3300fb3400fb3500fb3600fb3800fb3900fb3a00fb3b00fb3c00fb3e00fb4000fb4100fb4300fb4400fb4600fb4700fb4800fb4900fb4a00fb4b00fb4c00fb4d00fb4e01d15e01d15f01d16001d16101d16201d16301d16401d1bb01d1bc01d1bd01d1be01d1bf01d1c002f80002f80102f80202f80302f80402f80502f80602f80702f80802f80902f80a02f80b02f80c02f80d02f80e02f80f02f81002f81102f81202f81302f81402f81502f81602f81702f81802f81902f81a02f81b02f81c02f81d02f81e02f81f02f82002f82102f82202f82302f82402f82502f82602f82702f82802f82902f82a02f82b02f82c02f82d02f82e02f82f02f83002f83102f83202f83302f83402f83502f83602f83702f83802f83902f83a02f83b02f83c02f83d02f83e02f83f02f84002f84102f84202f84302f84402f84502f84602f84702f84802f84902f84a02f84b02f84c02f84d02f84e02f84f02f85002f85102f85202f85302f85402f85502f85602f85702f85802f85902f85a02f85b02f85c02f85d02f85e02f85f02f86002f86102f86202f86302f86402f86502f86602f86702f86802f86902f86a02f86b02f86c02f86d02f86e02f86f02f87002f87102f87202f87302f87402f87502f87602f87702f87802f87902f87a02f87b02f87c02f87d02f87e02f87f02f88002f88102f88202f88302f88402f88502f88602f88702f88802f88902f88a02f88b02f88c02f88d02f88e02f88f02f89002f89102f89202f89302f89402f89502f89602f89702f89802f89902f89a02f89b02f89c02f89d02f89e02f89f02f8a002f8a102f8a202f8a302f8a402f8a502f8a602f8a702f8a802f8a902f8aa02f8ab02f8ac02f8ad02f8ae02f8af02f8b002f8b102f8b202f8b302f8b402f8b502f8b602f8b702f8b802f8b902f8ba02f8bb02f8bc02f8bd02f8be02f8bf02f8c002f8c102f8c202f8c302f8c402f8c502f8c602f8c702f8c802f8c902f8ca02f8cb02f8cc02f8cd02f8ce02f8cf02f8d002f8d102f8d202f8d302f8d402f8d502f8d602f8d702f8d802f8d902f8da02f8db02f8dc02f8dd02f8de02f8df02f8e002f8e102f8e202f8e302f8e402f8e502f8e602f8e702f8e802f8e902f8ea02f8eb02f8ec02f8ed02f8ee02f8ef02f8f002f8f102f8f202f8f302f8f402f8f502f8f602f8f702f8f802f8f902f8fa02f8fb02f8fc02f8fd02f8fe02f8ff02f90002f90102f90202f90302f90402f90502f90602f90702f90802f90902f90a02f90b02f90c02f90d02f90e02f90f02f91002f91102f91202f91302f91402f91502f91602f91702f91802f91902f91a02f91b02f91c02f91d02f91e02f91f02f92002f92102f92202f92302f92402f92502f92602f92702f92802f92902f92a02f92b02f92c02f92d02f92e02f92f02f93002f93102f93202f93302f93402f93502f93602f93702f93802f93902f93a02f93b02f93c02f93d02f93e02f93f02f94002f94102f94202f94302f94402f94502f94602f94702f94802f94902f94a02f94b02f94c02f94d02f94e02f94f02f95002f95102f95202f95302f95402f95502f95602f95702f95802f95902f95a02f95b02f95c02f95d02f95e02f95f02f96002f96102f96202f96302f96402f96502f96602f96702f96802f96902f96a02f96b02f96c02f96d02f96e02f96f02f97002f97102f97202f97302f97402f97502f97602f97702f97802f97902f97a02f97b02f97c02f97d02f97e02f97f02f98002f98102f98202f98302f98402f98502f98602f98702f98802f98902f98a02f98b02f98c02f98d02f98e02f98f02f99002f99102f99202f99302f99402f99502f99602f99702f99802f99902f99a02f99b02f99c02f99d02f99e02f99f02f9a002f9a102f9a202f9a302f9a402f9a502f9a602f9a702f9a802f9a902f9aa02f9ab02f9ac02f9ad02f9ae02f9af02f9b002f9b102f9b202f9b302f9b402f9b502f9b602f9b702f9b802f9b902f9ba02f9bb02f9bc02f9bd02f9be02f9bf02f9c002f9c102f9c202f9c302f9c402f9c502f9c602f9c702f9c802f9c902f9ca02f9cb02f9cc02f9cd02f9ce02f9cf02f9d002f9d102f9d202f9d302f9d402f9d502f9d602f9d702f9d802f9d902f9da02f9db02f9dc02f9dd02f9de02f9df02f9e002f9e102f9e202f9e302f9e402f9e502f9e602f9e702f9e802f9e902f9ea02f9eb02f9ec02f9ed02f9ee02f9ef02f9f002f9f102f9f202f9f302f9f402f9f502f9f602f9f702f9f802f9f902f9fa02f9fb02f9fc02f9fd02f9fe02f9ff02fa0002fa0102fa0202fa0302fa0402fa0502fa0602fa0702fa0802fa0902fa0a02fa0b02fa0c02fa0d02fa0e02fa0f02fa1002fa1102fa1202fa1302fa1402fa1502fa1602fa1702fa1802fa1902fa1a02fa1b02fa1c02fa1d
@@ -0,0 +1,66 @@
1
+ 001100G
2
+ 001101GG
3
+ 001102N
4
+ 001103D
5
+ 001104DD
6
+ 001105R
7
+ 001106M
8
+ 001107B
9
+ 001108BB
10
+ 001109S
11
+ 00110aSS
12
+ 00110cJ
13
+ 00110dJJ
14
+ 00110eC
15
+ 00110fK
16
+ 001110T
17
+ 001111P
18
+ 001112H
19
+ 001161A
20
+ 001162AE
21
+ 001163YA
22
+ 001164YAE
23
+ 001165EO
24
+ 001166E
25
+ 001167YEO
26
+ 001168YE
27
+ 001169O
28
+ 00116aWA
29
+ 00116bWAE
30
+ 00116cOE
31
+ 00116dYO
32
+ 00116eU
33
+ 00116fWEO
34
+ 001170WE
35
+ 001171WI
36
+ 001172YU
37
+ 001173EU
38
+ 001174YI
39
+ 001175I
40
+ 0011a8G
41
+ 0011a9GG
42
+ 0011aaGS
43
+ 0011abN
44
+ 0011acNJ
45
+ 0011adNH
46
+ 0011aeD
47
+ 0011afL
48
+ 0011b0LG
49
+ 0011b1LM
50
+ 0011b2LB
51
+ 0011b3LS
52
+ 0011b4LT
53
+ 0011b5LP
54
+ 0011b6LH
55
+ 0011b7M
56
+ 0011b8B
57
+ 0011b9BS
58
+ 0011baS
59
+ 0011bbSS
60
+ 0011bcNG
61
+ 0011bdJ
62
+ 0011beC
63
+ 0011bfK
64
+ 0011c0T
65
+ 0011c1P
66
+ 0011c2H
data/cdata/names CHANGED
@@ -10969,8 +10969,6 @@
10969
10969
  0033fdIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
10970
10970
  0033feIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
10971
10971
  0033ffSQUARE GAL
10972
- 003400<CJK Ideograph Extension A, First>
10973
- 004db5<CJK Ideograph Extension A, Last>
10974
10972
  004dc0HEXAGRAM FOR THE CREATIVE HEAVEN
10975
10973
  004dc1HEXAGRAM FOR THE RECEPTIVE EARTH
10976
10974
  004dc2HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
@@ -11035,8 +11033,6 @@
11035
11033
  004dfdHEXAGRAM FOR SMALL PREPONDERANCE
11036
11034
  004dfeHEXAGRAM FOR AFTER COMPLETION
11037
11035
  004dffHEXAGRAM FOR BEFORE COMPLETION
11038
- 004e00<CJK Ideograph, First>
11039
- 009fc3<CJK Ideograph, Last>
11040
11036
  00a000YI SYLLABLE IT
11041
11037
  00a001YI SYLLABLE IX
11042
11038
  00a002YI SYLLABLE I
@@ -13130,16 +13126,6 @@
13130
13126
  00aa5dCHAM PUNCTUATION DANDA
13131
13127
  00aa5eCHAM PUNCTUATION DOUBLE DANDA
13132
13128
  00aa5fCHAM PUNCTUATION TRIPLE DANDA
13133
- 00ac00<Hangul Syllable, First>
13134
- 00d7a3<Hangul Syllable, Last>
13135
- 00d800<Non Private Use High Surrogate, First>
13136
- 00db7f<Non Private Use High Surrogate, Last>
13137
- 00db80<Private Use High Surrogate, First>
13138
- 00dbff<Private Use High Surrogate, Last>
13139
- 00dc00<Low Surrogate, First>
13140
- 00dfff<Low Surrogate, Last>
13141
- 00e000<Private Use, First>
13142
- 00f8ff<Private Use, Last>
13143
13129
  00f900CJK COMPATIBILITY IDEOGRAPH-F900
13144
13130
  00f901CJK COMPATIBILITY IDEOGRAPH-F901
13145
13131
  00f902CJK COMPATIBILITY IDEOGRAPH-F902
@@ -18449,8 +18435,6 @@
18449
18435
  01f091DOMINO TILE VERTICAL-06-04
18450
18436
  01f092DOMINO TILE VERTICAL-06-05
18451
18437
  01f093DOMINO TILE VERTICAL-06-06
18452
- 020000<CJK Ideograph Extension B, First>
18453
- 02a6d6<CJK Ideograph Extension B, Last>
18454
18438
  02f800CJK COMPATIBILITY IDEOGRAPH-2F800
18455
18439
  02f801CJK COMPATIBILITY IDEOGRAPH-2F801
18456
18440
  02f802CJK COMPATIBILITY IDEOGRAPH-2F802
@@ -19330,7 +19314,3 @@
19330
19314
  0e01edVARIATION SELECTOR-254
19331
19315
  0e01eeVARIATION SELECTOR-255
19332
19316
  0e01efVARIATION SELECTOR-256
19333
- 0f0000<Plane 15 Private Use, First>
19334
- 0ffffd<Plane 15 Private Use, Last>
19335
- 100000<Plane 16 Private Use, First>
19336
- 10fffd<Plane 16 Private Use, Last>
@@ -0,0 +1,86 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/read_multivalued_map"
4
+ require "unicode_utils/hangul_syllable_decomposition"
5
+ require "unicode_utils/combining_class"
6
+
7
+ module UnicodeUtils
8
+
9
+ CANONICAL_DECOMPOSITION_MAP =
10
+ Impl.read_multivalued_map("canonical_decomposition_map") # :nodoc:
11
+
12
+ # Get the canonical decomposition of the given string, also called
13
+ # Normalization Form D or short NFD.
14
+ #
15
+ # The Unicode standard has multiple representations for some
16
+ # characters. One representation as a single codepoint and other
17
+ # representation(s) as a combination of multiple codepoints. This
18
+ # function "decomposes" these characters in +str+ into the latter
19
+ # representation.
20
+ #
21
+ # Example:
22
+ #
23
+ # # LATIN SMALL LETTER A WITH ACUTE => LATIN SMALL LETTER A, COMBINING ACUTE ACCENT
24
+ # UnicodeUtils.canonical_decomposition("\u{E1}") => "\u{61}\u{301}"
25
+ def canonical_decomposition(str)
26
+ res = String.new.force_encoding(str.encoding)
27
+ str.each_codepoint { |cp|
28
+ if cp >= 0xAC00 && cp <= 0xD7A3 # hangul syllable
29
+ Impl.append_hangul_syllable_decomposition(res, cp)
30
+ else
31
+ Impl.append_recursive_canonical_decomposition_mapping(res, cp)
32
+ end
33
+ }
34
+ Impl.put_into_canonical_order(res)
35
+ end
36
+ module_function :canonical_decomposition
37
+
38
+ module Impl # :nodoc:
39
+
40
+ def self.append_recursive_canonical_decomposition_mapping(str, cp)
41
+ mapping = CANONICAL_DECOMPOSITION_MAP[cp]
42
+ if mapping
43
+ mapping.each { |c|
44
+ append_recursive_canonical_decomposition_mapping(str, c)
45
+ }
46
+ else
47
+ str << cp
48
+ end
49
+ end
50
+
51
+ def self.put_into_canonical_order(str)
52
+ reorder_needed = false
53
+ last_cp = nil
54
+ str.each_codepoint { |cp|
55
+ if last_cp
56
+ cc = COMBINING_CLASS_MAP[cp] || 0
57
+ if cc != 0
58
+ if (COMBINING_CLASS_MAP[last_cp] || 0) > cc
59
+ reorder_needed = true
60
+ break
61
+ end
62
+ end
63
+ end
64
+ last_cp = cp
65
+ }
66
+ return str unless reorder_needed
67
+ res = String.new.force_encoding(str.encoding)
68
+ last_cp = nil
69
+ str.each_codepoint { |cp|
70
+ if last_cp
71
+ cc = COMBINING_CLASS_MAP[cp] || 0
72
+ if cc != 0 && (COMBINING_CLASS_MAP[last_cp] || 0) > cc
73
+ res << cp
74
+ cp = nil
75
+ end
76
+ res << last_cp
77
+ end
78
+ last_cp = cp
79
+ }
80
+ res << last_cp if last_cp
81
+ put_into_canonical_order(res)
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+
5
+ module UnicodeUtils
6
+
7
+ # The strings +a+ and +b+ are canonical equivalents if their
8
+ # canonical decompositions are equal.
9
+ #
10
+ # Example:
11
+ #
12
+ # UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste") => true
13
+ # UnicodeUtils.canonical_equivalents?("Äste", "Aste") => false
14
+ def canonical_equivalents?(a, b)
15
+ UnicodeUtils.canonical_decomposition(a) ==
16
+ UnicodeUtils.canonical_decomposition(b)
17
+ end
18
+ module_function :canonical_equivalents?
19
+
20
+ end
@@ -22,7 +22,7 @@ module UnicodeUtils
22
22
 
23
23
  end
24
24
 
25
- COMBINING_CLASS_MAP = Impl.read_combining_class_map # :nodoc:
25
+ COMBINING_CLASS_MAP = Impl.read_combining_class_map() # :nodoc:
26
26
 
27
27
  # Get the combining class of the given character as an integer in
28
28
  # the range 0..255.
@@ -7,9 +7,9 @@ require "unicode_utils/combining_class"
7
7
 
8
8
  module UnicodeUtils
9
9
 
10
- module Impl # :nodoc:
10
+ module Impl # :nodoc:all
11
11
 
12
- class ConditionalCasing # :nodoc:
12
+ class ConditionalCasing
13
13
 
14
14
  attr_reader :mapping
15
15
 
@@ -23,7 +23,7 @@ module UnicodeUtils
23
23
 
24
24
  end
25
25
 
26
- class BeforeDotConditionalCasing < ConditionalCasing # :nodoc:
26
+ class BeforeDotConditionalCasing < ConditionalCasing
27
27
 
28
28
  def context_match?(str, pos)
29
29
  (pos + 1).upto(str.length - 1) { |i|
@@ -37,7 +37,7 @@ module UnicodeUtils
37
37
 
38
38
  end
39
39
 
40
- class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing # :nodoc:
40
+ class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing
41
41
 
42
42
  def context_match?(str, pos)
43
43
  !super
@@ -45,7 +45,7 @@ module UnicodeUtils
45
45
 
46
46
  end
47
47
 
48
- class MoreAboveConditionalCasing < ConditionalCasing # :nodoc:
48
+ class MoreAboveConditionalCasing < ConditionalCasing
49
49
 
50
50
  def context_match?(str, pos)
51
51
  (pos + 1).upto(str.length - 1) { |i|
@@ -59,7 +59,7 @@ module UnicodeUtils
59
59
 
60
60
  end
61
61
 
62
- class AfterIConditionalCasing < ConditionalCasing # :nodoc:
62
+ class AfterIConditionalCasing < ConditionalCasing
63
63
 
64
64
  def context_match?(str, pos)
65
65
  (pos - 1).downto(0) { |i|
@@ -73,7 +73,7 @@ module UnicodeUtils
73
73
 
74
74
  end
75
75
 
76
- class AfterSoftDottedConditionalCasing < ConditionalCasing # :nodoc:
76
+ class AfterSoftDottedConditionalCasing < ConditionalCasing
77
77
 
78
78
  def context_match?(str, pos)
79
79
  (pos - 1).downto(0) { |i|
@@ -87,7 +87,7 @@ module UnicodeUtils
87
87
 
88
88
  end
89
89
 
90
- class FinalSigmaConditionalCasing < ConditionalCasing # :nodoc:
90
+ class FinalSigmaConditionalCasing < ConditionalCasing
91
91
 
92
92
  def context_match?(str, pos)
93
93
  before_match?(str, pos) && !after_match?(str, pos)
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require "unicode_utils/simple_downcase"
4
- require "unicode_utils/read_special_casing_map"
4
+ require "unicode_utils/read_multivalued_map"
5
5
  require "unicode_utils/conditional_casing"
6
6
 
7
7
  module UnicodeUtils
8
8
 
9
- SPECIAL_DOWNCASE_MAP = Impl.read_special_casing_map("special_lc_map") # :nodoc:
9
+ SPECIAL_DOWNCASE_MAP = Impl.read_multivalued_map("special_lc_map") # :nodoc:
10
10
 
11
11
  # Perform a full case-conversion of +str+ to lowercase according to
12
12
  # the Unicode standard.
@@ -0,0 +1,44 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module UnicodeUtils
4
+
5
+ # Derives the canonical decomposition of the given Hangul syllable.
6
+ #
7
+ # Example:
8
+ #
9
+ # UnicodeUtils.hangul_syllable_decomposition("\u{d4db}") => "\u{1111}\u{1171}\u{11b6}"
10
+ def hangul_syllable_decomposition(char)
11
+ Impl.append_hangul_syllable_decomposition(
12
+ String.new.force_encoding(char.encoding), char.ord)
13
+ end
14
+ module_function :hangul_syllable_decomposition
15
+
16
+ module Impl # :nodoc:
17
+
18
+ def self.append_hangul_syllable_decomposition(str, s)
19
+ # constants
20
+ sbase = 0xAC00
21
+ lbase = 0x1100
22
+ vbase = 0x1161
23
+ tbase = 0x11A7
24
+ scount = 11172
25
+ lcount = 19
26
+ vcount = 21
27
+ tcount = 28
28
+ ncount = vcount * tcount
29
+
30
+ sindex = s - sbase
31
+ if 0 <= sindex && sindex < scount
32
+ l = lbase + sindex / ncount
33
+ v = vbase + (sindex % ncount) / tcount
34
+ t = tbase + sindex % tcount
35
+ str << l << v
36
+ str << t if t != tbase
37
+ else
38
+ str << s
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/read_names"
4
+
5
+ module UnicodeUtils
6
+
7
+ JAMO_SHORT_NAME_MAP = Impl.read_names("jamo_short_names") # :nodoc:
8
+
9
+ # The the Jamo Short Name property of the given character (defaults
10
+ # to nil).
11
+ #
12
+ # Example:
13
+ #
14
+ # UnicodeUtils.jamo_short_name("\u{1101}") => "GG"
15
+ def jamo_short_name(char)
16
+ JAMO_SHORT_NAME_MAP[char.ord]
17
+ end
18
+ module_function :jamo_short_name
19
+
20
+ end
@@ -1,33 +1,38 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- module UnicodeUtils
4
-
5
- module Impl # :nodoc:
3
+ require "unicode_utils/read_names"
4
+ require "unicode_utils/hangul_syllable_decomposition"
5
+ require "unicode_utils/jamo_short_name"
6
6
 
7
- def self.read_names
8
- path = File.join(File.dirname(__FILE__), "..", "..", "cdata", "names")
9
- Hash.new.tap { |map|
10
- File.open(path, "r:US-ASCII:-") do |input|
11
- buffer = "x" * 6
12
- buffer.force_encoding(Encoding::US_ASCII)
13
- while input.read(6, buffer)
14
- map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
15
- end
16
- end
17
- }
18
- end
19
-
20
- end
7
+ module UnicodeUtils
21
8
 
22
- NAME_MAP = Impl.read_names # :nodoc:
9
+ NAME_MAP = Impl.read_names("names") # :nodoc:
23
10
 
24
- # Get the Unicode name of the single codepoint in str.
11
+ # Get the normative Unicode name of the given character.
12
+ #
13
+ # Private Use codepoints have no name, this function returns nil for
14
+ # such codepoints.
15
+ #
16
+ # All control characters have the special name "<control>". All
17
+ # other characters have a unique name.
25
18
  #
26
19
  # Example:
27
20
  #
28
21
  # UnicodeUtils.name "ᾀ" => "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"
29
- def name(str)
30
- NAME_MAP[str.codepoints.first]
22
+ # UnicodeUtils.name "\t" => "<control>"
23
+ def name(char)
24
+ cp = char.ord
25
+ NAME_MAP[cp] ||
26
+ case cp
27
+ when 0x3400..0x4DB5, 0x4E00..0x9FC3, 0x20000..0x2A6D6
28
+ "CJK UNIFIED IDEOGRAPH-#{sprintf('%04x', cp).upcase}"
29
+ when 0xAC00..0xD7A3
30
+ "HANGUL SYLLABLE ".tap do |n|
31
+ hangul_syllable_decomposition(char).each_char { |c|
32
+ n << (jamo_short_name(c) || '')
33
+ }
34
+ end
35
+ end
31
36
  end
32
37
  module_function :name
33
38
 
@@ -0,0 +1,142 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+ require "unicode_utils/combining_class"
5
+ require "unicode_utils/read_codepoint_set"
6
+
7
+ module UnicodeUtils
8
+
9
+ module Impl # :nodoc:all
10
+
11
+ COMPOSITION_EXCLUSION_SET =
12
+ Impl.read_codepoint_set("composition_exclusion_set")
13
+
14
+ CANONICAL_COMPOSITION_MAP = Hash.new.tap do |m|
15
+ CANONICAL_DECOMPOSITION_MAP.each_pair { |comp, decomp|
16
+ if decomp.length == 2
17
+ (m[decomp[0]] ||= {})[decomp[1]] = comp
18
+ end
19
+ }
20
+ end
21
+
22
+ module NFC
23
+
24
+ def self.starter?(cp)
25
+ (COMBINING_CLASS_MAP[cp] || 0) == 0
26
+ end
27
+
28
+ # does b block c?
29
+ def self.blocked?(b, c)
30
+ # From the standard:
31
+ # "If a combining character sequence is in canonical order,
32
+ # then testing whether a character is blocked requires looking
33
+ # at only the immediately preceding character."
34
+ # cpary is in canonical order (since it comes out of
35
+ # canonical_decomposition).
36
+ (COMBINING_CLASS_MAP[b] || 0) >= (COMBINING_CLASS_MAP[c] || 0)
37
+ end
38
+
39
+ def self.primary_composite?(cp)
40
+ unless CANONICAL_DECOMPOSITION_MAP[cp] ||
41
+ # has hangul syllable decomposition?
42
+ (cp >= 0xAC00 && cp <= 0xD7A3)
43
+ return false
44
+ end
45
+ !COMPOSITION_EXCLUSION_SET.include?(cp)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ # Get +str+ in Normalization Form C.
53
+ #
54
+ # The Unicode standard has multiple representations for some
55
+ # characters. One representation as a single codepoint and other
56
+ # representation(s) as a combination of multiple codepoints. This
57
+ # function "composes" these characters into the former
58
+ # representation.
59
+ #
60
+ # Example:
61
+ #
62
+ # UnicodeUtils.nfc("La\u{308}mpchen") => "Lämpchen"
63
+ def nfc(str)
64
+ str = UnicodeUtils.canonical_decomposition(str)
65
+
66
+ ### constants for hangul composition ###
67
+ sbase = 0xAC00
68
+ lbase = 0x1100
69
+ vbase = 0x1161
70
+ tbase = 0x11A7
71
+ lcount = 19
72
+ vcount = 21
73
+ tcount = 28
74
+ ncount = vcount * tcount
75
+ scount = lcount * ncount
76
+ ########################################
77
+
78
+ String.new.force_encoding(str.encoding).tap do |res|
79
+ last_starter = nil
80
+ uncomposable_non_starters = []
81
+ str.each_codepoint { |cp|
82
+ if Impl::NFC.starter?(cp)
83
+ combined = false
84
+ if last_starter && uncomposable_non_starters.empty?
85
+ ### hangul ###
86
+ lindex = last_starter - lbase
87
+ if 0 <= lindex && lindex < lcount
88
+ vindex = cp - vbase
89
+ if 0 <= vindex && vindex <= vcount
90
+ last_starter =
91
+ sbase + (lindex * vcount + vindex) * tcount
92
+ combined = true
93
+ end
94
+ end
95
+ unless combined
96
+ sindex = last_starter - sbase
97
+ if 0 <= sindex && sindex < scount && (sindex % tcount) == 0
98
+ tindex = cp - tbase
99
+ if 0 <= tindex && tindex < tcount
100
+ last_starter += tindex
101
+ combined = true
102
+ end
103
+ end
104
+ end
105
+ ##############
106
+ unless combined
107
+ map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
108
+ composition = map && map[cp]
109
+ if composition && Impl::NFC.primary_composite?(composition)
110
+ last_starter = composition
111
+ combined = true
112
+ end
113
+ end
114
+ end
115
+ unless combined
116
+ res << last_starter if last_starter
117
+ uncomposable_non_starters.each { |nc| res << nc }
118
+ uncomposable_non_starters.clear
119
+ last_starter = cp
120
+ end
121
+ else
122
+ last_non_starter = uncomposable_non_starters.last
123
+ if last_non_starter && Impl::NFC.blocked?(last_non_starter, cp)
124
+ uncomposable_non_starters << cp
125
+ else
126
+ map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
127
+ composition = map && map[cp]
128
+ if composition && Impl::NFC.primary_composite?(composition)
129
+ last_starter = composition
130
+ else
131
+ uncomposable_non_starters << cp
132
+ end
133
+ end
134
+ end
135
+ }
136
+ res << last_starter if last_starter
137
+ uncomposable_non_starters.each { |nc| res << nc }
138
+ end
139
+ end
140
+ module_function :nfc
141
+
142
+ end
@@ -0,0 +1,15 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+
5
+ module UnicodeUtils
6
+
7
+ # Get +str+ in Normalization Form D.
8
+ #
9
+ # Alias for UnicodeUtils.canonical_decomposition.
10
+ def nfd(str)
11
+ UnicodeUtils.canonical_decomposition(str)
12
+ end
13
+ module_function :nfd
14
+
15
+ end
@@ -4,7 +4,7 @@ module UnicodeUtils
4
4
 
5
5
  module Impl # :nodoc:
6
6
 
7
- def self.read_special_casing_map(filename)
7
+ def self.read_multivalued_map(filename)
8
8
  path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
9
9
  Hash.new.tap { |map|
10
10
  File.open(path, "r:US-ASCII:-") do |input|
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module UnicodeUtils
4
+
5
+ module Impl # :nodoc:
6
+
7
+ def self.read_names(filename)
8
+ path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
9
+ Hash.new.tap { |map|
10
+ File.open(path, "r:US-ASCII:-") do |input|
11
+ buffer = "x" * 6
12
+ buffer.force_encoding(Encoding::US_ASCII)
13
+ while input.read(6, buffer)
14
+ map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
15
+ end
16
+ end
17
+ }
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require "unicode_utils/simple_upcase"
4
- require "unicode_utils/read_special_casing_map"
4
+ require "unicode_utils/read_multivalued_map"
5
5
  require "unicode_utils/conditional_casing"
6
6
 
7
7
  module UnicodeUtils
8
8
 
9
- SPECIAL_UPCASE_MAP = Impl.read_special_casing_map("special_uc_map") # :nodoc:
9
+ SPECIAL_UPCASE_MAP = Impl.read_multivalued_map("special_uc_map") # :nodoc:
10
10
 
11
11
  # Perform a full case-conversion of +str+ to uppercase according to
12
12
  # the Unicode standard.
@@ -3,6 +3,6 @@
3
3
  module UnicodeUtils
4
4
 
5
5
  # Corresponds to the unicode_utils gem version.
6
- VERSION = "0.2.0"
6
+ VERSION = "0.3.0"
7
7
 
8
8
  end
data/lib/unicode_utils.rb CHANGED
@@ -13,3 +13,21 @@ require "unicode_utils/cased_char_q"
13
13
  require "unicode_utils/case_ignorable_char_q"
14
14
  require "unicode_utils/soft_dotted_char_q"
15
15
  require "unicode_utils/combining_class"
16
+ require "unicode_utils/hangul_syllable_decomposition"
17
+ require "unicode_utils/jamo_short_name"
18
+ require "unicode_utils/canonical_decomposition"
19
+ require "unicode_utils/nfd"
20
+ require "unicode_utils/canonical_equivalents_q"
21
+ require "unicode_utils/nfc"
22
+
23
+ # Read the README[link:files/README_txt.html] for an introduction.
24
+ #
25
+ # Highlevel functions are:
26
+ #
27
+ # UnicodeUtils.upcase:: full conversion to uppercase
28
+ # UnicodeUtils.downcase:: full conversion to lowercase
29
+ # UnicodeUtils.nfd:: Normalization Form D
30
+ # UnicodeUtils.nfc:: Normalization Form C
31
+ # UnicodeUtils.name:: character names
32
+ module UnicodeUtils
33
+ end
@@ -0,0 +1,75 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "test/unit"
4
+
5
+ require "unicode_utils/nfd"
6
+ require "unicode_utils/nfc"
7
+
8
+ # See data/NormalizationTest.txt
9
+ class TestNormalization < Test::Unit::TestCase
10
+
11
+ class Record
12
+ def initialize(ary)
13
+ @ary = ary
14
+ end
15
+ def c1
16
+ @ary[0]
17
+ end
18
+ def c2
19
+ @ary[1]
20
+ end
21
+ def c3
22
+ @ary[2]
23
+ end
24
+ def c4
25
+ @ary[3]
26
+ end
27
+ def c5
28
+ @ary[4]
29
+ end
30
+ end
31
+
32
+ def each_testdata_record
33
+ fn = File.join(File.dirname(__FILE__),
34
+ "..", "data", "NormalizationTest.txt")
35
+ File.open(fn, "r:utf-8:-") do |input|
36
+ input.each_line { |line|
37
+ if line =~ /^([^#]*)#/
38
+ line = $1
39
+ end
40
+ line.strip!
41
+ next if line.empty? || line =~ /^@Part/
42
+ columns = line.split(";")
43
+ ary = columns.map { |column|
44
+ String.new.force_encoding(Encoding::UTF_8).tap do |str|
45
+ column.split(" ").each { |c|
46
+ str << c.strip.to_i(16)
47
+ }
48
+ end
49
+ }
50
+ yield Record.new(ary)
51
+ }
52
+ end
53
+ end
54
+
55
+ def test_nfd
56
+ each_testdata_record { |r|
57
+ assert_equal r.c3, UnicodeUtils.nfd(r.c1)
58
+ assert_equal r.c3, UnicodeUtils.nfd(r.c2)
59
+ assert_equal r.c3, UnicodeUtils.nfd(r.c3)
60
+ assert_equal r.c5, UnicodeUtils.nfd(r.c4)
61
+ assert_equal r.c5, UnicodeUtils.nfd(r.c5)
62
+ }
63
+ end
64
+
65
+ def test_nfc
66
+ each_testdata_record { |r|
67
+ assert_equal r.c2, UnicodeUtils.nfc(r.c1)
68
+ assert_equal r.c2, UnicodeUtils.nfc(r.c2)
69
+ assert_equal r.c2, UnicodeUtils.nfc(r.c3)
70
+ assert_equal r.c4, UnicodeUtils.nfc(r.c4)
71
+ assert_equal r.c4, UnicodeUtils.nfc(r.c5)
72
+ }
73
+ end
74
+
75
+ end
@@ -9,6 +9,12 @@ class TestUnicodeUtils < Test::Unit::TestCase
9
9
  def test_name
10
10
  assert_equal "LATIN SMALL LETTER F", UnicodeUtils.name("f")
11
11
  assert_equal Encoding::US_ASCII, UnicodeUtils.name("f").encoding
12
+ assert_equal nil, UnicodeUtils.name("\u{e000}") # private use
13
+ assert_equal "<control>", UnicodeUtils.name("\t")
14
+ assert_equal "CJK UNIFIED IDEOGRAPH-4E00", UnicodeUtils.name("\u{4e00}")
15
+ assert_equal "CJK UNIFIED IDEOGRAPH-2A6D6", UnicodeUtils.name("\u{2a6d6}")
16
+ assert_equal "CJK UNIFIED IDEOGRAPH-2A3D6", UnicodeUtils.name("\u{2a3d6}")
17
+ assert_equal "HANGUL SYLLABLE PWILH", UnicodeUtils.name("\u{d4db}")
12
18
  end
13
19
 
14
20
  def test_simple_upcase
@@ -104,4 +110,32 @@ class TestUnicodeUtils < Test::Unit::TestCase
104
110
  assert_equal false, UnicodeUtils.soft_dotted_char?("a")
105
111
  end
106
112
 
113
+ def test_hangul_syllable_decomposition
114
+ assert_equal "\u{1111}\u{1171}\u{11b6}", UnicodeUtils.hangul_syllable_decomposition("\u{d4db}")
115
+ end
116
+
117
+ def test_jamo_short_name
118
+ assert_equal "GG", UnicodeUtils.jamo_short_name("\u{1101}")
119
+ end
120
+
121
+ def test_canonical_decomposition
122
+ assert_equal "\u{61}\u{301}",
123
+ UnicodeUtils.canonical_decomposition("\u{E1}")
124
+ assert_equal "\u{61}\u{301}\u{63}\u{327}\u{301}",
125
+ UnicodeUtils.canonical_decomposition("\u{e1}\u{63}\u{301}\u{327}")
126
+ end
127
+
128
+ def test_nfd
129
+ assert_equal "\u{61}\u{301}", UnicodeUtils.nfd("\u{E1}")
130
+ end
131
+
132
+ def test_canonical_equivalents?
133
+ assert_equal true, UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste")
134
+ assert_equal false, UnicodeUtils.canonical_equivalents?("Äste", "Aste")
135
+ end
136
+
137
+ def test_nfc
138
+ assert_equal "Häschen", UnicodeUtils.nfc("Ha\u{308}schen")
139
+ end
140
+
107
141
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicode_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Lang
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-02 00:00:00 +01:00
12
+ date: 2008-11-16 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,20 +22,27 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.txt
24
24
  files:
25
- - lib/unicode_utils/read_special_casing_map.rb
26
25
  - lib/unicode_utils/conditional_casing.rb
26
+ - lib/unicode_utils/hangul_syllable_decomposition.rb
27
27
  - lib/unicode_utils/simple_downcase.rb
28
28
  - lib/unicode_utils/read_codepoint_map.rb
29
+ - lib/unicode_utils/read_names.rb
29
30
  - lib/unicode_utils/read_codepoint_set.rb
30
31
  - lib/unicode_utils/titlecase_char_q.rb
31
32
  - lib/unicode_utils/cased_char_q.rb
32
33
  - lib/unicode_utils/downcase.rb
33
34
  - lib/unicode_utils/name.rb
34
35
  - lib/unicode_utils/uppercase_char_q.rb
36
+ - lib/unicode_utils/read_multivalued_map.rb
37
+ - lib/unicode_utils/canonical_equivalents_q.rb
38
+ - lib/unicode_utils/canonical_decomposition.rb
35
39
  - lib/unicode_utils/upcase.rb
40
+ - lib/unicode_utils/nfc.rb
41
+ - lib/unicode_utils/nfd.rb
36
42
  - lib/unicode_utils/case_ignorable_char_q.rb
37
43
  - lib/unicode_utils/simple_upcase.rb
38
44
  - lib/unicode_utils/lowercase_char_q.rb
45
+ - lib/unicode_utils/jamo_short_name.rb
39
46
  - lib/unicode_utils/combining_class.rb
40
47
  - lib/unicode_utils/version.rb
41
48
  - lib/unicode_utils/soft_dotted_char_q.rb
@@ -48,11 +55,15 @@ files:
48
55
  - cdata/names
49
56
  - cdata/cond_uc_map
50
57
  - cdata/special_uc_map
58
+ - cdata/canonical_decomposition_map
51
59
  - cdata/soft_dotted_set
52
60
  - cdata/simple_lc_map
53
61
  - cdata/case_ignorable_set
62
+ - cdata/composition_exclusion_set
54
63
  - cdata/simple_uc_map
64
+ - cdata/jamo_short_names
55
65
  - cdata/prop_set_uppercase
66
+ - test/test_normalization.rb
56
67
  - test/test_unicode_utils.rb
57
68
  - README.txt
58
69
  - LICENSE.txt
@@ -78,10 +89,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
89
  version:
79
90
  requirements: []
80
91
 
81
- rubyforge_project:
92
+ rubyforge_project: unicode-utils
82
93
  rubygems_version: 1.3.1
83
94
  signing_key:
84
95
  specification_version: 2
85
96
  summary: additional Unicode aware functions for Ruby 1.9
86
97
  test_files:
98
+ - test/test_normalization.rb
87
99
  - test/test_unicode_utils.rb