diff --git a/icu4c/source/data/in/coll/ucadata-implicithan.icu b/icu4c/source/data/in/coll/ucadata-implicithan.icu index 50f6869f375..7bd79cbed84 100644 Binary files a/icu4c/source/data/in/coll/ucadata-implicithan.icu and b/icu4c/source/data/in/coll/ucadata-implicithan.icu differ diff --git a/icu4c/source/data/in/coll/ucadata-unihan.icu b/icu4c/source/data/in/coll/ucadata-unihan.icu index 92feef5258d..eb7f5c12093 100644 Binary files a/icu4c/source/data/in/coll/ucadata-unihan.icu and b/icu4c/source/data/in/coll/ucadata-unihan.icu differ diff --git a/icu4c/source/data/unidata/FractionalUCA.txt b/icu4c/source/data/unidata/FractionalUCA.txt index 65306a5af8b..6515c6c8e6a 100644 --- a/icu4c/source/data/unidata/FractionalUCA.txt +++ b/icu4c/source/data/unidata/FractionalUCA.txt @@ -1,7 +1,6 @@ -# Fractional UCA Table, generated from standard UCA -# 2014-10-09 [MS] -# VERSION: UCA=8.0.0, UCD=7.0.0 -# UCA 7 data except Cyrillic contractions removed as in UCA 8 +# Fractional UCA Table, generated from standard UCA +# 2014-12-23 [MS] +# VERSION: UCA=7.0.0, UCD=7.0.0 # For a description of the format and usage, see # http://www.unicode.org/reports/tr35/tr35-collation.html @@ -15081,7 +15080,7 @@ A79A; [29, 05, A2][, 96, 20] 1EAC; [29, 05, 9C][, C4, 05][, 8E, 05] 1E01; [29, 05, 05][, C8, 05] 1E00; [29, 05, 9C][, C8, 05] -1DD3; [29, 70, 10] +1DD3; [29, 70, 05] 33C2; [29, 05, 31][09, 05, 30][41, 05, 31][09, 05, 30] 2100; [29, 05, 13][0B 86, 05, 2E][2D, 05, 13] 2101; [29, 05, 13][0B 86, 05, 2E][4D, 05, 13] @@ -15090,14 +15089,14 @@ A79A; [29, 05, A2][, 96, 20] A733; [29, 05, 13][29, 05, 13] A732; [29, 05, A2][29, 05, A2] 1F18E; [29, 05, B4][2B, 05, B1] -00E6; [29, 70, 10][31, 05, 13] -1DD4; [29, 70, 10][31, 05, 13] -00C6; [29, 70, 9E][31, 05, A2] -1D2D; [29, 70, 2C][31, 05, 2B] -01FD; [29, 70, 10][31, 05, 13][, 88, 05] -01FC; [29, 70, 9E][31, 05, A2][, 88, 05] -01E3; [29, 70, 10][31, 05, 13][, A4, 05] -01E2; [29, 70, 9E][31, 05, A2][, A4, 05] +00E6; [29, 70, 05][31, 05, 13] +1DD4; [29, 70, 05][31, 05, 13] +00C6; [29, 70, A0][31, 05, A2] +1D2D; [29, 70, 2E][31, 05, 2B] +01FD; [29, 70, 05][31, 05, 13][, 88, 05] +01FC; [29, 70, A0][31, 05, A2][, 88, 05] +01E3; [29, 70, 05][31, 05, 13][, A4, 05] +01E2; [29, 70, A0][31, 05, A2][, A4, 05] 1DD5; [29, 05, 13][45, 05, 13] A735; [29, 05, 13][45, 05, 13] A734; [29, 05, A2][45, 05, A2] @@ -15107,8 +15106,8 @@ A736; [29, 05, A2][51, 05, A2] 1DD6; [29, 05, 13][53, 05, 13] A739; [29, 05, 13][53, 05, 13] A738; [29, 05, A2][53, 05, A2] -A73B; [29, 70, 10][53, 05, 13] -A73A; [29, 70, 9E][53, 05, A2] +A73B; [29, 70, 05][53, 05, 13] +A73A; [29, 70, A0][53, 05, A2] A73D; [29, 05, 13][59, 05, 13] A73C; [29, 05, A2][59, 05, A2] 1E9A; [29, 05, 13][5C 50, 05, 20] @@ -15360,13 +15359,13 @@ FF24; [2F, 05, 9F] 1E12; [2F, 05, 9C][, CC, 05] 1E0F; [2F, 05, 05][, D2, 05] 1E0E; [2F, 05, 9C][, D2, 05] -00F0; [2F, 70, 10] -1DD9; [2F, 70, 10] -00D0; [2F, 70, 9E] -1D9E; [2F, 70, 2C] -1DD8; [2F, 78, 20] -A77A; [2F, 78, 20] -A779; [2F, 78, AE] +00F0; [2F, 70, 05] +1DD9; [2F, 70, 05] +00D0; [2F, 70, A0] +1D9E; [2F, 70, 2E] +1DD8; [2F, 78, 05] +A77A; [2F, 78, 05] +A779; [2F, 78, A0] 3372; [2F, 05, 2E][29, 05, 31] 0238; [2F, 05, 13][2B, 05, 13] 33C8; [2F, 05, 2E][2B, 05, B1] @@ -15599,8 +15598,8 @@ FF26; [33, 05, 9F] 1F175; [33, 05, B1] 1E1F; [33, 05, 05][, 9C, 05] 1E1E; [33, 05, 9C][, 9C, 05] -A77C; [33, 70, 20] -A77B; [33, 70, AE] +A77C; [33, 70, 05] +A77B; [33, 70, A0] 213B; [33, 05, A2][29, 05, A2][57, 05, A2] FB00; [33, 05, 13][33, 05, 13] FB03; [33, 05, 13][33, 05, 13][39, 05, 13] @@ -15684,8 +15683,8 @@ FF27; [35, 05, 9F] 1E20; [35, 05, 9C][, A4, 05] A7A1; [35, 05, 13][, AA, 20] A7A0; [35, 05, A2][, AA, 20] -1D79; [35, 70, 20] -A77D; [35, 70, AE] +1D79; [35, 70, 05] +A77D; [35, 70, A0] 33FF; [35, 05, 2E][29, 05, 31][3F, 05, 31] 3387; [35, 05, B1][2B, 05, B1] 3393; [35, 05, B1][37, 05, B4][5B, 05, 2E] @@ -16526,9 +16525,9 @@ A79C; [45, 05, A2][, 96, 20] 1ECC; [45, 05, 9C][, C4, 05] 1ED9; [45, 05, 05][, C4, 05][, 8E, 05] 1ED8; [45, 05, 9C][, C4, 05][, 8E, 05] -0153; [45, 70, 10][31, 05, 13] -0152; [45, 70, 9E][31, 05, A2] -A7F9; [45, 70, 2C][31, 05, 2B] +0153; [45, 70, 05][31, 05, 13] +0152; [45, 70, A0][31, 05, A2] +A7F9; [45, 70, 2E][31, 05, 2B] 1F197; [45, 05, B4][3D, 05, B4] A74F; [45, 05, 13][45, 05, 13] A74E; [45, 05, A2][45, 05, A2] @@ -16794,8 +16793,8 @@ A7A6; [4B, 05, A2][, AA, 20] 1E5C; [4B, 05, 9C][, C4, 05][, A4, 05] 1E5F; [4B, 05, 05][, D2, 05] 1E5E; [4B, 05, 9C][, D2, 05] -A783; [4B, 70, 20] -A782; [4B, 70, AE] +A783; [4B, 70, 05] +A782; [4B, 70, A0] 33AD; [4B, 05, 31][29, 05, 31][2F, 05, 2E] 33AE; [4B, 05, 31][29, 05, 31][2F, 05, 2E][0D 79 1E, 05, 20][4D, 05, 31] 33AF; [4B, 05, 31][29, 05, 31][2F, 05, 2E][0D 79 1E, 05, 20][4D, 05, 31][18, 05, 2E] @@ -16926,21 +16925,21 @@ A7A8; [4D, 05, A2][, AA, 20] 1E68; [4D, 05, 9C][, C4, 05][, 9C, 05] 0219; [4D, 05, 05][, CA, 05] 0218; [4D, 05, 9C][, CA, 05] -017F; [4D, 78, 20] -1DE5; [4D, 78, 20] -A785; [4D, 78, 20] -A784; [4D, 78, AE] -1E9B; [4D, 78, 20][, 9C, 05] +017F; [4D, 78, 05] +1DE5; [4D, 78, 05] +A785; [4D, 78, 05] +A784; [4D, 78, A0] +1E9B; [4D, 78, 05][, 9C, 05] 1F18D; [4D, 05, B4][29, 05, B4] 1F14C; [4D, 05, B4][2F, 05, B1] 2120; [4D, 05, 2B][41, 05, 2B] 1F198; [4D, 05, B4][45, 05, B4][4D, 05, B4] 33DB; [4D, 05, 31][4B, 05, 31] 1F14D; [4D, 05, B4][4D, 05, B4] -00DF; [4D, 70, 20][4D, 05, 13] -1E9E; [4D, 70, AE][4D, 05, A2] +00DF; [4D, 70, 05][4D, 05, 13] +1E9E; [4D, 70, A0][4D, 05, A2] FB06; [4D, 05, 13][4F, 05, 13] -FB05; [4D, 78, 20][4F, 05, 13] +FB05; [4D, 78, 05][4F, 05, 13] 33DC; [4D, 05, B4][53, 05, 31] A731; [4E 06, 05, 05] @@ -17030,11 +17029,11 @@ FF34; [4F, 05, 9F] 1E70; [4F, 05, 9C][, CC, 05] 1E6F; [4F, 05, 05][, D2, 05] 1E6E; [4F, 05, 9C][, D2, 05] -A787; [4F, 78, 20] -A786; [4F, 78, AE] +A787; [4F, 78, 05] +A786; [4F, 78, A0] 02A8; [4F, 05, 13][2E 10, 05, 20] 2121; [4F, 05, A2][31, 05, A2][3F, 05, A2] -1D7A; [4F, 70, 20][37, 05, 13] +1D7A; [4F, 70, 05][37, 05, 13] 3394; [4F, 05, B4][37, 05, B4][5B, 05, 2E] 2122; [4F, 05, 2B][41, 05, 2B] 01BE; [4F, 05, 13][4D, 05, 13] @@ -18613,8 +18612,8 @@ FDD1 042F; [5E 04 02, 05, 05] # CYRILLIC first primary starts reordering group ( 0413; [5E 10, 05, AE] 0453; [5E 10, 05, 05][, 88, 05] 0403; [5E 10, 05, AE][, 88, 05] -0491; [5E 10, 70, 20] -0490; [5E 10, 70, AE] +0491; [5E 10, 70, 05] +0490; [5E 10, 70, A0] 0493; [5E 12, 05, 05] 0492; [5E 12, 05, A0] @@ -19933,7 +19932,7 @@ FDD1 0628; [62 04 02, 05, 05] # ARABIC first primary starts reordering group (co 0621; [62 06, 05, 05] 0674; [62 06, 05, 20] FE80; [62 06, 05, 2E] -06FD; [62 06, 70, 20] +06FD; [62 06, 70, 05] 0622; [62 08, 05, 05] 0627 0653; [62 08, 05, 05] @@ -20935,7 +20934,7 @@ FEE3; [62 9A, 05, 18] FEE4; [62 9A, 05, 20] FEE2; [62 9A, 05, 28] FEE1; [62 9A, 05, 30] -06FE; [62 9A, 70, 20] +06FE; [62 9A, 70, 05] FC88; [62 9A, 05, 28][62 1A, 05, 26] FCCE; [62 9A, 05, 18][62 34, 05, 18] FC45; [62 9A, 05, 30][62 34, 05, 30] @@ -21217,16 +21216,16 @@ FDD1 0710; [62 D0 02, 05, 05] # SYRIAC first primary 0710; [62 D0 09, 05, 05] 0712; [62 D0 10, 05, 05] -072D; [62 D0 10, 70, 20] +072D; [62 D0 10, 70, 05] 0713; [62 D0 17, 05, 05] -0714; [62 D0 17, 70, 20] -072E; [62 D0 17, 78, 20] +0714; [62 D0 17, 70, 05] +072E; [62 D0 17, 78, 05] 0716; [62 D0 1E, 05, 05] 0715; [62 D0 25, 05, 05] -072F; [62 D0 25, 70, 20] +072F; [62 D0 25, 70, 05] 0717; [62 D0 2C, 05, 05] @@ -21239,7 +21238,7 @@ FDD1 0710; [62 D0 02, 05, 05] # SYRIAC first primary 071A; [62 D0 48, 05, 05] 071B; [62 D0 4F, 05, 05] -071C; [62 D0 4F, 70, 20] +071C; [62 D0 4F, 70, 05] 071D; [62 D0 56, 05, 05] @@ -21261,7 +21260,7 @@ FDD1 0710; [62 D0 02, 05, 05] # SYRIAC first primary 0725; [62 D0 8E, 05, 05] 0726; [62 D0 95, 05, 05] -0727; [62 D0 95, 70, 20] +0727; [62 D0 95, 70, 05] 074F; [62 D0 9C, 05, 05] @@ -21456,15 +21455,15 @@ FDD1 07CA; [63 6A 02, 05, 05] # Nko first primary 07D5; [63 6A 56, 05, 05] 07D6; [63 6A 5D, 05, 05] -07E8; [63 6A 5D, 70, 20] +07E8; [63 6A 5D, 70, 05] 07D7; [63 6A 64, 05, 05] -07E9; [63 6A 64, 70, 20] +07E9; [63 6A 64, 70, 05] 07D8; [63 6A 6B, 05, 05] 07D9; [63 6A 72, 05, 05] -07EA; [63 6A 72, 70, 20] +07EA; [63 6A 72, 70, 05] 07DA; [63 6A 79, 05, 05] @@ -26961,7 +26960,7 @@ FDD1 0F40; [71 04 02, 05, 05] # TIBETAN first primary starts reordering group (c 0F5D; [71 64, 05, 05] 0FAD; [71 66, 05, 05] -0FBA; [71 66, 70, 20] +0FBA; [71 66, 70, 05] 0F5E; [71 68, 05, 05] @@ -26978,13 +26977,13 @@ FDD1 0F40; [71 04 02, 05, 05] # TIBETAN first primary starts reordering group (c 0F61; [71 74, 05, 05] 0FB1; [71 76, 05, 05] -0FBB; [71 76, 70, 20] +0FBB; [71 76, 70, 05] 0F62; [71 78, 05, 05] -0F6A; [71 78, 70, 20] +0F6A; [71 78, 70, 05] 0FB2; [71 7A, 05, 05] -0FBC; [71 7A, 70, 20] +0FBC; [71 7A, 70, 05] 0FB2 0F71; [71 7A, 05, 05][71 A6, 05, 05] 0FB2 0F71 0F72; [71 7A, 05, 05][71 AA, 05, 05] 0FB2 0F73; [71 7A, 05, 05][71 AA, 05, 05] @@ -31234,21 +31233,21 @@ FDD1 168F; [74 1C 84, 05, 05] # OGHAM first primary FDD1 16A0; [74 1D 43, 05, 05] # RUNIC first primary 16A0; [74 1D 4A, 05, 05] -16A1; [74 1D 4A, 70, 20] +16A1; [74 1D 4A, 70, 05] 16A2; [74 1D 51, 05, 05] -16A4; [74 1D 51, 70, 20] -16A5; [74 1D 51, 78, 20] +16A4; [74 1D 51, 70, 05] +16A5; [74 1D 51, 78, 05] 16A6; [74 1D 58, 05, 05] -16A7; [74 1D 58, 70, 20] +16A7; [74 1D 58, 70, 05] 16F0; [74 1D 58, 05, 20][74 1D 58, 05, 20] 16A8; [74 1D 5F, 05, 05] -16A9; [74 1D 5F, 70, 20] -16AC; [74 1D 5F, 74, 20] -16AD; [74 1D 5F, 78, 20] -16AE; [74 1D 5F, 7C, 20] +16A9; [74 1D 5F, 70, 05] +16AC; [74 1D 5F, 74, 05] +16AD; [74 1D 5F, 78, 05] +16AE; [74 1D 5F, 7C, 05] 16F4; [74 1D 66, 05, 05] @@ -31259,77 +31258,77 @@ FDD1 16A0; [74 1D 43, 05, 05] # RUNIC first primary 16B1; [74 1D 7B, 05, 05] 16B2; [74 1D 82, 05, 05] -16B3; [74 1D 82, 70, 20] -16B4; [74 1D 82, 74, 20] -16B5; [74 1D 82, 78, 20] -16B6; [74 1D 82, 7C, 20] +16B3; [74 1D 82, 70, 05] +16B4; [74 1D 82, 74, 05] +16B5; [74 1D 82, 78, 05] +16B6; [74 1D 82, 7C, 05] 16F1; [74 1D 89, 05, 05] 16B7; [74 1D 90, 05, 05] 16B9; [74 1D 97, 05, 05] -16E9; [74 1D 97, 70, 20] +16E9; [74 1D 97, 70, 05] 16BA; [74 1D 9E, 05, 05] -16BB; [74 1D 9E, 70, 20] -16BC; [74 1D 9E, 75, 20] -16BD; [74 1D 9E, 7A, 20] +16BB; [74 1D 9E, 70, 05] +16BC; [74 1D 9E, 75, 05] +16BD; [74 1D 9E, 7A, 05] 16BE; [74 1D A5, 05, 05] -16BF; [74 1D A5, 70, 20] -16C0; [74 1D A5, 78, 20] +16BF; [74 1D A5, 70, 05] +16C0; [74 1D A5, 78, 05] 16C1; [74 1D AC, 05, 05] -16C2; [74 1D AC, 70, 20] +16C2; [74 1D AC, 70, 05] 16F5; [74 1D B3, 05, 05] 16C3; [74 1D BA, 05, 05] -16C4; [74 1D BA, 70, 20] +16C4; [74 1D BA, 70, 05] 16C5; [74 1D C1, 05, 05] -16C6; [74 1D C1, 70, 20] +16C6; [74 1D C1, 70, 05] 16EE; [74 1D C1, 05, 20][74 1E 10, 05, 20] 16C7; [74 1D C8, 05, 05] 16C8; [74 1D CF, 05, 05] -16D5; [74 1D CF, 70, 20] +16D5; [74 1D CF, 70, 05] 16C9; [74 1D D6, 05, 05] 16CA; [74 1D DD, 05, 05] -16CB; [74 1D DD, 70, 20] -16EA; [74 1D DD, 73, 20] -16CC; [74 1D DD, 76, 20] -16CD; [74 1D DD, 79, 20] -16CE; [74 1D DD, 7C, 20] +16CB; [74 1D DD, 70, 05] +16EA; [74 1D DD, 73, 05] +16CC; [74 1D DD, 76, 05] +16CD; [74 1D DD, 79, 05] +16CE; [74 1D DD, 7C, 05] 16F2; [74 1D E4, 05, 05] 16CF; [74 1D EB, 05, 05] -16D0; [74 1D EB, 70, 20] -16D1; [74 1D EB, 78, 20] +16D0; [74 1D EB, 70, 05] +16D1; [74 1D EB, 78, 05] 16D2; [74 1D F2, 05, 05] -16D3; [74 1D F2, 70, 20] -16D4; [74 1D F2, 78, 20] +16D3; [74 1D F2, 70, 05] +16D4; [74 1D F2, 78, 05] 16D6; [74 1D F9, 05, 05] 16F6; [74 1E 02, 05, 05] 16D7; [74 1E 09, 05, 05] -16D8; [74 1E 09, 70, 20] -16D9; [74 1E 09, 78, 20] -16EF; [74 1E 09, 70, 20][74 1E 09, 70, 20] +16D8; [74 1E 09, 70, 05] +16D9; [74 1E 09, 78, 05] +16EF; [74 1E 09, 70, 05][74 1E 09, 70, 05] 16DA; [74 1E 10, 05, 05] -16DB; [74 1E 10, 70, 20] +16DB; [74 1E 10, 70, 05] 16DC; [74 1E 17, 05, 05] -16DD; [74 1E 17, 70, 20] +16DD; [74 1E 17, 70, 05] 16DE; [74 1E 1E, 05, 05] @@ -31362,60 +31361,60 @@ FDD1 16A0; [74 1D 43, 05, 05] # RUNIC first primary 16E5; [74 1E 80, 05, 05] 16E6; [74 1E 87, 05, 05] -16E7; [74 1E 87, 70, 20] -16E8; [74 1E 87, 78, 20] +16E7; [74 1E 87, 70, 05] +16E8; [74 1E 87, 78, 05] FDD1 10C00; [74 1E 8E, 05, 05] # Old Turkic first primary 10C00; [74 1E 95, 05, 05] -10C01; [74 1E 95, 70, 20] +10C01; [74 1E 95, 70, 05] 10C02; [74 1E 9C, 05, 05] 10C03; [74 1E A3, 05, 05] -10C04; [74 1E A3, 70, 20] +10C04; [74 1E A3, 70, 05] 10C05; [74 1E AA, 05, 05] 10C06; [74 1E B1, 05, 05] 10C07; [74 1E B8, 05, 05] -10C08; [74 1E B8, 70, 20] +10C08; [74 1E B8, 70, 05] 10C09; [74 1E BF, 05, 05] -10C0A; [74 1E BF, 70, 20] +10C0A; [74 1E BF, 70, 05] 10C0B; [74 1E C6, 05, 05] -10C0C; [74 1E C6, 70, 20] +10C0C; [74 1E C6, 70, 05] 10C0D; [74 1E CD, 05, 05] -10C0E; [74 1E CD, 70, 20] +10C0E; [74 1E CD, 70, 05] 10C0F; [74 1E D4, 05, 05] -10C10; [74 1E D4, 70, 20] +10C10; [74 1E D4, 70, 05] 10C11; [74 1E DB, 05, 05] -10C12; [74 1E DB, 70, 20] +10C12; [74 1E DB, 70, 05] 10C13; [74 1E E2, 05, 05] 10C14; [74 1E E9, 05, 05] -10C15; [74 1E E9, 70, 20] +10C15; [74 1E E9, 70, 05] 10C16; [74 1E F0, 05, 05] -10C17; [74 1E F0, 70, 20] +10C17; [74 1E F0, 70, 05] 10C18; [74 1E F7, 05, 05] -10C19; [74 1E F7, 70, 20] +10C19; [74 1E F7, 70, 05] 10C1A; [74 1E FE, 05, 05] -10C1B; [74 1E FE, 70, 20] +10C1B; [74 1E FE, 70, 05] 10C1C; [74 1F 07, 05, 05] -10C1D; [74 1F 07, 70, 20] +10C1D; [74 1F 07, 70, 05] 10C1E; [74 1F 0E, 05, 05] -10C1F; [74 1F 0E, 70, 20] +10C1F; [74 1F 0E, 70, 05] 10C20; [74 1F 15, 05, 05] @@ -31426,21 +31425,21 @@ FDD1 10C00; [74 1E 8E, 05, 05] # Old Turkic first primary 10C23; [74 1F 2A, 05, 05] 10C24; [74 1F 31, 05, 05] -10C25; [74 1F 31, 70, 20] +10C25; [74 1F 31, 70, 05] 10C26; [74 1F 38, 05, 05] -10C27; [74 1F 38, 70, 20] +10C27; [74 1F 38, 70, 05] 10C28; [74 1F 3F, 05, 05] -10C29; [74 1F 3F, 70, 20] +10C29; [74 1F 3F, 70, 05] 10C2A; [74 1F 46, 05, 05] -10C2B; [74 1F 46, 70, 20] +10C2B; [74 1F 46, 70, 05] 10C2C; [74 1F 4D, 05, 05] 10C2D; [74 1F 54, 05, 05] -10C2E; [74 1F 54, 70, 20] +10C2E; [74 1F 54, 70, 05] 10C2F; [74 1F 5B, 05, 05] @@ -31449,19 +31448,19 @@ FDD1 10C00; [74 1E 8E, 05, 05] # Old Turkic first primary 10C31; [74 1F 69, 05, 05] 10C32; [74 1F 70, 05, 05] -10C33; [74 1F 70, 70, 20] +10C33; [74 1F 70, 70, 05] 10C34; [74 1F 77, 05, 05] -10C35; [74 1F 77, 70, 20] +10C35; [74 1F 77, 70, 05] 10C36; [74 1F 7E, 05, 05] -10C37; [74 1F 7E, 70, 20] +10C37; [74 1F 7E, 70, 05] 10C38; [74 1F 85, 05, 05] -10C39; [74 1F 85, 70, 20] +10C39; [74 1F 85, 70, 05] 10C3A; [74 1F 8C, 05, 05] -10C3B; [74 1F 8C, 70, 20] +10C3B; [74 1F 8C, 70, 05] 10C3C; [74 1F 93, 05, 05] @@ -31470,16 +31469,16 @@ FDD1 10C00; [74 1E 8E, 05, 05] # Old Turkic first primary 10C3E; [74 1F A1, 05, 05] 10C3F; [74 1F A8, 05, 05] -10C40; [74 1F A8, 70, 20] +10C40; [74 1F A8, 70, 05] 10C41; [74 1F AF, 05, 05] -10C42; [74 1F AF, 70, 20] +10C42; [74 1F AF, 70, 05] 10C43; [74 1F B6, 05, 05] -10C44; [74 1F B6, 70, 20] +10C44; [74 1F B6, 70, 05] 10C45; [74 1F BD, 05, 05] -10C46; [74 1F BD, 70, 20] +10C46; [74 1F BD, 70, 05] 10C47; [74 1F C4, 05, 05] @@ -34698,452 +34697,452 @@ FDD1 304B; [76 04 02, 05, 05] # HIRAGANA first primary starts reordering group ( FDD1 30AB; [76 04 02, 05, 05] # KATAKANA first primary -3041; [76 06, 05, 10] -3042; [76 06, 05, 95] -30A1; [76 06, 05, 1A] -FF67; [76 06, 05, 1F] -30A2; [76 06, 05, A4] -FF71; [76 06, 05, A9] -32D0; [76 06, 05, 2E] -3303; [76 06, 05, 33][0E 1C, 05, 2E][76 5A, 05, 33] -3300; [76 06, 05, 33][76 3A, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 2E, 05, 34] -3301; [76 06, 05, 33][76 5A, 05, 33][76 3E, 05, 33][76 06, 05, 33] -3302; [76 06, 05, 33][76 68, 05, 31][76 40, 05, 33][, B0, 2E][76 06, 05, 33] +3041; [76 06, 05, 03] +3042; [76 06, 05, 85] +30A1; [76 06, 05, 10] +FF67; [76 06, 05, 17] +30A2; [76 06, 05, 9E] +FF71; [76 06, 05, A5] +32D0; [76 06, 05, 2C] +3303; [76 06, 05, 33][0E 1C, 05, 2E][76 5A, 05, 30] +3300; [76 06, 05, 33][76 3A, 05, 30][, B0, 2E][0E 1C, 05, 2E][76 2E, 05, 33] +3301; [76 06, 05, 33][76 5A, 05, 30][76 3E, 05, 30][76 06, 05, 33] +3302; [76 06, 05, 33][76 68, 05, 2C][76 40, 05, 30][, B0, 2E][76 06, 05, 33] -3043; [76 08, 05, 10] -3044; [76 08, 05, 95] -30A3; [76 08, 05, 1A] -FF68; [76 08, 05, 1F] -30A4; [76 08, 05, A4] -FF72; [76 08, 05, A9] -32D1; [76 08, 05, 2E] -3304; [76 08, 05, 33][76 32, 05, 30][76 68, 05, 31][76 16, 05, 33][, AE, 2E] -3305; [76 08, 05, 33][76 68, 05, 31][76 28, 05, 30] +3043; [76 08, 05, 03] +3044; [76 08, 05, 85] +30A3; [76 08, 05, 10] +FF68; [76 08, 05, 17] +30A4; [76 08, 05, 9E] +FF72; [76 08, 05, A5] +32D1; [76 08, 05, 2C] +3304; [76 08, 05, 33][76 32, 05, 31][76 68, 05, 2C][76 16, 05, 30][, AE, 2E] +3305; [76 08, 05, 33][76 68, 05, 2C][76 28, 05, 31] -3045; [76 0A, 05, 10] -3046; [76 0A, 05, 95] -30A5; [76 0A, 05, 1A] -FF69; [76 0A, 05, 1F] -30A6; [76 0A, 05, A4] -FF73; [76 0A, 05, A9] -32D2; [76 0A, 05, 2E] -3094; [76 0A, 05, 95][, AE, 05] -30F4; [76 0A, 05, A4][, AE, 05] -3306; [76 0A, 05, 33][76 10, 05, 33][76 68, 05, 31] +3045; [76 0A, 05, 03] +3046; [76 0A, 05, 85] +30A5; [76 0A, 05, 10] +FF69; [76 0A, 05, 17] +30A6; [76 0A, 05, 9E] +FF73; [76 0A, 05, A5] +32D2; [76 0A, 05, 2C] +3094; [76 0A, 05, 85][, AE, 05] +30F4; [76 0A, 05, 9E][, AE, 05] +3306; [76 0A, 05, 33][76 10, 05, 33][76 68, 05, 2C] -1B000; [76 0C, 05, A0] +1B000; [76 0C, 05, 85] -3047; [76 0E, 05, 10] -3048; [76 0E, 05, 95] -30A7; [76 0E, 05, 1A] -FF6A; [76 0E, 05, 1F] -30A8; [76 0E, 05, A4] -FF74; [76 0E, 05, A9] -32D3; [76 0E, 05, 2E] -3308; [76 0E, 05, 33][0E 1C, 05, 2E][76 12, 05, 34][0E 1C, 05, 2E] -3307; [76 0E, 05, 33][76 20, 05, 34][76 16, 05, 33][0E 1C, 05, 2E][76 2E, 05, 34][, AE, 2E] +3047; [76 0E, 05, 03] +3048; [76 0E, 05, 85] +30A7; [76 0E, 05, 10] +FF6A; [76 0E, 05, 17] +30A8; [76 0E, 05, 9E] +FF74; [76 0E, 05, A5] +32D3; [76 0E, 05, 2C] +3308; [76 0E, 05, 33][0E 1C, 05, 2E][76 12, 05, 30][0E 1C, 05, 2E] +3307; [76 0E, 05, 33][76 20, 05, 30][76 16, 05, 30][0E 1C, 05, 2E][76 2E, 05, 33][, AE, 2E] -3049; [76 10, 05, 10] -304A; [76 10, 05, 95] -30A9; [76 10, 05, 1A] -FF6B; [76 10, 05, 1F] -30AA; [76 10, 05, A4] -FF75; [76 10, 05, A9] -32D4; [76 10, 05, 2E] -330A; [76 10, 05, 33][0E 1C, 05, 2E][76 48, 05, 33] -3309; [76 10, 05, 33][76 68, 05, 31][76 20, 05, 34] +3049; [76 10, 05, 03] +304A; [76 10, 05, 85] +30A9; [76 10, 05, 10] +FF6B; [76 10, 05, 17] +30AA; [76 10, 05, 9E] +FF75; [76 10, 05, A5] +32D4; [76 10, 05, 2C] +330A; [76 10, 05, 33][0E 1C, 05, 2E][76 48, 05, 30] +3309; [76 10, 05, 33][76 68, 05, 2C][76 20, 05, 30] -3095; [76 12, 05, 10] -304B; [76 12, 05, 96] -30F5; [76 12, 05, 1C] -30AB; [76 12, 05, A2] -FF76; [76 12, 05, A8] -32D5; [76 12, 05, 2E] -304C; [76 12, 05, 96][, AE, 05] -30AC; [76 12, 05, A2][, AE, 05] -330B; [76 12, 05, 34][76 08, 05, 33][76 58, 05, 34] -330C; [76 12, 05, 34][76 56, 05, 33][76 2A, 05, 33][76 2E, 05, 34] -330D; [76 12, 05, 34][76 5E, 05, 33][76 58, 05, 34][0E 1C, 05, 2E] -330E; [76 12, 05, 34][, AE, 2E][76 5E, 05, 33][76 68, 05, 31] -330F; [76 12, 05, 34][, AE, 2E][76 68, 05, 31][76 44, 05, 33] +3095; [76 12, 05, 03] +304B; [76 12, 05, 85] +30F5; [76 12, 05, 10] +30AB; [76 12, 05, 98] +FF76; [76 12, 05, A0] +32D5; [76 12, 05, 28] +304C; [76 12, 05, 85][, AE, 05] +30AC; [76 12, 05, 98][, AE, 05] +330B; [76 12, 05, 30][76 08, 05, 33][76 58, 05, 33] +330C; [76 12, 05, 30][76 56, 05, 30][76 2A, 05, 33][76 2E, 05, 33] +330D; [76 12, 05, 30][76 5E, 05, 30][76 58, 05, 33][0E 1C, 05, 2E] +330E; [76 12, 05, 30][, AE, 2E][76 5E, 05, 30][76 68, 05, 2C] +330F; [76 12, 05, 30][, AE, 2E][76 68, 05, 2C][76 44, 05, 31] -304D; [76 14, 05, 90] -30AD; [76 14, 05, 98] -FF77; [76 14, 05, A0] -32D6; [76 14, 05, 28] -304E; [76 14, 05, 90][, AE, 05] -30AE; [76 14, 05, 98][, AE, 05] -3310; [76 14, 05, 30][, AE, 2E][76 12, 05, 34][, AE, 2E] -3311; [76 14, 05, 30][, AE, 2E][76 32, 05, 30][0E 1C, 05, 2E] -3312; [76 14, 05, 30][76 50, 05, 33][76 58, 05, 34][0E 1C, 05, 2E] -3313; [76 14, 05, 30][, AE, 2E][76 5A, 05, 33][76 26, 05, 30][, AE, 2E][0E 1C, 05, 2E] -3314; [76 14, 05, 30][76 5E, 05, 33] -3315; [76 14, 05, 30][76 5E, 05, 33][76 16, 05, 33][, AE, 2E][76 56, 05, 33][76 48, 05, 33] -3316; [76 14, 05, 30][76 5E, 05, 33][76 4A, 05, 33][0E 1C, 05, 2E][76 2E, 05, 34][76 5A, 05, 33] -3317; [76 14, 05, 30][76 5E, 05, 33][76 60, 05, 34][76 2A, 05, 33][76 2E, 05, 34] +304D; [76 14, 05, 85] +30AD; [76 14, 05, 90] +FF77; [76 14, 05, 9B] +32D6; [76 14, 05, 26] +304E; [76 14, 05, 85][, AE, 05] +30AE; [76 14, 05, 90][, AE, 05] +3310; [76 14, 05, 31][, AE, 2E][76 12, 05, 30][, AE, 2E] +3311; [76 14, 05, 31][, AE, 2E][76 32, 05, 31][0E 1C, 05, 2E] +3312; [76 14, 05, 31][76 50, 05, 33][76 58, 05, 33][0E 1C, 05, 2E] +3313; [76 14, 05, 31][, AE, 2E][76 5A, 05, 30][76 26, 05, 31][, AE, 2E][0E 1C, 05, 2E] +3314; [76 14, 05, 31][76 5E, 05, 30] +3315; [76 14, 05, 31][76 5E, 05, 30][76 16, 05, 30][, AE, 2E][76 56, 05, 30][76 48, 05, 30] +3316; [76 14, 05, 31][76 5E, 05, 30][76 4A, 05, 31][0E 1C, 05, 2E][76 2E, 05, 33][76 5A, 05, 30] +3317; [76 14, 05, 31][76 5E, 05, 30][76 60, 05, 30][76 2A, 05, 33][76 2E, 05, 33] -304F; [76 16, 05, 90] -31F0; [76 16, 05, 17] -30AF; [76 16, 05, 9E] -FF78; [76 16, 05, A5] -32D7; [76 16, 05, 2C] -3050; [76 16, 05, 90][, AE, 05] -30B0; [76 16, 05, 9E][, AE, 05] -3318; [76 16, 05, 33][, AE, 2E][76 56, 05, 33][76 48, 05, 33] -3319; [76 16, 05, 33][, AE, 2E][76 56, 05, 33][76 48, 05, 33][76 2E, 05, 34][76 68, 05, 31] -331A; [76 16, 05, 33][76 5A, 05, 33][76 22, 05, 30][, AE, 2E][76 08, 05, 33][76 5E, 05, 33] -331B; [76 16, 05, 33][76 5E, 05, 33][0E 1C, 05, 2E][76 36, 05, 30] +304F; [76 16, 05, 85] +31F0; [76 16, 05, 10] +30AF; [76 16, 05, 98] +FF78; [76 16, 05, A0] +32D7; [76 16, 05, 28] +3050; [76 16, 05, 85][, AE, 05] +30B0; [76 16, 05, 98][, AE, 05] +3318; [76 16, 05, 30][, AE, 2E][76 56, 05, 30][76 48, 05, 30] +3319; [76 16, 05, 30][, AE, 2E][76 56, 05, 30][76 48, 05, 30][76 2E, 05, 33][76 68, 05, 2C] +331A; [76 16, 05, 30][76 5A, 05, 30][76 22, 05, 31][, AE, 2E][76 08, 05, 33][76 5E, 05, 30] +331B; [76 16, 05, 30][76 5E, 05, 30][0E 1C, 05, 2E][76 36, 05, 31] -3096; [76 18, 05, 10] -3051; [76 18, 05, 96] -30F6; [76 18, 05, 1C] -30B1; [76 18, 05, A2] -FF79; [76 18, 05, A8] -32D8; [76 18, 05, 2E] -3052; [76 18, 05, 96][, AE, 05] -30B2; [76 18, 05, A2][, AE, 05] -331C; [76 18, 05, 34][0E 1C, 05, 2E][76 20, 05, 34] +3096; [76 18, 05, 03] +3051; [76 18, 05, 85] +30F6; [76 18, 05, 10] +30B1; [76 18, 05, 98] +FF79; [76 18, 05, A0] +32D8; [76 18, 05, 28] +3052; [76 18, 05, 85][, AE, 05] +30B2; [76 18, 05, 98][, AE, 05] +331C; [76 18, 05, 30][0E 1C, 05, 2E][76 20, 05, 30] -3053; [76 1A, 05, 90] -30B3; [76 1A, 05, 97] -FF7A; [76 1A, 05, 9E] -32D9; [76 1A, 05, 25] -3054; [76 1A, 05, 90][, AE, 05] -30B4; [76 1A, 05, 97][, AE, 05] -331E; [76 1A, 05, 33][0E 1C, 05, 2E][76 42, 05, 33][, B0, 2E] -1F201; [76 1A, 05, 33][76 1A, 05, 33] -30FF; [76 1A, 05, 2C][76 2E, 05, 2E] -331D; [76 1A, 05, 33][76 5A, 05, 33][76 30, 05, 30] +3053; [76 1A, 05, 85] +30B3; [76 1A, 05, 90] +FF7A; [76 1A, 05, 98] +32D9; [76 1A, 05, 20] +3054; [76 1A, 05, 85][, AE, 05] +30B4; [76 1A, 05, 90][, AE, 05] +331E; [76 1A, 05, 30][0E 1C, 05, 2E][76 42, 05, 30][, B0, 2E] +1F201; [76 1A, 05, 30][76 1A, 05, 30] +30FF; [76 1A, 05, 28][76 2E, 05, 2C] +331D; [76 1A, 05, 30][76 5A, 05, 30][76 30, 05, 31] -3055; [76 1C, 05, 90] -30B5; [76 1C, 05, 98] -FF7B; [76 1C, 05, A0] -32DA; [76 1C, 05, 28] -1F202; [76 1C, 05, 30] -3056; [76 1C, 05, 90][, AE, 05] -30B6; [76 1C, 05, 98][, AE, 05] -331F; [76 1C, 05, 30][76 08, 05, 33][76 16, 05, 33][76 5A, 05, 33] -3320; [76 1C, 05, 30][76 68, 05, 31][76 28, 05, 30][0E 1C, 05, 2E][76 48, 05, 33] +3055; [76 1C, 05, 85] +30B5; [76 1C, 05, 90] +FF7B; [76 1C, 05, 9B] +32DA; [76 1C, 05, 26] +1F202; [76 1C, 05, 31] +3056; [76 1C, 05, 85][, AE, 05] +30B6; [76 1C, 05, 90][, AE, 05] +331F; [76 1C, 05, 31][76 08, 05, 33][76 16, 05, 30][76 5A, 05, 30] +3320; [76 1C, 05, 31][76 68, 05, 2C][76 28, 05, 31][0E 1C, 05, 2E][76 48, 05, 30] -3057; [76 1E, 05, 96] -31F1; [76 1E, 05, 1C] -30B7; [76 1E, 05, A2] -FF7C; [76 1E, 05, A8] -32DB; [76 1E, 05, 2E] -3058; [76 1E, 05, 96][, AE, 05] -30B8; [76 1E, 05, A2][, AE, 05] -3006; [76 1E, 05, 10][76 4A, 05, 10] -3321; [76 1E, 05, 34][76 58, 05, 34][76 68, 05, 31][76 16, 05, 33][, AE, 2E] +3057; [76 1E, 05, 85] +31F1; [76 1E, 05, 10] +30B7; [76 1E, 05, 98] +FF7C; [76 1E, 05, A0] +32DB; [76 1E, 05, 28] +3058; [76 1E, 05, 85][, AE, 05] +30B8; [76 1E, 05, 98][, AE, 05] +3006; [76 1E, 05, 03][76 4A, 05, 03] +3321; [76 1E, 05, 30][76 58, 05, 33][76 68, 05, 2C][76 16, 05, 30][, AE, 2E] -3059; [76 20, 05, 96] -31F2; [76 20, 05, 1C] -30B9; [76 20, 05, A2] -FF7D; [76 20, 05, A8] -32DC; [76 20, 05, 2E] -305A; [76 20, 05, 96][, AE, 05] -30BA; [76 20, 05, A2][, AE, 05] +3059; [76 20, 05, 85] +31F2; [76 20, 05, 10] +30B9; [76 20, 05, 98] +FF7D; [76 20, 05, A0] +32DC; [76 20, 05, 28] +305A; [76 20, 05, 85][, AE, 05] +30BA; [76 20, 05, 98][, AE, 05] -305B; [76 22, 05, 90] -30BB; [76 22, 05, 98] -FF7E; [76 22, 05, A0] -32DD; [76 22, 05, 28] -305C; [76 22, 05, 90][, AE, 05] -30BC; [76 22, 05, 98][, AE, 05] -3322; [76 22, 05, 30][76 68, 05, 31][76 28, 05, 30] -3323; [76 22, 05, 30][76 68, 05, 31][76 2E, 05, 34] +305B; [76 22, 05, 85] +30BB; [76 22, 05, 90] +FF7E; [76 22, 05, 9B] +32DD; [76 22, 05, 26] +305C; [76 22, 05, 85][, AE, 05] +30BC; [76 22, 05, 90][, AE, 05] +3322; [76 22, 05, 31][76 68, 05, 2C][76 28, 05, 31] +3323; [76 22, 05, 31][76 68, 05, 2C][76 2E, 05, 33] -305D; [76 24, 05, 90] -30BD; [76 24, 05, 98] -FF7F; [76 24, 05, A0] -32DE; [76 24, 05, 28] -305E; [76 24, 05, 90][, AE, 05] -30BE; [76 24, 05, 98][, AE, 05] +305D; [76 24, 05, 85] +30BD; [76 24, 05, 90] +FF7F; [76 24, 05, 9B] +32DE; [76 24, 05, 26] +305E; [76 24, 05, 85][, AE, 05] +30BE; [76 24, 05, 90][, AE, 05] -305F; [76 26, 05, 90] -30BF; [76 26, 05, 98] -FF80; [76 26, 05, A0] -32DF; [76 26, 05, 28] -3060; [76 26, 05, 90][, AE, 05] -30C0; [76 26, 05, 98][, AE, 05] -3324; [76 26, 05, 30][, AE, 2E][0E 1C, 05, 2E][76 20, 05, 34] +305F; [76 26, 05, 85] +30BF; [76 26, 05, 90] +FF80; [76 26, 05, 9B] +32DF; [76 26, 05, 26] +3060; [76 26, 05, 85][, AE, 05] +30C0; [76 26, 05, 90][, AE, 05] +3324; [76 26, 05, 31][, AE, 2E][0E 1C, 05, 2E][76 20, 05, 30] -3061; [76 28, 05, 90] -30C1; [76 28, 05, 98] -FF81; [76 28, 05, A0] -32E0; [76 28, 05, 28] -3062; [76 28, 05, 90][, AE, 05] -30C2; [76 28, 05, 98][, AE, 05] +3061; [76 28, 05, 85] +30C1; [76 28, 05, 90] +FF81; [76 28, 05, 9B] +32E0; [76 28, 05, 26] +3062; [76 28, 05, 85][, AE, 05] +30C2; [76 28, 05, 90][, AE, 05] -3063; [76 2A, 05, 10] -3064; [76 2A, 05, 95] -30C3; [76 2A, 05, 1A] -FF6F; [76 2A, 05, 1F] -30C4; [76 2A, 05, A4] -FF82; [76 2A, 05, A9] -32E1; [76 2A, 05, 2E] -3065; [76 2A, 05, 95][, AE, 05] -30C5; [76 2A, 05, A4][, AE, 05] +3063; [76 2A, 05, 03] +3064; [76 2A, 05, 85] +30C3; [76 2A, 05, 10] +FF6F; [76 2A, 05, 17] +30C4; [76 2A, 05, 9E] +FF82; [76 2A, 05, A5] +32E1; [76 2A, 05, 2C] +3065; [76 2A, 05, 85][, AE, 05] +30C5; [76 2A, 05, 9E][, AE, 05] -3066; [76 2C, 05, 90] -30C6; [76 2C, 05, 98] -FF83; [76 2C, 05, A0] -32E2; [76 2C, 05, 28] -3067; [76 2C, 05, 90][, AE, 05] -30C7; [76 2C, 05, 98][, AE, 05] -1F213; [76 2C, 05, 30][, AE, 2E] -3325; [76 2C, 05, 30][, AE, 2E][76 1E, 05, 34] +3066; [76 2C, 05, 85] +30C6; [76 2C, 05, 90] +FF83; [76 2C, 05, 9B] +32E2; [76 2C, 05, 26] +3067; [76 2C, 05, 85][, AE, 05] +30C7; [76 2C, 05, 90][, AE, 05] +1F213; [76 2C, 05, 31][, AE, 2E] +3325; [76 2C, 05, 31][, AE, 2E][76 1E, 05, 30] -3068; [76 2E, 05, 90] -31F3; [76 2E, 05, 16] -30C8; [76 2E, 05, 9C] -FF84; [76 2E, 05, A2] -32E3; [76 2E, 05, 28] -3069; [76 2E, 05, 90][, AE, 05] -30C9; [76 2E, 05, 9C][, AE, 05] -3326; [76 2E, 05, 34][, AE, 2E][76 5A, 05, 33] -3327; [76 2E, 05, 34][76 68, 05, 31] +3068; [76 2E, 05, 85] +31F3; [76 2E, 05, 10] +30C8; [76 2E, 05, 97] +FF84; [76 2E, 05, 9E] +32E3; [76 2E, 05, 25] +3069; [76 2E, 05, 85][, AE, 05] +30C9; [76 2E, 05, 97][, AE, 05] +3326; [76 2E, 05, 33][, AE, 2E][76 5A, 05, 30] +3327; [76 2E, 05, 33][76 68, 05, 2C] -306A; [76 30, 05, 90] -30CA; [76 30, 05, 98] -FF85; [76 30, 05, A0] -32E4; [76 30, 05, 28] -3328; [76 30, 05, 30][76 38, 05, 30] +306A; [76 30, 05, 85] +30CA; [76 30, 05, 90] +FF85; [76 30, 05, 9B] +32E4; [76 30, 05, 26] +3328; [76 30, 05, 31][76 38, 05, 31] -306B; [76 32, 05, 90] -30CB; [76 32, 05, 98] -FF86; [76 32, 05, A0] -32E5; [76 32, 05, 28] +306B; [76 32, 05, 85] +30CB; [76 32, 05, 90] +FF86; [76 32, 05, 9B] +32E5; [76 32, 05, 26] -306C; [76 34, 05, 90] -31F4; [76 34, 05, 18] -30CC; [76 34, 05, A0] -FF87; [76 34, 05, A8] -32E6; [76 34, 05, 30] +306C; [76 34, 05, 85] +31F4; [76 34, 05, 10] +30CC; [76 34, 05, 9B] +FF87; [76 34, 05, A6] +32E6; [76 34, 05, 31] -306D; [76 36, 05, 90] -30CD; [76 36, 05, 98] -FF88; [76 36, 05, A0] -32E7; [76 36, 05, 28] +306D; [76 36, 05, 85] +30CD; [76 36, 05, 90] +FF88; [76 36, 05, 9B] +32E7; [76 36, 05, 26] -306E; [76 38, 05, 90] -30CE; [76 38, 05, 98] -FF89; [76 38, 05, A0] -32E8; [76 38, 05, 28] -3329; [76 38, 05, 30][76 2A, 05, 33][76 2E, 05, 34] +306E; [76 38, 05, 85] +30CE; [76 38, 05, 90] +FF89; [76 38, 05, 9B] +32E8; [76 38, 05, 26] +3329; [76 38, 05, 31][76 2A, 05, 33][76 2E, 05, 33] -306F; [76 3A, 05, 90] -31F5; [76 3A, 05, 17] -30CF; [76 3A, 05, 9E] -FF8A; [76 3A, 05, A5] -32E9; [76 3A, 05, 2C] -3070; [76 3A, 05, 90][, AE, 05] -30D0; [76 3A, 05, 9E][, AE, 05] -3071; [76 3A, 05, 90][, B0, 05] -30D1; [76 3A, 05, 9E][, B0, 05] -332B; [76 3A, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 22, 05, 30][76 68, 05, 31][76 2E, 05, 34] -332C; [76 3A, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 2A, 05, 33] -332D; [76 3A, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 5C, 05, 33][76 5A, 05, 33] -332A; [76 3A, 05, 33][76 08, 05, 33][76 2A, 05, 33] +306F; [76 3A, 05, 85] +31F5; [76 3A, 05, 10] +30CF; [76 3A, 05, 98] +FF8A; [76 3A, 05, A0] +32E9; [76 3A, 05, 28] +3070; [76 3A, 05, 85][, AE, 05] +30D0; [76 3A, 05, 98][, AE, 05] +3071; [76 3A, 05, 85][, B0, 05] +30D1; [76 3A, 05, 98][, B0, 05] +332B; [76 3A, 05, 30][, B0, 2E][0E 1C, 05, 2E][76 22, 05, 31][76 68, 05, 2C][76 2E, 05, 33] +332C; [76 3A, 05, 30][, B0, 2E][0E 1C, 05, 2E][76 2A, 05, 33] +332D; [76 3A, 05, 30][, AE, 2E][0E 1C, 05, 2E][76 5C, 05, 30][76 5A, 05, 30] +332A; [76 3A, 05, 30][76 08, 05, 33][76 2A, 05, 33] -3072; [76 3C, 05, 90] -31F6; [76 3C, 05, 17] -30D2; [76 3C, 05, 9E] -FF8B; [76 3C, 05, A5] -32EA; [76 3C, 05, 2C] -3073; [76 3C, 05, 90][, AE, 05] -30D3; [76 3C, 05, 9E][, AE, 05] -3074; [76 3C, 05, 90][, B0, 05] -30D4; [76 3C, 05, 9E][, B0, 05] -332E; [76 3C, 05, 33][, B0, 2E][76 06, 05, 33][76 20, 05, 34][76 2E, 05, 34][76 5A, 05, 33] -332F; [76 3C, 05, 33][, B0, 2E][76 16, 05, 33][76 5A, 05, 33] -3330; [76 3C, 05, 33][, B0, 2E][76 1A, 05, 33] -3331; [76 3C, 05, 33][, AE, 2E][76 5A, 05, 33] +3072; [76 3C, 05, 85] +31F6; [76 3C, 05, 10] +30D2; [76 3C, 05, 98] +FF8B; [76 3C, 05, A0] +32EA; [76 3C, 05, 28] +3073; [76 3C, 05, 85][, AE, 05] +30D3; [76 3C, 05, 98][, AE, 05] +3074; [76 3C, 05, 85][, B0, 05] +30D4; [76 3C, 05, 98][, B0, 05] +332E; [76 3C, 05, 30][, B0, 2E][76 06, 05, 33][76 20, 05, 30][76 2E, 05, 33][76 5A, 05, 30] +332F; [76 3C, 05, 30][, B0, 2E][76 16, 05, 30][76 5A, 05, 30] +3330; [76 3C, 05, 30][, B0, 2E][76 1A, 05, 30] +3331; [76 3C, 05, 30][, AE, 2E][76 5A, 05, 30] -3075; [76 3E, 05, 90] -31F7; [76 3E, 05, 17] -30D5; [76 3E, 05, 9E] -FF8C; [76 3E, 05, A5] -32EB; [76 3E, 05, 2C] -3076; [76 3E, 05, 90][, AE, 05] -30D6; [76 3E, 05, 9E][, AE, 05] -3077; [76 3E, 05, 90][, B0, 05] -30D7; [76 3E, 05, 9E][, B0, 05] -3332; [76 3E, 05, 33][76 06, 05, 33][76 56, 05, 33][76 2A, 05, 33][76 2E, 05, 34][, AE, 2E] -3333; [76 3E, 05, 33][76 08, 05, 33][0E 1C, 05, 2E][76 2E, 05, 34] -3334; [76 3E, 05, 33][, AE, 2E][76 2A, 05, 33][76 1E, 05, 34][76 0E, 05, 33][76 5A, 05, 33] -3335; [76 3E, 05, 33][76 56, 05, 33][76 68, 05, 31] +3075; [76 3E, 05, 85] +31F7; [76 3E, 05, 10] +30D5; [76 3E, 05, 98] +FF8C; [76 3E, 05, A0] +32EB; [76 3E, 05, 28] +3076; [76 3E, 05, 85][, AE, 05] +30D6; [76 3E, 05, 98][, AE, 05] +3077; [76 3E, 05, 85][, B0, 05] +30D7; [76 3E, 05, 98][, B0, 05] +3332; [76 3E, 05, 30][76 06, 05, 33][76 56, 05, 30][76 2A, 05, 33][76 2E, 05, 33][, AE, 2E] +3333; [76 3E, 05, 30][76 08, 05, 33][0E 1C, 05, 2E][76 2E, 05, 33] +3334; [76 3E, 05, 30][, AE, 2E][76 2A, 05, 33][76 1E, 05, 30][76 0E, 05, 33][76 5A, 05, 30] +3335; [76 3E, 05, 30][76 56, 05, 30][76 68, 05, 2C] -3078; [76 40, 05, 90] -31F8; [76 40, 05, 17] -30D8; [76 40, 05, 9E] -FF8D; [76 40, 05, A5] -32EC; [76 40, 05, 2C] -3079; [76 40, 05, 90][, AE, 05] -30D9; [76 40, 05, 9E][, AE, 05] -307A; [76 40, 05, 90][, B0, 05] -30DA; [76 40, 05, 9E][, B0, 05] -333B; [76 40, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 1E, 05, 34][, AE, 2E] -333C; [76 40, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 26, 05, 30] -3336; [76 40, 05, 33][76 16, 05, 33][76 26, 05, 30][0E 1C, 05, 2E][76 5A, 05, 33] -3337; [76 40, 05, 33][, B0, 2E][76 24, 05, 30] -3338; [76 40, 05, 33][, B0, 2E][76 32, 05, 30][76 3C, 05, 33] -3339; [76 40, 05, 33][76 5A, 05, 33][76 2A, 05, 33] -333A; [76 40, 05, 33][, B0, 2E][76 68, 05, 31][76 20, 05, 34] +3078; [76 40, 05, 85] +31F8; [76 40, 05, 10] +30D8; [76 40, 05, 98] +FF8D; [76 40, 05, A0] +32EC; [76 40, 05, 28] +3079; [76 40, 05, 85][, AE, 05] +30D9; [76 40, 05, 98][, AE, 05] +307A; [76 40, 05, 85][, B0, 05] +30DA; [76 40, 05, 98][, B0, 05] +333B; [76 40, 05, 30][, B0, 2E][0E 1C, 05, 2E][76 1E, 05, 30][, AE, 2E] +333C; [76 40, 05, 30][, AE, 2E][0E 1C, 05, 2E][76 26, 05, 31] +3336; [76 40, 05, 30][76 16, 05, 30][76 26, 05, 31][0E 1C, 05, 2E][76 5A, 05, 30] +3337; [76 40, 05, 30][, B0, 2E][76 24, 05, 31] +3338; [76 40, 05, 30][, B0, 2E][76 32, 05, 31][76 3C, 05, 30] +3339; [76 40, 05, 30][76 5A, 05, 30][76 2A, 05, 33] +333A; [76 40, 05, 30][, B0, 2E][76 68, 05, 2C][76 20, 05, 30] -307B; [76 42, 05, 90] -31F9; [76 42, 05, 17] -30DB; [76 42, 05, 9E] -FF8E; [76 42, 05, A5] -32ED; [76 42, 05, 2C] -307C; [76 42, 05, 90][, AE, 05] -30DC; [76 42, 05, 9E][, AE, 05] -307D; [76 42, 05, 90][, B0, 05] -30DD; [76 42, 05, 9E][, B0, 05] -3341; [76 42, 05, 33][0E 1C, 05, 2E][76 5A, 05, 33] -3342; [76 42, 05, 33][0E 1C, 05, 2E][76 68, 05, 31] -333D; [76 42, 05, 33][, B0, 2E][76 08, 05, 33][76 68, 05, 31][76 2E, 05, 34] -1F200; [76 42, 05, 33][76 12, 05, 34] -333E; [76 42, 05, 33][, AE, 2E][76 5A, 05, 33][76 2E, 05, 34] -333F; [76 42, 05, 33][76 68, 05, 31] -3340; [76 42, 05, 33][, B0, 2E][76 68, 05, 31][76 2E, 05, 34][, AE, 2E] +307B; [76 42, 05, 85] +31F9; [76 42, 05, 10] +30DB; [76 42, 05, 98] +FF8E; [76 42, 05, A0] +32ED; [76 42, 05, 28] +307C; [76 42, 05, 85][, AE, 05] +30DC; [76 42, 05, 98][, AE, 05] +307D; [76 42, 05, 85][, B0, 05] +30DD; [76 42, 05, 98][, B0, 05] +3341; [76 42, 05, 30][0E 1C, 05, 2E][76 5A, 05, 30] +3342; [76 42, 05, 30][0E 1C, 05, 2E][76 68, 05, 2C] +333D; [76 42, 05, 30][, B0, 2E][76 08, 05, 33][76 68, 05, 2C][76 2E, 05, 33] +1F200; [76 42, 05, 30][76 12, 05, 30] +333E; [76 42, 05, 30][, AE, 2E][76 5A, 05, 30][76 2E, 05, 33] +333F; [76 42, 05, 30][76 68, 05, 2C] +3340; [76 42, 05, 30][, B0, 2E][76 68, 05, 2C][76 2E, 05, 33][, AE, 2E] -307E; [76 44, 05, 97] -30DE; [76 44, 05, 9E] -FF8F; [76 44, 05, A5] -32EE; [76 44, 05, 2C] -3343; [76 44, 05, 33][76 08, 05, 33][76 16, 05, 33][76 5E, 05, 33] -3344; [76 44, 05, 33][76 08, 05, 33][76 5A, 05, 33] -303C; [76 44, 05, 10][76 20, 05, 10] -3345; [76 44, 05, 33][76 2A, 05, 33][76 3A, 05, 33] -3346; [76 44, 05, 33][76 5A, 05, 33][76 16, 05, 33] -3347; [76 44, 05, 33][76 68, 05, 31][76 1E, 05, 34][76 54, 05, 30][76 68, 05, 31] +307E; [76 44, 05, 85] +30DE; [76 44, 05, 90] +FF8F; [76 44, 05, 9B] +32EE; [76 44, 05, 26] +3343; [76 44, 05, 31][76 08, 05, 33][76 16, 05, 30][76 5E, 05, 30] +3344; [76 44, 05, 31][76 08, 05, 33][76 5A, 05, 30] +303C; [76 44, 05, 03][76 20, 05, 03] +3345; [76 44, 05, 31][76 2A, 05, 33][76 3A, 05, 30] +3346; [76 44, 05, 31][76 5A, 05, 30][76 16, 05, 30] +3347; [76 44, 05, 31][76 68, 05, 2C][76 1E, 05, 30][76 54, 05, 34][76 68, 05, 2C] -307F; [76 46, 05, 90] -30DF; [76 46, 05, 98] -FF90; [76 46, 05, A0] -32EF; [76 46, 05, 28] -3348; [76 46, 05, 30][76 16, 05, 33][76 5E, 05, 33][76 68, 05, 31] -3349; [76 46, 05, 30][76 58, 05, 34] -334A; [76 46, 05, 30][76 58, 05, 34][76 3A, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 5A, 05, 33] +307F; [76 46, 05, 85] +30DF; [76 46, 05, 90] +FF90; [76 46, 05, 9B] +32EF; [76 46, 05, 26] +3348; [76 46, 05, 31][76 16, 05, 30][76 5E, 05, 30][76 68, 05, 2C] +3349; [76 46, 05, 31][76 58, 05, 33] +334A; [76 46, 05, 31][76 58, 05, 33][76 3A, 05, 30][, AE, 2E][0E 1C, 05, 2E][76 5A, 05, 30] -3080; [76 48, 05, 90] -31FA; [76 48, 05, 17] -30E0; [76 48, 05, 9E] -FF91; [76 48, 05, A5] -32F0; [76 48, 05, 2C] +3080; [76 48, 05, 85] +31FA; [76 48, 05, 10] +30E0; [76 48, 05, 98] +FF91; [76 48, 05, A0] +32F0; [76 48, 05, 28] -3081; [76 4A, 05, 97] -30E1; [76 4A, 05, 9E] -FF92; [76 4A, 05, A5] -32F1; [76 4A, 05, 2C] -334D; [76 4A, 05, 33][0E 1C, 05, 2E][76 2E, 05, 34][76 5A, 05, 33] -334B; [76 4A, 05, 33][76 12, 05, 34][, AE, 2E] -334C; [76 4A, 05, 33][76 12, 05, 34][, AE, 2E][76 2E, 05, 34][76 68, 05, 31] +3081; [76 4A, 05, 85] +30E1; [76 4A, 05, 90] +FF92; [76 4A, 05, 9B] +32F1; [76 4A, 05, 26] +334D; [76 4A, 05, 31][0E 1C, 05, 2E][76 2E, 05, 33][76 5A, 05, 30] +334B; [76 4A, 05, 31][76 12, 05, 30][, AE, 2E] +334C; [76 4A, 05, 31][76 12, 05, 30][, AE, 2E][76 2E, 05, 33][76 68, 05, 2C] -3082; [76 4C, 05, 90] -30E2; [76 4C, 05, 9B] -FF93; [76 4C, 05, A6] -32F2; [76 4C, 05, 31] +3082; [76 4C, 05, 85] +30E2; [76 4C, 05, 90] +FF93; [76 4C, 05, 9E] +32F2; [76 4C, 05, 2C] -3083; [76 4E, 05, 10] -3084; [76 4E, 05, 95] -30E3; [76 4E, 05, 1A] -FF6C; [76 4E, 05, 1F] -30E4; [76 4E, 05, A4] -FF94; [76 4E, 05, A9] -32F3; [76 4E, 05, 2E] -334E; [76 4E, 05, 33][0E 1C, 05, 2E][76 2E, 05, 34][, AE, 2E] -334F; [76 4E, 05, 33][0E 1C, 05, 2E][76 5A, 05, 33] +3083; [76 4E, 05, 03] +3084; [76 4E, 05, 85] +30E3; [76 4E, 05, 10] +FF6C; [76 4E, 05, 17] +30E4; [76 4E, 05, 9E] +FF94; [76 4E, 05, A5] +32F3; [76 4E, 05, 2C] +334E; [76 4E, 05, 33][0E 1C, 05, 2E][76 2E, 05, 33][, AE, 2E] +334F; [76 4E, 05, 33][0E 1C, 05, 2E][76 5A, 05, 30] -3085; [76 50, 05, 10] -3086; [76 50, 05, 95] -30E5; [76 50, 05, 1A] -FF6D; [76 50, 05, 1F] -30E6; [76 50, 05, A4] -FF95; [76 50, 05, A9] -32F4; [76 50, 05, 2E] -3350; [76 50, 05, 33][76 06, 05, 33][76 68, 05, 31] +3085; [76 50, 05, 03] +3086; [76 50, 05, 85] +30E5; [76 50, 05, 10] +FF6D; [76 50, 05, 17] +30E6; [76 50, 05, 9E] +FF95; [76 50, 05, A5] +32F4; [76 50, 05, 2C] +3350; [76 50, 05, 33][76 06, 05, 33][76 68, 05, 2C] -1B001; [76 52, 05, A0] +1B001; [76 52, 05, 85] -3087; [76 54, 05, 10] -3088; [76 54, 05, 94] -30E7; [76 54, 05, 18] -FF6E; [76 54, 05, 1C] -30E8; [76 54, 05, A0] -FF96; [76 54, 05, A4] +3087; [76 54, 05, 03] +3088; [76 54, 05, 85] +30E7; [76 54, 05, 10] +FF6E; [76 54, 05, 16] +30E8; [76 54, 05, 9C] +FF96; [76 54, 05, A2] 32F5; [76 54, 05, 28] -309F; [76 54, 05, 2C][76 58, 05, 2E] +309F; [76 54, 05, 2E][76 58, 05, 2C] -3089; [76 56, 05, 90] -31FB; [76 56, 05, 17] -30E9; [76 56, 05, 9E] -FF97; [76 56, 05, A5] -32F6; [76 56, 05, 2C] +3089; [76 56, 05, 85] +31FB; [76 56, 05, 10] +30E9; [76 56, 05, 98] +FF97; [76 56, 05, A0] +32F6; [76 56, 05, 28] -308A; [76 58, 05, 90] -31FC; [76 58, 05, 16] -30EA; [76 58, 05, 9C] -FF98; [76 58, 05, A2] -32F7; [76 58, 05, 28] -3351; [76 58, 05, 34][76 2A, 05, 33][76 2E, 05, 34][76 5A, 05, 33] -3352; [76 58, 05, 34][76 56, 05, 33] +308A; [76 58, 05, 85] +31FC; [76 58, 05, 10] +30EA; [76 58, 05, 97] +FF98; [76 58, 05, 9E] +32F7; [76 58, 05, 25] +3351; [76 58, 05, 33][76 2A, 05, 33][76 2E, 05, 33][76 5A, 05, 30] +3352; [76 58, 05, 33][76 56, 05, 30] -308B; [76 5A, 05, 90] -31FD; [76 5A, 05, 17] -30EB; [76 5A, 05, 9E] -FF99; [76 5A, 05, A5] -32F8; [76 5A, 05, 2C] -3354; [76 5A, 05, 33][0E 1C, 05, 2E][76 3E, 05, 33][, AE, 2E][76 5A, 05, 33] -3353; [76 5A, 05, 33][76 3C, 05, 33][, B0, 2E][0E 1C, 05, 2E] +308B; [76 5A, 05, 85] +31FD; [76 5A, 05, 10] +30EB; [76 5A, 05, 98] +FF99; [76 5A, 05, A0] +32F8; [76 5A, 05, 28] +3354; [76 5A, 05, 30][0E 1C, 05, 2E][76 3E, 05, 30][, AE, 2E][76 5A, 05, 30] +3353; [76 5A, 05, 30][76 3C, 05, 30][, B0, 2E][0E 1C, 05, 2E] -308C; [76 5C, 05, 90] -31FE; [76 5C, 05, 17] -30EC; [76 5C, 05, 9E] -FF9A; [76 5C, 05, A5] -32F9; [76 5C, 05, 2C] -3355; [76 5C, 05, 33][76 48, 05, 33] -3356; [76 5C, 05, 33][76 68, 05, 31][76 2E, 05, 34][76 18, 05, 34][, AE, 2E][76 68, 05, 31] +308C; [76 5C, 05, 85] +31FE; [76 5C, 05, 10] +30EC; [76 5C, 05, 98] +FF9A; [76 5C, 05, A0] +32F9; [76 5C, 05, 28] +3355; [76 5C, 05, 30][76 48, 05, 30] +3356; [76 5C, 05, 30][76 68, 05, 2C][76 2E, 05, 33][76 18, 05, 30][, AE, 2E][76 68, 05, 2C] -308D; [76 5E, 05, 90] -31FF; [76 5E, 05, 17] -30ED; [76 5E, 05, 9E] -FF9B; [76 5E, 05, A5] -32FA; [76 5E, 05, 2C] +308D; [76 5E, 05, 85] +31FF; [76 5E, 05, 10] +30ED; [76 5E, 05, 98] +FF9B; [76 5E, 05, A0] +32FA; [76 5E, 05, 28] -308E; [76 60, 05, 10] -308F; [76 60, 05, 96] -30EE; [76 60, 05, 1C] -30EF; [76 60, 05, A2] -FF9C; [76 60, 05, A8] -32FB; [76 60, 05, 2E] -30F7; [76 60, 05, A2][, AE, 05] -3357; [76 60, 05, 34][76 2A, 05, 33][76 2E, 05, 34] +308E; [76 60, 05, 03] +308F; [76 60, 05, 85] +30EE; [76 60, 05, 10] +30EF; [76 60, 05, 98] +FF9C; [76 60, 05, A0] +32FB; [76 60, 05, 28] +30F7; [76 60, 05, 98][, AE, 05] +3357; [76 60, 05, 30][76 2A, 05, 33][76 2E, 05, 33] -3090; [76 62, 05, 90] -30F0; [76 62, 05, 9E] -32FC; [76 62, 05, 2C] -30F8; [76 62, 05, 9E][, AE, 05] +3090; [76 62, 05, 85] +30F0; [76 62, 05, A0] +32FC; [76 62, 05, 2E] +30F8; [76 62, 05, A0][, AE, 05] -3091; [76 64, 05, 90] -30F1; [76 64, 05, 9E] -32FD; [76 64, 05, 2C] -30F9; [76 64, 05, 9E][, AE, 05] +3091; [76 64, 05, 85] +30F1; [76 64, 05, A0] +32FD; [76 64, 05, 2E] +30F9; [76 64, 05, A0][, AE, 05] -3092; [76 66, 05, 90] -30F2; [76 66, 05, 9B] -FF66; [76 66, 05, A6] -32FE; [76 66, 05, 31] -30FA; [76 66, 05, 9B][, AE, 05] +3092; [76 66, 05, 85] +30F2; [76 66, 05, 90] +FF66; [76 66, 05, 9E] +32FE; [76 66, 05, 2C] +30FA; [76 66, 05, 90][, AE, 05] -3093; [76 68, 05, 90] -30F3; [76 68, 05, 9B] -FF9D; [76 68, 05, A6] +3093; [76 68, 05, 85] +30F3; [76 68, 05, 90] +FF9D; [76 68, 05, 9E] FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group (compressible) 3105; [77 06, 05, 05] -31A0; [77 06, 70, 20] +31A0; [77 06, 70, 05] 3106; [77 08, 05, 05] 31B4; [77 08, 05, 20] @@ -35164,7 +35163,7 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 310C; [77 16, 05, 05] 310D; [77 18, 05, 05] -31A3; [77 18, 70, 20] +31A3; [77 18, 70, 05] 310E; [77 1A, 05, 05] 31B6; [77 1A, 05, 20] @@ -35177,7 +35176,7 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 31B7; [77 20, 05, 20] 3110; [77 22, 05, 05] -31A2; [77 22, 70, 20] +31A2; [77 22, 70, 05] 3111; [77 24, 05, 05] @@ -35194,7 +35193,7 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 3116; [77 30, 05, 05] 3117; [77 32, 05, 05] -31A1; [77 32, 70, 20] +31A1; [77 32, 70, 05] 3118; [77 34, 05, 05] @@ -35207,10 +35206,10 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 31BA; [77 3C, 05, 05] 311A; [77 3E, 05, 05] -31A9; [77 3E, 70, 20] +31A9; [77 3E, 70, 05] 311B; [77 40, 05, 05] -31A7; [77 40, 70, 20] +31A7; [77 40, 70, 05] 31A6; [77 42, 05, 05] @@ -35219,15 +35218,15 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 311D; [77 46, 05, 05] 31A4; [77 48, 05, 05] -31A5; [77 48, 70, 20] +31A5; [77 48, 70, 05] 311E; [77 4A, 05, 05] -31AE; [77 4A, 70, 20] +31AE; [77 4A, 70, 05] 311F; [77 4C, 05, 05] 3120; [77 4E, 05, 05] -31AF; [77 4E, 70, 20] +31AF; [77 4E, 70, 05] 3121; [77 50, 05, 05] @@ -35250,12 +35249,12 @@ FDD1 3105; [77 04 02, 05, 05] # BOPOMOFO first primary starts reordering group ( 3126; [77 62, 05, 05] 3127; [77 64, 05, 05] -31AA; [77 64, 70, 20] -31B3; [77 64, 70, 2E] +31AA; [77 64, 70, 05] +31B3; [77 64, 70, 20] 3128; [77 66, 05, 05] -31AB; [77 66, 70, 20] -31A8; [77 66, 78, 20] +31AB; [77 66, 70, 05] +31A8; [77 66, 78, 05] 3129; [77 68, 05, 05] @@ -40984,7 +40983,7 @@ FDD1 10B00; [77 B8 89, 05, 05] # Avestan first primary 10B2C; [77 B9 C6, 05, 05] 10B2D; [77 B9 CD, 05, 05] -10B2E; [77 B9 CD, 70, 20] +10B2E; [77 B9 CD, 70, 05] 10B2F; [77 B9 D4, 05, 05] @@ -41289,7 +41288,7 @@ FDD1 10AD8; [77 BD A2, 05, 05] # Manichaean first primary 10AC6; [77 BD D3, 05, 05] 10AC7; [77 BD DA, 05, 05] -10AC8; [77 BD DA, 70, 20] +10AC8; [77 BD DA, 70, 05] 10AC9; [77 BD E1, 05, 05] @@ -45492,81 +45491,81 @@ FDD1 109A0; [77 F7 B3, 05, 05] # Meroitic_Cursive first primary FDD1 10980; [77 F7 B3, 05, 05] # Meroitic_Hieroglyphs first primary 109A0; [77 F7 BA, 05, 05] -10980; [77 F7 BA, 70, 20] +10980; [77 F7 BA, 70, 05] 109A1; [77 F7 C1, 05, 05] -10981; [77 F7 C1, 70, 20] +10981; [77 F7 C1, 70, 05] 109A2; [77 F7 C8, 05, 05] -10982; [77 F7 C8, 70, 20] +10982; [77 F7 C8, 70, 05] 109A3; [77 F7 CF, 05, 05] -10983; [77 F7 CF, 70, 20] +10983; [77 F7 CF, 70, 05] 109A4; [77 F7 D6, 05, 05] -10984; [77 F7 D6, 70, 20] +10984; [77 F7 D6, 70, 05] 109A5; [77 F7 DD, 05, 05] -10985; [77 F7 DD, 70, 20] +10985; [77 F7 DD, 70, 05] 109A6; [77 F7 E4, 05, 05] -10986; [77 F7 E4, 70, 20] -10987; [77 F7 E4, 78, 20] +10986; [77 F7 E4, 70, 05] +10987; [77 F7 E4, 78, 05] 109A7; [77 F7 EB, 05, 05] -10988; [77 F7 EB, 70, 20] +10988; [77 F7 EB, 70, 05] 109A8; [77 F7 F2, 05, 05] -10989; [77 F7 F2, 70, 20] +10989; [77 F7 F2, 70, 05] 109A9; [77 F7 F9, 05, 05] -1098A; [77 F7 F9, 70, 20] -1098B; [77 F7 F9, 78, 20] +1098A; [77 F7 F9, 70, 05] +1098B; [77 F7 F9, 78, 05] 109AA; [77 F8 02, 05, 05] -1098C; [77 F8 02, 70, 20] -1098D; [77 F8 02, 78, 20] +1098C; [77 F8 02, 70, 05] +1098D; [77 F8 02, 78, 05] 109AB; [77 F8 09, 05, 05] -1098E; [77 F8 09, 70, 20] -1098F; [77 F8 09, 78, 20] +1098E; [77 F8 09, 70, 05] +1098F; [77 F8 09, 78, 05] 109AC; [77 F8 10, 05, 05] -10990; [77 F8 10, 70, 20] +10990; [77 F8 10, 70, 05] 109AD; [77 F8 17, 05, 05] -10991; [77 F8 17, 70, 20] +10991; [77 F8 17, 70, 05] 109AE; [77 F8 1E, 05, 05] -10992; [77 F8 1E, 70, 20] +10992; [77 F8 1E, 70, 05] 109AF; [77 F8 25, 05, 05] -109B0; [77 F8 25, 70, 20] -10993; [77 F8 25, 75, 20] -10994; [77 F8 25, 7A, 20] +109B0; [77 F8 25, 70, 05] +10993; [77 F8 25, 75, 05] +10994; [77 F8 25, 7A, 05] 109B1; [77 F8 2C, 05, 05] -10995; [77 F8 2C, 70, 20] +10995; [77 F8 2C, 70, 05] 109B2; [77 F8 33, 05, 05] -10996; [77 F8 33, 70, 20] +10996; [77 F8 33, 70, 05] 109B3; [77 F8 3A, 05, 05] -10997; [77 F8 3A, 70, 20] +10997; [77 F8 3A, 70, 05] 109B4; [77 F8 41, 05, 05] -10998; [77 F8 41, 70, 20] -10999; [77 F8 41, 78, 20] +10998; [77 F8 41, 70, 05] +10999; [77 F8 41, 78, 05] 109B5; [77 F8 48, 05, 05] -1099A; [77 F8 48, 70, 20] -1099B; [77 F8 48, 78, 20] +1099A; [77 F8 48, 70, 05] +1099B; [77 F8 48, 78, 05] 109B6; [77 F8 4F, 05, 05] -1099C; [77 F8 4F, 70, 20] +1099C; [77 F8 4F, 70, 05] 109B7; [77 F8 56, 05, 05] -1099D; [77 F8 56, 70, 20] +1099D; [77 F8 56, 70, 05] 109BE; [77 F8 5D, 05, 05] @@ -45601,7 +45600,7 @@ FA70; [U+4E26] 1F22D; [U+4E2D, 31] F905; [U+4E32] 2F02; [U+4E36, 10] -2E80; [U+4E36, 70, 20] +2E80; [U+4E36, 70, 05] 2F801; [U+4E38] F95E; [U+4E39] 2F800; [U+4E3D] @@ -45609,7 +45608,7 @@ F95E; [U+4E39] 2F802; [U+4E41] 2F04; [U+4E59, 10] 319A; [U+4E59, 26] -2E84; [U+4E59, 70, 20] +2E84; [U+4E59, 70, 05] 2E83; [U+4E5A, 10] 2E82; [U+4E5B, 10] 3288; [U+4E5D, 1B] @@ -45667,7 +45666,7 @@ F9D1; [U+516D] 2F811; [U+5177] FA75; [U+5180] 2F0C; [U+5182, 10] -2E86; [U+5182, 70, 20] +2E86; [U+5182, 70, 05] 2F815; [U+518D] 1F21E; [U+518D, 31] 2F8D2; [U+5192] @@ -45686,11 +45685,11 @@ F955; [U+51CC] F954; [U+51DC] FA15; [U+51DE] 2F0F; [U+51E0, 10] -2E87; [U+51E0, 70, 20] +2E87; [U+51E0, 70, 05] 2F81D; [U+51F5] 2F10; [U+51F5, 10] 2F11; [U+5200, 10] -2E88; [U+5200, 70, 20] +2E88; [U+5200, 70, 05] 2E89; [U+5202, 10] 2F81E; [U+5203] 2F850; [U+5207] @@ -45743,9 +45742,9 @@ FA35; [U+5351] 32AF; [U+5354, 1B] 2F82E; [U+535A] 2F18; [U+535C, 10] -2E8A; [U+535C, 70, 20] +2E8A; [U+535C, 70, 05] 2F19; [U+5369, 10] -2E8B; [U+5369, 70, 20] +2E8B; [U+5369, 70, 05] 329E; [U+5370, 1B] 2F82F; [U+5373] F91C; [U+5375] @@ -45754,7 +45753,7 @@ F91C; [U+5375] 2F832; [U+537F] 2F833; [U+537F] 2F1A; [U+5382, 10] -2E81; [U+5382, 70, 20] +2E81; [U+5382, 70, 05] 2F1B; [U+53B6, 10] F96B; [U+53C3] 2F1C; [U+53C8, 10] @@ -45882,14 +45881,14 @@ F9BC; [U+5BEE] 2F872; [U+5BFF] 2F873; [U+5C06] 2F29; [U+5C0F, 10] -2E8C; [U+5C0F, 70, 20] -2E8D; [U+5C0F, 78, 20] +2E8C; [U+5C0F, 70, 05] +2E8D; [U+5C0F, 78, 05] 2F875; [U+5C22] 2E90; [U+5C22, 10] 2F2A; [U+5C22, 10] -2E8E; [U+5C22, 70, 20] +2E8E; [U+5C22, 70, 05] 2E8F; [U+5C23, 10] -2E91; [U+5C23, 70, 20] +2E91; [U+5C23, 70, 05] 2F2B; [U+5C38, 10] F9BD; [U+5C3F] 2F877; [U+5C60] @@ -45950,7 +45949,7 @@ F943; [U+5F04] 2F894; [U+5F22] 2F895; [U+5F22] 2F39; [U+5F50, 10] -2E95; [U+5F50, 70, 20] +2E95; [U+5F50, 70, 05] 2E94; [U+5F51, 10] 2F874; [U+5F53] 2F3A; [U+5F61, 10] @@ -45965,7 +45964,7 @@ F9D8; [U+5F8B] F966; [U+5FA9] FA85; [U+5FAD] 2F3C; [U+5FC3, 10] -2E97; [U+5FC3, 70, 20] +2E97; [U+5FC3, 70, 05] 2E96; [U+5FC4, 10] 2F89D; [U+5FCD] 2F89E; [U+5FD7] @@ -46067,7 +46066,7 @@ FA42; [U+65E2] 2F8CB; [U+65E3] 2F47; [U+65E5, 10] 3290; [U+65E5, 1B] -2E9C; [U+65E5, 70, 20] +2E9C; [U+65E5, 70, 05] 337E; [U+660E, 31][U+6CBB, 31] F9E0; [U+6613] 1F219; [U+6620, 31] @@ -46088,7 +46087,7 @@ F901; [U+66F4] 2F49; [U+6708, 10] 328A; [U+6708, 1B] 1F237; [U+6708, 31] -2E9D; [U+6708, 70, 20] +2E9D; [U+6708, 70, 05] 3292; [U+6709, 1B] 1F236; [U+6709, 31] 2F8D8; [U+6717] @@ -46139,7 +46138,7 @@ F91D; [U+6B04] F98C; [U+6B77] FA95; [U+6B79] 2F4D; [U+6B79, 10] -2E9E; [U+6B7A, 70, 20] +2E9E; [U+6B7A, 70, 05] 2F8F4; [U+6B9F] F9A5; [U+6BAE] 2F4E; [U+6BB3, 10] @@ -46233,7 +46232,7 @@ F91E; [U+721B] 2F56; [U+722A, 10] FA49; [U+722B] 2EA4; [U+722B, 10] -2EA5; [U+722B, 70, 20] +2EA5; [U+722B, 70, 05] 2F921; [U+7235] FA9E; [U+7235] 2F57; [U+7236, 10] @@ -46243,7 +46242,7 @@ FA9E; [U+7235] 2F922; [U+7250] 2F5B; [U+7259, 10] 2F5C; [U+725B, 10] -2EA7; [U+725B, 70, 20] +2EA7; [U+725B, 70, 05] F946; [U+7262] 3295; [U+7279, 1B] 2F924; [U+7280] @@ -46262,7 +46261,7 @@ F961; [U+7387] F9DB; [U+7387] 2F5F; [U+7389, 10] 2F929; [U+738B] -2EA9; [U+738B, 70, 20] +2EA9; [U+738B, 70, 05] 2F92B; [U+73A5] F9AD; [U+73B2] F917; [U+73DE] @@ -46297,7 +46296,7 @@ F976; [U+7565] 2F938; [U+7570] F962; [U+7570] 2F66; [U+758B, 10] -2EAA; [U+758B, 70, 20] +2EAA; [U+758B, 70, 05] 2F67; [U+7592, 10] F9E5; [U+75E2] 2F93A; [U+7610] @@ -46315,7 +46314,7 @@ FAA7; [U+76DB] 32AC; [U+76E3, 1B] F933; [U+76E7] 2F6C; [U+76EE, 10] -2EAB; [U+76EE, 70, 20] +2EAB; [U+76EE, 70, 05] 2F940; [U+76F4] FAA8; [U+76F4] F96D; [U+7701] @@ -46341,7 +46340,7 @@ FAAB; [U+78CC] F964; [U+78FB] F985; [U+792A] 2F70; [U+793A, 10] -2EAC; [U+793A, 70, 20] +2EAC; [U+793A, 70, 05] 2EAD; [U+793B, 10] FA18; [U+793C] FA4C; [U+793E] @@ -46380,7 +46379,7 @@ F9F7; [U+7ACB] 2F74; [U+7ACB, 10] 2F95F; [U+7AEE] 2F75; [U+7AF9, 10] -2EAE; [U+7AF9, 70, 20] +2EAE; [U+7AF9, 70, 05] F9F8; [U+7B20] 3247; [U+7B8F, 1B] FA56; [U+7BC0] @@ -46423,17 +46422,17 @@ FA59; [U+7E41] FAB1; [U+7F3E] 2F79; [U+7F51, 10] 2EB2; [U+7F52, 10] -2EB5; [U+7F52, 70, 20] +2EB5; [U+7F52, 70, 05] 2EB1; [U+7F53, 10] -2EB3; [U+7F53, 70, 20] -2EB4; [U+7F53, 78, 20] +2EB3; [U+7F53, 70, 05] +2EB4; [U+7F53, 78, 05] FA5A; [U+7F72] F9E6; [U+7F79] 2F976; [U+7F7A] F90F; [U+7F85] 2F7A; [U+7F8A, 10] -2EB6; [U+7F8A, 70, 20] -2EB7; [U+7F8A, 78, 20] +2EB6; [U+7F8A, 70, 05] +2EB7; [U+7F8A, 78, 05] 2EB8; [U+7F8B, 10] 2F978; [U+7F95] F9AF; [U+7F9A] @@ -46456,10 +46455,10 @@ F997; [U+806F] 2F97F; [U+8070] F945; [U+807E] 2F80; [U+807F, 10] -2EBB; [U+807F, 70, 20] +2EBB; [U+807F, 70, 05] 2EBA; [U+8080, 10] 2F81; [U+8089, 10] -2EBC; [U+8089, 70, 20] +2EBC; [U+8089, 70, 05] F953; [U+808B] 2F8D6; [U+80AD] 2F982; [U+80B2] @@ -46472,7 +46471,7 @@ F9F6; [U+81E8] FA5C; [U+81ED] 2F84; [U+81F3, 10] 2F85; [U+81FC, 10] -2EBD; [U+81FC, 70, 20] +2EBD; [U+81FC, 70, 05] 2F893; [U+8201] 2F98B; [U+8201] 2F98C; [U+8204] @@ -46487,8 +46486,8 @@ F97C; [U+826F] FA5D; [U+8279] FA5E; [U+8279] 2EBE; [U+8279, 10] -2EBF; [U+8279, 70, 20] -2EC0; [U+8279, 78, 20] +2EBF; [U+8279, 70, 05] +2EC0; [U+8279, 78, 05] 2F990; [U+828B] 2F98F; [U+8291] 2F991; [U+829D] @@ -46578,7 +46577,7 @@ FAB8; [U+8996] 2EC5; [U+89C1, 10] 2EC6; [U+89D2, 10] 2F93; [U+89D2, 10] -2EC7; [U+89D2, 70, 20] +2EC7; [U+89D2, 70, 05] 1F216; [U+89E3, 31] 2F94; [U+8A00, 10] 2F9CF; [U+8AA0] @@ -46627,7 +46626,7 @@ FAC1; [U+8D08] 1F230; [U+8D70, 31] 2F9D7; [U+8D77] 2F9C; [U+8DB3, 10] -2ECA; [U+8DB3, 70, 20] +2ECA; [U+8DB3, 70, 05] 2F9DB; [U+8DBC] 2F9DA; [U+8DCB] F937; [U+8DEF] @@ -46650,8 +46649,8 @@ F971; [U+8FB0] 2FA1; [U+8FB5, 10] FA66; [U+8FB6] 2ECC; [U+8FB6, 10] -2ECD; [U+8FB6, 70, 20] -2ECE; [U+8FB6, 78, 20] +2ECD; [U+8FB6, 70, 05] +2ECE; [U+8FB6, 78, 05] F99A; [U+9023] FA25; [U+9038] FA67; [U+9038] @@ -46661,7 +46660,7 @@ FAC3; [U+9072] F9C3; [U+907C] F913; [U+908F] 2FA2; [U+9091, 10] -2ECF; [U+9091, 70, 20] +2ECF; [U+9091, 70, 05] 2F9E2; [U+9094] F92C; [U+90CE] FA2E; [U+90DE] @@ -46701,7 +46700,7 @@ F986; [U+95AD] 2F9F0; [U+95B7] 2ED4; [U+95E8, 10] 2FA9; [U+961C, 10] -2ED5; [U+961C, 70, 20] +2ED5; [U+961C, 70, 05] 2ED6; [U+961D, 10] F9C6; [U+962E] F951; [U+964B] @@ -46720,7 +46719,7 @@ F9EA; [U+96E2] FA68; [U+96E3] FAC7; [U+96E3] 2FAC; [U+96E8, 10] -2ED7; [U+96E8, 70, 20] +2ED7; [U+96E8, 70, 05] F9B2; [U+96F6] F949; [U+96F7] 2F9F5; [U+9723] @@ -46759,7 +46758,7 @@ F9D0; [U+985E] 2EDD; [U+98DF, 10] 2FB7; [U+98DF, 10] 2EDF; [U+98E0, 10] -2EDE; [U+98E0, 70, 20] +2EDE; [U+98E0, 70, 05] 2FA02; [U+98E2] FA2A; [U+98EF] FA2B; [U+98FC] @@ -46767,7 +46766,7 @@ FA2C; [U+9928] 2FA04; [U+9929] 2EE0; [U+9963, 10] 2FB8; [U+9996, 10] -2EE1; [U+9996, 70, 20] +2EE1; [U+9996, 70, 05] 2FB9; [U+9999, 10] 2FA05; [U+99A7] 2FBA; [U+99AC, 10] @@ -46777,7 +46776,7 @@ F91A; [U+99F1] F987; [U+9A6A] 2EE2; [U+9A6C, 10] 2FBB; [U+9AA8, 10] -2EE3; [U+9AA8, 70, 20] +2EE3; [U+9AA8, 70, 05] 2FBC; [U+9AD8, 10] 2FBD; [U+9ADF, 10] 2FA0A; [U+9B12] @@ -46786,7 +46785,7 @@ FACD; [U+9B12] 2FBF; [U+9B2F, 10] 2FC0; [U+9B32, 10] 2FC1; [U+9B3C, 10] -2EE4; [U+9B3C, 70, 20] +2EE4; [U+9B3C, 70, 05] 2FC2; [U+9B5A, 10] F939; [U+9B6F] 2FA0B; [U+9C40] @@ -46800,7 +46799,7 @@ F93A; [U+9DFA] F920; [U+9E1E] 2EE6; [U+9E1F, 10] 2FC4; [U+9E75, 10] -2EE7; [U+9E75, 70, 20] +2EE7; [U+9E75, 70, 05] F940; [U+9E7F] 2FC5; [U+9E7F, 10] F988; [U+9E97] @@ -46829,22 +46828,22 @@ F989; [U+9ECE] 2FD0; [U+9F3B, 10] FAD8; [U+9F43] 2FD1; [U+9F4A, 10] -2EEB; [U+9F4A, 70, 20] +2EEB; [U+9F4A, 70, 05] 2EEC; [U+9F50, 10] 2FD2; [U+9F52, 10] -2EED; [U+9F52, 70, 20] +2EED; [U+9F52, 70, 05] 2EEE; [U+9F7F, 10] F9C4; [U+9F8D] 2FD3; [U+9F8D, 10] -2EEF; [U+9F8D, 70, 20] +2EEF; [U+9F8D, 70, 05] FAD9; [U+9F8E] 2EF0; [U+9F99, 10] F907; [U+9F9C] F908; [U+9F9C] FACE; [U+9F9C] 2FD4; [U+9F9C, 10] -2EF1; [U+9F9C, 70, 20] -2EF2; [U+9F9C, 78, 20] +2EF1; [U+9F9C, 70, 05] +2EF2; [U+9F9C, 78, 05] 2EF3; [U+9F9F, 10] 2FD5; [U+9FA0, 10] FA0E; [U+FA0E] @@ -47077,7 +47076,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [first tertiary ignorable [,,]] # CONSTRUCTED [last tertiary ignorable [,,]] # CONSTRUCTED # Warning: Case bits are masked in the following -[first tertiary in secondary non-ignorable [X, X, 05]] # U+0332 COMBINING LOW LINE +[first tertiary in secondary non-ignorable [X, X, 03]] # U+3041 HIRAGANA LETTER SMALL A [last tertiary in secondary non-ignorable [X, X, 38]] # U+33BE SQUARE KW [first secondary ignorable [,, 3D 02]] # CONSTRUCTED [last secondary ignorable [,, 3D 02]] # CONSTRUCTED diff --git a/icu4c/source/i18n/collationbasedatabuilder.cpp b/icu4c/source/i18n/collationbasedatabuilder.cpp index cb09ee6dd56..e700586387a 100644 --- a/icu4c/source/i18n/collationbasedatabuilder.cpp +++ b/icu4c/source/i18n/collationbasedatabuilder.cpp @@ -277,15 +277,22 @@ CollationBaseDataBuilder::addRootElement(int64_t ce, UErrorCode &errorCode) { // We will add it later, as part of the Han ranges. uint32_t p = (uint32_t)(ce >> 32); uint32_t secTer = (uint32_t)ce; - if(secTer == Collation::COMMON_SEC_AND_TER_CE) { - if(firstHanPrimary <= p && p <= lastHanPrimary) { + if(firstHanPrimary <= p && p <= lastHanPrimary) { + if(secTer < Collation::COMMON_SEC_AND_TER_CE) { + // buildRootElementsTable() does not currently handle this case. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } - } else { - // Check that secondary and tertiary weights are >= "common". + if(secTer == Collation::COMMON_SEC_AND_TER_CE) { + return; + } + } + if(secTer != Collation::COMMON_SEC_AND_TER_CE) { // minor optimization + // Check that secondary and tertiary weights are > 01. uint32_t s = secTer >> 16; uint32_t t = secTer & Collation::ONLY_TERTIARY_MASK; - if((s != 0 && s < Collation::COMMON_WEIGHT16) || (t != 0 && t < Collation::COMMON_WEIGHT16)) { + if((s != 0 && s <= Collation::BEFORE_WEIGHT16) || + (t != 0 && t <= Collation::BEFORE_WEIGHT16)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -337,14 +344,26 @@ CollationBaseDataBuilder::build(CollationData &data, UErrorCode &errorCode) { void CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &errorCode) { + // Limit sentinel for root elements. + // This allows us to reduce range checks at runtime. + rootElements.addElement(Collation::makeCE(CollationRootElements::PRIMARY_SENTINEL), errorCode); if(U_FAILURE(errorCode)) { return; } uint32_t nextHanPrimary = firstHanPrimary; // Set to 0xffffffff after the last Han range. uint32_t prevPrimary = 0; // Start with primary ignorable CEs. - UBool tryRange = FALSE; + UBool needCommonSecTerUnit = FALSE; + UBool hasDeltaUnit = FALSE; for(int32_t i = 0; i < rootElements.size(); ++i) { int64_t ce = rootElements.elementAti(i); uint32_t p = (uint32_t)(ce >> 32); uint32_t secTer = (uint32_t)ce & Collation::ONLY_SEC_TER_MASK; + if((p != prevPrimary || secTer > Collation::COMMON_SEC_AND_TER_CE) && needCommonSecTerUnit) { + // The last primary had low sec/ter weights but no common sec/ter combination. + // The next unit is either a new primary or an above-common sec/ter unit. + // Insert a common sec/ter unit so that the builder will reliably + // tailor to either before or after a common weight but not across it. + table.addElement((int32_t)Collation::COMMON_SEC_AND_TER_CE | + CollationRootElements::SEC_TER_DELTA_FLAG, errorCode); + } if(p != prevPrimary) { U_ASSERT((p & 0xff) == 0); int32_t end; @@ -352,7 +371,7 @@ CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &e // Add a Han primary weight or range. // We omitted them initially, and omitted all CEs with Han primaries // and common secondary/tertiary weights. - U_ASSERT(p > lastHanPrimary || secTer != Collation::COMMON_SEC_AND_TER_CE); + U_ASSERT(p > lastHanPrimary || secTer > Collation::COMMON_SEC_AND_TER_CE); if(p == nextHanPrimary) { // One single Han primary with non-common secondary/tertiary weights. table.addElement((int32_t)p, errorCode); @@ -370,6 +389,7 @@ CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &e // nextHanPrimary == lastHanPrimary < p // We just wrote the single last Han primary. nextHanPrimary = 0xffffffff; + table.addElement((int32_t)p, errorCode); } else if(p < lastHanPrimary) { // nextHanPrimary < p < lastHanPrimary // End the Han range on p, prepare for the next range. @@ -388,7 +408,14 @@ CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &e table.addElement((int32_t)p, errorCode); } } - } else if(tryRange && secTer == Collation::COMMON_SEC_AND_TER_CE && + } else if(prevPrimary != 0 && + // If there has not been an intervening delta unit, + // then we will try to combine the previous primary and + // the next several primaries into a range. + !hasDeltaUnit && + // Might get a range with more than two primaries if the current CE + // has common sec/ter weights. + secTer == Collation::COMMON_SEC_AND_TER_CE && (end = writeRootElementsRange(prevPrimary, p, i + 1, table, errorCode)) != 0) { // Multiple CEs with only common secondary/tertiary weights were // combined into a primary range. @@ -402,22 +429,24 @@ CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &e table.addElement((int32_t)p, errorCode); } prevPrimary = p; + needCommonSecTerUnit = FALSE; + hasDeltaUnit = FALSE; } - if(secTer == Collation::COMMON_SEC_AND_TER_CE) { + if(secTer == Collation::COMMON_SEC_AND_TER_CE && !needCommonSecTerUnit) { // The common secondar/tertiary weights are implied in the primary unit. - // If there is no intervening delta unit, then we will try to combine - // the next several primaries into a range. - tryRange = TRUE; } else { + if(secTer < Collation::COMMON_SEC_AND_TER_CE) { + // Remember to not suppress a common sec/ter unit if p!=0. + needCommonSecTerUnit = p != 0; + } else if(secTer == Collation::COMMON_SEC_AND_TER_CE) { + // Real common sec/ter unit, no need to insert an artificial one. + needCommonSecTerUnit = FALSE; + } // For each new set of secondary/tertiary weights we write a delta unit. table.addElement((int32_t)secTer | CollationRootElements::SEC_TER_DELTA_FLAG, errorCode); - tryRange = FALSE; + hasDeltaUnit = TRUE; } } - - // Limit sentinel for root elements. - // This allows us to reduce range checks at runtime. - table.addElement(CollationRootElements::PRIMARY_SENTINEL, errorCode); } int32_t diff --git a/icu4c/source/i18n/collationbuilder.cpp b/icu4c/source/i18n/collationbuilder.cpp index 79b50927cb6..4e297b8920c 100644 --- a/icu4c/source/i18n/collationbuilder.cpp +++ b/icu4c/source/i18n/collationbuilder.cpp @@ -313,7 +313,7 @@ CollationBuilder::addReset(int32_t strength, const UnicodeString &str, if(U_FAILURE(errorCode)) { return; } int64_t node = nodes.elementAti(index); - // If the index is for a "weaker" tailored node, + // If the index is for a "weaker" node, // then skip backwards over this and further "weaker" nodes. while(strengthFromNode(node) > strength) { index = previousIndexFromNode(node); @@ -360,6 +360,8 @@ CollationBuilder::addReset(int32_t strength, const UnicodeString &str, if(strength >= UCOL_TERTIARY) { index = findCommonNode(index, UCOL_TERTIARY); } + // findCommonNode() stayed on the stronger node or moved to + // an explicit common-weight node of the reset-before strength. node = nodes.elementAti(index); if(strengthFromNode(node) == strength) { // Found a same-strength node with an explicit weight. @@ -373,89 +375,45 @@ CollationBuilder::addReset(int32_t strength, const UnicodeString &str, } return; } - U_ASSERT(weight16 >= Collation::COMMON_WEIGHT16); + U_ASSERT(weight16 > Collation::BEFORE_WEIGHT16); + // Reset to just before this node. + // Insert the preceding same-level explicit weight if it is not there already. + // Which explicit weight immediately precedes this one? + weight16 = getWeight16Before(index, node, strength); + // Does this preceding weight have a node? + uint32_t previousWeight16; int32_t previousIndex = previousIndexFromNode(node); - if(weight16 == Collation::COMMON_WEIGHT16) { - // Reset to just before this same-strength common-weight node. + for(int32_t i = previousIndex;; i = previousIndexFromNode(node)) { + node = nodes.elementAti(i); + int32_t previousStrength = strengthFromNode(node); + if(previousStrength < strength) { + U_ASSERT(weight16 >= Collation::COMMON_WEIGHT16 || i == previousIndex); + // Either the reset element has an above-common weight and + // the parent node provides the implied common weight, + // or the reset element has a weight<=common in the node + // right after the parent, and we need to insert the preceding weight. + previousWeight16 = Collation::COMMON_WEIGHT16; + break; + } else if(previousStrength == strength && !isTailoredNode(node)) { + previousWeight16 = weight16FromNode(node); + break; + } + // Skip weaker nodes and same-level tailored nodes. + } + if(previousWeight16 == weight16) { + // The preceding weight has a node, + // maybe with following weaker or tailored nodes. + // Reset to the last of them. index = previousIndex; } else { - // A non-common weight is only possible from a root CE. - // Find the higher-level weights, which must all be explicit, - // and then find the preceding weight for this level. - uint32_t previousWeight16 = 0; - int32_t previousWeightIndex = -1; - int32_t i = index; - if(strength == UCOL_SECONDARY) { - uint32_t p; - do { - i = previousIndexFromNode(node); - node = nodes.elementAti(i); - if(strengthFromNode(node) == UCOL_SECONDARY && !isTailoredNode(node) && - previousWeightIndex < 0) { - previousWeightIndex = i; - previousWeight16 = weight16FromNode(node); - } - } while(strengthFromNode(node) > UCOL_PRIMARY); - U_ASSERT(!isTailoredNode(node)); - p = weight32FromNode(node); - weight16 = rootElements.getSecondaryBefore(p, weight16); - } else { - uint32_t p, s; - do { - i = previousIndexFromNode(node); - node = nodes.elementAti(i); - if(strengthFromNode(node) == UCOL_TERTIARY && !isTailoredNode(node) && - previousWeightIndex < 0) { - previousWeightIndex = i; - previousWeight16 = weight16FromNode(node); - } - } while(strengthFromNode(node) > UCOL_SECONDARY); - U_ASSERT(!isTailoredNode(node)); - if(strengthFromNode(node) == UCOL_SECONDARY) { - s = weight16FromNode(node); - do { - i = previousIndexFromNode(node); - node = nodes.elementAti(i); - } while(strengthFromNode(node) > UCOL_PRIMARY); - U_ASSERT(!isTailoredNode(node)); - } else { - U_ASSERT(!nodeHasBefore2(node)); - s = Collation::COMMON_WEIGHT16; - } - p = weight32FromNode(node); - weight16 = rootElements.getTertiaryBefore(p, s, weight16); - U_ASSERT((weight16 & ~Collation::ONLY_TERTIARY_MASK) == 0); - } - // Find or insert the new explicit weight before the current one. - if(previousWeightIndex >= 0 && weight16 == previousWeight16) { - // Tailor after the last node between adjacent root nodes. - index = previousIndex; - } else { - node = nodeFromWeight16(weight16) | nodeFromStrength(strength); - index = insertNodeBetween(previousIndex, index, node, errorCode); - } + // Insert a node with the preceding weight, reset to that. + node = nodeFromWeight16(weight16) | nodeFromStrength(strength); + index = insertNodeBetween(previousIndex, index, node, errorCode); } } else { // Found a stronger node with implied strength-common weight. - int64_t hasBefore3 = 0; - if(strength == UCOL_SECONDARY) { - U_ASSERT(!nodeHasBefore2(node)); - // Move the HAS_BEFORE3 flag from the parent node - // to the new secondary common node. - hasBefore3 = node & HAS_BEFORE3; - node = (node & ~(int64_t)HAS_BEFORE3) | HAS_BEFORE2; - } else { - U_ASSERT(!nodeHasBefore3(node)); - node |= HAS_BEFORE3; - } - nodes.setElementAt(node, index); - int32_t nextIndex = nextIndexFromNode(node); - // Insert default nodes with weights 01 and 05, reset to the 01 node. - node = nodeFromWeight16(Collation::BEFORE_WEIGHT16) | nodeFromStrength(strength); - index = insertNodeBetween(index, nextIndex, node, errorCode); - node = nodeFromWeight16(Collation::COMMON_WEIGHT16) | hasBefore3 | - nodeFromStrength(strength); - insertNodeBetween(index, nextIndex, node, errorCode); + uint32_t weight16 = getWeight16Before(index, node, strength); + index = findOrInsertWeakNode(index, weight16, strength, errorCode); } // Strength of the temporary CE = strength of its reset position. // Code above raises an error if the before-strength is stronger. @@ -468,6 +426,49 @@ CollationBuilder::addReset(int32_t strength, const UnicodeString &str, ces[cesLength - 1] = tempCEFromIndexAndStrength(index, strength); } +uint32_t +CollationBuilder::getWeight16Before(int32_t index, int64_t node, int32_t level) { + U_ASSERT(strengthFromNode(node) < level || !isTailoredNode(node)); + // Collect the root CE weights if this node is for a root CE. + // If it is not, then return the low non-primary boundary for a tailored CE. + uint32_t t; + if(strengthFromNode(node) == UCOL_TERTIARY) { + t = weight16FromNode(node); + } else { + t = Collation::COMMON_WEIGHT16; // Stronger node with implied common weight. + } + while(strengthFromNode(node) > UCOL_SECONDARY) { + index = previousIndexFromNode(node); + node = nodes.elementAti(index); + } + if(isTailoredNode(node)) { + return Collation::BEFORE_WEIGHT16; + } + uint32_t s; + if(strengthFromNode(node) == UCOL_SECONDARY) { + s = weight16FromNode(node); + } else { + s = Collation::COMMON_WEIGHT16; // Stronger node with implied common weight. + } + while(strengthFromNode(node) > UCOL_PRIMARY) { + index = previousIndexFromNode(node); + node = nodes.elementAti(index); + } + if(isTailoredNode(node)) { + return Collation::BEFORE_WEIGHT16; + } + // [p, s, t] is a root CE. Return the preceding weight for the requested level. + uint32_t p = weight32FromNode(node); + uint32_t weight16; + if(level == UCOL_SECONDARY) { + weight16 = rootElements.getSecondaryBefore(p, s); + } else { + weight16 = rootElements.getTertiaryBefore(p, s, t); + U_ASSERT((weight16 & ~Collation::ONLY_TERTIARY_MASK) == 0); + } + return weight16; +} + int64_t CollationBuilder::getSpecialResetPosition(const UnicodeString &str, const char *&parserErrorReason, UErrorCode &errorCode) { @@ -793,7 +794,7 @@ CollationBuilder::findOrInsertNodeForRootCE(int64_t ce, int32_t strength, UError // down to the requested level/strength. // Root CEs must have common=zero quaternary weights (for which we never insert any nodes). U_ASSERT((ce & 0xc0) == 0); - int32_t index = findOrInsertNodeForPrimary((uint32_t)(ce >> 32) , errorCode); + int32_t index = findOrInsertNodeForPrimary((uint32_t)(ce >> 32), errorCode); if(strength >= UCOL_SECONDARY) { uint32_t lower32 = (uint32_t)ce; index = findOrInsertWeakNode(index, lower32 >> 16, UCOL_SECONDARY, errorCode); @@ -863,17 +864,44 @@ int32_t CollationBuilder::findOrInsertWeakNode(int32_t index, uint32_t weight16, int32_t level, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return 0; } U_ASSERT(0 <= index && index < nodes.size()); + U_ASSERT(UCOL_SECONDARY <= level && level <= UCOL_TERTIARY); - U_ASSERT(weight16 == 0 || weight16 >= Collation::COMMON_WEIGHT16); - // Only reset-before inserts common weights. if(weight16 == Collation::COMMON_WEIGHT16) { return findCommonNode(index, level); } + + // If this will be the first below-common weight for the parent node, + // then we will also need to insert a common weight after it. + int64_t node = nodes.elementAti(index); + U_ASSERT(strengthFromNode(node) < level); // parent node is stronger + if(weight16 != 0 && weight16 < Collation::COMMON_WEIGHT16) { + int32_t hasThisLevelBefore = level == UCOL_SECONDARY ? HAS_BEFORE2 : HAS_BEFORE3; + if((node & hasThisLevelBefore) == 0) { + // The parent node has an implied level-common weight. + int64_t commonNode = + nodeFromWeight16(Collation::COMMON_WEIGHT16) | nodeFromStrength(level); + if(level == UCOL_SECONDARY) { + // Move the HAS_BEFORE3 flag from the parent node + // to the new secondary common node. + commonNode |= node & HAS_BEFORE3; + node &= ~(int64_t)HAS_BEFORE3; + } + nodes.setElementAt(node | hasThisLevelBefore, index); + // Insert below-common-weight node. + int32_t nextIndex = nextIndexFromNode(node); + node = nodeFromWeight16(weight16) | nodeFromStrength(level); + index = insertNodeBetween(index, nextIndex, node, errorCode); + // Insert common-weight node. + insertNodeBetween(index, nextIndex, commonNode, errorCode); + // Return index of below-common-weight node. + return index; + } + } + // Find the root CE's weight for this level. // Postpone insertion if not found: // Insert the new root node before the next stronger node, // or before the next root node with the same strength and a larger weight. - int64_t node = nodes.elementAti(index); int32_t nextIndex; while((nextIndex = nextIndexFromNode(node)) != 0) { node = nodes.elementAti(nextIndex); @@ -961,13 +989,14 @@ CollationBuilder::findCommonNode(int32_t index, int32_t strength) const { index = nextIndexFromNode(node); node = nodes.elementAti(index); U_ASSERT(!isTailoredNode(node) && strengthFromNode(node) == strength && - weight16FromNode(node) == Collation::BEFORE_WEIGHT16); + weight16FromNode(node) < Collation::COMMON_WEIGHT16); // Skip to the explicit common node. do { index = nextIndexFromNode(node); node = nodes.elementAti(index); U_ASSERT(strengthFromNode(node) >= strength); - } while(isTailoredNode(node) || strengthFromNode(node) > strength); + } while(isTailoredNode(node) || strengthFromNode(node) > strength || + weight16FromNode(node) < Collation::COMMON_WEIGHT16); U_ASSERT(weight16FromNode(node) == Collation::COMMON_WEIGHT16); return index; } @@ -1351,6 +1380,9 @@ CollationBuilder::makeTailoredCEs(UErrorCode &errorCode) { CollationWeights primaries, secondaries, tertiaries; int64_t *nodesArray = nodes.getBuffer(); +#ifdef DEBUG_COLLATION_BUILDER + puts("\nCollationBuilder::makeTailoredCEs()"); +#endif for(int32_t rpi = 0; rpi < rootPrimaryIndexes.size(); ++rpi) { int32_t i = rootPrimaryIndexes.elementAti(rpi); @@ -1398,11 +1430,11 @@ CollationBuilder::makeTailoredCEs(UErrorCode &errorCode) { // Gap at the beginning of the tertiary CE range. t = rootElements.getTertiaryBoundary() - 0x100; tLimit = rootElements.getFirstTertiaryCE() & Collation::ONLY_TERTIARY_MASK; - } else if(t == Collation::BEFORE_WEIGHT16) { - tLimit = Collation::COMMON_WEIGHT16; } else if(!pIsTailored && !sIsTailored) { // p and s are root weights. tLimit = rootElements.getTertiaryAfter(pIndex, s, t); + } else if(t == Collation::BEFORE_WEIGHT16) { + tLimit = Collation::COMMON_WEIGHT16; } else { // [p, s] is tailored. U_ASSERT(t == Collation::COMMON_WEIGHT16); @@ -1441,11 +1473,11 @@ CollationBuilder::makeTailoredCEs(UErrorCode &errorCode) { // Gap at the beginning of the secondary CE range. s = rootElements.getSecondaryBoundary() - 0x100; sLimit = rootElements.getFirstSecondaryCE() >> 16; - } else if(s == Collation::BEFORE_WEIGHT16) { - sLimit = Collation::COMMON_WEIGHT16; } else if(!pIsTailored) { // p is a root primary. sLimit = rootElements.getSecondaryAfter(pIndex, s); + } else if(s == Collation::BEFORE_WEIGHT16) { + sLimit = Collation::COMMON_WEIGHT16; } else { // p is a tailored primary. U_ASSERT(s == Collation::COMMON_WEIGHT16); @@ -1460,6 +1492,11 @@ CollationBuilder::makeTailoredCEs(UErrorCode &errorCode) { if(!secondaries.allocWeights(s, sLimit, sCount)) { errorCode = U_BUFFER_OVERFLOW_ERROR; errorReason = "secondary tailoring gap too small"; +#ifdef DEBUG_COLLATION_BUILDER + printf("!secondaries.allocWeights(%lx, %lx, sCount=%ld)\n", + (long)alignWeightRight(s), (long)alignWeightRight(sLimit), + (long)alignWeightRight(sCount)); +#endif return; } sIsTailored = TRUE; diff --git a/icu4c/source/i18n/collationbuilder.h b/icu4c/source/i18n/collationbuilder.h index 0582b167199..cd499a4e927 100644 --- a/icu4c/source/i18n/collationbuilder.h +++ b/icu4c/source/i18n/collationbuilder.h @@ -56,6 +56,11 @@ private: /** Implements CollationRuleParser::Sink. */ virtual void addReset(int32_t strength, const UnicodeString &str, const char *&errorReason, UErrorCode &errorCode); + /** + * Returns the secondary or tertiary weight preceding the current node's weight. + * node=nodes[index]. + */ + uint32_t getWeight16Before(int32_t index, int64_t node, int32_t level); int64_t getSpecialResetPosition(const UnicodeString &str, const char *&parserErrorReason, UErrorCode &errorCode); @@ -96,7 +101,7 @@ private: /** * Finds the node which implies or contains a common=05 weight of the given strength - * (secondary or tertiary). + * (secondary or tertiary), if the current node is stronger. * Skips weaker nodes and tailored nodes if the current node is stronger * and is followed by an explicit-common-weight node. * Always returns the input index if that node is no stronger than the given strength. @@ -218,15 +223,13 @@ private: /** At most 1M nodes, limited by the 20 bits in node bit fields. */ static const int32_t MAX_INDEX = 0xfffff; /** - * Node bit 6 is set on a primary node if there are tailored nodes - * with secondary values below the common secondary weight (05), - * from a reset-secondary-before (&[before 2]). + * Node bit 6 is set on a primary node if there are nodes + * with secondary values below the common secondary weight (05). */ static const int32_t HAS_BEFORE2 = 0x40; /** - * Node bit 5 is set on a primary or secondary node if there are tailored nodes - * with tertiary values below the common tertiary weight (05), - * from a reset-tertiary-before (&[before 3]). + * Node bit 5 is set on a primary or secondary node if there are nodes + * with tertiary values below the common tertiary weight (05). */ static const int32_t HAS_BEFORE3 = 0x20; /** @@ -338,15 +341,16 @@ private: * A node of a given strength normally implies "common" weights on weaker levels. * * A node with HAS_BEFORE2 must be immediately followed by - * a secondary node with BEFORE_WEIGHT16, then a secondary tailored node, + * a secondary node with an explicit below-common weight, then a secondary tailored node, * and later an explicit common-secondary node. - * (&[before 2] resets to the BEFORE_WEIGHT16 node so that + * The below-common weight can be a root weight, + * or it can be BEFORE_WEIGHT16 for tailoring before an implied common weight + * or before the lowest root weight. + * (&[before 2] resets to an explicit secondary node so that * the following addRelation(secondary) tailors right after that. * If we did not have this node and instead were to reset on the primary node, * then addRelation(secondary) would skip forward to the the COMMON_WEIGHT16 node.) * - * All secondary tailored nodes between these two explicit ones - * will be assigned lower-than-common secondary weights. * If the flag is not set, then there are no explicit secondary nodes * with the common or lower weights. * diff --git a/icu4c/source/i18n/collationdatareader.h b/icu4c/source/i18n/collationdatareader.h index df65b862ab4..01c0ede5382 100644 --- a/icu4c/source/i18n/collationdatareader.h +++ b/icu4c/source/i18n/collationdatareader.h @@ -109,7 +109,7 @@ private: /* * Format of collation data (ucadata.icu, binary data in coll/ *.res files). - * Format version 4.0. + * Format version 4.1. * * The root collation data is stored in the ucadata.icu file. * Tailorings are stored inside .res resource bundle files, with a complete file header. @@ -200,6 +200,17 @@ private: * * UBool compressibleBytes[]; -- empty in all tailorings * Flag for getSortKey(), indicating primary weight lead bytes that are compressible. + * + * ----------------- + * Changes for formatVersion 4.1 + * + * The rootElements may contain secondary and tertiary weights below common=05. + * (Used for small Hiragana letters.) + * Where is occurs, there is also an explicit unit with common secondary & tertiary weights. + * There are no other data structure changes, but builder code needs to be able to handle such data. + * + * ICU 55 ucadata.icu uses formatVersion 4.1. + * ICU 55 tailoring data continues to use formatVersion 4.0. */ U_NAMESPACE_END diff --git a/icu4c/source/i18n/collationrootelements.cpp b/icu4c/source/i18n/collationrootelements.cpp index f5b17b9f2cd..c8fd0a09ffd 100644 --- a/icu4c/source/i18n/collationrootelements.cpp +++ b/icu4c/source/i18n/collationrootelements.cpp @@ -125,7 +125,7 @@ CollationRootElements::getSecondaryBefore(uint32_t p, uint32_t s) const { } else { index = findPrimary(p) + 1; previousSec = Collation::BEFORE_WEIGHT16; - sec = Collation::COMMON_WEIGHT16; + sec = getFirstSecTerForPrimary(index) >> 16; } U_ASSERT(s >= sec); while(s > sec) { @@ -155,7 +155,7 @@ CollationRootElements::getTertiaryBefore(uint32_t p, uint32_t s, uint32_t t) con } else { index = findPrimary(p) + 1; previousTer = Collation::BEFORE_WEIGHT16; - secTer = Collation::COMMON_SEC_AND_TER_CE; + secTer = getFirstSecTerForPrimary(index); } uint32_t st = (s << 16) | t; while(st > secTer) { @@ -191,33 +191,38 @@ CollationRootElements::getPrimaryAfter(uint32_t p, int32_t index, UBool isCompre uint32_t CollationRootElements::getSecondaryAfter(int32_t index, uint32_t s) const { + uint32_t secTer; uint32_t secLimit; if(index == 0) { // primary = 0 + U_ASSERT(s != 0); index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX]; + secTer = elements[index]; // Gap at the end of the secondary CE range. secLimit = 0x10000; } else { U_ASSERT(index >= (int32_t)elements[IX_FIRST_PRIMARY_INDEX]); - ++index; + secTer = getFirstSecTerForPrimary(index + 1); + // If this is an explicit sec/ter unit, then it will be read once more. // Gap for secondaries of primary CEs. secLimit = getSecondaryBoundary(); } for(;;) { - uint32_t secTer = elements[index]; - if((secTer & SEC_TER_DELTA_FLAG) == 0) { return secLimit; } uint32_t sec = secTer >> 16; if(sec > s) { return sec; } - ++index; + secTer = elements[++index]; + if((secTer & SEC_TER_DELTA_FLAG) == 0) { return secLimit; } } } uint32_t CollationRootElements::getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) const { + uint32_t secTer; uint32_t terLimit; if(index == 0) { // primary = 0 if(s == 0) { + U_ASSERT(t != 0); index = (int32_t)elements[IX_FIRST_TERTIARY_INDEX]; // Gap at the end of the tertiary CE range. terLimit = 0x4000; @@ -226,22 +231,42 @@ CollationRootElements::getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) c // Gap for tertiaries of primary/secondary CEs. terLimit = getTertiaryBoundary(); } + secTer = elements[index] & ~SEC_TER_DELTA_FLAG; } else { U_ASSERT(index >= (int32_t)elements[IX_FIRST_PRIMARY_INDEX]); - ++index; + secTer = getFirstSecTerForPrimary(index + 1); + // If this is an explicit sec/ter unit, then it will be read once more. terLimit = getTertiaryBoundary(); } uint32_t st = (s << 16) | t; for(;;) { - uint32_t secTer = elements[index]; + if(secTer > st) { + U_ASSERT((secTer >> 16) == s); + return secTer & 0xffff; + } + secTer = elements[++index]; // No tertiary greater than t for this primary+secondary. if((secTer & SEC_TER_DELTA_FLAG) == 0 || (secTer >> 16) > s) { return terLimit; } secTer &= ~SEC_TER_DELTA_FLAG; - if(secTer > st) { return secTer & 0xffff; } - ++index; } } +uint32_t +CollationRootElements::getFirstSecTerForPrimary(int32_t index) const { + uint32_t secTer = elements[index]; + if((secTer & SEC_TER_DELTA_FLAG) == 0) { + // No sec/ter delta. + return Collation::COMMON_SEC_AND_TER_CE; + } + secTer &= ~SEC_TER_DELTA_FLAG; + if(secTer > Collation::COMMON_SEC_AND_TER_CE) { + // Implied sec/ter. + return Collation::COMMON_SEC_AND_TER_CE; + } + // Explicit sec/ter below common/common. + return secTer; +} + int32_t CollationRootElements::findPrimary(uint32_t p) const { // Requirement: p must occur as a root primary. diff --git a/icu4c/source/i18n/collationrootelements.h b/icu4c/source/i18n/collationrootelements.h index 1fa256194a5..df2a13df243 100644 --- a/icu4c/source/i18n/collationrootelements.h +++ b/icu4c/source/i18n/collationrootelements.h @@ -189,15 +189,32 @@ public: /** * Returns the secondary weight after [p, s] where index=findPrimary(p) * except use index=0 for p=0. + * + * Must return a weight for every root [p, s] as well as for every weight + * returned by getSecondaryBefore(). If p!=0 then s can be BEFORE_WEIGHT16. + * + * Exception: [0, 0] is handled by the CollationBuilder: + * Both its lower and upper boundaries are special. */ uint32_t getSecondaryAfter(int32_t index, uint32_t s) const; /** * Returns the tertiary weight after [p, s, t] where index=findPrimary(p) * except use index=0 for p=0. + * + * Must return a weight for every root [p, s, t] as well as for every weight + * returned by getTertiaryBefore(). If s!=0 then t can be BEFORE_WEIGHT16. + * + * Exception: [0, 0, 0] is handled by the CollationBuilder: + * Both its lower and upper boundaries are special. */ uint32_t getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) const; private: + /** + * Returns the first secondary & tertiary weights for p where index=findPrimary(p)+1. + */ + uint32_t getFirstSecTerForPrimary(int32_t index) const; + /** * Finds the largest index i where elements[i]<=p. * Requires first primary<=p<0xffffff00 (PRIMARY_SENTINEL). @@ -216,15 +233,18 @@ private: * See the comments on the IX_ constants. * * All other elements are a compact form of the root collator CEs - * in collation order. + * in mostly collation order. * - * Primary weights have the SEC_TER_DELTA_FLAG flag not set. - * A primary-weight element by itself represents a root CE - * with Collation::COMMON_SEC_AND_TER_CE. + * A sequence of one or more root CEs with the same primary weight is stored as + * one element with the primary weight, with the SEC_TER_DELTA_FLAG flag not set, + * followed by elements with only the secondary/tertiary weights, + * each with that flag set. + * If the lowest secondary/tertiary combination is Collation::COMMON_SEC_AND_TER_CE, + * then the element for that combination is omitted. * - * If there are root CEs with the same primary but other secondary/tertiary weights, - * then for each such CE there is an element with those secondary and tertiary weights, - * and with the SEC_TER_DELTA_FLAG flag set. + * Note: If the first actual secondary/tertiary combination is higher than + * Collation::COMMON_SEC_AND_TER_CE (which is unusual), + * the runtime code will assume anyway that Collation::COMMON_SEC_AND_TER_CE is present. * * A range of only-primary CEs with a consistent "step" increment * from each primary to the next may be stored as a range. diff --git a/icu4c/source/test/intltest/collationtest.cpp b/icu4c/source/test/intltest/collationtest.cpp index fa14d349c00..8e53832c904 100644 --- a/icu4c/source/test/intltest/collationtest.cpp +++ b/icu4c/source/test/intltest/collationtest.cpp @@ -723,7 +723,26 @@ public: // Simple primary CE. ++index; pri = p; - secTer = Collation::COMMON_SEC_AND_TER_CE; + // Does this have an explicit below-common sec/ter unit, + // or does it imply a common one? + if(index == length) { + secTer = Collation::COMMON_SEC_AND_TER_CE; + } else { + secTer = elements[index]; + if((secTer & CollationRootElements::SEC_TER_DELTA_FLAG) == 0) { + // No sec/ter delta. + secTer = Collation::COMMON_SEC_AND_TER_CE; + } else { + secTer &= ~CollationRootElements::SEC_TER_DELTA_FLAG; + if(secTer > Collation::COMMON_SEC_AND_TER_CE) { + // Implied sec/ter. + secTer = Collation::COMMON_SEC_AND_TER_CE; + } else { + // Explicit sec/ter below common/common. + ++index; + } + } + } return TRUE; } diff --git a/icu4c/source/test/testdata/collationtest.txt b/icu4c/source/test/testdata/collationtest.txt index e4a023b5767..bd779c2cac6 100644 --- a/icu4c/source/test/testdata/collationtest.txt +++ b/icu4c/source/test/testdata/collationtest.txt @@ -2476,3 +2476,53 @@ * compare <1 AA <2 aą + +** test: tailor tertiary-after a common tertiary where there is a lower one +# Assume that Hiragana small A has a below-common tertiary, and Hiragana A has a common one. +# See ICU ticket 11448 & CLDR ticket 7222. +@ rules +&あ<<