[glib] Add locale-sensitive ASCII transliteration API



commit 941b8979d07a7d9bd1a8f581ee744c0c914e12ee
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Feb 17 11:54:18 2014 -0500

    Add locale-sensitive ASCII transliteration API
    
    Add a new function, g_str_to_ascii() that does locale-dependent ASCII
    transliteration of UTF-8 strings.
    
    This function works off of an internal database.  We get the data out of
    the localedata shipped with glibc, which seems to be just about the best
    source of locale-sensitive transliteration information available
    anywhere.
    
    We include a update script with this commit that's not used by anything
    at all -- it will just sit in git.  It is intended to be run manually
    from time to time.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=710142

 docs/reference/glib/glib-sections.txt |    1 +
 glib/Makefile.am                      |    1 +
 glib/gstrfuncs.h                      |    4 +
 glib/gtranslit-data.h                 |   12 +
 glib/gtranslit.c                      |  409 ++++++++++++++++++++++++++++++++
 glib/update-gtranslit.py              |  410 +++++++++++++++++++++++++++++++++
 6 files changed, 837 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index 8458bc6..c6382f3 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -1282,6 +1282,7 @@ g_strrstr_len
 g_str_has_prefix
 g_str_has_suffix
 g_strcmp0
+g_str_to_ascii
 g_str_tokenize_and_fold
 g_str_match_string
 
diff --git a/glib/Makefile.am b/glib/Makefile.am
index 15377ec..e3bd1b0 100644
--- a/glib/Makefile.am
+++ b/glib/Makefile.am
@@ -172,6 +172,7 @@ libglib_2_0_la_SOURCES =    \
        gthreadpool.c           \
        gtimer.c                \
        gtimezone.c             \
+       gtranslit.c             \
        gtrashstack.c           \
        gtree.c                 \
        guniprop.c              \
diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h
index 0cf25a2..41fc839 100644
--- a/glib/gstrfuncs.h
+++ b/glib/gstrfuncs.h
@@ -288,6 +288,10 @@ gchar*                g_stpcpy         (gchar        *dest,
                                         const char   *src);
 
 GLIB_AVAILABLE_IN_2_40
+gchar *                 g_str_to_ascii                                  (const gchar   *str,
+                                                                         const gchar   *from_locale);
+
+GLIB_AVAILABLE_IN_2_40
 gchar **                g_str_tokenize_and_fold                         (const gchar   *string,
                                                                          const gchar   *translit_locale,
                                                                          gchar       ***ascii_alternates);
diff --git a/glib/gtranslit-data.h b/glib/gtranslit-data.h
new file mode 100644
index 0000000..f863e20
--- /dev/null
+++ b/glib/gtranslit-data.h
@@ -0,0 +1,12 @@
+/* Generated by update-gtranslit.py */
+#define MAX_KEY_SIZE 2
+#define MAX_LOCALE_NAME 10
+static const gunichar src_table[] = { 64256, 64257, 64258, 64259, 64260, 64262, 64297, 65024, 65025, 65026, 
65027, 65028, 65029, 65030, 65031, 65032, 65033, 65034, 65035, 65036, 65037, 65038, 65039, 65101, 65102, 
65103, 65104, 65106, 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65119, 65120, 65121, 65122, 
65123, 65124, 65125, 65126, 65128, 65129, 65130, 65131, 65279, 65281, 65282, 65283, 65284, 65285, 65286, 
65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, 65295, 65296, 65297, 65298, 65299, 65300, 65301, 
65302, 65303, 65304, 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, 65315, 65316, 
65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 
65332, 65333, 65334, 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, 65345, 65346, 
65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 
65362, 65363, 65364, 65365, 65366, 65367,
  65368, 65369, 65370, 65371, 65372, 65373, 65374, 119808, 119809, 119810, 119811, 119812, 119813, 119814, 
119815, 119816, 119817, 119818, 119819, 119820, 119821, 119822, 119823, 119824, 119825, 119826, 119827, 
119828, 119829, 119830, 119831, 119832, 119833, 119834, 119835, 119836, 119837, 119838, 119839, 119840, 
119841, 119842, 119843, 119844, 119845, 119846, 119847, 119848, 119849, 119850, 119851, 119852, 119853, 
119854, 119855, 119856, 119857, 119858, 119859, 119860, 119861, 119862, 119863, 119864, 119865, 119866, 
119867, 119868, 119869, 119870, 119871, 119872, 119873, 119874, 119875, 119876, 119877, 119878, 119879, 
119880, 119881, 119882, 119883, 119884, 119885, 119886, 119887, 119888, 119889, 119890, 119891, 119892, 
119894, 119895, 119896, 119897, 119898, 119899, 119900, 119901, 119902, 119903, 119904, 119905, 119906, 
119907, 119908, 119909, 119910, 119911, 119912, 119913, 119914, 119915, 119916, 119917, 119918, 119919, 
119920, 119921, 119922, 119923, 119924, 119925, 119
 926, 119927, 119928, 119929, 119930, 119931, 119932, 119933, 119934, 119935, 119936, 119937, 119938, 119939, 
119940, 119941, 119942, 119943, 119944, 119945, 119946, 119947, 119948, 119949, 119950, 119951, 119952, 
119953, 119954, 119955, 119956, 119957, 119958, 119959, 119960, 119961, 119962, 119963, 119964, 119966, 
119967, 119970, 119973, 119974, 119977, 119978, 119979, 119980, 119982, 119983, 119984, 119985, 119986, 
119987, 119988, 119989, 119990, 119991, 119992, 119993, 119995, 119997, 119998, 119999, 120000, 120002, 
120003, 120005, 120006, 120007, 120008, 120009, 120010, 120011, 120012, 120013, 120014, 120015, 120016, 
120017, 120018, 120019, 120020, 120021, 120022, 120023, 120024, 120025, 120026, 120027, 120028, 120029, 
120030, 120031, 120032, 120033, 120034, 120035, 120036, 120037, 120038, 120039, 120040, 120041, 120042, 
120043, 120044, 120045, 120046, 120047, 120048, 120049, 120050, 120051, 120052, 120053, 120054, 120055, 
120056, 120057, 120058, 120059, 120060, 120061, 
 120062, 120063, 120064, 120065, 120066, 120067, 120068, 120069, 120071, 120072, 120073, 120074, 120077, 
120078, 120079, 120080, 120081, 120082, 120083, 120084, 120086, 120087, 120088, 120089, 120090, 120091, 
120092, 120094, 120095, 120096, 120097, 120098, 120099, 120100, 120101, 120102, 120103, 120104, 120105, 
120106, 120107, 120108, 120109, 120110, 120111, 120112, 120113, 120114, 120115, 120116, 120117, 120118, 
120119, 120120, 120121, 120123, 120124, 120125, 120126, 120128, 120129, 120130, 120131, 120132, 120134, 
120138, 120139, 120140, 120141, 120142, 120143, 120144, 120146, 120147, 120148, 120149, 120150, 120151, 
120152, 120153, 120154, 120155, 120156, 120157, 120158, 120159, 120160, 120161, 120162, 120163, 120164, 
120165, 120166, 120167, 120168, 120169, 120170, 120171, 120172, 120173, 120174, 120175, 120176, 120177, 
120178, 120179, 120180, 120181, 120182, 120183, 120184, 120185, 120186, 120187, 120188, 120189, 120190, 
120191, 120192, 120193, 120194, 120195, 120196, 12019
 7, 120198, 120199, 120200, 120201, 120202, 120203, 120204, 120205, 120206, 120207, 120208, 120209, 120210, 
120211, 120212, 120213, 120214, 120215, 120216, 120217, 120218, 120219, 120220, 120221, 120222, 120223, 
120224, 120225, 120226, 120227, 120228, 120229, 120230, 120231, 120232, 120233, 120234, 120235, 120236, 
120237, 120238, 120239, 120240, 120241, 120242, 120243, 120244, 120245, 120246, 120247, 120248, 120249, 
120250, 120251, 120252, 120253, 120254, 120255, 120256, 120257, 120258, 120259, 120260, 120261, 120262, 
120263, 120264, 120265, 120266, 120267, 120268, 120269, 120270, 120271, 120272, 120273, 120274, 120275, 
120276, 120277, 120278, 120279, 120280, 120281, 120282, 120283, 120284, 120285, 120286, 120287, 120288, 
120289, 120290, 120291, 120292, 120293, 120294, 120295, 120296, 120297, 120298, 120299, 120300, 120301, 
120302, 120303, 120304, 120305, 120306, 120307, 120308, 120309, 120310, 120311, 120312, 120313, 120314, 
120315, 120316, 120317, 120318, 120319, 120320, 12
 0321, 120322, 120323, 120324, 120325, 120326, 120327, 120328, 120329, 120330, 120331, 120332, 120333, 
120334, 120335, 120336, 120337, 120338, 120339, 120340, 120341, 120342, 120343, 120344, 120345, 120346, 
120347, 120348, 120349, 120350, 120351, 120352, 120353, 120354, 120355, 120356, 120357, 120358, 120359, 
120360, 120361, 120362, 120363, 120364, 120365, 120366, 120367, 120368, 120369, 120370, 120371, 120372, 
120373, 120374, 120375, 120376, 120377, 120378, 120379, 120380, 120381, 120382, 120383, 120384, 120385, 
120386, 120387, 120388, 120389, 120390, 120391, 120392, 120393, 120394, 120395, 120396, 120397, 120398, 
120399, 120400, 120401, 120402, 120403, 120404, 120405, 120406, 120407, 120408, 120409, 120410, 120411, 
120412, 120413, 120414, 120415, 120416, 120417, 120418, 120419, 120420, 120421, 120422, 120423, 120424, 
120425, 120426, 120427, 120428, 120429, 120430, 120431, 120432, 120433, 120434, 120435, 120436, 120437, 
120438, 120439, 120440, 120441, 120442, 120443, 120444,
  120445, 120446, 120447, 120448, 120449, 120450, 120451, 120452, 120453, 120454, 120455, 120456, 120457, 
120458, 120459, 120460, 120461, 120462, 120463, 120464, 120465, 120466, 120467, 120468, 120469, 120470, 
120471, 120472, 120473, 120474, 120475, 120476, 120477, 120478, 120479, 120480, 120481, 120482, 120483, 
120782, 120783, 120784, 120785, 120786, 120787, 120788, 120789, 120790, 120791, 120792, 120793, 120794, 
120795, 120796, 120797, 120798, 120799, 120800, 120801, 120802, 120803, 120804, 120805, 120806, 120807, 
120808, 120809, 120810, 120811, 120812, 120813, 120814, 120815, 120816, 120817, 120818, 120819, 120820, 
120821, 120822, 120823, 120824, 120825, 120826, 120827, 120828, 120829, 120830, 120831, 4613, 4768, 4613, 
4769, 4613, 4770, 4613, 4772, 4613, 4774, 4613, 4775, 4621, 4768, 4621, 4769, 4621, 4770, 4621, 4772, 4621, 
4774, 4621, 4775, 4629, 4768, 4629, 4769, 4629, 4770, 4629, 4772, 4629, 4774, 4629, 4775, 4637, 4768, 4637, 
4769, 4637, 4770, 4637, 4772, 4637, 4774, 
 4637, 4775, 4645, 4768, 4645, 4769, 4645, 4770, 4645, 4772, 4645, 4774, 4645, 4775, 4648, 4811, 4653, 4768, 
4653, 4769, 4653, 4770, 4653, 4772, 4653, 4774, 4653, 4775, 4661, 4768, 4661, 4769, 4661, 4770, 4661, 4772, 
4661, 4774, 4661, 4775, 4669, 4768, 4669, 4769, 4669, 4770, 4669, 4772, 4669, 4774, 4669, 4775, 4677, 4768, 
4677, 4769, 4677, 4770, 4677, 4772, 4677, 4774, 4677, 4775, 4685, 4768, 4685, 4769, 4685, 4770, 4685, 4772, 
4685, 4774, 4685, 4775, 4693, 4768, 4693, 4769, 4693, 4770, 4693, 4772, 4693, 4774, 4693, 4775, 4701, 4768, 
4701, 4769, 4701, 4770, 4701, 4772, 4701, 4774, 4701, 4775, 4709, 4768, 4709, 4769, 4709, 4770, 4709, 4772, 
4709, 4774, 4709, 4775, 4717, 4768, 4717, 4769, 4717, 4770, 4717, 4772, 4717, 4774, 4717, 4775, 4725, 4768, 
4725, 4769, 4725, 4770, 4725, 4772, 4725, 4774, 4725, 4775, 4733, 4768, 4733, 4769, 4733, 4770, 4733, 4772, 
4733, 4774, 4733, 4775, 4741, 4768, 4741, 4769, 4741, 4770, 4741, 4772, 4741, 4774, 4741, 4775, 4749, 4768, 
4749, 4769, 4749,
  4770, 4749, 4772, 4749, 4774, 4749, 4775, 4757, 4768, 4757, 4769, 4757, 4770, 4757, 4772, 4757, 4774, 4757, 
4775, 4765, 4768, 4765, 4769, 4765, 4770, 4765, 4772, 4765, 4774, 4765, 4775, 4781, 4768, 4781, 4769, 4781, 
4770, 4781, 4772, 4781, 4774, 4781, 4775, 4789, 4768, 4789, 4769, 4789, 4770, 4789, 4772, 4789, 4774, 4789, 
4775, 4797, 4768, 4797, 4769, 4797, 4770, 4797, 4772, 4797, 4774, 4797, 4775, 4805, 4768, 4805, 4769, 4805, 
4770, 4805, 4772, 4805, 4774, 4805, 4775, 4808, 4811, 4813, 4768, 4813, 4769, 4813, 4770, 4813, 4772, 4813, 
4774, 4813, 4775, 4829, 4768, 4829, 4769, 4829, 4770, 4829, 4772, 4829, 4774, 4829, 4775, 4837, 4768, 4837, 
4769, 4837, 4770, 4837, 4772, 4837, 4774, 4837, 4775, 4845, 4768, 4845, 4769, 4845, 4770, 4845, 4772, 4845, 
4774, 4845, 4775, 4853, 4768, 4853, 4769, 4853, 4770, 4853, 4772, 4853, 4774, 4853, 4775, 4861, 4768, 4861, 
4769, 4861, 4770, 4861, 4772, 4861, 4774, 4861, 4775, 4869, 4768, 4869, 4769, 4869, 4770, 4869, 4772, 4869, 
4774, 4869, 4775
 , 4877, 4768, 4877, 4769, 4877, 4770, 4877, 4772, 4877, 4774, 4877, 4775, 4885, 4768, 4885, 4769, 4885, 
4770, 4885, 4772, 4885, 4774, 4885, 4775, 4893, 4768, 4893, 4769, 4893, 4770, 4893, 4772, 4893, 4774, 4893, 
4775, 4901, 4768, 4901, 4769, 4901, 4770, 4901, 4772, 4901, 4774, 4901, 4775, 4909, 4768, 4909, 4769, 4909, 
4770, 4909, 4772, 4909, 4774, 4909, 4775, 4917, 4768, 4917, 4769, 4917, 4770, 4917, 4772, 4917, 4774, 4917, 
4775, 4925, 4768, 4925, 4769, 4925, 4770, 4925, 4772, 4925, 4774, 4925, 4775, 4933, 4768, 4933, 4769, 4933, 
4770, 4933, 4772, 4933, 4774, 4933, 4775, 4941, 4768, 4941, 4769, 4941, 4770, 4941, 4772, 4941, 4774, 4941, 
4775, 4949, 4768, 4949, 4769, 4949, 4770, 4949, 4772, 4949, 4774, 4949, 4775, 1047, 1043, 1047, 1075, 1079, 
1043, 1079, 1075 };
+static const gchar ascii_table[] = { 40, 67, 41, 60, 60, 40, 82, 41, 62, 62, 32, 49, 47, 52, 32, 32, 49, 47, 
50, 32, 32, 51, 47, 52, 32, 65, 69, 79, 69, 115, 115, 97, 101, 111, 101, 73, 74, 105, 106, 39, 110, 76, 74, 
76, 106, 108, 106, 78, 74, 78, 106, 110, 106, 68, 90, 68, 122, 100, 122, 45, 45, 44, 44, 46, 46, 46, 46, 46, 
96, 96, 96, 96, 96, 33, 33, 63, 63, 63, 33, 67, 61, 82, 115, 69, 85, 82, 97, 47, 99, 97, 47, 115, 99, 47, 
111, 99, 47, 117, 78, 111, 84, 69, 76, 40, 84, 77, 41, 79, 104, 109, 32, 49, 47, 51, 32, 32, 50, 47, 51, 32, 
32, 49, 47, 53, 32, 32, 50, 47, 53, 32, 32, 51, 47, 53, 32, 32, 52, 47, 53, 32, 32, 49, 47, 54, 32, 32, 53, 
47, 54, 32, 32, 49, 47, 56, 32, 32, 51, 47, 56, 32, 32, 53, 47, 56, 32, 32, 55, 47, 56, 32, 73, 73, 73, 73, 
73, 73, 86, 86, 73, 86, 73, 73, 86, 73, 73, 73, 73, 88, 88, 73, 88, 73, 73, 105, 105, 105, 105, 105, 105, 
118, 118, 105, 118, 105, 105, 118, 105, 105, 105, 105, 120, 120, 105, 120, 105, 105, 60, 45, 45, 62, 60, 45, 
62, 60, 61, 61, 6
 2, 60, 61, 62, 62, 61, 60, 60, 60, 62, 62, 62, 78, 85, 76, 83, 79, 72, 83, 84, 88, 69, 84, 88, 69, 79, 84, 
69, 78, 81, 65, 67, 75, 66, 69, 76, 66, 83, 72, 84, 76, 70, 86, 84, 70, 70, 67, 82, 83, 73, 68, 76, 69, 68, 
67, 49, 68, 67, 50, 68, 67, 51, 68, 67, 52, 78, 65, 75, 83, 89, 78, 69, 84, 66, 67, 65, 78, 69, 77, 83, 85, 
66, 69, 83, 67, 70, 83, 71, 83, 85, 83, 83, 80, 68, 69, 76, 78, 76, 40, 49, 41, 40, 50, 41, 40, 51, 41, 40, 
52, 41, 40, 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40, 49, 
50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 
49, 57, 41, 40, 50, 48, 41, 49, 46, 50, 46, 51, 46, 52, 46, 53, 46, 54, 46, 55, 46, 56, 46, 57, 46, 49, 48, 
46, 49, 49, 46, 49, 50, 46, 49, 51, 46, 49, 52, 46, 49, 53, 46, 49, 54, 46, 49, 55, 46, 49, 56, 46, 49, 57, 
46, 50, 48, 46, 40, 97, 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, 102, 41, 40, 103, 41, 40, 
104, 41, 40, 105, 
 41, 40, 106, 41, 40, 107, 41, 40, 108, 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 
40, 114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 
122, 41, 40, 65, 41, 40, 66, 41, 40, 68, 41, 40, 69, 41, 40, 70, 41, 40, 71, 41, 40, 72, 41, 40, 73, 41, 40, 
74, 41, 40, 75, 41, 40, 76, 41, 40, 77, 41, 40, 78, 41, 40, 79, 41, 40, 80, 41, 40, 81, 41, 40, 83, 41, 40, 
84, 41, 40, 85, 41, 40, 86, 41, 40, 87, 41, 40, 88, 41, 40, 89, 41, 40, 90, 41, 40, 48, 41, 58, 58, 61, 61, 
61, 61, 40, 50, 49, 41, 40, 50, 50, 41, 40, 50, 51, 41, 40, 50, 52, 41, 40, 50, 53, 41, 40, 50, 54, 41, 40, 
50, 55, 41, 40, 50, 56, 41, 40, 50, 57, 41, 40, 51, 48, 41, 40, 51, 49, 41, 40, 51, 50, 41, 40, 51, 51, 41, 
40, 51, 52, 41, 40, 51, 53, 41, 40, 51, 54, 41, 40, 51, 55, 41, 40, 51, 56, 41, 40, 51, 57, 41, 40, 52, 48, 
41, 40, 52, 49, 41, 40, 52, 50, 41, 40, 52, 51, 41, 40, 52, 52, 41, 40, 52, 53, 41, 40, 52, 54, 41, 40, 52, 
55, 41, 40, 52, 
 56, 41, 40, 52, 57, 41, 40, 53, 48, 41, 104, 80, 97, 100, 97, 65, 85, 98, 97, 114, 111, 86, 112, 99, 112, 
65, 110, 65, 117, 65, 109, 65, 107, 65, 77, 66, 71, 66, 99, 97, 108, 107, 99, 97, 108, 112, 70, 110, 70, 117, 
70, 117, 103, 109, 103, 107, 103, 72, 122, 107, 72, 122, 77, 72, 122, 71, 72, 122, 84, 72, 122, 117, 108, 
109, 108, 100, 108, 107, 108, 102, 109, 110, 109, 117, 109, 109, 109, 99, 109, 107, 109, 109, 109, 94, 50, 
99, 109, 94, 50, 107, 109, 94, 50, 109, 109, 94, 51, 99, 109, 94, 51, 107, 109, 94, 51, 109, 47, 115, 109, 
47, 115, 94, 50, 107, 80, 97, 77, 80, 97, 71, 80, 97, 114, 97, 100, 114, 97, 100, 47, 115, 114, 97, 100, 47, 
115, 94, 50, 112, 115, 110, 115, 117, 115, 109, 115, 112, 86, 110, 86, 117, 86, 109, 86, 107, 86, 77, 86, 
112, 87, 110, 87, 117, 87, 109, 87, 107, 87, 77, 87, 97, 46, 109, 46, 66, 113, 99, 99, 99, 100, 67, 47, 107, 
103, 67, 111, 46, 100, 66, 71, 121, 104, 97, 72, 80, 105, 110, 75, 75, 75, 77, 107, 116, 108, 110, 108, 111, 
103, 108, 120, 109, 
 98, 109, 105, 108, 109, 111, 108, 80, 72, 112, 46, 109, 46, 80, 80, 77, 80, 82, 83, 118, 87, 98, 102, 102, 
102, 105, 102, 108, 102, 102, 108, 115, 116, 65, 65, 85, 69, 97, 97, 117, 101, 89, 111, 79, 39, 84, 115, 67, 
104, 83, 104, 89, 117, 89, 97, 116, 115, 99, 104, 115, 104, 121, 117, 121, 97, 121, 111, 111, 39, 71, 39, 
103, 39, 104, 101, 104, 117, 104, 105, 104, 69, 104, 39, 97, 104, 39, 117, 104, 39, 105, 104, 39, 69, 104, 
39, 111, 104, 39, 101, 97, 104, 111, 108, 101, 108, 117, 108, 105, 108, 97, 108, 69, 108, 39, 97, 108, 39, 
117, 108, 39, 105, 108, 39, 69, 108, 39, 111, 108, 39, 101, 97, 108, 87, 97, 72, 101, 72, 117, 72, 105, 72, 
97, 72, 69, 72, 39, 97, 72, 39, 117, 72, 39, 105, 72, 39, 69, 72, 39, 111, 72, 39, 101, 97, 72, 111, 72, 87, 
97, 109, 101, 109, 97, 109, 69, 109, 39, 97, 109, 39, 117, 109, 39, 105, 109, 39, 69, 109, 39, 111, 109, 39, 
101, 97, 109, 87, 97, 96, 115, 101, 96, 115, 117, 96, 115, 105, 96, 115, 97, 96, 115, 69, 96, 115, 39, 97, 
96, 115, 39, 117, 96
 , 115, 39, 105, 96, 115, 39, 69, 96, 115, 39, 111, 96, 115, 39, 101, 97, 96, 115, 111, 96, 115, 87, 97, 114, 
101, 114, 87, 97, 114, 117, 114, 105, 114, 69, 114, 39, 97, 114, 39, 117, 114, 39, 105, 114, 39, 69, 114, 39, 
111, 114, 39, 101, 97, 120, 101, 120, 117, 120, 97, 120, 69, 120, 39, 97, 120, 39, 117, 120, 39, 105, 120, 
39, 69, 120, 39, 111, 120, 39, 101, 97, 120, 111, 120, 87, 97, 113, 101, 113, 117, 113, 105, 113, 97, 113, 
69, 113, 39, 97, 113, 39, 117, 113, 39, 105, 113, 39, 69, 113, 39, 111, 113, 39, 101, 97, 113, 111, 113, 87, 
101, 113, 87, 105, 113, 87, 97, 113, 87, 69, 113, 87, 39, 97, 113, 87, 39, 117, 113, 87, 39, 105, 113, 87, 
39, 69, 113, 87, 39, 111, 113, 87, 39, 101, 97, 81, 101, 81, 117, 81, 105, 81, 97, 81, 69, 81, 39, 97, 81, 
39, 117, 81, 39, 105, 81, 39, 69, 81, 39, 111, 81, 39, 101, 97, 81, 111, 81, 87, 101, 81, 87, 105, 81, 87, 
97, 81, 87, 69, 81, 87, 39, 97, 81, 87, 39, 117, 81, 87, 39, 105, 81, 87, 39, 69, 81, 87, 39, 111, 81, 87, 
39, 101, 97, 98, 10
 1, 98, 117, 98, 105, 98, 69, 98, 39, 97, 98, 39, 117, 98, 39, 105, 98, 39, 69, 98, 39, 111, 98, 39, 101, 97, 
98, 111, 98, 87, 97, 118, 101, 118, 117, 118, 97, 118, 69, 118, 39, 97, 118, 39, 117, 118, 39, 105, 118, 39, 
69, 118, 39, 111, 118, 39, 101, 97, 118, 111, 118, 87, 97, 116, 101, 116, 117, 116, 105, 116, 97, 116, 69, 
116, 39, 97, 116, 39, 117, 116, 39, 105, 116, 39, 69, 116, 39, 111, 116, 39, 101, 97, 116, 111, 116, 87, 97, 
99, 101, 99, 117, 99, 105, 99, 69, 99, 39, 97, 99, 39, 117, 99, 39, 105, 99, 39, 69, 99, 39, 111, 99, 39, 
101, 97, 99, 111, 99, 87, 97, 96, 104, 101, 96, 104, 117, 96, 104, 105, 96, 104, 97, 96, 104, 69, 96, 104, 
39, 97, 96, 104, 39, 117, 96, 104, 39, 105, 96, 104, 39, 69, 96, 104, 39, 111, 96, 104, 39, 101, 97, 96, 104, 
111, 96, 104, 87, 101, 96, 104, 87, 105, 96, 104, 87, 97, 96, 104, 87, 69, 104, 87, 39, 97, 104, 87, 39, 117, 
104, 87, 39, 105, 104, 87, 39, 69, 104, 87, 39, 111, 104, 87, 39, 101, 97, 110, 101, 110, 117, 110, 105, 110, 
97, 110, 69,
  110, 39, 97, 110, 39, 117, 110, 39, 105, 110, 39, 69, 110, 39, 111, 110, 39, 101, 97, 110, 111, 110, 87, 
97, 78, 101, 78, 117, 78, 105, 78, 97, 78, 39, 97, 78, 39, 117, 78, 39, 105, 78, 39, 69, 78, 39, 111, 78, 39, 
101, 97, 78, 87, 97, 107, 101, 107, 117, 107, 105, 107, 97, 107, 69, 107, 39, 97, 107, 39, 117, 107, 39, 105, 
107, 39, 69, 107, 39, 111, 107, 39, 101, 97, 107, 111, 107, 87, 101, 107, 87, 105, 107, 87, 97, 107, 87, 69, 
107, 87, 39, 97, 107, 87, 39, 117, 107, 87, 39, 105, 107, 87, 39, 69, 107, 87, 39, 111, 107, 87, 39, 101, 97, 
75, 101, 75, 117, 75, 105, 75, 97, 75, 69, 75, 39, 97, 75, 39, 117, 75, 39, 105, 75, 39, 69, 75, 39, 111, 75, 
39, 101, 97, 75, 111, 75, 87, 101, 75, 87, 105, 75, 87, 97, 75, 87, 69, 75, 87, 39, 97, 75, 87, 39, 117, 75, 
87, 39, 105, 75, 87, 39, 69, 75, 87, 39, 111, 75, 87, 39, 101, 97, 119, 101, 119, 87, 97, 119, 117, 119, 105, 
119, 97, 119, 69, 119, 39, 97, 119, 39, 117, 119, 39, 105, 119, 39, 69, 119, 39, 111, 119, 39, 101, 97, 119, 
111, 9
 6, 101, 96, 117, 96, 105, 96, 97, 96, 69, 96, 73, 96, 111, 122, 101, 122, 105, 122, 97, 122, 69, 122, 39, 
97, 122, 39, 117, 122, 39, 105, 122, 39, 69, 122, 39, 111, 122, 39, 101, 97, 122, 111, 122, 87, 97, 90, 101, 
90, 117, 90, 105, 90, 97, 90, 69, 90, 39, 97, 90, 39, 117, 90, 39, 105, 90, 39, 69, 90, 39, 111, 90, 39, 101, 
97, 90, 111, 90, 87, 97, 121, 101, 121, 105, 121, 69, 121, 39, 97, 121, 39, 117, 121, 39, 105, 121, 39, 69, 
121, 39, 111, 121, 39, 101, 97, 100, 101, 100, 117, 100, 105, 100, 69, 100, 39, 97, 100, 39, 117, 100, 39, 
105, 100, 39, 69, 100, 39, 111, 100, 39, 101, 97, 100, 111, 100, 87, 97, 68, 101, 68, 117, 68, 105, 68, 97, 
68, 39, 97, 68, 39, 117, 68, 39, 105, 68, 39, 69, 68, 39, 111, 68, 39, 101, 97, 68, 111, 68, 87, 97, 106, 
101, 106, 117, 106, 105, 106, 97, 106, 69, 106, 39, 97, 106, 39, 117, 106, 39, 105, 106, 39, 69, 106, 39, 
111, 106, 39, 101, 97, 106, 111, 106, 87, 97, 103, 101, 103, 117, 103, 105, 103, 97, 103, 69, 103, 39, 97, 
103, 39, 117, 103, 39,
  105, 103, 39, 69, 103, 39, 111, 103, 39, 101, 97, 103, 111, 103, 87, 101, 103, 87, 105, 103, 87, 97, 103, 
87, 69, 103, 87, 39, 97, 103, 87, 39, 117, 103, 87, 39, 105, 103, 87, 39, 69, 103, 87, 39, 111, 103, 87, 39, 
101, 97, 71, 101, 71, 117, 71, 105, 71, 97, 71, 69, 71, 39, 97, 71, 39, 117, 71, 39, 105, 71, 39, 69, 71, 39, 
111, 71, 39, 101, 97, 71, 111, 71, 87, 97, 84, 101, 84, 117, 84, 105, 84, 97, 84, 39, 97, 84, 39, 117, 84, 
39, 105, 84, 39, 69, 84, 39, 111, 84, 39, 101, 97, 84, 111, 84, 87, 97, 67, 101, 67, 117, 67, 105, 67, 97, 
67, 69, 67, 39, 97, 67, 39, 117, 67, 39, 105, 67, 39, 69, 67, 39, 111, 67, 39, 101, 97, 67, 87, 97, 80, 101, 
80, 117, 80, 69, 80, 39, 97, 80, 39, 117, 80, 39, 105, 80, 39, 69, 80, 39, 111, 80, 39, 101, 97, 80, 111, 80, 
87, 97, 83, 101, 83, 117, 83, 105, 83, 97, 83, 69, 83, 39, 97, 83, 39, 117, 83, 39, 105, 83, 39, 69, 83, 39, 
111, 83, 39, 101, 97, 83, 111, 96, 83, 87, 97, 96, 83, 101, 96, 83, 117, 96, 83, 105, 96, 83, 97, 96, 83, 69, 
96, 83, 39,
  97, 96, 83, 39, 117, 96, 83, 39, 105, 96, 83, 39, 69, 96, 83, 39, 111, 96, 83, 39, 101, 97, 96, 83, 111, 
102, 101, 102, 117, 102, 97, 102, 69, 102, 39, 97, 102, 39, 117, 102, 39, 105, 102, 39, 69, 102, 39, 111, 
102, 39, 101, 97, 102, 111, 102, 87, 97, 112, 101, 112, 117, 112, 105, 112, 97, 112, 69, 112, 39, 97, 112, 
39, 117, 112, 39, 105, 112, 39, 69, 112, 39, 111, 112, 39, 101, 97, 112, 111, 112, 87, 97, 109, 89, 97, 114, 
89, 97, 102, 89, 97, 45, 58, 58, 45, 96, 63, 58, 124, 58, 96, 49, 96, 50, 96, 51, 96, 52, 96, 53, 96, 54, 96, 
55, 96, 56, 96, 57, 96, 49, 48, 96, 50, 48, 96, 51, 48, 96, 52, 48, 96, 53, 48, 96, 54, 48, 96, 55, 48, 96, 
56, 48, 96, 57, 48, 96, 49, 48, 48, 96, 49, 48, 48, 48, 48, 69, 94, 69, 69, 97, 69, 101, 94, 101, 69, 111, 
69, 117, 69, 89, 69, 89, 73, 90, 72, 90, 71, 72, 90, 103, 104, 75, 72, 84, 83, 67, 72, 89, 85, 89, 65, 122, 
104, 122, 103, 104, 107, 104, 65, 39, 69, 39, 73, 39, 79, 58, 85, 39, 85, 58, 97, 39, 101, 39, 105, 39, 111, 
58, 117, 39, 117, 5
 8, 79, 34, 111, 34, 85, 34, 117, 34, 100, 100, 68, 106, 71, 106, 75, 106, 100, 106, 103, 106, 107, 106, 89, 
101, 85, 101, 79, 101, 119, 119, 119, 106, 106, 106 };
+static const struct mapping_entry mappings_table[] = { { 160, 32 }, { 169, 45056 }, { 171, 40963 }, { 173, 
45 }, { 174, 45061 }, { 181, 117 }, { 184, 44 }, { 187, 40968 }, { 188, 53258 }, { 189, 53263 }, { 190, 53268 
}, { 198, 40985 }, { 215, 120 }, { 216, 40987 }, { 223, 40989 }, { 230, 40991 }, { 248, 40993 }, { 306, 40995 
}, { 307, 40997 }, { 329, 40999 }, { 338, 40987 }, { 339, 40993 }, { 383, 115 }, { 455, 41001 }, { 456, 41003 
}, { 457, 41005 }, { 458, 41007 }, { 459, 41009 }, { 460, 41011 }, { 497, 41013 }, { 498, 41015 }, { 499, 
41017 }, { 700, 39 }, { 710, 94 }, { 712, 39 }, { 715, 96 }, { 717, 95 }, { 720, 58 }, { 732, 126 }, { 8194, 
32 }, { 8195, 32 }, { 8196, 32 }, { 8197, 32 }, { 8198, 32 }, { 8200, 32 }, { 8201, 32 }, { 8202, 32 }, { 
8203, 32768 }, { 8208, 45 }, { 8209, 45 }, { 8210, 45 }, { 8211, 45 }, { 8212, 41019 }, { 8213, 45 }, { 8216, 
39 }, { 8217, 39 }, { 8218, 44 }, { 8219, 39 }, { 8220, 34 }, { 8221, 34 }, { 8222, 41021 }, { 8223, 34 }, { 
8224, 43 }, 
 { 8226, 111 }, { 8228, 46 }, { 8229, 41023 }, { 8230, 45121 }, { 8239, 32 }, { 8245, 96 }, { 8246, 41028 }, 
{ 8247, 45126 }, { 8249, 60 }, { 8250, 62 }, { 8252, 41033 }, { 8260, 47 }, { 8263, 41035 }, { 8264, 41037 }, 
{ 8265, 41034 }, { 8287, 32 }, { 8288, 32768 }, { 8289, 32768 }, { 8290, 32768 }, { 8291, 32768 }, { 8353, 
41039 }, { 8360, 41041 }, { 8364, 45139 }, { 8448, 45142 }, { 8449, 45145 }, { 8450, 67 }, { 8453, 45148 }, { 
8454, 45151 }, { 8458, 103 }, { 8459, 72 }, { 8460, 72 }, { 8461, 72 }, { 8462, 104 }, { 8464, 73 }, { 8465, 
73 }, { 8466, 76 }, { 8467, 108 }, { 8469, 78 }, { 8470, 41058 }, { 8473, 80 }, { 8474, 81 }, { 8475, 82 }, { 
8476, 82 }, { 8477, 82 }, { 8481, 45156 }, { 8482, 49255 }, { 8484, 90 }, { 8486, 45163 }, { 8488, 90 }, { 
8492, 66 }, { 8493, 67 }, { 8494, 101 }, { 8495, 101 }, { 8496, 69 }, { 8497, 70 }, { 8499, 77 }, { 8500, 111 
}, { 8505, 105 }, { 8517, 68 }, { 8518, 100 }, { 8519, 101 }, { 8520, 105 }, { 8521, 106 }, { 8531, 53358 }, 
{ 8532, 5
 3363 }, { 8533, 53368 }, { 8534, 53373 }, { 8535, 53378 }, { 8536, 53383 }, { 8537, 53388 }, { 8538, 53393 
}, { 8539, 53398 }, { 8540, 53403 }, { 8541, 53408 }, { 8542, 53413 }, { 8543, 45066 }, { 8544, 73 }, { 8545, 
41130 }, { 8546, 45228 }, { 8547, 41135 }, { 8548, 86 }, { 8549, 41137 }, { 8550, 45235 }, { 8551, 49334 }, { 
8552, 41146 }, { 8553, 88 }, { 8554, 41148 }, { 8555, 45246 }, { 8556, 76 }, { 8557, 67 }, { 8558, 68 }, { 
8559, 77 }, { 8560, 105 }, { 8561, 41153 }, { 8562, 45251 }, { 8563, 41158 }, { 8564, 118 }, { 8565, 41160 }, 
{ 8566, 45258 }, { 8567, 49357 }, { 8568, 41169 }, { 8569, 120 }, { 8570, 41171 }, { 8571, 45269 }, { 8572, 
108 }, { 8573, 99 }, { 8574, 100 }, { 8575, 109 }, { 8592, 41176 }, { 8594, 41178 }, { 8596, 45276 }, { 8656, 
41183 }, { 8658, 41185 }, { 8660, 45283 }, { 8722, 45 }, { 8725, 47 }, { 8726, 92 }, { 8727, 42 }, { 8739, 
124 }, { 8758, 58 }, { 8764, 126 }, { 8804, 41183 }, { 8805, 41190 }, { 8810, 40963 }, { 8811, 40968 }, { 
8920, 45288 },
  { 8921, 45291 }, { 9216, 45294 }, { 9217, 45297 }, { 9218, 45300 }, { 9219, 45303 }, { 9220, 45306 }, { 
9221, 45309 }, { 9222, 45312 }, { 9223, 45315 }, { 9224, 41222 }, { 9225, 41224 }, { 9226, 41226 }, { 9227, 
41228 }, { 9228, 41230 }, { 9229, 41232 }, { 9230, 41201 }, { 9231, 41234 }, { 9232, 45332 }, { 9233, 45335 
}, { 9234, 45338 }, { 9235, 45341 }, { 9236, 45344 }, { 9237, 45347 }, { 9238, 45350 }, { 9239, 45353 }, { 
9240, 45356 }, { 9241, 41263 }, { 9242, 45361 }, { 9243, 45364 }, { 9244, 41271 }, { 9245, 41273 }, { 9246, 
41233 }, { 9247, 41275 }, { 9248, 41277 }, { 9249, 45375 }, { 9251, 95 }, { 9252, 41282 }, { 9312, 45380 }, { 
9313, 45383 }, { 9314, 45386 }, { 9315, 45389 }, { 9316, 45392 }, { 9317, 45395 }, { 9318, 45398 }, { 9319, 
45401 }, { 9320, 45404 }, { 9321, 49503 }, { 9322, 49507 }, { 9323, 49511 }, { 9324, 49515 }, { 9325, 49519 
}, { 9326, 49523 }, { 9327, 49527 }, { 9328, 49531 }, { 9329, 49535 }, { 9330, 49539 }, { 9331, 49543 }, { 
9332, 45380 }, { 933
 3, 45383 }, { 9334, 45386 }, { 9335, 45389 }, { 9336, 45392 }, { 9337, 45395 }, { 9338, 45398 }, { 9339, 
45401 }, { 9340, 45404 }, { 9341, 49503 }, { 9342, 49507 }, { 9343, 49511 }, { 9344, 49515 }, { 9345, 49519 
}, { 9346, 49523 }, { 9347, 49527 }, { 9348, 49531 }, { 9349, 49535 }, { 9350, 49539 }, { 9351, 49543 }, { 
9352, 41355 }, { 9353, 41357 }, { 9354, 41359 }, { 9355, 41361 }, { 9356, 41363 }, { 9357, 41365 }, { 9358, 
41367 }, { 9359, 41369 }, { 9360, 41371 }, { 9361, 45469 }, { 9362, 45472 }, { 9363, 45475 }, { 9364, 45478 
}, { 9365, 45481 }, { 9366, 45484 }, { 9367, 45487 }, { 9368, 45490 }, { 9369, 45493 }, { 9370, 45496 }, { 
9371, 45499 }, { 9372, 45502 }, { 9373, 45505 }, { 9374, 45508 }, { 9375, 45511 }, { 9376, 45514 }, { 9377, 
45517 }, { 9378, 45520 }, { 9379, 45523 }, { 9380, 45526 }, { 9381, 45529 }, { 9382, 45532 }, { 9383, 45535 
}, { 9384, 45538 }, { 9385, 45541 }, { 9386, 45544 }, { 9387, 45547 }, { 9388, 45550 }, { 9389, 45553 }, { 
9390, 45556 }, { 9391, 
 45559 }, { 9392, 45562 }, { 9393, 45565 }, { 9394, 45568 }, { 9395, 45571 }, { 9396, 45574 }, { 9397, 45577 
}, { 9398, 45580 }, { 9399, 45583 }, { 9400, 45056 }, { 9401, 45586 }, { 9402, 45589 }, { 9403, 45592 }, { 
9404, 45595 }, { 9405, 45598 }, { 9406, 45601 }, { 9407, 45604 }, { 9408, 45607 }, { 9409, 45610 }, { 9410, 
45613 }, { 9411, 45616 }, { 9412, 45619 }, { 9413, 45622 }, { 9414, 45625 }, { 9415, 45061 }, { 9416, 45628 
}, { 9417, 45631 }, { 9418, 45634 }, { 9419, 45637 }, { 9420, 45640 }, { 9421, 45643 }, { 9422, 45646 }, { 
9423, 45649 }, { 9424, 45502 }, { 9425, 45505 }, { 9426, 45508 }, { 9427, 45511 }, { 9428, 45514 }, { 9429, 
45517 }, { 9430, 45520 }, { 9431, 45523 }, { 9432, 45526 }, { 9433, 45529 }, { 9434, 45532 }, { 9435, 45535 
}, { 9436, 45538 }, { 9437, 45541 }, { 9438, 45544 }, { 9439, 45547 }, { 9440, 45550 }, { 9441, 45553 }, { 
9442, 45556 }, { 9443, 45559 }, { 9444, 45562 }, { 9445, 45565 }, { 9446, 45568 }, { 9447, 45571 }, { 9448, 
45574 }, { 9449, 455
 77 }, { 9450, 45652 }, { 9472, 45 }, { 9474, 124 }, { 9484, 43 }, { 9488, 43 }, { 9492, 43 }, { 9496, 43 }, 
{ 9500, 43 }, { 9508, 43 }, { 9516, 43 }, { 9524, 43 }, { 9532, 43 }, { 9702, 111 }, { 10868, 45655 }, { 
10869, 41184 }, { 10870, 45658 }, { 12288, 32 }, { 12448, 61 }, { 12881, 49757 }, { 12882, 49761 }, { 12883, 
49765 }, { 12884, 49769 }, { 12885, 49773 }, { 12886, 49777 }, { 12887, 49781 }, { 12888, 49785 }, { 12889, 
49789 }, { 12890, 49793 }, { 12891, 49797 }, { 12892, 49801 }, { 12893, 49805 }, { 12894, 49809 }, { 12895, 
49813 }, { 12977, 49817 }, { 12978, 49821 }, { 12979, 49825 }, { 12980, 49829 }, { 12981, 49833 }, { 12982, 
49837 }, { 12983, 49841 }, { 12984, 49845 }, { 12985, 49849 }, { 12986, 49853 }, { 12987, 49857 }, { 12988, 
49861 }, { 12989, 49865 }, { 12990, 49869 }, { 12991, 49873 }, { 13169, 45781 }, { 13170, 41688 }, { 13171, 
41690 }, { 13172, 45788 }, { 13173, 41695 }, { 13174, 41697 }, { 13184, 41699 }, { 13185, 41701 }, { 13186, 
41703 }, { 13187, 4
 1705 }, { 13188, 41707 }, { 13189, 41218 }, { 13190, 41709 }, { 13191, 41711 }, { 13192, 45809 }, { 13193, 
49908 }, { 13194, 41720 }, { 13195, 41722 }, { 13196, 41724 }, { 13197, 41726 }, { 13198, 41728 }, { 13199, 
41730 }, { 13200, 41732 }, { 13201, 45830 }, { 13202, 45833 }, { 13203, 45836 }, { 13204, 45839 }, { 13205, 
41746 }, { 13206, 41748 }, { 13207, 41750 }, { 13208, 41752 }, { 13209, 41754 }, { 13210, 41756 }, { 13211, 
41758 }, { 13212, 41760 }, { 13213, 41762 }, { 13214, 41764 }, { 13215, 49958 }, { 13216, 49962 }, { 13217, 
45863 }, { 13218, 49966 }, { 13219, 49970 }, { 13220, 49974 }, { 13221, 45875 }, { 13222, 49978 }, { 13223, 
45886 }, { 13224, 54081 }, { 13225, 41686 }, { 13226, 45894 }, { 13227, 45897 }, { 13228, 45900 }, { 13229, 
45903 }, { 13230, 54098 }, { 13231, 62295 }, { 13232, 41822 }, { 13233, 41824 }, { 13234, 41826 }, { 13235, 
41828 }, { 13236, 41830 }, { 13237, 41832 }, { 13238, 41834 }, { 13239, 41836 }, { 13240, 41838 }, { 13241, 
41840 }, { 13242, 
 41842 }, { 13243, 41844 }, { 13244, 41846 }, { 13245, 41848 }, { 13246, 41850 }, { 13247, 41852 }, { 13250, 
50046 }, { 13251, 41858 }, { 13252, 41860 }, { 13253, 41862 }, { 13254, 50056 }, { 13255, 45964 }, { 13256, 
41871 }, { 13257, 41873 }, { 13258, 41875 }, { 13259, 41877 }, { 13260, 41879 }, { 13261, 41881 }, { 13262, 
41883 }, { 13263, 41885 }, { 13264, 41747 }, { 13265, 41887 }, { 13266, 45985 }, { 13267, 41892 }, { 13268, 
41894 }, { 13269, 45992 }, { 13270, 45995 }, { 13271, 41902 }, { 13272, 50096 }, { 13273, 46004 }, { 13274, 
41911 }, { 13275, 41814 }, { 13276, 41913 }, { 13277, 41915 }, { 36864, 41917 }, { 36865, 41919 }, { 36866, 
41921 }, { 36867, 46014 }, { 36868, 46019 }, { 36869, 41926 }, { 36870, 43 }, { 36871, 32768 }, { 36872, 
32768 }, { 36873, 32768 }, { 36874, 32768 }, { 36875, 32768 }, { 36876, 32768 }, { 36877, 32768 }, { 36878, 
32768 }, { 36879, 32768 }, { 36880, 32768 }, { 36881, 32768 }, { 36882, 32768 }, { 36883, 32768 }, { 36884, 
32768 }, { 36885, 32
 768 }, { 36886, 32768 }, { 36887, 95 }, { 36888, 95 }, { 36889, 95 }, { 36890, 44 }, { 36891, 46 }, { 36892, 
59 }, { 36893, 58 }, { 36894, 63 }, { 36895, 33 }, { 36896, 40 }, { 36897, 41 }, { 36898, 123 }, { 36899, 125 
}, { 36900, 35 }, { 36901, 38 }, { 36902, 42 }, { 36903, 43 }, { 36904, 45 }, { 36905, 60 }, { 36906, 62 }, { 
36907, 61 }, { 36908, 92 }, { 36909, 36 }, { 36910, 37 }, { 36911, 64 }, { 36912, 32768 }, { 36913, 33 }, { 
36914, 34 }, { 36915, 35 }, { 36916, 36 }, { 36917, 37 }, { 36918, 38 }, { 36919, 39 }, { 36920, 40 }, { 
36921, 41 }, { 36922, 42 }, { 36923, 43 }, { 36924, 44 }, { 36925, 45 }, { 36926, 46 }, { 36927, 47 }, { 
36928, 48 }, { 36929, 49 }, { 36930, 50 }, { 36931, 51 }, { 36932, 52 }, { 36933, 53 }, { 36934, 54 }, { 
36935, 55 }, { 36936, 56 }, { 36937, 57 }, { 36938, 58 }, { 36939, 59 }, { 36940, 60 }, { 36941, 61 }, { 
36942, 62 }, { 36943, 63 }, { 36944, 64 }, { 36945, 65 }, { 36946, 66 }, { 36947, 67 }, { 36948, 68 }, { 
36949, 69 }, { 36950, 70 },
  { 36951, 71 }, { 36952, 72 }, { 36953, 73 }, { 36954, 74 }, { 36955, 75 }, { 36956, 76 }, { 36957, 77 }, { 
36958, 78 }, { 36959, 79 }, { 36960, 80 }, { 36961, 81 }, { 36962, 82 }, { 36963, 83 }, { 36964, 84 }, { 
36965, 85 }, { 36966, 86 }, { 36967, 87 }, { 36968, 88 }, { 36969, 89 }, { 36970, 90 }, { 36971, 91 }, { 
36972, 92 }, { 36973, 93 }, { 36974, 94 }, { 36975, 95 }, { 36976, 96 }, { 36977, 97 }, { 36978, 98 }, { 
36979, 99 }, { 36980, 100 }, { 36981, 101 }, { 36982, 102 }, { 36983, 103 }, { 36984, 104 }, { 36985, 105 }, 
{ 36986, 106 }, { 36987, 107 }, { 36988, 108 }, { 36989, 109 }, { 36990, 110 }, { 36991, 111 }, { 36992, 112 
}, { 36993, 113 }, { 36994, 114 }, { 36995, 115 }, { 36996, 116 }, { 36997, 117 }, { 36998, 118 }, { 36999, 
119 }, { 37000, 120 }, { 37001, 121 }, { 37002, 122 }, { 37003, 123 }, { 37004, 124 }, { 37005, 125 }, { 
37006, 126 }, { 37007, 65 }, { 37008, 66 }, { 37009, 67 }, { 37010, 68 }, { 37011, 69 }, { 37012, 70 }, { 
37013, 71 }, { 37014, 72 }, {
  37015, 73 }, { 37016, 74 }, { 37017, 75 }, { 37018, 76 }, { 37019, 77 }, { 37020, 78 }, { 37021, 79 }, { 
37022, 80 }, { 37023, 81 }, { 37024, 82 }, { 37025, 83 }, { 37026, 84 }, { 37027, 85 }, { 37028, 86 }, { 
37029, 87 }, { 37030, 88 }, { 37031, 89 }, { 37032, 90 }, { 37033, 97 }, { 37034, 98 }, { 37035, 99 }, { 
37036, 100 }, { 37037, 101 }, { 37038, 102 }, { 37039, 103 }, { 37040, 104 }, { 37041, 105 }, { 37042, 106 }, 
{ 37043, 107 }, { 37044, 108 }, { 37045, 109 }, { 37046, 110 }, { 37047, 111 }, { 37048, 112 }, { 37049, 113 
}, { 37050, 114 }, { 37051, 115 }, { 37052, 116 }, { 37053, 117 }, { 37054, 118 }, { 37055, 119 }, { 37056, 
120 }, { 37057, 121 }, { 37058, 122 }, { 37059, 65 }, { 37060, 66 }, { 37061, 67 }, { 37062, 68 }, { 37063, 
69 }, { 37064, 70 }, { 37065, 71 }, { 37066, 72 }, { 37067, 73 }, { 37068, 74 }, { 37069, 75 }, { 37070, 76 
}, { 37071, 77 }, { 37072, 78 }, { 37073, 79 }, { 37074, 80 }, { 37075, 81 }, { 37076, 82 }, { 37077, 83 }, { 
37078, 84 }, { 37079
 , 85 }, { 37080, 86 }, { 37081, 87 }, { 37082, 88 }, { 37083, 89 }, { 37084, 90 }, { 37085, 97 }, { 37086, 
98 }, { 37087, 99 }, { 37088, 100 }, { 37089, 101 }, { 37090, 102 }, { 37091, 103 }, { 37092, 105 }, { 37093, 
106 }, { 37094, 107 }, { 37095, 108 }, { 37096, 109 }, { 37097, 110 }, { 37098, 111 }, { 37099, 112 }, { 
37100, 113 }, { 37101, 114 }, { 37102, 115 }, { 37103, 116 }, { 37104, 117 }, { 37105, 118 }, { 37106, 119 }, 
{ 37107, 120 }, { 37108, 121 }, { 37109, 122 }, { 37110, 65 }, { 37111, 66 }, { 37112, 67 }, { 37113, 68 }, { 
37114, 69 }, { 37115, 70 }, { 37116, 71 }, { 37117, 72 }, { 37118, 73 }, { 37119, 74 }, { 37120, 75 }, { 
37121, 76 }, { 37122, 77 }, { 37123, 78 }, { 37124, 79 }, { 37125, 80 }, { 37126, 81 }, { 37127, 82 }, { 
37128, 83 }, { 37129, 84 }, { 37130, 85 }, { 37131, 86 }, { 37132, 87 }, { 37133, 88 }, { 37134, 89 }, { 
37135, 90 }, { 37136, 97 }, { 37137, 98 }, { 37138, 99 }, { 37139, 100 }, { 37140, 101 }, { 37141, 102 }, { 
37142, 103 }, { 37143, 1
 04 }, { 37144, 105 }, { 37145, 106 }, { 37146, 107 }, { 37147, 108 }, { 37148, 109 }, { 37149, 110 }, { 
37150, 111 }, { 37151, 112 }, { 37152, 113 }, { 37153, 114 }, { 37154, 115 }, { 37155, 116 }, { 37156, 117 }, 
{ 37157, 118 }, { 37158, 119 }, { 37159, 120 }, { 37160, 121 }, { 37161, 122 }, { 37162, 65 }, { 37163, 67 }, 
{ 37164, 68 }, { 37165, 71 }, { 37166, 74 }, { 37167, 75 }, { 37168, 78 }, { 37169, 79 }, { 37170, 80 }, { 
37171, 81 }, { 37172, 83 }, { 37173, 84 }, { 37174, 85 }, { 37175, 86 }, { 37176, 87 }, { 37177, 88 }, { 
37178, 89 }, { 37179, 90 }, { 37180, 97 }, { 37181, 98 }, { 37182, 99 }, { 37183, 100 }, { 37184, 102 }, { 
37185, 104 }, { 37186, 105 }, { 37187, 106 }, { 37188, 107 }, { 37189, 109 }, { 37190, 110 }, { 37191, 112 }, 
{ 37192, 113 }, { 37193, 114 }, { 37194, 115 }, { 37195, 116 }, { 37196, 117 }, { 37197, 118 }, { 37198, 119 
}, { 37199, 120 }, { 37200, 121 }, { 37201, 122 }, { 37202, 65 }, { 37203, 66 }, { 37204, 67 }, { 37205, 68 
}, { 37206, 69 }, {
  37207, 70 }, { 37208, 71 }, { 37209, 72 }, { 37210, 73 }, { 37211, 74 }, { 37212, 75 }, { 37213, 76 }, { 
37214, 77 }, { 37215, 78 }, { 37216, 79 }, { 37217, 80 }, { 37218, 81 }, { 37219, 82 }, { 37220, 83 }, { 
37221, 84 }, { 37222, 85 }, { 37223, 86 }, { 37224, 87 }, { 37225, 88 }, { 37226, 89 }, { 37227, 90 }, { 
37228, 97 }, { 37229, 98 }, { 37230, 99 }, { 37231, 100 }, { 37232, 101 }, { 37233, 102 }, { 37234, 103 }, { 
37235, 104 }, { 37236, 105 }, { 37237, 106 }, { 37238, 107 }, { 37239, 108 }, { 37240, 109 }, { 37241, 110 }, 
{ 37242, 111 }, { 37243, 112 }, { 37244, 113 }, { 37245, 114 }, { 37246, 115 }, { 37247, 116 }, { 37248, 117 
}, { 37249, 118 }, { 37250, 119 }, { 37251, 120 }, { 37252, 121 }, { 37253, 122 }, { 37254, 65 }, { 37255, 66 
}, { 37256, 68 }, { 37257, 69 }, { 37258, 70 }, { 37259, 71 }, { 37260, 74 }, { 37261, 75 }, { 37262, 76 }, { 
37263, 77 }, { 37264, 78 }, { 37265, 79 }, { 37266, 80 }, { 37267, 81 }, { 37268, 83 }, { 37269, 84 }, { 
37270, 85 }, { 37271
 , 86 }, { 37272, 87 }, { 37273, 88 }, { 37274, 89 }, { 37275, 97 }, { 37276, 98 }, { 37277, 99 }, { 37278, 
100 }, { 37279, 101 }, { 37280, 102 }, { 37281, 103 }, { 37282, 104 }, { 37283, 105 }, { 37284, 106 }, { 
37285, 107 }, { 37286, 108 }, { 37287, 109 }, { 37288, 110 }, { 37289, 111 }, { 37290, 112 }, { 37291, 113 }, 
{ 37292, 114 }, { 37293, 115 }, { 37294, 116 }, { 37295, 117 }, { 37296, 118 }, { 37297, 119 }, { 37298, 120 
}, { 37299, 121 }, { 37300, 122 }, { 37301, 65 }, { 37302, 66 }, { 37303, 68 }, { 37304, 69 }, { 37305, 70 }, 
{ 37306, 71 }, { 37307, 73 }, { 37308, 74 }, { 37309, 75 }, { 37310, 76 }, { 37311, 77 }, { 37312, 79 }, { 
37313, 83 }, { 37314, 84 }, { 37315, 85 }, { 37316, 86 }, { 37317, 87 }, { 37318, 88 }, { 37319, 89 }, { 
37320, 97 }, { 37321, 98 }, { 37322, 99 }, { 37323, 100 }, { 37324, 101 }, { 37325, 102 }, { 37326, 103 }, { 
37327, 104 }, { 37328, 105 }, { 37329, 106 }, { 37330, 107 }, { 37331, 108 }, { 37332, 109 }, { 37333, 110 }, 
{ 37334, 111 }, {
  37335, 112 }, { 37336, 113 }, { 37337, 114 }, { 37338, 115 }, { 37339, 116 }, { 37340, 117 }, { 37341, 118 
}, { 37342, 119 }, { 37343, 120 }, { 37344, 121 }, { 37345, 122 }, { 37346, 65 }, { 37347, 66 }, { 37348, 67 
}, { 37349, 68 }, { 37350, 69 }, { 37351, 70 }, { 37352, 71 }, { 37353, 72 }, { 37354, 73 }, { 37355, 74 }, { 
37356, 75 }, { 37357, 76 }, { 37358, 77 }, { 37359, 78 }, { 37360, 79 }, { 37361, 80 }, { 37362, 81 }, { 
37363, 82 }, { 37364, 83 }, { 37365, 84 }, { 37366, 85 }, { 37367, 86 }, { 37368, 87 }, { 37369, 88 }, { 
37370, 89 }, { 37371, 90 }, { 37372, 97 }, { 37373, 98 }, { 37374, 99 }, { 37375, 100 }, { 37376, 101 }, { 
37377, 102 }, { 37378, 103 }, { 37379, 104 }, { 37380, 105 }, { 37381, 106 }, { 37382, 107 }, { 37383, 108 }, 
{ 37384, 109 }, { 37385, 110 }, { 37386, 111 }, { 37387, 112 }, { 37388, 113 }, { 37389, 114 }, { 37390, 115 
}, { 37391, 116 }, { 37392, 117 }, { 37393, 118 }, { 37394, 119 }, { 37395, 120 }, { 37396, 121 }, { 37397, 
122 }, { 37398, 65
  }, { 37399, 66 }, { 37400, 67 }, { 37401, 68 }, { 37402, 69 }, { 37403, 70 }, { 37404, 71 }, { 37405, 72 }, 
{ 37406, 73 }, { 37407, 74 }, { 37408, 75 }, { 37409, 76 }, { 37410, 77 }, { 37411, 78 }, { 37412, 79 }, { 
37413, 80 }, { 37414, 81 }, { 37415, 82 }, { 37416, 83 }, { 37417, 84 }, { 37418, 85 }, { 37419, 86 }, { 
37420, 87 }, { 37421, 88 }, { 37422, 89 }, { 37423, 90 }, { 37424, 97 }, { 37425, 98 }, { 37426, 99 }, { 
37427, 100 }, { 37428, 101 }, { 37429, 102 }, { 37430, 103 }, { 37431, 104 }, { 37432, 105 }, { 37433, 106 }, 
{ 37434, 107 }, { 37435, 108 }, { 37436, 109 }, { 37437, 110 }, { 37438, 111 }, { 37439, 112 }, { 37440, 113 
}, { 37441, 114 }, { 37442, 115 }, { 37443, 116 }, { 37444, 117 }, { 37445, 118 }, { 37446, 119 }, { 37447, 
120 }, { 37448, 121 }, { 37449, 122 }, { 37450, 65 }, { 37451, 66 }, { 37452, 67 }, { 37453, 68 }, { 37454, 
69 }, { 37455, 70 }, { 37456, 71 }, { 37457, 72 }, { 37458, 73 }, { 37459, 74 }, { 37460, 75 }, { 37461, 76 
}, { 37462, 77 }, { 
 37463, 78 }, { 37464, 79 }, { 37465, 80 }, { 37466, 81 }, { 37467, 82 }, { 37468, 83 }, { 37469, 84 }, { 
37470, 85 }, { 37471, 86 }, { 37472, 87 }, { 37473, 88 }, { 37474, 89 }, { 37475, 90 }, { 37476, 97 }, { 
37477, 98 }, { 37478, 99 }, { 37479, 100 }, { 37480, 101 }, { 37481, 102 }, { 37482, 103 }, { 37483, 104 }, { 
37484, 105 }, { 37485, 106 }, { 37486, 107 }, { 37487, 108 }, { 37488, 109 }, { 37489, 110 }, { 37490, 111 }, 
{ 37491, 112 }, { 37492, 113 }, { 37493, 114 }, { 37494, 115 }, { 37495, 116 }, { 37496, 117 }, { 37497, 118 
}, { 37498, 119 }, { 37499, 120 }, { 37500, 121 }, { 37501, 122 }, { 37502, 65 }, { 37503, 66 }, { 37504, 67 
}, { 37505, 68 }, { 37506, 69 }, { 37507, 70 }, { 37508, 71 }, { 37509, 72 }, { 37510, 73 }, { 37511, 74 }, { 
37512, 75 }, { 37513, 76 }, { 37514, 77 }, { 37515, 78 }, { 37516, 79 }, { 37517, 80 }, { 37518, 81 }, { 
37519, 82 }, { 37520, 83 }, { 37521, 84 }, { 37522, 85 }, { 37523, 86 }, { 37524, 87 }, { 37525, 88 }, { 
37526, 89 }, { 37527,
  90 }, { 37528, 97 }, { 37529, 98 }, { 37530, 99 }, { 37531, 100 }, { 37532, 101 }, { 37533, 102 }, { 37534, 
103 }, { 37535, 104 }, { 37536, 105 }, { 37537, 106 }, { 37538, 107 }, { 37539, 108 }, { 37540, 109 }, { 
37541, 110 }, { 37542, 111 }, { 37543, 112 }, { 37544, 113 }, { 37545, 114 }, { 37546, 115 }, { 37547, 116 }, 
{ 37548, 117 }, { 37549, 118 }, { 37550, 119 }, { 37551, 120 }, { 37552, 121 }, { 37553, 122 }, { 37554, 65 
}, { 37555, 66 }, { 37556, 67 }, { 37557, 68 }, { 37558, 69 }, { 37559, 70 }, { 37560, 71 }, { 37561, 72 }, { 
37562, 73 }, { 37563, 74 }, { 37564, 75 }, { 37565, 76 }, { 37566, 77 }, { 37567, 78 }, { 37568, 79 }, { 
37569, 80 }, { 37570, 81 }, { 37571, 82 }, { 37572, 83 }, { 37573, 84 }, { 37574, 85 }, { 37575, 86 }, { 
37576, 87 }, { 37577, 88 }, { 37578, 89 }, { 37579, 90 }, { 37580, 97 }, { 37581, 98 }, { 37582, 99 }, { 
37583, 100 }, { 37584, 101 }, { 37585, 102 }, { 37586, 103 }, { 37587, 104 }, { 37588, 105 }, { 37589, 106 }, 
{ 37590, 107 }, { 3759
 1, 108 }, { 37592, 109 }, { 37593, 110 }, { 37594, 111 }, { 37595, 112 }, { 37596, 113 }, { 37597, 114 }, { 
37598, 115 }, { 37599, 116 }, { 37600, 117 }, { 37601, 118 }, { 37602, 119 }, { 37603, 120 }, { 37604, 121 }, 
{ 37605, 122 }, { 37606, 65 }, { 37607, 66 }, { 37608, 67 }, { 37609, 68 }, { 37610, 69 }, { 37611, 70 }, { 
37612, 71 }, { 37613, 72 }, { 37614, 73 }, { 37615, 74 }, { 37616, 75 }, { 37617, 76 }, { 37618, 77 }, { 
37619, 78 }, { 37620, 79 }, { 37621, 80 }, { 37622, 81 }, { 37623, 82 }, { 37624, 83 }, { 37625, 84 }, { 
37626, 85 }, { 37627, 86 }, { 37628, 87 }, { 37629, 88 }, { 37630, 89 }, { 37631, 90 }, { 37632, 97 }, { 
37633, 98 }, { 37634, 99 }, { 37635, 100 }, { 37636, 101 }, { 37637, 102 }, { 37638, 103 }, { 37639, 104 }, { 
37640, 105 }, { 37641, 106 }, { 37642, 107 }, { 37643, 108 }, { 37644, 109 }, { 37645, 110 }, { 37646, 111 }, 
{ 37647, 112 }, { 37648, 113 }, { 37649, 114 }, { 37650, 115 }, { 37651, 116 }, { 37652, 117 }, { 37653, 118 
}, { 37654, 119 }, 
 { 37655, 120 }, { 37656, 121 }, { 37657, 122 }, { 37658, 48 }, { 37659, 49 }, { 37660, 50 }, { 37661, 51 }, 
{ 37662, 52 }, { 37663, 53 }, { 37664, 54 }, { 37665, 55 }, { 37666, 56 }, { 37667, 57 }, { 37668, 48 }, { 
37669, 49 }, { 37670, 50 }, { 37671, 51 }, { 37672, 52 }, { 37673, 53 }, { 37674, 54 }, { 37675, 55 }, { 
37676, 56 }, { 37677, 57 }, { 37678, 48 }, { 37679, 49 }, { 37680, 50 }, { 37681, 51 }, { 37682, 52 }, { 
37683, 53 }, { 37684, 54 }, { 37685, 55 }, { 37686, 56 }, { 37687, 57 }, { 37688, 48 }, { 37689, 49 }, { 
37690, 50 }, { 37691, 51 }, { 37692, 52 }, { 37693, 53 }, { 37694, 54 }, { 37695, 55 }, { 37696, 56 }, { 
37697, 57 }, { 37698, 48 }, { 37699, 49 }, { 37700, 50 }, { 37701, 51 }, { 37702, 52 }, { 37703, 53 }, { 
37704, 54 }, { 37705, 55 }, { 37706, 56 }, { 37707, 57 }, { 192, 65 }, { 193, 65 }, { 194, 65 }, { 195, 65 }, 
{ 196, 65 }, { 197, 65 }, { 199, 67 }, { 200, 69 }, { 201, 69 }, { 202, 69 }, { 203, 69 }, { 204, 73 }, { 
205, 73 }, { 206, 73 }, { 207, 73
  }, { 209, 78 }, { 210, 79 }, { 211, 79 }, { 212, 79 }, { 213, 79 }, { 214, 79 }, { 217, 85 }, { 218, 85 }, 
{ 219, 85 }, { 220, 85 }, { 221, 89 }, { 224, 97 }, { 225, 97 }, { 226, 97 }, { 227, 97 }, { 228, 97 }, { 
229, 97 }, { 231, 99 }, { 232, 101 }, { 233, 101 }, { 234, 101 }, { 235, 101 }, { 236, 105 }, { 237, 105 }, { 
238, 105 }, { 239, 105 }, { 241, 110 }, { 242, 111 }, { 243, 111 }, { 244, 111 }, { 245, 111 }, { 246, 111 }, 
{ 249, 117 }, { 250, 117 }, { 251, 117 }, { 252, 117 }, { 253, 121 }, { 255, 121 }, { 256, 65 }, { 257, 97 }, 
{ 258, 65 }, { 259, 97 }, { 260, 65 }, { 261, 97 }, { 262, 67 }, { 263, 99 }, { 264, 67 }, { 265, 99 }, { 
266, 67 }, { 267, 99 }, { 268, 67 }, { 269, 99 }, { 270, 68 }, { 271, 100 }, { 274, 69 }, { 275, 101 }, { 
276, 69 }, { 277, 101 }, { 278, 69 }, { 279, 101 }, { 280, 69 }, { 281, 101 }, { 282, 69 }, { 283, 101 }, { 
284, 71 }, { 285, 103 }, { 286, 71 }, { 287, 103 }, { 288, 71 }, { 289, 103 }, { 290, 71 }, { 291, 103 }, { 
292, 72 }, { 293,
  104 }, { 296, 73 }, { 297, 105 }, { 298, 73 }, { 299, 105 }, { 300, 73 }, { 301, 105 }, { 302, 73 }, { 303, 
105 }, { 304, 73 }, { 308, 74 }, { 309, 106 }, { 310, 75 }, { 311, 107 }, { 313, 76 }, { 314, 108 }, { 315, 
76 }, { 316, 108 }, { 317, 76 }, { 318, 108 }, { 321, 76 }, { 322, 108 }, { 323, 78 }, { 324, 110 }, { 325, 
78 }, { 326, 110 }, { 327, 78 }, { 328, 110 }, { 332, 79 }, { 333, 111 }, { 334, 79 }, { 335, 111 }, { 336, 
79 }, { 337, 111 }, { 340, 82 }, { 341, 114 }, { 342, 82 }, { 343, 114 }, { 344, 82 }, { 345, 114 }, { 346, 
83 }, { 347, 115 }, { 348, 83 }, { 349, 115 }, { 350, 83 }, { 351, 115 }, { 352, 83 }, { 353, 115 }, { 354, 
84 }, { 355, 116 }, { 356, 84 }, { 357, 116 }, { 360, 85 }, { 361, 117 }, { 362, 85 }, { 363, 117 }, { 364, 
85 }, { 365, 117 }, { 366, 85 }, { 367, 117 }, { 368, 85 }, { 369, 117 }, { 370, 85 }, { 371, 117 }, { 372, 
87 }, { 373, 119 }, { 374, 89 }, { 375, 121 }, { 376, 89 }, { 377, 90 }, { 378, 122 }, { 379, 90 }, { 380, 
122 }, { 381, 90 
 }, { 382, 122 }, { 416, 79 }, { 417, 111 }, { 431, 85 }, { 432, 117 }, { 461, 65 }, { 462, 97 }, { 463, 73 
}, { 464, 105 }, { 465, 79 }, { 466, 111 }, { 467, 85 }, { 468, 117 }, { 469, 85 }, { 470, 117 }, { 471, 85 
}, { 472, 117 }, { 473, 85 }, { 474, 117 }, { 475, 85 }, { 476, 117 }, { 478, 65 }, { 479, 97 }, { 480, 65 }, 
{ 481, 97 }, { 482, 40985 }, { 483, 40991 }, { 486, 71 }, { 487, 103 }, { 488, 75 }, { 489, 107 }, { 490, 79 
}, { 491, 111 }, { 492, 79 }, { 493, 111 }, { 496, 106 }, { 500, 71 }, { 501, 103 }, { 504, 78 }, { 505, 110 
}, { 506, 65 }, { 507, 97 }, { 508, 40985 }, { 509, 40991 }, { 510, 79 }, { 511, 111 }, { 512, 65 }, { 513, 
97 }, { 514, 65 }, { 515, 97 }, { 516, 69 }, { 517, 101 }, { 518, 69 }, { 519, 101 }, { 520, 73 }, { 521, 105 
}, { 522, 73 }, { 523, 105 }, { 524, 79 }, { 525, 111 }, { 526, 79 }, { 527, 111 }, { 528, 82 }, { 529, 114 
}, { 530, 82 }, { 531, 114 }, { 532, 85 }, { 533, 117 }, { 534, 85 }, { 535, 117 }, { 536, 83 }, { 537, 115 
}, { 538, 84
  }, { 539, 116 }, { 542, 72 }, { 543, 104 }, { 550, 65 }, { 551, 97 }, { 552, 69 }, { 553, 101 }, { 554, 79 
}, { 555, 111 }, { 556, 79 }, { 557, 111 }, { 558, 79 }, { 559, 111 }, { 560, 79 }, { 561, 111 }, { 562, 89 
}, { 563, 121 }, { 768, 32768 }, { 769, 32768 }, { 770, 32768 }, { 771, 32768 }, { 772, 32768 }, { 773, 32768 
}, { 774, 32768 }, { 775, 32768 }, { 776, 32768 }, { 777, 32768 }, { 778, 32768 }, { 779, 32768 }, { 780, 
32768 }, { 781, 32768 }, { 782, 32768 }, { 783, 32768 }, { 784, 32768 }, { 785, 32768 }, { 786, 32768 }, { 
787, 32768 }, { 788, 32768 }, { 789, 32768 }, { 790, 32768 }, { 791, 32768 }, { 792, 32768 }, { 793, 32768 }, 
{ 794, 32768 }, { 795, 32768 }, { 796, 32768 }, { 797, 32768 }, { 798, 32768 }, { 799, 32768 }, { 800, 32768 
}, { 801, 32768 }, { 802, 32768 }, { 803, 32768 }, { 804, 32768 }, { 805, 32768 }, { 806, 32768 }, { 807, 
32768 }, { 808, 32768 }, { 809, 32768 }, { 810, 32768 }, { 811, 32768 }, { 812, 32768 }, { 813, 32768 }, { 
814, 32768 }, { 81
 5, 32768 }, { 816, 32768 }, { 817, 32768 }, { 818, 32768 }, { 819, 32768 }, { 820, 32768 }, { 821, 32768 }, 
{ 822, 32768 }, { 823, 32768 }, { 824, 32768 }, { 825, 32768 }, { 826, 32768 }, { 827, 32768 }, { 828, 32768 
}, { 829, 32768 }, { 830, 32768 }, { 831, 32768 }, { 832, 32768 }, { 833, 32768 }, { 834, 32768 }, { 835, 
32768 }, { 836, 32768 }, { 837, 32768 }, { 838, 32768 }, { 839, 32768 }, { 840, 32768 }, { 841, 32768 }, { 
842, 32768 }, { 843, 32768 }, { 844, 32768 }, { 845, 32768 }, { 846, 32768 }, { 864, 32768 }, { 865, 32768 }, 
{ 866, 32768 }, { 867, 32768 }, { 868, 32768 }, { 869, 32768 }, { 870, 32768 }, { 871, 32768 }, { 872, 32768 
}, { 873, 32768 }, { 874, 32768 }, { 875, 32768 }, { 876, 32768 }, { 877, 32768 }, { 878, 32768 }, { 879, 
32768 }, { 894, 59 }, { 1456, 32768 }, { 1457, 32768 }, { 1458, 32768 }, { 1459, 32768 }, { 1460, 32768 }, { 
1461, 32768 }, { 1462, 32768 }, { 1463, 32768 }, { 1464, 32768 }, { 1465, 32768 }, { 1467, 32768 }, { 1468, 
32768 }, { 1469, 
 32768 }, { 1471, 32768 }, { 1473, 32768 }, { 1474, 32768 }, { 1619, 32768 }, { 1620, 32768 }, { 1621, 32768 
}, { 7680, 65 }, { 7681, 97 }, { 7682, 66 }, { 7683, 98 }, { 7684, 66 }, { 7685, 98 }, { 7686, 66 }, { 7687, 
98 }, { 7688, 67 }, { 7689, 99 }, { 7690, 68 }, { 7691, 100 }, { 7692, 68 }, { 7693, 100 }, { 7694, 68 }, { 
7695, 100 }, { 7696, 68 }, { 7697, 100 }, { 7698, 68 }, { 7699, 100 }, { 7700, 69 }, { 7701, 101 }, { 7702, 
69 }, { 7703, 101 }, { 7704, 69 }, { 7705, 101 }, { 7706, 69 }, { 7707, 101 }, { 7708, 69 }, { 7709, 101 }, { 
7710, 70 }, { 7711, 102 }, { 7712, 71 }, { 7713, 103 }, { 7714, 72 }, { 7715, 104 }, { 7716, 72 }, { 7717, 
104 }, { 7718, 72 }, { 7719, 104 }, { 7720, 72 }, { 7721, 104 }, { 7722, 72 }, { 7723, 104 }, { 7724, 73 }, { 
7725, 105 }, { 7726, 73 }, { 7727, 105 }, { 7728, 75 }, { 7729, 107 }, { 7730, 75 }, { 7731, 107 }, { 7732, 
75 }, { 7733, 107 }, { 7734, 76 }, { 7735, 108 }, { 7736, 76 }, { 7737, 108 }, { 7738, 76 }, { 7739, 108 }, { 
7740, 76 },
  { 7741, 108 }, { 7742, 77 }, { 7743, 109 }, { 7744, 77 }, { 7745, 109 }, { 7746, 77 }, { 7747, 109 }, { 
7748, 78 }, { 7749, 110 }, { 7750, 78 }, { 7751, 110 }, { 7752, 78 }, { 7753, 110 }, { 7754, 78 }, { 7755, 
110 }, { 7756, 79 }, { 7757, 111 }, { 7758, 79 }, { 7759, 111 }, { 7760, 79 }, { 7761, 111 }, { 7762, 79 }, { 
7763, 111 }, { 7764, 80 }, { 7765, 112 }, { 7766, 80 }, { 7767, 112 }, { 7768, 82 }, { 7769, 114 }, { 7770, 
82 }, { 7771, 114 }, { 7772, 82 }, { 7773, 114 }, { 7774, 82 }, { 7775, 114 }, { 7776, 83 }, { 7777, 115 }, { 
7778, 83 }, { 7779, 115 }, { 7780, 83 }, { 7781, 115 }, { 7782, 83 }, { 7783, 115 }, { 7784, 83 }, { 7785, 
115 }, { 7786, 84 }, { 7787, 116 }, { 7788, 84 }, { 7789, 116 }, { 7790, 84 }, { 7791, 116 }, { 7792, 84 }, { 
7793, 116 }, { 7794, 85 }, { 7795, 117 }, { 7796, 85 }, { 7797, 117 }, { 7798, 85 }, { 7799, 117 }, { 7800, 
85 }, { 7801, 117 }, { 7802, 85 }, { 7803, 117 }, { 7804, 86 }, { 7805, 118 }, { 7806, 86 }, { 7807, 118 }, { 
7808, 87 }, { 
 7809, 119 }, { 7810, 87 }, { 7811, 119 }, { 7812, 87 }, { 7813, 119 }, { 7814, 87 }, { 7815, 119 }, { 7816, 
87 }, { 7817, 119 }, { 7818, 88 }, { 7819, 120 }, { 7820, 88 }, { 7821, 120 }, { 7822, 89 }, { 7823, 121 }, { 
7824, 90 }, { 7825, 122 }, { 7826, 90 }, { 7827, 122 }, { 7828, 90 }, { 7829, 122 }, { 7830, 104 }, { 7831, 
116 }, { 7832, 119 }, { 7833, 121 }, { 7840, 65 }, { 7841, 97 }, { 7842, 65 }, { 7843, 97 }, { 7844, 65 }, { 
7845, 97 }, { 7846, 65 }, { 7847, 97 }, { 7848, 65 }, { 7849, 97 }, { 7850, 65 }, { 7851, 97 }, { 7852, 65 }, 
{ 7853, 97 }, { 7854, 65 }, { 7855, 97 }, { 7856, 65 }, { 7857, 97 }, { 7858, 65 }, { 7859, 97 }, { 7860, 65 
}, { 7861, 97 }, { 7862, 65 }, { 7863, 97 }, { 7864, 69 }, { 7865, 101 }, { 7866, 69 }, { 7867, 101 }, { 
7868, 69 }, { 7869, 101 }, { 7870, 69 }, { 7871, 101 }, { 7872, 69 }, { 7873, 101 }, { 7874, 69 }, { 7875, 
101 }, { 7876, 69 }, { 7877, 101 }, { 7878, 69 }, { 7879, 101 }, { 7880, 73 }, { 7881, 105 }, { 7882, 73 }, { 
7883, 105 }, 
 { 7884, 79 }, { 7885, 111 }, { 7886, 79 }, { 7887, 111 }, { 7888, 79 }, { 7889, 111 }, { 7890, 79 }, { 7891, 
111 }, { 7892, 79 }, { 7893, 111 }, { 7894, 79 }, { 7895, 111 }, { 7896, 79 }, { 7897, 111 }, { 7898, 79 }, { 
7899, 111 }, { 7900, 79 }, { 7901, 111 }, { 7902, 79 }, { 7903, 111 }, { 7904, 79 }, { 7905, 111 }, { 7906, 
79 }, { 7907, 111 }, { 7908, 85 }, { 7909, 117 }, { 7910, 85 }, { 7911, 117 }, { 7912, 85 }, { 7913, 117 }, { 
7914, 85 }, { 7915, 117 }, { 7916, 85 }, { 7917, 117 }, { 7918, 85 }, { 7919, 117 }, { 7920, 85 }, { 7921, 
117 }, { 7922, 89 }, { 7923, 121 }, { 7924, 89 }, { 7925, 121 }, { 7926, 89 }, { 7927, 121 }, { 7928, 89 }, { 
7929, 121 }, { 8175, 96 }, { 8192, 32 }, { 8193, 32 }, { 8420, 32768 }, { 8421, 32768 }, { 8422, 32768 }, { 
8423, 32768 }, { 8424, 32768 }, { 8425, 32768 }, { 8426, 32768 }, { 8490, 75 }, { 9001, 60 }, { 9002, 62 }, { 
12441, 32768 }, { 12442, 32768 }, { 196, 40985 }, { 197, 41928 }, { 214, 40987 }, { 220, 41930 }, { 228, 
40991 }, { 2
 29, 41932 }, { 246, 40993 }, { 252, 41934 }, { 8220, 34 }, { 8221, 34 }, { 8222, 41021 }, { 8223, 34 }, { 
197, 65 }, { 229, 97 }, { 1025, 41936 }, { 1038, 41938 }, { 1040, 65 }, { 1041, 66 }, { 1042, 86 }, { 1043, 
71 }, { 1044, 68 }, { 1045, 69 }, { 1046, 74 }, { 1047, 90 }, { 1048, 73 }, { 1049, 89 }, { 1050, 75 }, { 
1051, 76 }, { 1052, 77 }, { 1053, 78 }, { 1054, 79 }, { 1055, 80 }, { 1056, 82 }, { 1057, 83 }, { 1058, 84 }, 
{ 1059, 85 }, { 1060, 70 }, { 1061, 88 }, { 1062, 41940 }, { 1063, 41942 }, { 1064, 41944 }, { 1065, 41944 }, 
{ 1066, 39 }, { 1067, 73 }, { 1068, 32768 }, { 1069, 69 }, { 1070, 41946 }, { 1071, 41948 }, { 1072, 97 }, { 
1073, 98 }, { 1074, 118 }, { 1075, 103 }, { 1076, 100 }, { 1077, 101 }, { 1078, 106 }, { 1079, 122 }, { 1080, 
105 }, { 1081, 121 }, { 1082, 107 }, { 1083, 108 }, { 1084, 109 }, { 1085, 110 }, { 1086, 111 }, { 1087, 112 
}, { 1088, 114 }, { 1089, 115 }, { 1090, 116 }, { 1091, 117 }, { 1092, 102 }, { 1093, 120 }, { 1094, 41950 }, 
{ 1095, 419
 52 }, { 1096, 41954 }, { 1097, 41954 }, { 1098, 39 }, { 1099, 105 }, { 1100, 32768 }, { 1101, 101 }, { 1102, 
41956 }, { 1103, 41958 }, { 1105, 41960 }, { 1118, 41962 }, { 1170, 41964 }, { 1171, 41966 }, { 1178, 81 }, { 
1179, 113 }, { 1202, 72 }, { 1203, 104 }, { 4608, 41968 }, { 4609, 41970 }, { 4610, 41972 }, { 4611, 41875 }, 
{ 4612, 41974 }, { 4613, 104 }, { 41804, 46072 }, { 41806, 46075 }, { 41808, 46078 }, { 41810, 46081 }, { 
41812, 46084 }, { 41814, 50183 }, { 4614, 41995 }, { 4616, 41997 }, { 4617, 41999 }, { 4618, 42001 }, { 4619, 
42003 }, { 4620, 42005 }, { 4621, 108 }, { 41816, 46103 }, { 41818, 46106 }, { 41820, 46109 }, { 41822, 46112 
}, { 41824, 46115 }, { 41826, 50214 }, { 4622, 41889 }, { 4623, 46122 }, { 4624, 42029 }, { 4625, 42031 }, { 
4626, 42033 }, { 4627, 42035 }, { 4628, 42037 }, { 4629, 72 }, { 41828, 46135 }, { 41830, 46138 }, { 41832, 
46141 }, { 41834, 46144 }, { 41836, 46147 }, { 41838, 50246 }, { 4630, 42058 }, { 4631, 46156 }, { 4632, 
42063 }, { 4
 633, 41757 }, { 4634, 41896 }, { 4635, 42065 }, { 4636, 42067 }, { 4637, 109 }, { 41840, 46165 }, { 41842, 
46168 }, { 41844, 46171 }, { 41846, 46174 }, { 41848, 46177 }, { 41850, 50276 }, { 4638, 41899 }, { 4639, 
46184 }, { 4640, 46187 }, { 4641, 46190 }, { 4642, 46193 }, { 4643, 46196 }, { 4644, 46199 }, { 4645, 42091 
}, { 41852, 50298 }, { 41854, 50302 }, { 41856, 50306 }, { 41858, 50310 }, { 41860, 50314 }, { 41862, 54414 
}, { 4646, 46227 }, { 4647, 50326 }, { 4648, 42138 }, { 41864, 46236 }, { 4649, 42143 }, { 4650, 42145 }, { 
4651, 41807 }, { 4652, 42147 }, { 4653, 114 }, { 41866, 46245 }, { 41868, 46248 }, { 41870, 46251 }, { 41872, 
46254 }, { 41874, 46257 }, { 41876, 50356 }, { 4654, 41694 }, { 4656, 42092 }, { 4657, 41825 }, { 4658, 42098 
}, { 4659, 40990 }, { 4660, 41042 }, { 4661, 115 }, { 41878, 46203 }, { 41880, 46207 }, { 41882, 46211 }, { 
41884, 46215 }, { 41886, 46219 }, { 41888, 50319 }, { 4662, 42132 }, { 4663, 46231 }, { 4664, 42168 }, { 
4665, 42170 }, { 46
 66, 41171 }, { 4667, 42172 }, { 4668, 42174 }, { 4669, 120 }, { 41890, 46272 }, { 41892, 46275 }, { 41894, 
46278 }, { 41896, 46281 }, { 41898, 46284 }, { 41900, 50383 }, { 4670, 42195 }, { 4671, 46293 }, { 4672, 
42200 }, { 4673, 42202 }, { 4674, 42204 }, { 4675, 42206 }, { 4676, 42208 }, { 4677, 113 }, { 41902, 46306 }, 
{ 41904, 46309 }, { 41906, 46312 }, { 41908, 46315 }, { 41910, 46318 }, { 41912, 50417 }, { 4678, 42229 }, { 
4680, 46327 }, { 4682, 46330 }, { 4683, 46333 }, { 4684, 46336 }, { 4685, 42231 }, { 41914, 50435 }, { 41916, 
50439 }, { 41918, 50443 }, { 41920, 50447 }, { 41922, 50451 }, { 41924, 54551 }, { 4688, 42268 }, { 4689, 
42270 }, { 4690, 42272 }, { 4691, 42274 }, { 4692, 42276 }, { 4693, 81 }, { 41926, 46374 }, { 41928, 46377 }, 
{ 41930, 46380 }, { 41932, 46383 }, { 41934, 46386 }, { 41936, 50485 }, { 4694, 42297 }, { 4696, 46395 }, { 
4698, 46398 }, { 4699, 46401 }, { 4700, 46404 }, { 4701, 42299 }, { 41938, 50503 }, { 41940, 50507 }, { 
41942, 50511 }, { 41
 944, 50515 }, { 41946, 50519 }, { 41948, 54619 }, { 4704, 42336 }, { 4705, 42338 }, { 4706, 42340 }, { 4707, 
41692 }, { 4708, 42342 }, { 4709, 98 }, { 41950, 46440 }, { 41952, 46443 }, { 41954, 46446 }, { 41956, 46449 
}, { 41958, 46452 }, { 41960, 50551 }, { 4710, 42363 }, { 4711, 46461 }, { 4712, 42368 }, { 4713, 42370 }, { 
4714, 41160 }, { 4715, 42372 }, { 4716, 42374 }, { 4717, 118 }, { 41962, 46472 }, { 41964, 46475 }, { 41966, 
46478 }, { 41968, 46481 }, { 41970, 46484 }, { 41972, 50583 }, { 4718, 42395 }, { 4719, 46493 }, { 4720, 
42400 }, { 4721, 42402 }, { 4722, 42404 }, { 4723, 42406 }, { 4724, 42408 }, { 4725, 116 }, { 41974, 46506 }, 
{ 41976, 46509 }, { 41978, 46512 }, { 41980, 46515 }, { 41982, 46518 }, { 41984, 50617 }, { 4726, 42429 }, { 
4727, 46527 }, { 4728, 42434 }, { 4729, 42436 }, { 4730, 42438 }, { 4731, 41048 }, { 4732, 42440 }, { 4733, 
99 }, { 41986, 46538 }, { 41988, 46541 }, { 41990, 46544 }, { 41992, 46547 }, { 41994, 46550 }, { 41996, 
50649 }, { 4734,
  42461 }, { 4735, 46559 }, { 4736, 46562 }, { 4737, 46565 }, { 4738, 46568 }, { 4739, 46571 }, { 4740, 46574 
}, { 4741, 42466 }, { 41998, 50673 }, { 42000, 50677 }, { 42002, 50681 }, { 42004, 50685 }, { 42006, 50689 }, 
{ 42008, 54789 }, { 4742, 46602 }, { 4744, 50701 }, { 4746, 50705 }, { 4747, 50709 }, { 4748, 50713 }, { 
4749, 46605 }, { 42010, 50717 }, { 42012, 50721 }, { 42014, 50725 }, { 42016, 50729 }, { 42018, 50733 }, { 
42020, 54833 }, { 4752, 42550 }, { 4753, 42552 }, { 4754, 42554 }, { 4755, 42556 }, { 4756, 42558 }, { 4757, 
110 }, { 42022, 46656 }, { 42024, 46659 }, { 42026, 46662 }, { 42028, 46665 }, { 42030, 46668 }, { 42032, 
50767 }, { 4758, 42579 }, { 4759, 46677 }, { 4760, 42584 }, { 4761, 42586 }, { 4762, 42588 }, { 4763, 42590 
}, { 4764, 41256 }, { 4765, 78 }, { 42034, 46688 }, { 42036, 46691 }, { 42038, 46694 }, { 42040, 46697 }, { 
42042, 46700 }, { 42044, 50799 }, { 4766, 41058 }, { 4767, 46707 }, { 4768, 97 }, { 4769, 117 }, { 4770, 105 
}, { 4771, 65 }, {
  4772, 69 }, { 4773, 73 }, { 4774, 111 }, { 4775, 41993 }, { 4776, 42614 }, { 4777, 42616 }, { 4778, 42618 
}, { 4779, 42620 }, { 4780, 42622 }, { 4781, 107 }, { 42046, 46720 }, { 42048, 46723 }, { 42050, 46726 }, { 
42052, 46729 }, { 42054, 46732 }, { 42056, 50831 }, { 4782, 42643 }, { 4784, 46741 }, { 4786, 46744 }, { 
4787, 46747 }, { 4788, 46750 }, { 4789, 41850 }, { 42058, 50849 }, { 42060, 50853 }, { 42062, 50857 }, { 
42064, 50861 }, { 42066, 50865 }, { 42068, 54965 }, { 4792, 42682 }, { 4793, 42684 }, { 4794, 42686 }, { 
4795, 42688 }, { 4796, 42690 }, { 4797, 75 }, { 42070, 46788 }, { 42072, 46791 }, { 42074, 46794 }, { 42076, 
46797 }, { 42078, 46800 }, { 42080, 50899 }, { 4798, 42711 }, { 4800, 46809 }, { 4802, 46812 }, { 4803, 46815 
}, { 4804, 46818 }, { 4805, 42713 }, { 42082, 50917 }, { 42084, 50921 }, { 42086, 50925 }, { 42088, 50929 }, 
{ 42090, 50933 }, { 42092, 55033 }, { 4808, 42750 }, { 42094, 46848 }, { 4809, 42755 }, { 4810, 42757 }, { 
4811, 42759 }, { 4812, 4
 2761 }, { 4813, 119 }, { 42096, 46859 }, { 42098, 46862 }, { 42100, 46865 }, { 42102, 46868 }, { 42104, 
46871 }, { 42106, 50970 }, { 4814, 42782 }, { 4816, 42784 }, { 4817, 42786 }, { 4818, 42788 }, { 4819, 42790 
}, { 4820, 42792 }, { 4821, 42794 }, { 4822, 42796 }, { 4824, 42798 }, { 4825, 41745 }, { 4826, 42800 }, { 
4827, 42802 }, { 4828, 42804 }, { 4829, 122 }, { 42108, 46902 }, { 42110, 46905 }, { 42112, 46908 }, { 42114, 
46911 }, { 42116, 46914 }, { 42118, 51013 }, { 4830, 42825 }, { 4831, 46923 }, { 4832, 42830 }, { 4833, 42832 
}, { 4834, 42834 }, { 4835, 42836 }, { 4836, 42838 }, { 4837, 90 }, { 42120, 46936 }, { 42122, 46939 }, { 
42124, 46942 }, { 42126, 46945 }, { 42128, 46948 }, { 42130, 51047 }, { 4838, 42859 }, { 4839, 46957 }, { 
4840, 42864 }, { 4841, 41956 }, { 4842, 42866 }, { 4843, 41958 }, { 4844, 42868 }, { 4845, 121 }, { 42132, 
46966 }, { 42134, 46969 }, { 42136, 46972 }, { 42138, 46975 }, { 42140, 46978 }, { 42142, 51077 }, { 4846, 
41960 }, { 4848, 42889 
 }, { 4849, 42891 }, { 4850, 42893 }, { 4851, 41688 }, { 4852, 42895 }, { 4853, 100 }, { 42144, 46993 }, { 
42146, 46996 }, { 42148, 46999 }, { 42150, 47002 }, { 42152, 47005 }, { 42154, 51104 }, { 4854, 42916 }, { 
4855, 47014 }, { 4856, 42921 }, { 4857, 42923 }, { 4858, 42925 }, { 4859, 42927 }, { 4860, 41279 }, { 4861, 
68 }, { 42156, 47025 }, { 42158, 47028 }, { 42160, 47031 }, { 42162, 47034 }, { 42164, 47037 }, { 42166, 
51136 }, { 4862, 42948 }, { 4863, 47046 }, { 4864, 42953 }, { 4865, 42955 }, { 4866, 42957 }, { 4867, 42959 
}, { 4868, 42961 }, { 4869, 106 }, { 42168, 47059 }, { 42170, 47062 }, { 42172, 47065 }, { 42174, 47068 }, { 
42176, 47071 }, { 42178, 51170 }, { 4870, 42982 }, { 4871, 47080 }, { 4872, 42987 }, { 4873, 42989 }, { 4874, 
42991 }, { 4875, 42993 }, { 4876, 42995 }, { 4877, 103 }, { 42180, 47093 }, { 42182, 47096 }, { 42184, 47099 
}, { 42186, 47102 }, { 42188, 47105 }, { 42190, 51204 }, { 4878, 43016 }, { 4880, 47114 }, { 4882, 47117 }, { 
4883, 47120 }, { 
 4884, 47123 }, { 4885, 43018 }, { 42192, 51222 }, { 42194, 51226 }, { 42196, 51230 }, { 42198, 51234 }, { 
42200, 51238 }, { 42202, 55338 }, { 4888, 43055 }, { 4889, 43057 }, { 4890, 43059 }, { 4891, 43061 }, { 4892, 
43063 }, { 4893, 71 }, { 42204, 47161 }, { 42206, 47164 }, { 42208, 47167 }, { 42210, 47170 }, { 42212, 47173 
}, { 42214, 51272 }, { 4894, 43084 }, { 4895, 47182 }, { 4896, 43089 }, { 4897, 43091 }, { 4898, 43093 }, { 
4899, 43095 }, { 4900, 41060 }, { 4901, 84 }, { 42216, 47193 }, { 42218, 47196 }, { 42220, 47199 }, { 42222, 
47202 }, { 42224, 47205 }, { 42226, 51304 }, { 4902, 43116 }, { 4903, 47214 }, { 4904, 43121 }, { 4905, 43123 
}, { 4906, 43125 }, { 4907, 43127 }, { 4908, 43129 }, { 4909, 67 }, { 42228, 47227 }, { 42230, 47230 }, { 
42232, 47233 }, { 42234, 47236 }, { 42236, 47239 }, { 42238, 51338 }, { 4910, 41868 }, { 4911, 47246 }, { 
4912, 43153 }, { 4913, 43155 }, { 4914, 41878 }, { 4915, 41686 }, { 4916, 43157 }, { 4917, 80 }, { 42240, 
47255 }, { 42242, 
 47258 }, { 42244, 47261 }, { 42246, 47264 }, { 42248, 47267 }, { 42250, 51366 }, { 4918, 43178 }, { 4919, 
47276 }, { 4920, 43183 }, { 4921, 43185 }, { 4922, 43187 }, { 4923, 43189 }, { 4924, 43191 }, { 4925, 83 }, { 
42252, 47289 }, { 42254, 47292 }, { 42256, 47295 }, { 42258, 47298 }, { 42260, 47301 }, { 42262, 51400 }, { 
4926, 43212 }, { 4927, 51406 }, { 4928, 47314 }, { 4929, 47317 }, { 4930, 47320 }, { 4931, 47323 }, { 4932, 
47326 }, { 4933, 43214 }, { 42264, 51425 }, { 42266, 51429 }, { 42268, 51433 }, { 42270, 51437 }, { 42272, 
51441 }, { 42274, 55541 }, { 4934, 47354 }, { 4936, 43261 }, { 4937, 43263 }, { 4938, 41919 }, { 4939, 43265 
}, { 4940, 43267 }, { 4941, 102 }, { 42276, 47365 }, { 42278, 47368 }, { 42280, 47371 }, { 42282, 47374 }, { 
42284, 47377 }, { 42286, 51476 }, { 4942, 43288 }, { 4943, 47386 }, { 4944, 43293 }, { 4945, 43295 }, { 4946, 
43297 }, { 4947, 43299 }, { 4948, 43301 }, { 4949, 112 }, { 42288, 47399 }, { 42290, 47402 }, { 42292, 47405 
}, { 42294, 4
 7408 }, { 42296, 47411 }, { 42298, 51510 }, { 4950, 43322 }, { 4951, 47420 }, { 4952, 47423 }, { 4953, 47426 
}, { 4954, 47429 }, { 4961, 58 }, { 4962, 41559 }, { 4963, 44 }, { 4964, 59 }, { 4965, 43336 }, { 4966, 43338 
}, { 4967, 43340 }, { 4968, 47438 }, { 4969, 43345 }, { 4970, 43347 }, { 4971, 43349 }, { 4972, 43351 }, { 
4973, 43353 }, { 4974, 43355 }, { 4975, 43357 }, { 4976, 43359 }, { 4977, 43361 }, { 4978, 47459 }, { 4979, 
47462 }, { 4980, 47465 }, { 4981, 47468 }, { 4982, 47471 }, { 4983, 47474 }, { 4984, 47477 }, { 4985, 47480 
}, { 4986, 47483 }, { 4987, 51582 }, { 4988, 59778 }, { 197, 41928 }, { 229, 41932 }, { 196, 40985 }, { 200, 
42105 }, { 202, 43400 }, { 203, 43402 }, { 214, 40987 }, { 220, 41930 }, { 228, 43404 }, { 232, 42093 }, { 
234, 43406 }, { 235, 43408 }, { 246, 43410 }, { 252, 43412 }, { 171, 40963 }, { 187, 40968 }, { 1028, 43414 
}, { 1030, 73 }, { 1031, 43416 }, { 1040, 65 }, { 1041, 66 }, { 1042, 86 }, { 1043, 72 }, { 1044, 68 }, { 
1045, 69 }, { 104
 6, 43418 }, { 1047, 90 }, { 42300, 47516 }, { 42302, 47519 }, { 1048, 89 }, { 1049, 89 }, { 1050, 75 }, { 
1051, 76 }, { 1052, 77 }, { 1053, 78 }, { 1054, 79 }, { 1055, 80 }, { 1056, 82 }, { 1057, 83 }, { 1058, 84 }, 
{ 1059, 85 }, { 1060, 70 }, { 1061, 43426 }, { 1062, 43428 }, { 1063, 43430 }, { 1064, 41223 }, { 1065, 47525 
}, { 1068, 96 }, { 1070, 43432 }, { 1071, 43434 }, { 1072, 97 }, { 1073, 98 }, { 1074, 118 }, { 1075, 104 }, 
{ 1076, 100 }, { 1077, 101 }, { 1078, 43436 }, { 1079, 122 }, { 42304, 45835 }, { 42306, 47534 }, { 1080, 121 
}, { 1081, 121 }, { 1082, 107 }, { 1083, 108 }, { 1084, 109 }, { 1085, 110 }, { 1086, 111 }, { 1087, 112 }, { 
1088, 114 }, { 1089, 115 }, { 1090, 116 }, { 1091, 117 }, { 1092, 102 }, { 1093, 43441 }, { 1094, 41950 }, { 
1095, 41952 }, { 1096, 41954 }, { 1097, 46047 }, { 1100, 96 }, { 1102, 41956 }, { 1103, 41958 }, { 1108, 
42864 }, { 1110, 105 }, { 1111, 42866 }, { 1168, 71 }, { 1169, 103 }, { 8470, 41058 }, { 350, 83 }, { 351, 
115 }, { 354,
  84 }, { 355, 116 }, { 536, 83 }, { 537, 115 }, { 538, 84 }, { 539, 116 }, { 193, 43443 }, { 201, 43445 }, { 
205, 43447 }, { 211, 41938 }, { 214, 43449 }, { 218, 43451 }, { 220, 43453 }, { 225, 43455 }, { 233, 43457 }, 
{ 237, 43459 }, { 243, 41962 }, { 246, 43461 }, { 250, 43463 }, { 252, 43465 }, { 336, 43467 }, { 337, 43469 
}, { 368, 43471 }, { 369, 43473 }, { 8363, 43475 }, { 1026, 43477 }, { 1027, 43479 }, { 1029, 41015 }, { 
1032, 74 }, { 1033, 41003 }, { 1034, 41009 }, { 1035, 67 }, { 1036, 43481 }, { 1039, 41017 }, { 1040, 65 }, { 
1041, 66 }, { 1042, 86 }, { 1043, 71 }, { 1044, 68 }, { 1045, 69 }, { 1046, 90 }, { 1047, 90 }, { 1048, 73 }, 
{ 1050, 75 }, { 1051, 76 }, { 1052, 77 }, { 1053, 78 }, { 1054, 79 }, { 1055, 80 }, { 1056, 82 }, { 1057, 83 
}, { 1058, 84 }, { 1059, 85 }, { 1060, 70 }, { 1061, 72 }, { 1062, 67 }, { 1063, 99 }, { 1064, 83 }, { 1072, 
97 }, { 1073, 98 }, { 1074, 118 }, { 1075, 103 }, { 1076, 100 }, { 1077, 101 }, { 1078, 122 }, { 1079, 122 }, 
{ 1080, 
 105 }, { 1082, 107 }, { 1083, 108 }, { 1084, 109 }, { 1085, 110 }, { 1086, 111 }, { 1087, 112 }, { 1088, 114 
}, { 1089, 115 }, { 1090, 116 }, { 1091, 117 }, { 1092, 102 }, { 1093, 104 }, { 1094, 99 }, { 1095, 99 }, { 
1096, 115 }, { 1106, 43483 }, { 1107, 43485 }, { 1109, 41017 }, { 1112, 106 }, { 1113, 41005 }, { 1114, 41011 
}, { 1115, 99 }, { 1116, 43487 }, { 1119, 41017 }, { 1025, 41936 }, { 1040, 65 }, { 1041, 66 }, { 1042, 86 }, 
{ 1043, 71 }, { 1044, 68 }, { 1045, 43489 }, { 1046, 74 }, { 1047, 90 }, { 1048, 73 }, { 1049, 73 }, { 1050, 
75 }, { 1051, 76 }, { 1052, 77 }, { 1053, 78 }, { 1054, 79 }, { 1055, 80 }, { 1056, 82 }, { 1057, 83 }, { 
1058, 84 }, { 1059, 85 }, { 1060, 70 }, { 1061, 72 }, { 1062, 67 }, { 1063, 41942 }, { 1064, 41944 }, { 1065, 
41944 }, { 1066, 34 }, { 1067, 89 }, { 1068, 39 }, { 1069, 69 }, { 1070, 41946 }, { 1071, 41948 }, { 1072, 97 
}, { 1073, 98 }, { 1074, 118 }, { 1075, 103 }, { 1076, 100 }, { 1077, 42864 }, { 1078, 106 }, { 1079, 122 }, 
{ 1080, 
 105 }, { 1081, 105 }, { 1082, 107 }, { 1083, 108 }, { 1084, 109 }, { 1085, 110 }, { 1086, 111 }, { 1087, 112 
}, { 1088, 114 }, { 1089, 115 }, { 1090, 116 }, { 1091, 117 }, { 1092, 102 }, { 1093, 104 }, { 1094, 67 }, { 
1095, 41952 }, { 1096, 41954 }, { 1097, 41954 }, { 1098, 34 }, { 1099, 121 }, { 1100, 39 }, { 1101, 101 }, { 
1102, 41956 }, { 1103, 41958 }, { 1105, 41960 }, { 1198, 43491 }, { 1199, 41934 }, { 1256, 43493 }, { 1257, 
40993 }, { 1520, 43495 }, { 1521, 43497 }, { 1522, 43499 }, { 1040, 65 }, { 1041, 66 }, { 1042, 87 }, { 1043, 
71 }, { 1044, 68 }, { 1045, 69 }, { 1047, 90 }, { 1048, 73 }, { 1050, 75 }, { 1051, 76 }, { 1052, 77 }, { 
1053, 78 }, { 1054, 79 }, { 1055, 80 }, { 1056, 82 }, { 1057, 83 }, { 1058, 84 }, { 1059, 85 }, { 1060, 70 }, 
{ 1061, 72 }, { 1062, 41940 }, { 1066, 32768 }, { 1067, 89 }, { 1068, 32768 }, { 1069, 69 }, { 1072, 97 }, { 
1073, 98 }, { 1074, 119 }, { 1075, 103 }, { 1076, 100 }, { 1077, 101 }, { 1079, 122 }, { 1080, 105 }, { 1082, 
107 }, { 
 1083, 108 }, { 1084, 109 }, { 1085, 110 }, { 1086, 111 }, { 1087, 112 }, { 1088, 114 }, { 1089, 115 }, { 
1090, 116 }, { 1091, 117 }, { 1092, 102 }, { 1093, 104 }, { 1094, 41950 }, { 1098, 32768 }, { 1099, 121 }, { 
1100, 32768 }, { 1101, 101 }, { 1174, 74 }, { 1175, 106 } };
+static const struct mapping_range mapping_ranges[] = { { 0, 1354 }, { 1354, 626 }, { 1980, 12 }, { 1992, 2 
}, { 1994, 74 }, { 2068, 593 }, { 2661, 0 }, { 2661, 2 }, { 2663, 12 }, { 2675, 73 }, { 2748, 8 }, { 2756, 18 
}, { 2774, 1 }, { 2775, 66 }, { 2841, 70 }, { 2911, 3 }, { 2914, 52 } };
+static const guint8 chains_table[] = { 1, 0, 255, 2, 1, 0, 255, 3, 1, 0, 255, 4, 1, 0, 255, 1, 5, 0, 255, 6, 
1, 0, 255, 7, 1, 0, 255, 8, 1, 0, 255, 9, 0, 255, 10, 1, 0, 255, 6, 1, 255, 11, 1, 0, 255, 12, 1, 0, 255, 13, 
1, 0, 255, 14, 1, 0, 255, 15, 1, 0, 255, 5, 1, 0, 255, 16, 1, 0, 255 };
+static const guint8 chain_starts[] = { 0, 3, 7, 11, 15, 19, 23, 27, 31, 34, 38, 41, 45, 49, 53, 57, 61, 65 };
+static const gchar locale_names[] = "aa 
saaho\0aa_ER\0aa_ET\0am\0az\0be@latin\0byn\0cmn\0crh\0da\0de\0fo\0gez\0hak\0hsb\0hu\0ja\0kl\0km\0ko\0ku\0lb\0lzh\0mn\0my\0nan\0nso\0om_ET\0pa_PK\0ps\0ro\0sid\0so_ET\0sr
 latin\0sr_ME\0sr_RS\0ti\0tig\0tk\0tr\0tt@iqtelif\0ug\0uk\0ur_PK\0uz\0vi\0wa\0wae\0wal\0yi\0";
+static const struct locale_entry locale_index[] =  { { 0, 132 }, { 9, 132 }, { 15, 132 }, { 21, 144 }, { 24, 
138 }, { 27, 0 }, { 36, 132 }, { 40, 0 }, { 44, 1 }, { 48, 134 }, { 51, 129 }, { 54, 134 }, { 57, 132 }, { 
61, 0 }, { 65, 0 }, { 69, 139 }, { 72, 133 }, { 75, 134 }, { 78, 1 }, { 81, 133 }, { 84, 1 }, { 87, 135 }, { 
90, 0 }, { 94, 142 }, { 97, 0 }, { 100, 0 }, { 104, 0 }, { 108, 132 }, { 114, 133 }, { 120, 0 }, { 123, 137 
}, { 126, 132 }, { 130, 132 }, { 136, 0 }, { 145, 0 }, { 151, 141 }, { 157, 132 }, { 160, 132 }, { 164, 145 
}, { 167, 1 }, { 170, 1 }, { 181, 0 }, { 184, 136 }, { 187, 133 }, { 193, 131 }, { 196, 140 }, { 199, 130 }, 
{ 202, 129 }, { 206, 132 }, { 210, 143 } };
+static const guint8 default_item_id = 128;
diff --git a/glib/gtranslit.c b/glib/gtranslit.c
new file mode 100644
index 0000000..3cdfe94
--- /dev/null
+++ b/glib/gtranslit.c
@@ -0,0 +1,409 @@
+/*
+ * Copyright © 2014 Canonical Limited
+ *
+ * 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 of the licence, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Ryan Lortie <desrt desrt ca>
+ */
+
+#include <config.h>
+
+#include "gstrfuncs.h"
+
+#include <glib.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct mapping_entry
+{
+  guint16 src;
+  guint16 ascii;
+};
+
+struct mapping_range
+{
+  guint16 start;
+  guint16 length;
+};
+
+struct locale_entry
+{
+  guint8 name_offset;
+  guint8 item_id;
+};
+
+#include "gtranslit-data.h"
+
+#define get_src_char(array, encoded, index) ((encoded & 0x8000) ? (array)[((encoded) & 0xfff) + index] : 
encoded)
+#define get_length(encoded)                 ((encoded & 0x8000) ? ((encoded & 0x7000) >> 12) : 1)
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define get_ascii_item(array, encoded)      ((encoded & 0x8000) ? &(array)[(encoded) & 0xfff] : (gpointer) 
(((char *) &(encoded)) + 1))
+#else
+#define get_ascii_item(array, encoded)      ((encoded & 0x8000) ? &(array)[(encoded) & 0xfff] : (gpointer) 
&(encoded))
+#endif
+
+static const gchar * lookup_in_item (guint           item_id,
+                                     const gunichar *key,
+                                     gint           *result_len,
+                                     gint           *key_consumed);
+
+static gint
+compare_mapping_entry (gconstpointer user_data,
+                       gconstpointer data)
+{
+  const struct mapping_entry *entry = data;
+  const gunichar *key = user_data;
+  gunichar src_0;
+
+  G_STATIC_ASSERT(MAX_KEY_SIZE == 2);
+
+  src_0 = get_src_char (src_table, entry->src, 0);
+
+  if (key[0] > src_0)
+    return 1;
+  else if (key[0] < src_0)
+    return -1;
+
+  if (get_length (entry->src) > 1)
+    {
+      gunichar src_1;
+
+      src_1 = get_src_char (src_table, entry->src, 1);
+
+      if (key[1] > src_1)
+        return 1;
+      else if (key[1] < src_1)
+        return -1;
+    }
+  else if (key[1])
+    return 1;
+
+  return 0;
+}
+
+static const gchar *
+lookup_in_mapping (const struct mapping_entry *mapping,
+                   gint                        mapping_size,
+                   const gunichar             *key,
+                   gint                       *result_len,
+                   gint                       *key_consumed)
+{
+  const struct mapping_entry *hit;
+
+  hit = bsearch (key, mapping, mapping_size, sizeof (struct mapping_entry), compare_mapping_entry);
+
+  if (hit == NULL)
+    return NULL;
+
+  *key_consumed = get_length (hit->src);
+  *result_len = get_length (hit->ascii);
+
+  return get_ascii_item(ascii_table, hit->ascii);
+}
+
+static const gchar *
+lookup_in_chain (const guint8   *chain,
+                 const gunichar *key,
+                 gint           *result_len,
+                 gint           *key_consumed)
+{
+  const gchar *result;
+
+  while (*chain != 0xff)
+    {
+      result = lookup_in_item (*chain, key, result_len, key_consumed);
+
+      if (result)
+        return result;
+
+      chain++;
+    }
+
+  return NULL;
+}
+
+static const gchar *
+lookup_in_item (guint           item_id,
+                const gunichar *key,
+                gint           *result_len,
+                gint           *key_consumed)
+{
+  if (item_id & 0x80)
+    {
+      const guint8 *chain = chains_table + chain_starts[item_id & 0x7f];
+
+      return lookup_in_chain (chain, key, result_len, key_consumed);
+    }
+  else
+    {
+      const struct mapping_range *range = &mapping_ranges[item_id];
+
+      return lookup_in_mapping (mappings_table + range->start, range->length, key, result_len, key_consumed);
+    }
+}
+
+static gint
+compare_locale_entry (gconstpointer user_data,
+                      gconstpointer data)
+{
+  const struct locale_entry *entry = data;
+  const gchar *key = user_data;
+
+  return strcmp (key, &locale_names[entry->name_offset]);
+}
+
+static gboolean
+lookup_item_id_for_one_locale (const gchar *key,
+                               guint       *item_id)
+{
+  const struct locale_entry *hit;
+
+  hit = bsearch (key, locale_index, G_N_ELEMENTS (locale_index), sizeof (struct locale_entry), 
compare_locale_entry);
+
+  if (hit == NULL)
+    return FALSE;
+
+  *item_id = hit->item_id;
+  return TRUE;
+}
+
+static guint
+lookup_item_id_for_locale (const gchar *locale)
+{
+  gchar key[MAX_LOCALE_NAME + 1];
+  const gchar *language;
+  guint language_len;
+  const gchar *territory = NULL;
+  guint territory_len = 0;
+  const gchar *modifier = NULL;
+  guint modifier_len = 0;
+  const gchar *next_char;
+  guint id;
+
+  /* As per POSIX, a valid locale looks like:
+   *
+   *   language[_territory][ codeset][ modifier]
+   */
+  language = locale;
+  language_len = strcspn (language, "_.@");
+  next_char = language + language_len;
+
+  if (*next_char == '_')
+    {
+      territory = next_char;
+      territory_len = strcspn (territory + 1, "_.@") + 1;
+      next_char = territory + territory_len;
+    }
+
+  if (*next_char == '.')
+    {
+      const gchar *codeset;
+      guint codeset_len;
+
+      codeset = next_char;
+      codeset_len = strcspn (codeset + 1, "_.@") + 1;
+      next_char = codeset + codeset_len;
+    }
+
+  if (*next_char == '@')
+    {
+      modifier = next_char;
+      modifier_len = strcspn (modifier + 1, "_.@") + 1;
+      next_char = modifier + modifier_len;
+    }
+
+  /* What madness is this? */
+  if (language_len == 0 || *next_char)
+    return default_item_id;
+
+  /* We are not interested in codeset.
+   *
+   * For this locale:
+   *
+   *  aa_BB cc
+   *
+   * try in this order:
+   *
+   * Note: we have no locales of the form aa_BB cc in the database.
+   *
+   *  1. aa cc
+   *  2. aa_BB
+   *  3. aa
+   */
+
+  /* 1. */
+  if (modifier_len && language_len + modifier_len <= MAX_LOCALE_NAME)
+    {
+      memcpy (key, language, language_len);
+      memcpy (key + language_len, modifier, modifier_len);
+      key[language_len + modifier_len] = '\0';
+
+      if (lookup_item_id_for_one_locale (key, &id))
+        return id;
+    }
+
+  /* 2. */
+  if (territory_len && language_len + territory_len <= MAX_LOCALE_NAME)
+    {
+      memcpy (key, language, language_len);
+      memcpy (key + language_len, territory, territory_len);
+      key[language_len + territory_len] = '\0';
+
+      if (lookup_item_id_for_one_locale (key, &id))
+        return id;
+    }
+
+  /* 3. */
+  if (language_len <= MAX_LOCALE_NAME)
+    {
+      memcpy (key, language, language_len);
+      key[language_len] = '\0';
+
+      if (lookup_item_id_for_one_locale (key, &id))
+        return id;
+    }
+
+  return default_item_id;
+}
+
+static guint
+get_default_item_id (void)
+{
+  static guint item_id;
+  static gboolean done;
+
+  /* Doesn't need to be locked -- no harm in doing it twice. */
+  if (!done)
+    {
+      const gchar *locale;
+
+      locale = setlocale (LC_CTYPE, NULL);
+      item_id = lookup_item_id_for_locale (locale);
+      done = TRUE;
+    }
+
+  return item_id;
+}
+
+/**
+ * g_str_to_ascii:
+ * @str: a string, in UTF-8
+ * @from_locale: (allow-none): the source locale, if known
+ *
+ * Transliterate @str to plain ASCII.
+ *
+ * For best results, @str should be in composed normalised form.
+ *
+ * This function performs a reasonably good set of character
+ * replacements.  The particular set of replacements that is done may
+ * change by version or even by runtime environment.
+ *
+ * If the source language of @str is known, it can used to improve the
+ * accuracy of the translation by passing it as @from_locale.  It should
+ * be a valid POSIX locale string (of the form
+ * "language[_territory][ codeset][ modifier]").
+ *
+ * If @from_locale is %NULL then the current locale is used.
+ *
+ * If you want to do translation for no specific locale, and you want it
+ * to be done independently of the currently locale, specify "C" for
+ * @from_locale.
+ *
+ * Returns: a string in plain ASCII
+ **/
+gchar *
+g_str_to_ascii (const gchar *str,
+                const gchar *from_locale)
+{
+  GString *result;
+  guint item_id;
+
+  if (g_str_is_ascii (str))
+    return g_strdup (str);
+
+  if (from_locale)
+    item_id = lookup_item_id_for_locale (from_locale);
+  else
+    item_id = get_default_item_id ();
+
+  result = g_string_new (NULL);
+
+  while (*str)
+    {
+      /* We only need to transliterate non-ASCII values... */
+      if (*str & 0x80)
+        {
+          gunichar key[MAX_KEY_SIZE];
+          const gchar *r;
+          gint consumed;
+          gint r_len;
+          gunichar c;
+
+          G_STATIC_ASSERT(MAX_KEY_SIZE == 2);
+
+          c = g_utf8_get_char (str);
+
+          /* This is where it gets evil...
+           *
+           * We know that MAX_KEY_SIZE is 2.  We also know that we
+           * only want to try another character if it's non-ascii.
+           */
+          str = g_utf8_next_char (str);
+
+          key[0] = c;
+          if (*str & 0x80)
+            key[1] = g_utf8_get_char (str);
+          else
+            key[1] = 0;
+
+          r = lookup_in_item (item_id, key, &r_len, &consumed);
+
+          /* If we failed to map two characters, try again with one.
+           *
+           * gconv behaviour is a bit weird here -- it seems to
+           * depend in the randomness of the binary search and the
+           * size of the input buffer as to what result we get here.
+           *
+           * Doing it this way is more work, but should be
+           * more-correct.
+           */
+          if (r == NULL && key[1])
+            {
+              key[1] = 0;
+              r = lookup_in_item (item_id, key, &r_len, &consumed);
+            }
+
+          if (r != NULL)
+            {
+              g_string_append_len (result, r, r_len);
+              if (consumed == 2)
+                /* If it took both then skip again */
+                str = g_utf8_next_char (str);
+            }
+          else /* no match found */
+            g_string_append_c (result, '?');
+        }
+      else if (*str & 0x80) /* Out-of-range non-ASCII case */
+        {
+          g_string_append_c (result, '?');
+          str = g_utf8_next_char (str);
+        }
+      else /* ASCII case */
+        g_string_append_c (result, *str++);
+    }
+
+  return g_string_free (result, FALSE);
+}
diff --git a/glib/update-gtranslit.py b/glib/update-gtranslit.py
new file mode 100755
index 0000000..01f7c7f
--- /dev/null
+++ b/glib/update-gtranslit.py
@@ -0,0 +1,410 @@
+#!/usr/bin/env python3
+
+# Run this script like so:
+#
+#  ./update-gtranslit.py /path/to/glibc/localedata/locales > gtranslit-data.h
+
+import sys, os
+
+localedir = sys.argv[1]
+
+# returns true if the name looks like a POSIX locale name
+def looks_like_locale(name):
+    name, _, variant = name.partition('@')
+
+    if '_' not in name:
+        return False
+
+    lang, _, land = name.partition('_')
+
+    return len(lang) == 2 or len(lang) == 3 and len(land) == 2
+
+# handles <U1234> style escapes
+def unescape(string):
+    chunks = []
+
+    n = len(string)
+    i = 0
+
+    while i < n:
+        start_escape = string.find('<', i)
+
+        if start_escape == -1:
+            chunks.append(string[i:])
+            break
+
+        assert string[start_escape:start_escape + 2] == '<U'
+        start_escape += 2
+
+        end_escape = string.find('>', start_escape)
+        assert end_escape != -1
+
+        chunks.append(chr(int(string[start_escape:end_escape], 16)))
+        i = end_escape + 1
+
+    return ''.join(chunks)
+
+# Checks if a string is ascii
+def is_ascii(string):
+    return all(ord(c) < 0x80 for c in string)
+
+# A Mapping is a map from non-ascii strings to ascii strings.
+#
+# It corresponds to a sequence of one or more mapping lines:
+#
+#   <U00C4> "<U0041><U0308>";"<U0041><U0045>"
+#
+# in a file.
+class Mapping:
+    def __init__(self):
+        self.serialised = None
+        self.mapping = {}
+
+    # Scans a string like
+    #
+    #   <U00C4> "<U0041><U0308>";"<U0041><U0045>" % LATIN CAPITAL LETTER A WITH DIAERESIS.
+    #
+    # and adds the first all-ascii choice (or IGNORE) to the mapping
+    # dictionary, with the origin string as the key.  In the case of
+    # IGNORE, stores the empty string.
+    def consider_mapping_line(self, line):
+        key, value, rest = (line + ' % comment').split(maxsplit=2)
+
+        key = unescape(key)
+
+        for alternative in value.split(';'):
+            if alternative[0] == '"' and alternative[-1] == '"':
+                unescaped = unescape(alternative[1:-1])
+                if is_ascii(unescaped):
+                    self.mapping[key] = unescaped
+                    break
+
+            elif alternative[0] == '<' and alternative[-1] == '>':
+                unescaped = unescape(alternative)
+                if is_ascii(unescaped):
+                    self.mapping[key] = unescaped
+                    break
+
+            elif alternative == 'IGNORE':
+                self.mapping[key] = ''
+                break
+
+    # Performs a normal dictionary merge, but ensures that there are no
+    # conflicting entries between the original dictionary and the requested
+    # changes
+    def merge_mapping(self, changes):
+        for key in changes.mapping:
+            if key in self.mapping:
+                assert self.mapping[key] == changes.mapping[key]
+
+        self.mapping.update(changes.mapping)
+
+    # Can't get much flatter...
+    def get_flattened(self):
+        return [self]
+
+    def serialise(self, serialiser):
+        if self.serialised == None:
+            self.serialised = serialiser.add_mapping(self.mapping)
+
+        return self.serialised
+
+# A Chain is a sequence of mappings and chains.
+#
+# A chain contains another chain whenever "copy" or "include" is
+# encountered in a source file.
+#
+# A chain contains a mapping whenever a sequence of mapping lines:
+#
+#   <U00C4> "<U0041><U0308>";"<U0041><U0045>"
+#
+# is encountered in a file.
+#
+# The order of lookup is reverse: later entries override earlier ones.
+class Chain:
+    def __init__(self, name):
+        self.serialised = None
+        self.name = name
+        self.chain = []
+        self.links = 0
+
+        self.read_from_file(os.path.join(localedir, name))
+
+    def read_from_file(self, filename):
+        current_mapping = None
+        in_lc_ctype = False
+        in_translit = False
+
+        fp = open(filename, encoding='ascii', errors='surrogateescape')
+
+        for line in fp:
+            line = line.strip()
+
+            if in_lc_ctype:
+                if line == 'END LC_CTYPE':
+                    break
+
+                if line.startswith('copy') or line.startswith('include'):
+                    if current_mapping:
+                        self.chain.append(current_mapping)
+
+                    copyname = unescape(line.split('"', 3)[1])
+                    copyfile = get_chain(copyname)
+                    self.chain.append(copyfile)
+                    copyfile.links += 1
+
+                    current_mapping = None
+
+                elif line == 'translit_start':
+                    in_translit = True
+
+                elif line == 'translit_end':
+                    in_translit = False
+
+                elif in_translit and line.startswith('<U'):
+                    if not current_mapping:
+                        current_mapping = Mapping()
+
+                    current_mapping.consider_mapping_line(line)
+
+                elif line == '' or line.startswith('%'):
+                    pass
+
+                elif 'default_missing <U003F>':
+                    pass
+
+                elif in_translit:
+                    print('unknown line:', line)
+                    assert False
+
+            elif line == 'LC_CTYPE':
+                in_lc_ctype = True
+
+        if current_mapping:
+            self.chain.append(current_mapping)
+
+    # If there is only one link to this chain, we may as well just
+    # return the contents of the chain so that they can be merged into
+    # our sole parent directly.  Otherwise, return ourselves.
+    def get_flattened(self):
+        if self.links == 1:
+            return sum((item.get_flattened() for item in self.chain), [])
+        else:
+            return [self]
+
+    def serialise(self, serialiser):
+        if self.serialised == None:
+            # Before we serialise, see if we can optimise a bit
+            self.chain = sum((item.get_flattened() for item in self.chain), [])
+
+            i = 0
+            while i < len(self.chain) - 1:
+                if isinstance(self.chain[i], Mapping) and isinstance(self.chain[i + 1], Mapping):
+                    # We have two mappings in a row.  Try to merge them.
+                    self.chain[i].merge_mapping(self.chain[i + 1])
+                    del self.chain[i + 1]
+                else:
+                    i += 1
+
+            # If all that is left is one item, just serialise that directly
+            if len(self.chain) == 1:
+                self.serialised = self.chain[0].serialise(serialiser)
+            else:
+                ids = [item.serialise(serialiser) for item in self.chain]
+                self.serialised = serialiser.add_chain(ids)
+
+        return self.serialised
+
+# Chain cache -- allows sharing of common chains
+chains = {}
+def get_chain(name):
+    if not name in chains:
+        chains[name] = Chain(name)
+
+    return chains[name]
+
+
+# Remove the country name from a locale, preserving variant
+# eg: 'sr_RS latin' -> 'sr latin'
+def remove_country(string):
+    base, at, variant = string.partition('@')
+    lang, _, land = base.partition('_')
+    return lang + at + variant
+
+def encode_range(start, end):
+    assert start <= end
+    length = end - start
+
+    assert start < 0x1000
+    assert length < 0x8
+
+    result = 0x8000 + (length << 12) + start
+
+    assert result < 0x10000
+
+    return result
+
+def c_pair_array(array):
+    return '{ ' + ', '.join ('{ %u, %u }' % pair for pair in array) + ' };'
+
+class Serialiser:
+    def __init__(self):
+        self.mappings = []
+        self.chains = []
+        self.locales = {}
+
+    def add_mapping(self, mapping):
+        if mapping in self.mappings:
+            mapping_id = self.mappings.index(mapping)
+        else:
+            mapping_id = len(self.mappings)
+            self.mappings.append(mapping)
+
+        assert mapping_id < 128
+        return mapping_id
+
+    def add_chain(self, chain):
+        if chain in self.chains:
+            chain_id = self.chains.index(chain)
+        else:
+            chain_id = len(self.chains)
+            self.chains.append(chain)
+
+        assert chain_id < 128
+        return 128 + chain_id
+
+    def add_locale(self, name, item_id):
+        self.locales[name] = item_id
+
+    def add_default(self, item_id):
+        self.default = item_id
+
+    def optimise_locales(self):
+        # Check if all regions of a language/variant agree
+        languages = list(set(remove_country(locale) for locale in self.locales))
+
+        for language in languages:
+            locales = [locale for locale in self.locales if remove_country(locale) == language]
+
+            item_id = self.locales[locales[0]]
+            if all(self.locales[locale] == item_id for locale in locales):
+                self.locales[language] = item_id
+                for locale in locales:
+                    del self.locales[locale]
+
+        # Check if a variant is the same as the non-variant form
+        # eg: 'de euro' and 'de'
+        for variant in list(locale for locale in self.locales if '@' in locale):
+            base, _, _ = variant.partition('@')
+            if base in self.locales and self.locales[base] == self.locales[variant]:
+                del self.locales[variant]
+
+        # Eliminate any entries that are just the same as the C locale
+        for locale in list(self.locales):
+            if self.locales[locale] == self.default:
+                del self.locales[locale]
+
+    def to_c(self):
+        src_table = ''
+        ascii_table = ''
+        mappings_table = []
+        mapping_ranges = []
+        chains_table = []
+        chain_starts = []
+        locale_names = ''
+        locale_index = []
+        max_lookup = 0
+        max_localename = 0
+
+        for mapping in self.mappings:
+            mapping_ranges.append ((len(mappings_table), len(mapping)))
+
+            for key in sorted(mapping):
+                if len(key) == 1 and ord(key[0]) < 0x8000:
+                    src_range = ord(key[0])
+                else:
+                    existing = src_table.find(key)
+                    if existing == -1:
+                        start = len(src_table)
+                        assert all(ord(c) <= 0x10ffff for c in key)
+                        src_table += key
+                        src_range = encode_range(start, len(src_table))
+                        max_lookup = max(max_lookup, len(key))
+                    else:
+                        src_range = encode_range(existing, existing + len(key))
+
+                value = mapping[key]
+                if len(value) == 1 and ord(value[0]) < 0x80:
+                    ascii_range = ord(value[0])
+                else:
+                    existing = ascii_table.find(value)
+                    if existing == -1:
+                        start = len(ascii_table)
+                        assert all(ord(c) < 0x80 for c in value)
+                        ascii_table += value
+                        ascii_range = encode_range(start, len(ascii_table))
+                    else:
+                        ascii_range = encode_range(existing, existing + len(value))
+
+                mappings_table.append ((src_range, ascii_range))
+
+            mapping_end = len(mappings_table)
+
+        for chain in self.chains:
+            chain_starts.append(len(chains_table))
+
+            for item_id in reversed(chain):
+                assert item_id < 0xff
+                chains_table.append(item_id)
+            chains_table.append(0xff)
+
+        for locale in sorted(self.locales):
+            max_localename = max(max_localename, len(locale))
+            name_offset = len(locale_names)
+            assert all(ord(c) <= 0x7f for c in locale)
+            locale_names += (locale + '\0')
+
+            item_id = self.locales[locale]
+
+            assert name_offset < 256
+            assert item_id < 256
+            locale_index.append((name_offset, item_id))
+
+        print('/* Generated by update-gtranslit.py */')
+        print('#define MAX_KEY_SIZE', max_lookup)
+        print('#define MAX_LOCALE_NAME', max_localename)
+        print('static const gunichar src_table[] = {', ', '.join(str(ord(c)) for c in src_table), '};')
+        # cannot do this in plain ascii because of trigraphs... :(
+        print('static const gchar ascii_table[] = {', ', '.join(str(ord(c)) for c in ascii_table), '};')
+        print('static const struct mapping_entry mappings_table[] =', c_pair_array (mappings_table))
+        print('static const struct mapping_range mapping_ranges[] =', c_pair_array (mapping_ranges))
+        print('static const guint8 chains_table[] = {', ', '.join(str(i) for i in chains_table), '};')
+        print('static const guint8 chain_starts[] = {', ', '.join(str(i) for i in chain_starts), '};')
+        print('static const gchar locale_names[] = "' + locale_names.replace('\0', '\\0') + '";')
+        print('static const struct locale_entry locale_index[] = ', c_pair_array (locale_index))
+        print('static const guint8 default_item_id = %u;' % (self.default,))
+
+    def dump(self):
+        print(self.mappings)
+        print(self.chains)
+        print(self.locales)
+
+locales = []
+for name in os.listdir(localedir):
+    if looks_like_locale(name):
+        chain = get_chain(name)
+        locales.append (chain)
+        chain.links += 1
+
+serialiser = Serialiser()
+
+for locale in locales:
+    serialiser.add_locale(locale.name, locale.serialise(serialiser))
+
+i18n = get_chain('i18n').serialise(serialiser)
+combining = get_chain('translit_combining').serialise(serialiser)
+serialiser.add_default(serialiser.add_chain([i18n, combining]))
+
+serialiser.optimise_locales()
+
+serialiser.to_c()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]