From 3de9bc9cb1dc96ea803e6190de9b6fb6fe00e307 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Sat, 24 Jan 2015 19:41:33 +0400 Subject: Update bundled HarfBuzz-NG to 0.9.38 Most important changes: * Fixes for Arabic, Hangul, Hebrew, Indic, Mandaic, Myanmar, and New Tai Lue shapers. * Fixed out-of-bounds access in Indic shaper. * Build and stability fixes, various optimizations. Change-Id: I4f0e32c017f62fe576bee41a430d3da6d571de80 Reviewed-by: Lars Knoll --- src/3rdparty/harfbuzz-ng/NEWS | 135 + src/3rdparty/harfbuzz-ng/README | 3 + src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro | 1 + src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh | 1 - src/3rdparty/harfbuzz-ng/src/hb-blob.cc | 9 +- .../harfbuzz-ng/src/hb-buffer-deserialize-json.hh | 4 +- src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh | 7 +- src/3rdparty/harfbuzz-ng/src/hb-buffer.cc | 6 +- src/3rdparty/harfbuzz-ng/src/hb-common.cc | 12 +- src/3rdparty/harfbuzz-ng/src/hb-common.h | 24 +- src/3rdparty/harfbuzz-ng/src/hb-face-private.hh | 2 +- src/3rdparty/harfbuzz-ng/src/hb-face.cc | 8 +- src/3rdparty/harfbuzz-ng/src/hb-font.cc | 4 +- src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh | 13 +- src/3rdparty/harfbuzz-ng/src/hb-object-private.hh | 107 +- .../harfbuzz-ng/src/hb-open-file-private.hh | 2 + .../harfbuzz-ng/src/hb-open-type-private.hh | 122 +- src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc | 205 +- src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh | 65 +- src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh | 37 +- .../harfbuzz-ng/src/hb-ot-layout-gpos-table.hh | 63 +- .../harfbuzz-ng/src/hb-ot-layout-gsub-table.hh | 18 +- .../src/hb-ot-layout-gsubgpos-private.hh | 91 +- .../harfbuzz-ng/src/hb-ot-layout-private.hh | 18 +- src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc | 4 +- .../src/hb-ot-shape-complex-arabic-fallback.hh | 148 +- .../src/hb-ot-shape-complex-arabic-table.hh | 2 +- .../harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc | 44 +- .../harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc | 11 +- .../harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc | 2 +- .../src/hb-ot-shape-complex-indic-machine.hh | 2570 ++++++++++---------- .../src/hb-ot-shape-complex-indic-table.cc | 36 +- .../harfbuzz-ng/src/hb-ot-shape-complex-indic.cc | 29 +- .../harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc | 18 + .../harfbuzz-ng/src/hb-ot-shape-complex-private.hh | 7 +- .../harfbuzz-ng/src/hb-ot-shape-fallback.cc | 2 + .../harfbuzz-ng/src/hb-ot-shape-normalize.cc | 2 + src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc | 8 +- src/3rdparty/harfbuzz-ng/src/hb-private.hh | 123 +- src/3rdparty/harfbuzz-ng/src/hb-set-private.hh | 2 +- src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc | 53 +- src/3rdparty/harfbuzz-ng/src/hb-shape.cc | 108 +- src/3rdparty/harfbuzz-ng/src/hb-shaper.cc | 6 +- src/3rdparty/harfbuzz-ng/src/hb-unicode.cc | 4 +- src/3rdparty/harfbuzz-ng/src/hb-version.h | 4 +- 45 files changed, 2344 insertions(+), 1796 deletions(-) (limited to 'src/3rdparty') diff --git a/src/3rdparty/harfbuzz-ng/NEWS b/src/3rdparty/harfbuzz-ng/NEWS index f4fabc7cd9..3a33bdf5cb 100644 --- a/src/3rdparty/harfbuzz-ng/NEWS +++ b/src/3rdparty/harfbuzz-ng/NEWS @@ -1,3 +1,138 @@ +Overview of changes leading to 0.9.38 +Friday, January 23, 2015 +===================================== + +- Fix minor out-of-bounds access in Indic shaper. +- Change New Tai Lue shaping engine from South-East Asian to default, + reflecting change in Unicode encoding model. +- Add hb-shape --font-size. Can take up to two numbers for separate + x / y size. +- Fix CoreText and FreeType scale issues with negative scales. +- Reject blobs larger than 2GB. This might break some icu-le-hb clients + that need security fixes. See: + http://www.icu-project.org/trac/ticket/11450 +- Avoid accessing font tables during face destruction, in casce rogue + clients released face data already. +- Fix up gobject-introspection a bit. Python bindings kinda working. + See README.python. +- Misc fixes. +- API additions: + hb_ft_face_create_referenced() + hb_ft_font_create_referenced() + + +Overview of changes leading to 0.9.37 +Wednesday, December 17, 2014 +===================================== + +- Fix out-of-bounds access in Context lookup format 3. +- Indic: Allow ZWJ/ZWNJ before syllable modifiers. + + +Overview of changes leading to 0.9.36 +Thursday, November 20, 2014 +===================================== + +- First time that three months went by without a release since + 0.9.2 was released on August 10, 2012! +- Fix performance bug in hb_ot_collect_glyphs(): + https://bugzilla.mozilla.org/show_bug.cgi?id=1090869 +- Add basic vertical-text support to hb-ot-font. +- Misc build fixes. + + +Overview of changes leading to 0.9.35 +Saturday, August 13, 2014 +===================================== + +- Fix major shape-plan caching bug when more than one shaper were + provided to hb_shape_full() (as exercised by XeTeX). + http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1246370.html +- Fix Arabic fallback shaping regression. This was broken in 0.9.32. +- Major hb-coretext fixes. That backend is complete now, including + respecing buffer direction and language, down to vertical writing. +- Build fixes for Windows CE. Should build fine now. +- Misc fixes: + Use atexit() only if it's safe to call from shared library + https://bugs.freedesktop.org/show_bug.cgi?id=82246 + Mandaic had errors in its Unicode Joining_Type + https://bugs.freedesktop.org/show_bug.cgi?id=82306 +- API changes: + + * hb_buffer_clear_contents() does not reset buffer flags now. + + After 763e5466c0a03a7c27020e1e2598e488612529a7, one doesn't + need to set flags for different pieces of text. The flags now + are something the client sets up once, depending on how it + actually uses the buffer. As such, don't clear it in + clear_contents(). + + I don't expect any changes to be needed to any existing client. + + +Overview of changes leading to 0.9.34 +Saturday, August 2, 2014 +===================================== + +- hb_feature_from_string() now accepts CSS font-feature-settings format. +- As a result, hb-shape / hb-view --features also accept CSS-style strings. + Eg, "'liga' off" is accepted now. +- Add old-spec Myanmar shaper: + https://bugs.freedesktop.org/show_bug.cgi?id=81775 +- Don't apply 'calt' in Hangul shaper. +- Fix mark advance zeroing for Hebrew shaper: + https://bugs.freedesktop.org/show_bug.cgi?id=76767 +- Implement Windows-1256 custom Arabic shaping. Only built on Windows, + and requires help from get_glyph(). Used by Firefox. + https://bugzilla.mozilla.org/show_bug.cgi?id=1045139 +- Disable 'liga' in vertical text. +- Build fixes. +- API changes: + + * Make HB_BUFFER_FLAG_BOT/EOT easier to use. + + Previously, we expected users to provide BOT/EOT flags when the + text *segment* was at paragraph boundaries. This meant that for + clients that provide full paragraph to HarfBuzz (eg. Pango), they + had code like this: + + hb_buffer_set_flags (hb_buffer, + (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) | + (item_offset + item_length == paragraph_length ? + HB_BUFFER_FLAG_EOT : 0)); + + hb_buffer_add_utf8 (hb_buffer, + paragraph_text, paragraph_length, + item_offset, item_length); + + After this change such clients can simply say: + + hb_buffer_set_flags (hb_buffer, + HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT); + + hb_buffer_add_utf8 (hb_buffer, + paragraph_text, paragraph_length, + item_offset, item_length); + + Ie, HarfBuzz itself checks whether the segment is at the beginning/end + of the paragraph. Clients that only pass item-at-a-time to HarfBuzz + continue not setting any flags whatsoever. + + Another way to put it is: if there's pre-context text in the buffer, + HarfBuzz ignores the BOT flag. If there's post-context, it ignores + EOT flag. + + +Overview of changes leading to 0.9.33 +Tuesday, July 22, 2014 +===================================== + +- Turn off ARabic 'cswh' feature that was accidentally turned on. +- Add HB_TAG_MAX_SIGNED. +- Make hb_face_make_immutable() really make face immutable! +- Windows build fixes. + + Overview of changes leading to 0.9.32 Thursday, July 17, 2014 ===================================== diff --git a/src/3rdparty/harfbuzz-ng/README b/src/3rdparty/harfbuzz-ng/README index 74e739da52..d34bc74f99 100644 --- a/src/3rdparty/harfbuzz-ng/README +++ b/src/3rdparty/harfbuzz-ng/README @@ -1,3 +1,6 @@ +[![Build Status](https://travis-ci.org/behdad/harfbuzz.svg)](https://travis-ci.org/behdad/harfbuzz) +[![Coverage Status](https://img.shields.io/coveralls/behdad/harfbuzz.svg)](https://coveralls.io/r/behdad/harfbuzz) + This is HarfBuzz, a text shaping library. For bug reports, mailing list, and other information please visit: diff --git a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro index 79c2a3e2d6..e64e5b2002 100644 --- a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro +++ b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro @@ -8,6 +8,7 @@ CONFIG += \ load(qt_helper_lib) DEFINES += HAVE_OT HAVE_ATEXIT HB_NO_UNICODE_FUNCS HB_DISABLE_DEPRECATED +win32: DEFINES += HB_NO_WIN1256 INCLUDEPATH += $$PWD/include diff --git a/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh index 60cbcf91be..e6738b7d9f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh @@ -44,7 +44,6 @@ #elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__)) -#define WIN32_LEAN_AND_MEAN #include /* MinGW has a convoluted history of supporting MemoryBarrier diff --git a/src/3rdparty/harfbuzz-ng/src/hb-blob.cc b/src/3rdparty/harfbuzz-ng/src/hb-blob.cc index b82b4b2a3a..8759a252a5 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-blob.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-blob.cc @@ -78,8 +78,8 @@ _hb_blob_destroy_user_data (hb_blob_t *blob) } /** - * hb_blob_create: (Xconstructor) - * @data: (array length=length) (closure user_data) (destroy destroy) (scope notified) (transfer none): Pointer to blob data. + * hb_blob_create: (skip) + * @data: Pointer to blob data. * @length: Length of @data in bytes. * @mode: Memory mode for @data. * @user_data: Data parameter to pass to @destroy. @@ -102,7 +102,10 @@ hb_blob_create (const char *data, { hb_blob_t *blob; - if (!length || !(blob = hb_object_create ())) { + if (!length || + length >= 1u << 31 || + data + length < data /* overflows */ || + !(blob = hb_object_create ())) { if (destroy) destroy (user_data); return hb_blob_get_empty (); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh index a49dc2ac50..3f626bda40 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh @@ -459,8 +459,8 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, const char *tok = NULL; int cs; - hb_glyph_info_t info; - hb_glyph_position_t pos; + hb_glyph_info_t info = {0}; + hb_glyph_position_t pos = {0}; #line 466 "hb-buffer-deserialize-json.hh" { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh index 5eccd3c31f..069f925581 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh @@ -48,15 +48,13 @@ struct hb_buffer_t { ASSERT_POD (); /* Information about how the text in the buffer should be treated */ - hb_unicode_funcs_t *unicode; /* Unicode functions */ - hb_segment_properties_t props; /* Script, language, direction */ hb_buffer_flags_t flags; /* BOT / EOT / etc. */ hb_codepoint_t replacement; /* U+FFFD or something else. */ /* Buffer contents */ - hb_buffer_content_type_t content_type; + hb_segment_properties_t props; /* Script, language, direction */ bool in_error; /* Allocation failed */ bool have_output; /* Whether we have an output buffer going on */ @@ -183,6 +181,9 @@ struct hb_buffer_t { inline bool ensure (unsigned int size) { return likely (!size || size < allocated) ? true : enlarge (size); } + inline bool ensure_inplace (unsigned int size) + { return likely (!size || size < allocated); } + HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out); HB_INTERNAL bool shift_forward (unsigned int count); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc index 2377ba40da..7bf232d760 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc @@ -178,6 +178,7 @@ hb_buffer_t::reset (void) hb_unicode_funcs_destroy (unicode); unicode = hb_unicode_funcs_get_default (); + flags = HB_BUFFER_FLAG_DEFAULT; replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT; clear (); @@ -191,7 +192,6 @@ hb_buffer_t::clear (void) hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; props = default_props; - flags = HB_BUFFER_FLAG_DEFAULT; content_type = HB_BUFFER_CONTENT_TYPE_INVALID; in_error = false; @@ -702,11 +702,11 @@ hb_buffer_get_empty (void) HB_OBJECT_HEADER_STATIC, const_cast (&_hb_unicode_funcs_nil), - HB_SEGMENT_PROPERTIES_DEFAULT, HB_BUFFER_FLAG_DEFAULT, HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, HB_BUFFER_CONTENT_TYPE_INVALID, + HB_SEGMENT_PROPERTIES_DEFAULT, true, /* in_error */ true, /* have_output */ true /* have_positions */ @@ -1400,7 +1400,7 @@ hb_buffer_add_utf (hb_buffer_t *buffer, /** * hb_buffer_add_utf8: * @buffer: a buffer. - * @text: (array length=text_length): + * @text: (array length=text_length) (element-type uint8_t): * @text_length: * @item_offset: * @item_length: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.cc b/src/3rdparty/harfbuzz-ng/src/hb-common.cc index 416d082a6b..8837cefbf7 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-common.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-common.cc @@ -33,10 +33,6 @@ #include -#ifdef _WIN32_WCE -#define strdup(x) _strdup(x) -#endif - /* hb_options_t */ @@ -238,8 +234,8 @@ struct hb_language_item_t { static hb_language_item_t *langs; -#ifdef HAVE_ATEXIT -static inline +#ifdef HB_USE_ATEXIT +static void free_langs (void) { while (langs) { @@ -273,7 +269,7 @@ retry: goto retry; } -#ifdef HAVE_ATEXIT +#ifdef HB_USE_ATEXIT if (!first_lang) atexit (free_langs); /* First person registers atexit() callback. */ #endif @@ -349,7 +345,7 @@ hb_language_get_default (void) hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language); if (unlikely (language == HB_LANGUAGE_INVALID)) { language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); - hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language); + (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language); } return default_language; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.h b/src/3rdparty/harfbuzz-ng/src/hb-common.h index b24cbb33ba..b6ce3f724d 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-common.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-common.h @@ -95,6 +95,7 @@ typedef uint32_t hb_tag_t; #define HB_TAG_NONE HB_TAG(0,0,0,0) #define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff) +#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff) /* len=-1 means str is NUL-terminated. */ hb_tag_t @@ -122,12 +123,13 @@ hb_direction_from_string (const char *str, int len); const char * hb_direction_to_string (hb_direction_t direction); +#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4) +/* Direction must be valid for the following */ #define HB_DIRECTION_IS_HORIZONTAL(dir) ((((unsigned int) (dir)) & ~1U) == 4) #define HB_DIRECTION_IS_VERTICAL(dir) ((((unsigned int) (dir)) & ~1U) == 6) #define HB_DIRECTION_IS_FORWARD(dir) ((((unsigned int) (dir)) & ~2U) == 4) #define HB_DIRECTION_IS_BACKWARD(dir) ((((unsigned int) (dir)) & ~2U) == 5) -#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4) -#define HB_DIRECTION_REVERSE(dir) ((hb_direction_t) (((unsigned int) (dir)) ^ 1)) /* Direction must be valid */ +#define HB_DIRECTION_REVERSE(dir) ((hb_direction_t) (((unsigned int) (dir)) ^ 1)) /* hb_language_t */ @@ -295,11 +297,17 @@ typedef enum /*7.0*/ HB_SCRIPT_WARANG_CITI = HB_TAG ('W','a','r','a'), /* No script set. */ - /*---*/ HB_SCRIPT_INVALID = HB_TAG_NONE, - - /* Dummy value to ensure any hb_tag_t value can be passed/stored as hb_script_t - * without risking undefined behavior. */ - /*---*/ _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX + HB_SCRIPT_INVALID = HB_TAG_NONE, + + /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t + * without risking undefined behavior. Include both a signed and unsigned max, + * since technically enums are int, and indeed, hb_script_t ends up being signed. + * See this thread for technicalities: + * + * http://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html + */ + _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX, /*< skip >*/ + _HB_SCRIPT_MAX_VALUE_SIGNED = HB_TAG_MAX_SIGNED /*< skip >*/ } hb_script_t; @@ -309,7 +317,7 @@ typedef enum hb_script_t hb_script_from_iso15924_tag (hb_tag_t tag); -/* suger for tag_from_string() then script_from_iso15924_tag */ +/* sugar for tag_from_string() then script_from_iso15924_tag */ /* len=-1 means s is NUL-terminated */ hb_script_t hb_script_from_string (const char *s, int len); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh index 6520d3dbdf..c4266fff4f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh @@ -66,7 +66,7 @@ struct hb_face_t { { hb_blob_t *blob; - if (unlikely (!this || !reference_table_func)) + if (unlikely (!reference_table_func)) return hb_blob_get_empty (); blob = reference_table_func (/*XXX*/const_cast (this), tag, user_data); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face.cc b/src/3rdparty/harfbuzz-ng/src/hb-face.cc index 71cf49a5bc..9348af7bf8 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-face.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-face.cc @@ -298,7 +298,7 @@ hb_face_get_user_data (hb_face_t *face, void hb_face_make_immutable (hb_face_t *face) { - if (hb_object_is_inert (face)) + if (unlikely (hb_object_is_inert (face))) return; face->immutable = true; @@ -368,7 +368,7 @@ void hb_face_set_index (hb_face_t *face, unsigned int index) { - if (hb_object_is_inert (face)) + if (face->immutable) return; face->index = index; @@ -403,7 +403,7 @@ void hb_face_set_upem (hb_face_t *face, unsigned int upem) { - if (hb_object_is_inert (face)) + if (face->immutable) return; face->upem = upem; @@ -447,7 +447,7 @@ void hb_face_set_glyph_count (hb_face_t *face, unsigned int glyph_count) { - if (hb_object_is_inert (face)) + if (face->immutable) return; face->num_glyphs = glyph_count; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-font.cc index fc4c8ebf07..4364ca72fb 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-font.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-font.cc @@ -357,7 +357,7 @@ hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, void hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) { - if (hb_object_is_inert (ffuncs)) + if (unlikely (hb_object_is_inert (ffuncs))) return; ffuncs->immutable = true; @@ -1034,7 +1034,7 @@ hb_font_get_user_data (hb_font_t *font, void hb_font_make_immutable (hb_font_t *font) { - if (hb_object_is_inert (font)) + if (unlikely (hb_object_is_inert (font))) return; font->immutable = true; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh index 40f2e3d152..6281201958 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh @@ -44,21 +44,10 @@ #elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__)) -#define WIN32_LEAN_AND_MEAN #include typedef CRITICAL_SECTION hb_mutex_impl_t; -#ifdef _WIN32_WCE -#define HB_MUTEX_IMPL_INIT { 0, 0, NULL, NULL, 0 } -#else -#define HB_MUTEX_IMPL_INIT { NULL, 0, 0, NULL, NULL, 0 } -#endif - -#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) -#define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0) -#else +#define HB_MUTEX_IMPL_INIT {0} #define hb_mutex_impl_init(M) InitializeCriticalSection (M) -#endif - #define hb_mutex_impl_lock(M) EnterCriticalSection (M) #define hb_mutex_impl_unlock(M) LeaveCriticalSection (M) #define hb_mutex_impl_finish(M) DeleteCriticalSection (M) diff --git a/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh index 8a9ae34dbe..7bd0f1624b 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh @@ -68,8 +68,6 @@ struct hb_reference_count_t #define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT} struct hb_user_data_array_t { - /* TODO Add tracing. */ - struct hb_user_data_item_t { hb_user_data_key_t *key; void *data; @@ -106,69 +104,6 @@ struct hb_object_header_t #define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID, HB_USER_DATA_ARRAY_INIT} - static inline void *create (unsigned int size) { - hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size); - - if (likely (obj)) - obj->init (); - - return obj; - } - - inline void init (void) { - ref_count.init (1); - user_data.init (); - } - - inline bool is_inert (void) const { - return unlikely (ref_count.is_invalid ()); - } - - inline void reference (void) { - if (unlikely (!this || this->is_inert ())) - return; - ref_count.inc (); - } - - inline bool destroy (void) { - if (unlikely (!this || this->is_inert ())) - return false; - if (ref_count.dec () != 1) - return false; - - ref_count.finish (); /* Do this before user_data */ - user_data.finish (); - - return true; - } - - inline bool set_user_data (hb_user_data_key_t *key, - void * data, - hb_destroy_func_t destroy_func, - hb_bool_t replace) { - if (unlikely (!this || this->is_inert ())) - return false; - - return user_data.set (key, data, destroy_func, replace); - } - - inline void *get_user_data (hb_user_data_key_t *key) { - if (unlikely (!this || this->is_inert ())) - return NULL; - - return user_data.get (key); - } - - inline void trace (const char *function) const { - if (unlikely (!this)) return; - /* TODO We cannot use DEBUG_MSG_FUNC here since that one currently only - * prints the class name and throws away the template info. */ - DEBUG_MSG (OBJECT, (void *) this, - "%s refcount=%d", - function, - this ? ref_count.ref_count : 0); - } - private: ASSERT_POD (); }; @@ -179,32 +114,56 @@ struct hb_object_header_t template static inline void hb_object_trace (const Type *obj, const char *function) { - obj->header.trace (function); + DEBUG_MSG (OBJECT, (void *) obj, + "%s refcount=%d", + function, + obj ? obj->header.ref_count.ref_count : 0); } + template static inline Type *hb_object_create (void) { - Type *obj = (Type *) hb_object_header_t::create (sizeof (Type)); + Type *obj = (Type *) calloc (1, sizeof (Type)); + + if (unlikely (!obj)) + return obj; + + hb_object_init (obj); hb_object_trace (obj, HB_FUNC); return obj; } template +static inline void hb_object_init (Type *obj) +{ + obj->header.ref_count.init (1); + obj->header.user_data.init (); +} +template static inline bool hb_object_is_inert (const Type *obj) { - return unlikely (obj->header.is_inert ()); + return unlikely (obj->header.ref_count.is_invalid ()); } template static inline Type *hb_object_reference (Type *obj) { hb_object_trace (obj, HB_FUNC); - obj->header.reference (); + if (unlikely (!obj || hb_object_is_inert (obj))) + return obj; + obj->header.ref_count.inc (); return obj; } template static inline bool hb_object_destroy (Type *obj) { hb_object_trace (obj, HB_FUNC); - return obj->header.destroy (); + if (unlikely (!obj || hb_object_is_inert (obj))) + return false; + if (obj->header.ref_count.dec () != 1) + return false; + + obj->header.ref_count.finish (); /* Do this before user_data */ + obj->header.user_data.finish (); + return true; } template static inline bool hb_object_set_user_data (Type *obj, @@ -213,14 +172,18 @@ static inline bool hb_object_set_user_data (Type *obj, hb_destroy_func_t destroy, hb_bool_t replace) { - return obj->header.set_user_data (key, data, destroy, replace); + if (unlikely (!obj || hb_object_is_inert (obj))) + return false; + return obj->header.user_data.set (key, data, destroy, replace); } template static inline void *hb_object_get_user_data (Type *obj, hb_user_data_key_t *key) { - return obj->header.get_user_data (key); + if (unlikely (!obj || hb_object_is_inert (obj))) + return NULL; + return obj->header.user_data.get (key); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh index 57db59db84..7500c32f15 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh @@ -197,6 +197,8 @@ struct TTCHeader struct OpenTypeFontFile { + static const hb_tag_t tableTag = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */ + static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */ static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */ static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f'); /* TrueType Collection */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh index 046df97659..477d9e28b2 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh @@ -194,10 +194,11 @@ struct hb_sanitize_context_t { this->start = hb_blob_get_data (this->blob, NULL); this->end = this->start + hb_blob_get_length (this->blob); + assert (this->start <= this->end); /* Must not overflow. */ this->edit_count = 0; this->debug_depth = 0; - DEBUG_MSG_LEVEL (SANITIZE, this->blob, 0, +1, + DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, "start [%p..%p] (%lu bytes)", this->start, this->end, (unsigned long) (this->end - this->start)); @@ -205,7 +206,7 @@ struct hb_sanitize_context_t inline void end_processing (void) { - DEBUG_MSG_LEVEL (SANITIZE, this->blob, 0, -1, + DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1, "end [%p..%p] %u edit requests", this->start, this->end, this->edit_count); @@ -217,28 +218,31 @@ struct hb_sanitize_context_t inline bool check_range (const void *base, unsigned int len) const { const char *p = (const char *) base; + bool ok = this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len; - hb_auto_trace_t trace - (&this->debug_depth, "SANITIZE", this->blob, NULL, - "check_range [%p..%p] (%d bytes) in [%p..%p]", + DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, + "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s", p, p + len, len, - this->start, this->end); + this->start, this->end, + ok ? "OK" : "OUT-OF-RANGE"); - return TRACE_RETURN (likely (this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len)); + return likely (ok); } inline bool check_array (const void *base, unsigned int record_size, unsigned int len) const { const char *p = (const char *) base; bool overflows = _hb_unsigned_int_mul_overflows (len, record_size); + unsigned int array_size = record_size * len; + bool ok = !overflows && this->check_range (base, array_size); - hb_auto_trace_t trace - (&this->debug_depth, "SANITIZE", this->blob, NULL, - "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]", - p, p + (record_size * len), record_size, len, (unsigned long) record_size * len, - this->start, this->end); + DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, + "check_array [%p..%p] (%d*%d=%d bytes) in [%p..%p] -> %s", + p, p + (record_size * len), record_size, len, (unsigned int) array_size, + this->start, this->end, + overflows ? "OVERFLOWS" : ok ? "OK" : "OUT-OF-RANGE"); - return TRACE_RETURN (likely (!overflows && this->check_range (base, record_size * len))); + return likely (ok); } template @@ -255,15 +259,14 @@ struct hb_sanitize_context_t const char *p = (const char *) base; this->edit_count++; - hb_auto_trace_t trace - (&this->debug_depth, "SANITIZE", this->blob, NULL, + DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s", this->edit_count, p, p + len, len, this->start, this->end, this->writable ? "GRANTED" : "DENIED"); - return TRACE_RETURN (this->writable); + return this->writable; } template @@ -289,7 +292,7 @@ template struct Sanitizer { static hb_blob_t *sanitize (hb_blob_t *blob) { - hb_sanitize_context_t c[1] = {{0}}; + hb_sanitize_context_t c[1] = {{0, NULL, NULL, false, 0, NULL}}; bool sane; /* TODO is_sane() stuff */ @@ -297,7 +300,7 @@ struct Sanitizer c->init (blob); retry: - DEBUG_MSG_FUNC (SANITIZE, blob, "start"); + DEBUG_MSG_FUNC (SANITIZE, c->start, "start"); c->start_processing (); @@ -311,13 +314,13 @@ struct Sanitizer sane = t->sanitize (c); if (sane) { if (c->edit_count) { - DEBUG_MSG_FUNC (SANITIZE, blob, "passed first round with %d edits; going for second round", c->edit_count); + DEBUG_MSG_FUNC (SANITIZE, c->start, "passed first round with %d edits; going for second round", c->edit_count); /* sanitize again to ensure no toe-stepping */ c->edit_count = 0; sane = t->sanitize (c); if (c->edit_count) { - DEBUG_MSG_FUNC (SANITIZE, blob, "requested %d edits in second round; FAILLING", c->edit_count); + DEBUG_MSG_FUNC (SANITIZE, c->start, "requested %d edits in second round; FAILLING", c->edit_count); sane = false; } } @@ -330,7 +333,7 @@ struct Sanitizer if (c->start) { c->writable = true; /* ok, we made it writable by relocating. try again */ - DEBUG_MSG_FUNC (SANITIZE, blob, "retry"); + DEBUG_MSG_FUNC (SANITIZE, c->start, "retry"); goto retry; } } @@ -338,7 +341,7 @@ struct Sanitizer c->end_processing (); - DEBUG_MSG_FUNC (SANITIZE, blob, sane ? "PASSED" : "FAILED"); + DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED"); if (sane) return blob; else { @@ -533,31 +536,76 @@ template struct BEInt { public: - inline void set (Type i) { hb_be_uint16_put (v,i); } - inline operator Type (void) const { return hb_be_uint16_get (v); } - inline bool operator == (const BEInt& o) const { return hb_be_uint16_eq (v, o.v); } + inline void set (Type V) + { + v[0] = (V >> 8) & 0xFF; + v[1] = (V ) & 0xFF; + } + inline operator Type (void) const + { + return (v[0] << 8) + + (v[1] ); + } + inline bool operator == (const BEInt& o) const + { + return v[0] == o.v[0] + && v[1] == o.v[1]; + } inline bool operator != (const BEInt& o) const { return !(*this == o); } private: uint8_t v[2]; }; template -struct BEInt +struct BEInt { public: - inline void set (Type i) { hb_be_uint32_put (v,i); } - inline operator Type (void) const { return hb_be_uint32_get (v); } - inline bool operator == (const BEInt& o) const { return hb_be_uint32_eq (v, o.v); } - inline bool operator != (const BEInt& o) const { return !(*this == o); } - private: uint8_t v[4]; + inline void set (Type V) + { + v[0] = (V >> 16) & 0xFF; + v[1] = (V >> 8) & 0xFF; + v[2] = (V ) & 0xFF; + } + inline operator Type (void) const + { + return (v[0] << 16) + + (v[1] << 8) + + (v[2] ); + } + inline bool operator == (const BEInt& o) const + { + return v[0] == o.v[0] + && v[1] == o.v[1] + && v[2] == o.v[2]; + } + inline bool operator != (const BEInt& o) const { return !(*this == o); } + private: uint8_t v[3]; }; template -struct BEInt +struct BEInt { public: - inline void set (Type i) { hb_be_uint24_put (v,i); } - inline operator Type (void) const { return hb_be_uint24_get (v); } - inline bool operator == (const BEInt& o) const { return hb_be_uint24_eq (v, o.v); } - inline bool operator != (const BEInt& o) const { return !(*this == o); } - private: uint8_t v[3]; + inline void set (Type V) + { + v[0] = (V >> 24) & 0xFF; + v[1] = (V >> 16) & 0xFF; + v[2] = (V >> 8) & 0xFF; + v[3] = (V ) & 0xFF; + } + inline operator Type (void) const + { + return (v[0] << 24) + + (v[1] << 16) + + (v[2] << 8) + + (v[3] ); + } + inline bool operator == (const BEInt& o) const + { + return v[0] == o.v[0] + && v[1] == o.v[1] + && v[2] == o.v[2] + && v[3] == o.v[3]; + } + inline bool operator != (const BEInt& o) const { return !(*this == o); } + private: uint8_t v[4]; }; /* Integer types in big-endian order and no alignment requirement */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc index c9890c5922..2af2f54a75 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc @@ -35,17 +35,128 @@ #include "hb-ot-hmtx-table.hh" +struct hb_ot_face_metrics_accelerator_t +{ + unsigned int num_metrics; + unsigned int num_advances; + unsigned int default_advance; + const OT::_mtx *table; + hb_blob_t *blob; + + inline void init (hb_face_t *face, + hb_tag_t _hea_tag, hb_tag_t _mtx_tag, + unsigned int default_advance) + { + this->default_advance = default_advance; + this->num_metrics = face->get_num_glyphs (); + + hb_blob_t *_hea_blob = OT::Sanitizer::sanitize (face->reference_table (_hea_tag)); + const OT::_hea *_hea = OT::Sanitizer::lock_instance (_hea_blob); + this->num_advances = _hea->numberOfLongMetrics; + hb_blob_destroy (_hea_blob); + + this->blob = OT::Sanitizer::sanitize (face->reference_table (_mtx_tag)); + if (unlikely (!this->num_advances || + 2 * (this->num_advances + this->num_metrics) < hb_blob_get_length (this->blob))) + { + this->num_metrics = this->num_advances = 0; + hb_blob_destroy (this->blob); + this->blob = hb_blob_get_empty (); + } + this->table = OT::Sanitizer::lock_instance (this->blob); + } + + inline void fini (void) + { + hb_blob_destroy (this->blob); + } + + inline unsigned int get_advance (hb_codepoint_t glyph) const + { + if (unlikely (glyph >= this->num_metrics)) + { + /* If this->num_metrics is zero, it means we don't have the metrics table + * for this direction: return one EM. Otherwise, it means that the glyph + * index is out of bound: return zero. */ + if (this->num_metrics) + return 0; + else + return this->default_advance; + } + + if (glyph >= this->num_advances) + glyph = this->num_advances - 1; + + return this->table->longMetric[glyph].advance; + } +}; + +struct hb_ot_face_cmap_accelerator_t +{ + const OT::CmapSubtable *table; + const OT::CmapSubtable *uvs_table; + hb_blob_t *blob; + + inline void init (hb_face_t *face) + { + this->blob = OT::Sanitizer::sanitize (face->reference_table (HB_OT_TAG_cmap)); + const OT::cmap *cmap = OT::Sanitizer::lock_instance (this->blob); + const OT::CmapSubtable *subtable = NULL; + const OT::CmapSubtable *subtable_uvs = NULL; + + /* 32-bit subtables. */ + if (!subtable) subtable = cmap->find_subtable (3, 10); + if (!subtable) subtable = cmap->find_subtable (0, 6); + if (!subtable) subtable = cmap->find_subtable (0, 4); + /* 16-bit subtables. */ + if (!subtable) subtable = cmap->find_subtable (3, 1); + if (!subtable) subtable = cmap->find_subtable (0, 3); + if (!subtable) subtable = cmap->find_subtable (0, 2); + if (!subtable) subtable = cmap->find_subtable (0, 1); + if (!subtable) subtable = cmap->find_subtable (0, 0); + /* Meh. */ + if (!subtable) subtable = &OT::Null(OT::CmapSubtable); + + /* UVS subtable. */ + if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5); + /* Meh. */ + if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable); + + this->table = subtable; + this->uvs_table = subtable_uvs; + } + + inline void fini (void) + { + hb_blob_destroy (this->blob); + } + + inline bool get_glyph (hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) const + { + if (unlikely (variation_selector)) + { + switch (this->uvs_table->get_glyph_variant (unicode, + variation_selector, + glyph)) + { + case OT::GLYPH_VARIANT_NOT_FOUND: return false; + case OT::GLYPH_VARIANT_FOUND: return true; + case OT::GLYPH_VARIANT_USE_DEFAULT: break; + } + } + + return this->table->get_glyph (unicode, glyph); + } +}; + struct hb_ot_font_t { - unsigned int num_glyphs; - unsigned int num_hmetrics; - const OT::hmtx *hmtx; - hb_blob_t *hmtx_blob; - - const OT::CmapSubtable *cmap; - const OT::CmapSubtable *cmap_uvs; - hb_blob_t *cmap_blob; + hb_ot_face_cmap_accelerator_t cmap; + hb_ot_face_metrics_accelerator_t h_metrics; + hb_ot_face_metrics_accelerator_t v_metrics; }; @@ -53,50 +164,16 @@ static hb_ot_font_t * _hb_ot_font_create (hb_font_t *font) { hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t)); + hb_face_t *face = font->face; if (unlikely (!ot_font)) return NULL; - ot_font->num_glyphs = font->face->get_num_glyphs (); + unsigned int upem = face->get_upem (); - { - hb_blob_t *hhea_blob = OT::Sanitizer::sanitize (font->face->reference_table (HB_OT_TAG_hhea)); - const OT::hhea *hhea = OT::Sanitizer::lock_instance (hhea_blob); - ot_font->num_hmetrics = hhea->numberOfHMetrics; - hb_blob_destroy (hhea_blob); - } - ot_font->hmtx_blob = OT::Sanitizer::sanitize (font->face->reference_table (HB_OT_TAG_hmtx)); - if (unlikely (!ot_font->num_hmetrics || - 2 * (ot_font->num_hmetrics + ot_font->num_glyphs) < hb_blob_get_length (ot_font->hmtx_blob))) - { - hb_blob_destroy (ot_font->hmtx_blob); - free (ot_font); - return NULL; - } - ot_font->hmtx = OT::Sanitizer::lock_instance (ot_font->hmtx_blob); - - ot_font->cmap_blob = OT::Sanitizer::sanitize (font->face->reference_table (HB_OT_TAG_cmap)); - const OT::cmap *cmap = OT::Sanitizer::lock_instance (ot_font->cmap_blob); - const OT::CmapSubtable *subtable = NULL; - const OT::CmapSubtable *subtable_uvs = NULL; - - /* 32-bit subtables. */ - if (!subtable) subtable = cmap->find_subtable (0, 6); - if (!subtable) subtable = cmap->find_subtable (0, 4); - if (!subtable) subtable = cmap->find_subtable (3, 10); - /* 16-bit subtables. */ - if (!subtable) subtable = cmap->find_subtable (0, 3); - if (!subtable) subtable = cmap->find_subtable (3, 1); - /* Meh. */ - if (!subtable) subtable = &OT::Null(OT::CmapSubtable); - - /* UVS subtable. */ - if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5); - /* Meh. */ - if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable); - - ot_font->cmap = subtable; - ot_font->cmap_uvs = subtable_uvs; + ot_font->cmap.init (face); + ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1); + ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */ return ot_font; } @@ -104,8 +181,9 @@ _hb_ot_font_create (hb_font_t *font) static void _hb_ot_font_destroy (hb_ot_font_t *ot_font) { - hb_blob_destroy (ot_font->cmap_blob); - hb_blob_destroy (ot_font->hmtx_blob); + ot_font->cmap.fini (); + ot_font->h_metrics.fini (); + ot_font->v_metrics.fini (); free (ot_font); } @@ -121,20 +199,7 @@ hb_ot_get_glyph (hb_font_t *font HB_UNUSED, { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - - if (unlikely (variation_selector)) - { - switch (ot_font->cmap_uvs->get_glyph_variant (unicode, - variation_selector, - glyph)) - { - case OT::GLYPH_VARIANT_NOT_FOUND: return false; - case OT::GLYPH_VARIANT_FOUND: return true; - case OT::GLYPH_VARIANT_USE_DEFAULT: break; - } - } - - return ot_font->cmap->get_glyph (unicode, glyph); + return ot_font->cmap.get_glyph (unicode, variation_selector, glyph); } static hb_position_t @@ -144,14 +209,7 @@ hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - - if (unlikely (glyph >= ot_font->num_glyphs)) - return 0; /* Maybe better to return notdef's advance instead? */ - - if (glyph >= ot_font->num_hmetrics) - glyph = ot_font->num_hmetrics - 1; - - return font->em_scale_x (ot_font->hmtx->longHorMetric[glyph].advanceWidth); + return font->em_scale_x (ot_font->h_metrics.get_advance (glyph)); } static hb_position_t @@ -160,8 +218,8 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { - /* TODO */ - return 0; + const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; + return font->em_scale_y (-ot_font->v_metrics.get_advance (glyph)); } static hb_bool_t @@ -206,6 +264,7 @@ hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED, hb_codepoint_t bottom_glyph HB_UNUSED, void *user_data HB_UNUSED) { + /* OpenType doesn't have vertical-kerning other than GPOS. */ return 0; } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh index d433200165..edc0e29cbf 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh @@ -35,14 +35,19 @@ namespace OT { /* * hhea -- The Horizontal Header Table + * vhea -- The Vertical Header Table */ #define HB_OT_TAG_hhea HB_TAG('h','h','e','a') +#define HB_OT_TAG_vhea HB_TAG('v','h','e','a') -struct hhea +struct _hea { - static const hb_tag_t tableTag = HB_OT_TAG_hhea; + static const hb_tag_t tableTag = HB_TAG('_','h','e','a'); + + static const hb_tag_t hheaTag = HB_OT_TAG_hhea; + static const hb_tag_t vheaTag = HB_OT_TAG_vhea; inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (this); @@ -51,45 +56,45 @@ struct hhea public: FixedVersion version; /* 0x00010000u for version 1.0. */ - FWORD ascender; /* Typographic ascent. - * (Distance from baseline of highest - * ascender) */ - FWORD descender; /* Typographic descent. - * (Distance from baseline of lowest - * descender) */ - FWORD lineGap; /* Typographic line gap. Negative - * LineGap values are treated as zero - * in Windows 3.1, System 6, and - * System 7. */ - UFWORD advanceWidthMax; /* Maximum advance width value in - * 'hmtx' table. */ - FWORD minLeftSideBearing; /* Minimum left sidebearing value in - * 'hmtx' table. */ - FWORD minRightSideBearing; /* Minimum right sidebearing value; + FWORD ascender; /* Typographic ascent. */ + FWORD descender; /* Typographic descent. */ + FWORD lineGap; /* Typographic line gap. */ + UFWORD advanceMax; /* Maximum advance width/height value in + * metrics table. */ + FWORD minLeadingBearing; /* Minimum left/top sidebearing value in + * metrics table. */ + FWORD minTrailingBearing; /* Minimum right/bottom sidebearing value; * calculated as Min(aw - lsb - - * (xMax - xMin)). */ - FWORD xMaxExtent; /* Max(lsb + (xMax - xMin)). */ + * (xMax - xMin)) for horizontal. */ + FWORD maxExtent; /* horizontal: Max(lsb + (xMax - xMin)), + * vertical: minLeadingBearing+(yMax-yMin). */ SHORT caretSlopeRise; /* Used to calculate the slope of the - * cursor (rise/run); 1 for vertical. */ - SHORT caretSlopeRun; /* 0 for vertical. */ + * cursor (rise/run); 1 for vertical caret, + * 0 for horizontal.*/ + SHORT caretSlopeRun; /* 0 for vertical caret, 1 for horizontal. */ SHORT caretOffset; /* The amount by which a slanted * highlight on a glyph needs * to be shifted to produce the * best appearance. Set to 0 for - * non--slanted fonts */ - SHORT reserved1; /* set to 0 */ - SHORT reserved2; /* set to 0 */ - SHORT reserved3; /* set to 0 */ - SHORT reserved4; /* set to 0 */ + * non-slanted fonts. */ + SHORT reserved1; /* Set to 0. */ + SHORT reserved2; /* Set to 0. */ + SHORT reserved3; /* Set to 0. */ + SHORT reserved4; /* Set to 0. */ SHORT metricDataFormat; /* 0 for current format. */ - USHORT numberOfHMetrics; /* Number of hMetric entries in 'hmtx' - * table */ + USHORT numberOfLongMetrics; /* Number of LongMetric entries in metric + * table. */ public: DEFINE_SIZE_STATIC (36); }; +struct hhea : _hea { + static const hb_tag_t tableTag = HB_OT_TAG_hhea; +}; +struct vhea : _hea { + static const hb_tag_t tableTag = HB_OT_TAG_vhea; +}; + } /* namespace OT */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh index e918e3b3f4..317854ce7f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh @@ -35,22 +35,27 @@ namespace OT { /* * hmtx -- The Horizontal Metrics Table + * vmtx -- The Vertical Metrics Table */ #define HB_OT_TAG_hmtx HB_TAG('h','m','t','x') +#define HB_OT_TAG_vmtx HB_TAG('v','m','t','x') -struct LongHorMetric +struct LongMetric { - USHORT advanceWidth; - SHORT lsb; + USHORT advance; /* Advance width/height. */ + SHORT lsb; /* Leading (left/top) side bearing. */ public: DEFINE_SIZE_STATIC (4); }; -struct hmtx +struct _mtx { - static const hb_tag_t tableTag = HB_OT_TAG_hmtx; + static const hb_tag_t tableTag = HB_TAG('_','m','t','x'); + + static const hb_tag_t hmtxTag = HB_OT_TAG_hmtx; + static const hb_tag_t vmtxTag = HB_OT_TAG_vmtx; inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (this); @@ -60,7 +65,7 @@ struct hmtx } public: - LongHorMetric longHorMetric[VAR]; /* Paired advance width and left side + LongMetric longMetric[VAR]; /* Paired advance width and leading * bearing values for each glyph. The * value numOfHMetrics comes from * the 'hhea' table. If the font is @@ -68,23 +73,29 @@ struct hmtx * be in the array, but that entry is * required. The last entry applies to * all subsequent glyphs. */ - SHORT leftSideBearingX[VAR]; /* Here the advanceWidth is assumed - * to be the same as the advanceWidth + SHORT leadingBearingX[VAR]; /* Here the advance is assumed + * to be the same as the advance * for the last entry above. The * number of entries in this array is * derived from numGlyphs (from 'maxp' - * table) minus numberOfHMetrics. This - * generally is used with a run of - * monospaced glyphs (e.g., Kanji + * table) minus numberOfLongMetrics. + * This generally is used with a run + * of monospaced glyphs (e.g., Kanji * fonts or Courier fonts). Only one * run is allowed and it must be at * the end. This allows a monospaced - * font to vary the left side bearing + * font to vary the side bearing * values for each glyph. */ public: - DEFINE_SIZE_ARRAY2 (0, longHorMetric, leftSideBearingX); + DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX); }; +struct hmtx : _mtx { + static const hb_tag_t tableTag = HB_OT_TAG_hmtx; +}; +struct vmtx : _mtx { + static const hb_tag_t tableTag = HB_OT_TAG_vmtx; +}; } /* namespace OT */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh index d8e3e6e11d..f7fef5273a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh @@ -345,8 +345,8 @@ struct AnchorMatrix inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned int cols, bool *found) const { *found = false; if (unlikely (row >= rows || col >= cols)) return Null(Anchor); - *found = !matrix[row * cols + col].is_null (); - return this+matrix[row * cols + col]; + *found = !matrixZ[row * cols + col].is_null (); + return this+matrixZ[row * cols + col]; } inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) { @@ -354,19 +354,19 @@ struct AnchorMatrix if (!c->check_struct (this)) return TRACE_RETURN (false); if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_RETURN (false); unsigned int count = rows * cols; - if (!c->check_array (matrix, matrix[0].static_size, count)) return TRACE_RETURN (false); + if (!c->check_array (matrixZ, matrixZ[0].static_size, count)) return TRACE_RETURN (false); for (unsigned int i = 0; i < count; i++) - if (!matrix[i].sanitize (c, this)) return TRACE_RETURN (false); + if (!matrixZ[i].sanitize (c, this)) return TRACE_RETURN (false); return TRACE_RETURN (true); } USHORT rows; /* Number of rows */ protected: OffsetTo - matrix[VAR]; /* Matrix of offsets to Anchor tables-- + matrixZ[VAR]; /* Matrix of offsets to Anchor tables-- * from beginning of AnchorMatrix table */ public: - DEFINE_SIZE_ARRAY (2, matrix); + DEFINE_SIZE_ARRAY (2, matrixZ); }; @@ -530,7 +530,7 @@ struct SinglePos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); case 2: return TRACE_RETURN (c->dispatch (u.format2)); @@ -583,7 +583,7 @@ struct PairSet unsigned int len2 = valueFormats[1].get_len (); unsigned int record_size = USHORT::static_size * (1 + len1 + len2); - const PairValueRecord *record = CastP (array); + const PairValueRecord *record = CastP (arrayZ); unsigned int count = len; for (unsigned int i = 0; i < count; i++) { @@ -602,12 +602,24 @@ struct PairSet unsigned int len2 = valueFormats[1].get_len (); unsigned int record_size = USHORT::static_size * (1 + len1 + len2); - const PairValueRecord *record = CastP (array); + const PairValueRecord *record_array = CastP (arrayZ); unsigned int count = len; - for (unsigned int i = 0; i < count; i++) + + /* Hand-coded bsearch. */ + if (unlikely (!count)) + return TRACE_RETURN (false); + hb_codepoint_t x = buffer->info[pos].codepoint; + int min = 0, max = (int) count - 1; + while (min <= max) { - /* TODO bsearch */ - if (buffer->info[pos].codepoint == record->secondGlyph) + int mid = (min + max) / 2; + const PairValueRecord *record = &StructAtOffset (record_array, record_size * mid); + hb_codepoint_t mid_x = record->secondGlyph; + if (x < mid_x) + max = mid - 1; + else if (x > mid_x) + min = mid + 1; + else { valueFormats[0].apply_value (c->font, c->direction, this, &record->values[0], buffer->cur_pos()); @@ -618,7 +630,6 @@ struct PairSet buffer->idx = pos; return TRACE_RETURN (true); } - record = &StructAtOffset (record, record_size); } return TRACE_RETURN (false); @@ -634,20 +645,20 @@ struct PairSet inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) { TRACE_SANITIZE (this); if (!(c->check_struct (this) - && c->check_array (array, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false); + && c->check_array (arrayZ, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false); unsigned int count = len; - PairValueRecord *record = CastP (array); + PairValueRecord *record = CastP (arrayZ); return TRACE_RETURN (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) && closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride)); } protected: USHORT len; /* Number of PairValueRecords */ - USHORT array[VAR]; /* Array of PairValueRecords--ordered + USHORT arrayZ[VAR]; /* Array of PairValueRecords--ordered * by GlyphID of the second glyph */ public: - DEFINE_SIZE_ARRAY (2, array); + DEFINE_SIZE_ARRAY (2, arrayZ); }; struct PairPosFormat1 @@ -822,7 +833,7 @@ struct PairPos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); case 2: return TRACE_RETURN (c->dispatch (u.format2)); @@ -989,7 +1000,7 @@ struct CursivePos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1088,7 +1099,7 @@ struct MarkBasePos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1209,7 +1220,7 @@ struct MarkLigPos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1328,7 +1339,7 @@ struct MarkMarkPos template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1387,7 +1398,7 @@ struct PosLookupSubTable template inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { case Single: return TRACE_RETURN (u.single.dispatch (c)); case Pair: return TRACE_RETURN (u.pair.dispatch (c)); @@ -1488,8 +1499,8 @@ struct PosLookup : Lookup template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); unsigned int lookup_type = get_type (); + TRACE_DISPATCH (this, lookup_type); unsigned int count = get_subtable_count (); for (unsigned int i = 0; i < count; i++) { typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type); @@ -1589,6 +1600,8 @@ GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) void GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { + _hb_buffer_assert_gsubgpos_vars (buffer); + unsigned int len; hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len); hb_direction_t direction = buffer->props.direction; @@ -1600,8 +1613,6 @@ GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) /* Handle attachments */ for (unsigned int i = 0; i < len; i++) fix_mark_attachment (pos, i, direction); - - _hb_buffer_deallocate_gsubgpos_vars (buffer); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh index e1939735de..5d67be0ec0 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh @@ -200,7 +200,7 @@ struct SingleSubst TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false); unsigned int format = 2; - int delta; + int delta = 0; if (num_glyphs) { format = 1; /* TODO(serialize) check for wrap-around */ @@ -222,7 +222,7 @@ struct SingleSubst template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); case 2: return TRACE_RETURN (c->dispatch (u.format2)); @@ -422,7 +422,7 @@ struct MultipleSubst template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -573,7 +573,7 @@ struct AlternateSubst template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -889,7 +889,7 @@ struct LigatureSubst template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1053,7 +1053,7 @@ struct ReverseChainSingleSubst template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); default:return TRACE_RETURN (c->default_return_value ()); @@ -1100,7 +1100,7 @@ struct SubstLookupSubTable template inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { case Single: return TRACE_RETURN (u.single.dispatch (c)); case Multiple: return TRACE_RETURN (u.multiple.dispatch (c)); @@ -1275,8 +1275,8 @@ struct SubstLookup : Lookup template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); unsigned int lookup_type = get_type (); + TRACE_DISPATCH (this, lookup_type); unsigned int count = get_subtable_count (); for (unsigned int i = 0; i < count; i++) { typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type); @@ -1338,7 +1338,7 @@ struct GSUB : GSUBGPOS void GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer) { - _hb_buffer_allocate_gsubgpos_vars (buffer); + _hb_buffer_assert_gsubgpos_vars (buffer); const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef; unsigned int count = buffer->len; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh index 546ff4b0fd..57fc1e05f7 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh @@ -38,10 +38,10 @@ namespace OT { -#define TRACE_DISPATCH(this) \ +#define TRACE_DISPATCH(this, format) \ hb_auto_trace_t trace \ (&c->debug_depth, c->get_name (), this, HB_FUNC, \ - ""); + "format %d", (int) format); #ifndef HB_DEBUG_CLOSURE #define HB_DEBUG_CLOSURE (HB_DEBUG+0) @@ -168,6 +168,10 @@ struct hb_collect_glyphs_context_t if (output == hb_set_get_empty ()) return HB_VOID; + /* Return if new lookup was recursed to before. */ + if (recursed_lookups.has (lookup_index)) + return HB_VOID; + hb_set_t *old_before = before; hb_set_t *old_input = input; hb_set_t *old_after = after; @@ -181,6 +185,8 @@ struct hb_collect_glyphs_context_t input = old_input; after = old_after; + recursed_lookups.add (lookup_index); + return HB_VOID; } @@ -190,6 +196,7 @@ struct hb_collect_glyphs_context_t hb_set_t *after; hb_set_t *output; recurse_func_t recurse_func; + hb_set_t recursed_lookups; unsigned int nesting_level_left; unsigned int debug_depth; @@ -205,18 +212,30 @@ struct hb_collect_glyphs_context_t after (glyphs_after ? glyphs_after : hb_set_get_empty ()), output (glyphs_output ? glyphs_output : hb_set_get_empty ()), recurse_func (NULL), + recursed_lookups (), nesting_level_left (nesting_level_left_), - debug_depth (0) {} + debug_depth (0) + { + recursed_lookups.init (); + } + ~hb_collect_glyphs_context_t (void) + { + recursed_lookups.fini (); + } void set_recurse_func (recurse_func_t func) { recurse_func = func; } }; +#ifndef HB_DEBUG_GET_COVERAGE +#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0) +#endif + struct hb_get_coverage_context_t { inline const char *get_name (void) { return "GET_COVERAGE"; } - static const unsigned int max_debug_depth = 0; + static const unsigned int max_debug_depth = HB_DEBUG_GET_COVERAGE; typedef const Coverage &return_t; template inline return_t dispatch (const T &obj) { return obj.get_coverage (); } @@ -1117,9 +1136,9 @@ struct Rule inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { TRACE_CLOSURE (this); - const LookupRecord *lookupRecord = &StructAtOffset (input, input[0].static_size * (inputCount ? inputCount - 1 : 0)); + const LookupRecord *lookupRecord = &StructAtOffset (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); context_closure_lookup (c, - inputCount, input, + inputCount, inputZ, lookupCount, lookupRecord, lookup_context); } @@ -1127,9 +1146,9 @@ struct Rule inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const { TRACE_COLLECT_GLYPHS (this); - const LookupRecord *lookupRecord = &StructAtOffset (input, input[0].static_size * (inputCount ? inputCount - 1 : 0)); + const LookupRecord *lookupRecord = &StructAtOffset (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); context_collect_glyphs_lookup (c, - inputCount, input, + inputCount, inputZ, lookupCount, lookupRecord, lookup_context); } @@ -1137,15 +1156,15 @@ struct Rule inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_WOULD_APPLY (this); - const LookupRecord *lookupRecord = &StructAtOffset (input, input[0].static_size * (inputCount ? inputCount - 1 : 0)); - return TRACE_RETURN (context_would_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context)); + const LookupRecord *lookupRecord = &StructAtOffset (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + return TRACE_RETURN (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context)); } inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const LookupRecord *lookupRecord = &StructAtOffset (input, input[0].static_size * (inputCount ? inputCount - 1 : 0)); - return TRACE_RETURN (context_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context)); + const LookupRecord *lookupRecord = &StructAtOffset (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); + return TRACE_RETURN (context_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context)); } public: @@ -1153,8 +1172,8 @@ struct Rule TRACE_SANITIZE (this); return inputCount.sanitize (c) && lookupCount.sanitize (c) - && c->check_range (input, - input[0].static_size * inputCount + && c->check_range (inputZ, + inputZ[0].static_size * inputCount + lookupRecordX[0].static_size * lookupCount); } @@ -1163,12 +1182,12 @@ struct Rule * glyph sequence--includes the first * glyph */ USHORT lookupCount; /* Number of LookupRecords */ - USHORT input[VAR]; /* Array of match inputs--start with + USHORT inputZ[VAR]; /* Array of match inputs--start with * second glyph */ LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in * design order */ public: - DEFINE_SIZE_ARRAY2 (4, input, lookupRecordX); + DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX); }; struct RuleSet @@ -1413,16 +1432,16 @@ struct ContextFormat3 inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (this); - if (!(this+coverage[0]).intersects (c->glyphs)) + if (!(this+coverageZ[0]).intersects (c->glyphs)) return; - const LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAtOffset (coverageZ, coverageZ[0].static_size * glyphCount); struct ContextClosureLookupContext lookup_context = { {intersects_coverage}, this }; context_closure_lookup (c, - glyphCount, (const USHORT *) (coverage + 1), + glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context); } @@ -1430,16 +1449,16 @@ struct ContextFormat3 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - (this+coverage[0]).add_coverage (c->input); + (this+coverageZ[0]).add_coverage (c->input); - const LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAtOffset (coverageZ, coverageZ[0].static_size * glyphCount); struct ContextCollectGlyphsLookupContext lookup_context = { {collect_coverage}, this }; context_collect_glyphs_lookup (c, - glyphCount, (const USHORT *) (coverage + 1), + glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context); } @@ -1448,41 +1467,42 @@ struct ContextFormat3 { TRACE_WOULD_APPLY (this); - const LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAtOffset (coverageZ, coverageZ[0].static_size * glyphCount); struct ContextApplyLookupContext lookup_context = { {match_coverage}, this }; - return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context)); + return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); } inline const Coverage &get_coverage (void) const { - return this+coverage[0]; + return this+coverageZ[0]; } inline bool apply (hb_apply_context_t *c) const { TRACE_APPLY (this); - unsigned int index = (this+coverage[0]).get_coverage (c->buffer->cur().codepoint); + unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); - const LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * glyphCount); + const LookupRecord *lookupRecord = &StructAtOffset (coverageZ, coverageZ[0].static_size * glyphCount); struct ContextApplyLookupContext lookup_context = { {match_coverage}, this }; - return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context)); + return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); } inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (this); if (!c->check_struct (this)) return TRACE_RETURN (false); unsigned int count = glyphCount; - if (!c->check_array (coverage, coverage[0].static_size, count)) return TRACE_RETURN (false); + if (!count) return TRACE_RETURN (false); /* We want to access coverageZ[0] freely. */ + if (!c->check_array (coverageZ, coverageZ[0].static_size, count)) return TRACE_RETURN (false); for (unsigned int i = 0; i < count; i++) - if (!coverage[i].sanitize (c, this)) return TRACE_RETURN (false); - LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * count); + if (!coverageZ[i].sanitize (c, this)) return TRACE_RETURN (false); + LookupRecord *lookupRecord = &StructAtOffset (coverageZ, coverageZ[0].static_size * count); return TRACE_RETURN (c->check_array (lookupRecord, lookupRecord[0].static_size, lookupCount)); } @@ -1492,12 +1512,12 @@ struct ContextFormat3 * sequence */ USHORT lookupCount; /* Number of LookupRecords */ OffsetTo - coverage[VAR]; /* Array of offsets to Coverage + coverageZ[VAR]; /* Array of offsets to Coverage * table in glyph sequence order */ LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in * design order */ public: - DEFINE_SIZE_ARRAY2 (6, coverage, lookupRecordX); + DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX); }; struct Context @@ -1505,7 +1525,7 @@ struct Context template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); case 2: return TRACE_RETURN (c->dispatch (u.format2)); @@ -2090,6 +2110,7 @@ struct ChainContextFormat3 if (!backtrack.sanitize (c, this)) return TRACE_RETURN (false); OffsetArrayOf &input = StructAfter > (backtrack); if (!input.sanitize (c, this)) return TRACE_RETURN (false); + if (!input.len) return TRACE_RETURN (false); /* To be consistent with Context. */ OffsetArrayOf &lookahead = StructAfter > (input); if (!lookahead.sanitize (c, this)) return TRACE_RETURN (false); ArrayOf &lookup = StructAfter > (lookahead); @@ -2122,7 +2143,7 @@ struct ChainContext template inline typename context_t::return_t dispatch (context_t *c) const { - TRACE_DISPATCH (this); + TRACE_DISPATCH (this, u.format); switch (u.format) { case 1: return TRACE_RETURN (c->dispatch (u.format1)); case 2: return TRACE_RETURN (c->dispatch (u.format2)); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh index 9b06300800..3f7c858d1c 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh @@ -126,8 +126,7 @@ struct hb_ot_layout_lookup_accelerator_t lookup.add_coverage (&digest); } - template - inline void fini (const TLookup &lookup) + inline void fini (void) { } @@ -419,6 +418,13 @@ _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer) HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props1); } +static inline void +_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer) +{ + HB_BUFFER_ASSERT_VAR (buffer, unicode_props0); + HB_BUFFER_ASSERT_VAR (buffer, unicode_props1); +} + static inline void _hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer) { @@ -435,6 +441,14 @@ _hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer) HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props); } +static inline void +_hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer) +{ + HB_BUFFER_ASSERT_VAR (buffer, glyph_props); + HB_BUFFER_ASSERT_VAR (buffer, lig_props); + HB_BUFFER_ASSERT_VAR (buffer, syllable); +} + /* Make sure no one directly touches our props... */ #undef unicode_props0 #undef unicode_props1 diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc index 661d90ea0d..602b94ecd6 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc @@ -84,9 +84,9 @@ void _hb_ot_layout_destroy (hb_ot_layout_t *layout) { for (unsigned int i = 0; i < layout->gsub_lookup_count; i++) - layout->gsub_accels[i].fini (layout->gsub->get_lookup (i)); + layout->gsub_accels[i].fini (); for (unsigned int i = 0; i < layout->gpos_lookup_count; i++) - layout->gpos_accels[i].fini (layout->gpos->get_lookup (i)); + layout->gpos_accels[i].fini (); free (layout->gsub_accels); free (layout->gpos_accels); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh index 2d8488e151..a77f24ec84 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh @@ -33,6 +33,8 @@ #include "hb-ot-layout-gsub-table.hh" +/* Features ordered the same as the entries in shaping_table rows, + * followed by rlig. Don't change. */ static const hb_tag_t arabic_fallback_features[] = { HB_TAG('i','n','i','t'), @@ -42,16 +44,6 @@ static const hb_tag_t arabic_fallback_features[] = HB_TAG('r','l','i','g'), }; -/* Same order as the fallback feature array */ -enum { - FALLBACK_INIT, - FALLBACK_MEDI, - FALLBACK_FINA, - FALLBACK_ISOL, - FALLBACK_RLIG, - ARABIC_NUM_FALLBACK_FEATURES -}; - static OT::SubstLookup * arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font, @@ -80,6 +72,9 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS num_glyphs++; } + if (!num_glyphs) + return NULL; + /* Bubble-sort! * May not be good-enough for presidential candidate interviews, but good-enough for us... */ hb_bubble_sort (&glyphs[0], num_glyphs, OT::GlyphID::cmp, &substitutes[0]); @@ -157,6 +152,9 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN } } + if (!num_ligatures) + return NULL; + OT::Supplier first_glyphs_supplier (first_glyphs, num_first_glyphs); OT::Supplier ligature_per_first_glyph_count_supplier (ligature_per_first_glyph_count_list, num_first_glyphs); OT::Supplier ligatures_supplier (ligature_list, num_ligatures); @@ -193,17 +191,108 @@ arabic_fallback_synthesize_lookup (const hb_ot_shape_plan_t *plan, return arabic_fallback_synthesize_lookup_ligature (plan, font); } +#define ARABIC_FALLBACK_MAX_LOOKUPS 5 + struct arabic_fallback_plan_t { ASSERT_POD (); - hb_mask_t mask_array[ARABIC_NUM_FALLBACK_FEATURES]; - OT::SubstLookup *lookup_array[ARABIC_NUM_FALLBACK_FEATURES]; - hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_NUM_FALLBACK_FEATURES]; + unsigned int num_lookups; + bool free_lookups; + + hb_mask_t mask_array[ARABIC_FALLBACK_MAX_LOOKUPS]; + OT::SubstLookup *lookup_array[ARABIC_FALLBACK_MAX_LOOKUPS]; + hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS]; }; static const arabic_fallback_plan_t arabic_fallback_plan_nil = {}; +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_NO_WIN1256) +#define HB_WITH_WIN1256 +#endif + +#ifdef HB_WITH_WIN1256 +#include "hb-ot-shape-complex-arabic-win1256.hh" +#endif + +struct ManifestLookup { + OT::Tag tag; + OT::OffsetTo lookupOffset; +}; +typedef OT::ArrayOf Manifest; + +static bool +arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan, + const hb_ot_shape_plan_t *plan, + hb_font_t *font) +{ +#ifdef HB_WITH_WIN1256 + /* Does this font look like it's Windows-1256-encoded? */ + hb_codepoint_t g; + if (!(hb_font_get_glyph (font, 0x0627u, 0, &g) && g == 199 /* ALEF */ && + hb_font_get_glyph (font, 0x0644u, 0, &g) && g == 225 /* LAM */ && + hb_font_get_glyph (font, 0x0649u, 0, &g) && g == 236 /* ALEF MAKSURA */ && + hb_font_get_glyph (font, 0x064Au, 0, &g) && g == 237 /* YEH */ && + hb_font_get_glyph (font, 0x0652u, 0, &g) && g == 250 /* SUKUN */)) + return false; + + const Manifest &manifest = reinterpret_cast (arabic_win1256_gsub_lookups.manifest); + ASSERT_STATIC (sizeof (arabic_win1256_gsub_lookups.manifestData) / sizeof (ManifestLookup) + <= ARABIC_FALLBACK_MAX_LOOKUPS); + /* TODO sanitize the table? */ + + unsigned j = 0; + unsigned int count = manifest.len; + for (unsigned int i = 0; i < count; i++) + { + fallback_plan->mask_array[j] = plan->map.get_1_mask (manifest[i].tag); + if (fallback_plan->mask_array[j]) + { + fallback_plan->lookup_array[j] = const_cast (&(&manifest+manifest[i].lookupOffset)); + if (fallback_plan->lookup_array[j]) + { + fallback_plan->accel_array[j].init (*fallback_plan->lookup_array[j]); + j++; + } + } + } + + fallback_plan->num_lookups = j; + fallback_plan->free_lookups = false; + + return j > 0; +#else + return false; +#endif +} + +static bool +arabic_fallback_plan_init_unicode (arabic_fallback_plan_t *fallback_plan, + const hb_ot_shape_plan_t *plan, + hb_font_t *font) +{ + ASSERT_STATIC (ARRAY_LENGTH_CONST(arabic_fallback_features) <= ARABIC_FALLBACK_MAX_LOOKUPS); + unsigned int j = 0; + for (unsigned int i = 0; i < ARRAY_LENGTH(arabic_fallback_features) ; i++) + { + fallback_plan->mask_array[j] = plan->map.get_1_mask (arabic_fallback_features[i]); + if (fallback_plan->mask_array[j]) + { + fallback_plan->lookup_array[j] = arabic_fallback_synthesize_lookup (plan, font, i); + if (fallback_plan->lookup_array[j]) + { + fallback_plan->accel_array[j].init (*fallback_plan->lookup_array[j]); + j++; + } + } + } + + fallback_plan->num_lookups = j; + fallback_plan->free_lookups = true; + + return j > 0; +} + static arabic_fallback_plan_t * arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan, hb_font_t *font) @@ -212,17 +301,21 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan, if (unlikely (!fallback_plan)) return const_cast (&arabic_fallback_plan_nil); - for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++) - { - fallback_plan->mask_array[i] = plan->map.get_1_mask (arabic_fallback_features[i]); - if (fallback_plan->mask_array[i]) { - fallback_plan->lookup_array[i] = arabic_fallback_synthesize_lookup (plan, font, i); - if (fallback_plan->lookup_array[i]) - fallback_plan->accel_array[i].init (*fallback_plan->lookup_array[i]); - } - } + fallback_plan->num_lookups = 0; + fallback_plan->free_lookups = false; + + /* Try synthesizing GSUB table using Unicode Arabic Presentation Forms, + * in case the font has cmap entries for the presentation-forms characters. */ + if (arabic_fallback_plan_init_unicode (fallback_plan, plan, font)) + return fallback_plan; - return fallback_plan; + /* See if this looks like a Windows-1256-encoded font. If it does, use a + * hand-coded GSUB table. */ + if (arabic_fallback_plan_init_win1256 (fallback_plan, plan, font)) + return fallback_plan; + + free (fallback_plan); + return const_cast (&arabic_fallback_plan_nil); } static void @@ -231,11 +324,12 @@ arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan) if (!fallback_plan || fallback_plan == &arabic_fallback_plan_nil) return; - for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++) + for (unsigned int i = 0; i < fallback_plan->num_lookups; i++) if (fallback_plan->lookup_array[i]) { - fallback_plan->accel_array[i].fini (fallback_plan->lookup_array[i]); - free (fallback_plan->lookup_array[i]); + fallback_plan->accel_array[i].fini (); + if (fallback_plan->free_lookups) + free (fallback_plan->lookup_array[i]); } free (fallback_plan); @@ -247,7 +341,7 @@ arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan, hb_buffer_t *buffer) { OT::hb_apply_context_t c (0, font, buffer); - for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++) + for (unsigned int i = 0; i < fallback_plan->num_lookups; i++) if (fallback_plan->lookup_array[i]) { c.set_lookup_mask (fallback_plan->mask_array[i]); hb_ot_layout_substitute_lookup (&c, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh index d41d6ce598..17100497ec 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh @@ -70,7 +70,7 @@ static const uint8_t joining_table[] = /* Mandaic */ - /* 0840 */ R,D,D,D,D,D,R,D,D,R,D,D,D,D,D,R,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X, + /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X, /* 0860 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc index 9870ba3da0..ae90864127 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc @@ -223,8 +223,8 @@ data_create_arabic (const hb_ot_shape_plan_t *plan) for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) { arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]); arabic_plan->do_fallback = arabic_plan->do_fallback && - !FEATURE_IS_SYRIAC (arabic_features[i]) && - plan->map.needs_fallback (arabic_features[i]); + (FEATURE_IS_SYRIAC (arabic_features[i]) || + plan->map.needs_fallback (arabic_features[i])); } return arabic_plan; @@ -248,18 +248,17 @@ arabic_joining (hb_buffer_t *buffer) unsigned int prev = (unsigned int) -1, state = 0; /* Check pre-context */ - if (!(buffer->flags & HB_BUFFER_FLAG_BOT)) - for (unsigned int i = 0; i < buffer->context_len[0]; i++) - { - unsigned int this_type = get_joining_type (buffer->context[0][i], buffer->unicode->general_category (buffer->context[0][i])); + for (unsigned int i = 0; i < buffer->context_len[0]; i++) + { + unsigned int this_type = get_joining_type (buffer->context[0][i], buffer->unicode->general_category (buffer->context[0][i])); - if (unlikely (this_type == JOINING_TYPE_T)) - continue; + if (unlikely (this_type == JOINING_TYPE_T)) + continue; - const arabic_state_table_entry *entry = &arabic_state_table[state][this_type]; - state = entry->next_state; - break; - } + const arabic_state_table_entry *entry = &arabic_state_table[state][this_type]; + state = entry->next_state; + break; + } for (unsigned int i = 0; i < count; i++) { @@ -281,19 +280,18 @@ arabic_joining (hb_buffer_t *buffer) state = entry->next_state; } - if (!(buffer->flags & HB_BUFFER_FLAG_EOT)) - for (unsigned int i = 0; i < buffer->context_len[1]; i++) - { - unsigned int this_type = get_joining_type (buffer->context[1][i], buffer->unicode->general_category (buffer->context[1][i])); + for (unsigned int i = 0; i < buffer->context_len[1]; i++) + { + unsigned int this_type = get_joining_type (buffer->context[1][i], buffer->unicode->general_category (buffer->context[1][i])); - if (unlikely (this_type == JOINING_TYPE_T)) - continue; + if (unlikely (this_type == JOINING_TYPE_T)) + continue; - const arabic_state_table_entry *entry = &arabic_state_table[state][this_type]; - if (entry->prev_action != NONE && prev != (unsigned int) -1) - info[prev].arabic_shaping_action() = entry->prev_action; - break; - } + const arabic_state_table_entry *entry = &arabic_state_table[state][this_type]; + if (entry->prev_action != NONE && prev != (unsigned int) -1) + info[prev].arabic_shaping_action() = entry->prev_action; + break; + } } static void diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc index 54c12ebca2..6ac18b08bf 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc @@ -59,6 +59,15 @@ collect_features_hangul (hb_ot_shape_planner_t *plan) map->add_feature (hangul_features[i], 1, F_NONE); } +static void +override_features_hangul (hb_ot_shape_planner_t *plan) +{ + /* Uniscribe does not apply 'calt' for Hangul, and certain fonts + * (Noto Sans CJK, Source Sans Han, etc) apply all of jamo lookups + * in calt, which is not desirable. */ + plan->map.add_feature (HB_TAG('c','a','l','t'), 0, F_GLOBAL); +} + struct hangul_shape_plan_t { ASSERT_POD (); @@ -404,7 +413,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul = { "hangul", collect_features_hangul, - NULL, /* override_features */ + override_features_hangul, data_create_hangul, /* data_create */ data_destroy_hangul, /* data_destroy */ preprocess_text_hangul, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc index 2381a6e732..c7b7a5eba6 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc @@ -167,6 +167,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew = NULL, /* decompose */ compose_hebrew, NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh index 522ccc67fe..f652d4fda7 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh @@ -34,1279 +34,1302 @@ #line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, - 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, - 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, - 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, - 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, - 5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, - 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, + 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, + 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, + 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, + 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, + 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, - 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, - 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, - 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, - 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, - 7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, - 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 5u, 7u, 5u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, - 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 1u, 16u, 13u, 13u, 4u, 4u, 6u, 6u, - 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, - 6u, 6u, 16u, 16u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, + 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, + 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, + 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, + 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, + 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, + 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, + 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, + 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u, + 5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, + 5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, + 16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, + 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, + 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, + 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, + 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, - 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, 5u, 10u, + 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, - 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, + 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, + 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, + 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, + 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, - 5u, 10u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 8u, 14u, - 3u, 13u, 3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 8u, 10u, + 1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u, + 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u, + 4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, + 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0 }; static const char _indic_syllable_machine_key_spans[] = { - 16, 1, 3, 3, 1, 3, 3, 1, - 3, 3, 1, 3, 3, 1, 1, 1, - 1, 4, 1, 1, 4, 1, 1, 4, - 1, 1, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 16, 1, 3, 3, - 1, 3, 3, 1, 3, 3, 1, 3, - 3, 1, 1, 1, 1, 4, 1, 1, - 4, 1, 1, 4, 1, 1, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 16, 1, 3, 3, 1, 3, 3, 1, - 3, 3, 1, 3, 3, 1, 1, 1, - 1, 4, 1, 1, 4, 1, 1, 4, - 1, 1, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 16, 1, 3, 3, 1, - 3, 3, 1, 3, 3, 1, 3, 3, - 1, 1, 1, 1, 4, 1, 1, 4, - 1, 1, 4, 1, 1, 11, 11, 11, + 1, 16, 6, 4, 3, 1, 4, 3, + 1, 4, 3, 1, 4, 3, 1, 5, + 1, 1, 5, 1, 1, 5, 1, 1, + 5, 1, 1, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 1, 16, 6, + 4, 3, 1, 4, 3, 1, 4, 3, + 1, 4, 3, 1, 5, 1, 1, 5, + 1, 1, 5, 1, 1, 5, 1, 1, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 3, 3, 3, 3, 1, 3, 3, - 1, 3, 3, 1, 16, 1, 1, 1, - 1, 4, 1, 1, 4, 1, 1, 4, + 11, 11, 1, 16, 6, 4, 3, 1, + 4, 3, 1, 4, 3, 1, 4, 3, + 1, 5, 1, 1, 5, 1, 1, 5, + 1, 1, 5, 1, 1, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 1, 16, + 6, 4, 3, 1, 4, 3, 1, 4, + 3, 1, 4, 3, 1, 5, 1, 1, + 5, 1, 1, 5, 1, 1, 5, 1, + 1, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 4, 11, 11, 4, + 3, 4, 3, 1, 4, 3, 1, 4, + 3, 1, 1, 16, 6, 5, 1, 1, + 5, 1, 1, 5, 1, 1, 5, 1, 1, 1, 31, 29, 29, 28, 16, 29, 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 7, + 29, 28, 16, 29, 29, 28, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, - 8, 3, 8, 11, 12, 12, 11, 10, + 8, 6, 8, 11, 12, 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, - 9, 12, 16, 28, 11, 29, 29, 16, + 10, 12, 16, 28, 11, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 29, 29, 28, 16, 29, 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 7, + 29, 28, 16, 29, 29, 28, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, - 8, 3, 8, 11, 12, 12, 11, 10, + 8, 6, 8, 11, 12, 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, - 9, 12, 16, 28, 11, 29, 29, 16, + 10, 12, 16, 28, 11, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 11, 16, 29, 29, 28, 16, 29, 29, 28, 16, 29, 29, 28, 16, 29, 29, - 28, 16, 29, 29, 28, 10, 7, 6, + 28, 16, 29, 29, 28, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, 8, - 3, 8, 11, 12, 12, 11, 10, 12, - 11, 10, 12, 11, 10, 12, 11, 9, + 6, 8, 11, 12, 12, 11, 10, 12, + 11, 10, 12, 11, 10, 12, 11, 10, 12, 16, 28, 11, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 11, 29, 11, 29, 29, 28, 16, 29, 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 7, + 29, 28, 16, 29, 29, 28, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, - 8, 3, 8, 11, 12, 12, 11, 10, + 8, 6, 8, 11, 12, 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, - 9, 12, 16, 28, 11, 29, 29, 16, + 10, 12, 16, 28, 11, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, 16, 29, 29, 16, 16, 16, 16, - 16, 29, 31, 29, 31, 11, 16, 29, - 29, 28, 6, 2, 1, 2, 2, 1, - 6, 29, 29, 16, 12, 11, 10, 12, - 11, 10, 12, 11, 10, 12, 11, 7, - 11, 8, 3, 8, 11, 16, 8, 3, + 16, 29, 31, 29, 31, 11, 6, 2, + 1, 2, 2, 1, 6, 16, 29, 29, + 28, 29, 29, 16, 12, 11, 10, 12, + 11, 10, 12, 11, 10, 12, 11, 10, + 11, 8, 6, 8, 11, 16, 8, 6, 6, 2, 1, 2, 2, 1, 6 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 17, 19, 23, 27, 29, 33, 37, - 39, 43, 47, 49, 53, 57, 59, 61, - 63, 65, 70, 72, 74, 79, 81, 83, - 88, 90, 92, 104, 116, 128, 140, 152, - 164, 176, 188, 200, 212, 229, 231, 235, - 239, 241, 245, 249, 251, 255, 259, 261, - 265, 269, 271, 273, 275, 277, 282, 284, - 286, 291, 293, 295, 300, 302, 304, 316, - 328, 340, 352, 364, 376, 388, 400, 412, - 424, 441, 443, 447, 451, 453, 457, 461, - 463, 467, 471, 473, 477, 481, 483, 485, - 487, 489, 494, 496, 498, 503, 505, 507, - 512, 514, 516, 528, 540, 552, 564, 576, - 588, 600, 612, 624, 641, 643, 647, 651, - 653, 657, 661, 663, 667, 671, 673, 677, - 681, 683, 685, 687, 689, 694, 696, 698, - 703, 705, 707, 712, 714, 716, 728, 740, - 752, 764, 776, 788, 800, 812, 824, 836, - 848, 860, 864, 868, 872, 876, 878, 882, - 886, 888, 892, 896, 898, 915, 917, 919, - 921, 923, 928, 930, 932, 937, 939, 941, - 946, 948, 950, 982, 1012, 1042, 1071, 1088, - 1118, 1148, 1177, 1194, 1224, 1254, 1283, 1300, - 1330, 1360, 1389, 1406, 1436, 1466, 1495, 1506, - 1514, 1521, 1524, 1526, 1529, 1532, 1534, 1541, - 1553, 1562, 1566, 1575, 1587, 1600, 1613, 1625, - 1636, 1649, 1661, 1672, 1685, 1697, 1708, 1721, - 1733, 1743, 1756, 1773, 1802, 1814, 1844, 1874, - 1891, 1908, 1925, 1942, 1959, 1989, 2019, 2036, - 2053, 2070, 2087, 2104, 2134, 2164, 2181, 2198, - 2215, 2232, 2249, 2279, 2309, 2326, 2343, 2360, - 2377, 2394, 2424, 2454, 2484, 2514, 2543, 2560, - 2590, 2620, 2649, 2666, 2696, 2726, 2755, 2772, - 2802, 2832, 2861, 2878, 2908, 2938, 2967, 2978, - 2986, 2993, 2996, 2998, 3001, 3004, 3006, 3013, - 3025, 3034, 3038, 3047, 3059, 3072, 3085, 3097, - 3108, 3121, 3133, 3144, 3157, 3169, 3180, 3193, - 3205, 3215, 3228, 3245, 3274, 3286, 3316, 3346, - 3363, 3380, 3397, 3414, 3431, 3461, 3491, 3508, - 3525, 3542, 3559, 3576, 3606, 3636, 3653, 3670, - 3687, 3704, 3721, 3751, 3781, 3798, 3815, 3832, - 3849, 3861, 3878, 3908, 3938, 3967, 3984, 4014, - 4044, 4073, 4090, 4120, 4150, 4179, 4196, 4226, - 4256, 4285, 4302, 4332, 4362, 4391, 4402, 4410, - 4417, 4420, 4422, 4425, 4428, 4430, 4437, 4449, - 4458, 4462, 4471, 4483, 4496, 4509, 4521, 4532, - 4545, 4557, 4568, 4581, 4593, 4604, 4617, 4629, - 4639, 4652, 4669, 4698, 4710, 4740, 4770, 4787, - 4804, 4821, 4838, 4855, 4885, 4915, 4932, 4949, - 4966, 4983, 5000, 5030, 5060, 5077, 5094, 5111, - 5128, 5145, 5175, 5205, 5222, 5239, 5256, 5273, - 5290, 5302, 5332, 5344, 5374, 5404, 5433, 5450, - 5480, 5510, 5539, 5556, 5586, 5616, 5645, 5662, - 5692, 5722, 5751, 5768, 5798, 5828, 5857, 5868, - 5876, 5883, 5886, 5888, 5891, 5894, 5896, 5903, - 5915, 5924, 5928, 5937, 5949, 5962, 5975, 5987, - 5998, 6011, 6023, 6034, 6047, 6059, 6070, 6083, - 6095, 6105, 6118, 6135, 6164, 6176, 6206, 6236, - 6253, 6270, 6287, 6304, 6321, 6351, 6381, 6398, - 6415, 6432, 6449, 6466, 6496, 6526, 6543, 6560, - 6577, 6594, 6611, 6641, 6671, 6688, 6705, 6722, - 6739, 6756, 6786, 6818, 6848, 6880, 6892, 6909, - 6939, 6969, 6998, 7005, 7008, 7010, 7013, 7016, - 7018, 7025, 7055, 7085, 7102, 7115, 7127, 7138, - 7151, 7163, 7174, 7187, 7199, 7210, 7223, 7235, - 7243, 7255, 7264, 7268, 7277, 7289, 7306, 7315, - 7319, 7326, 7329, 7331, 7334, 7337, 7339 + 0, 2, 19, 26, 31, 35, 37, 42, + 46, 48, 53, 57, 59, 64, 68, 70, + 76, 78, 80, 86, 88, 90, 96, 98, + 100, 106, 108, 110, 122, 134, 146, 158, + 170, 182, 194, 206, 218, 230, 232, 249, + 256, 261, 265, 267, 272, 276, 278, 283, + 287, 289, 294, 298, 300, 306, 308, 310, + 316, 318, 320, 326, 328, 330, 336, 338, + 340, 352, 364, 376, 388, 400, 412, 424, + 436, 448, 460, 462, 479, 486, 491, 495, + 497, 502, 506, 508, 513, 517, 519, 524, + 528, 530, 536, 538, 540, 546, 548, 550, + 556, 558, 560, 566, 568, 570, 582, 594, + 606, 618, 630, 642, 654, 666, 678, 680, + 697, 704, 709, 713, 715, 720, 724, 726, + 731, 735, 737, 742, 746, 748, 754, 756, + 758, 764, 766, 768, 774, 776, 778, 784, + 786, 788, 800, 812, 824, 836, 848, 860, + 872, 884, 896, 908, 920, 925, 937, 949, + 954, 958, 963, 967, 969, 974, 978, 980, + 985, 989, 991, 993, 1010, 1017, 1023, 1025, + 1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, + 1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197, + 1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409, + 1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615, + 1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653, + 1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740, + 1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836, + 1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990, + 2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152, + 2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314, + 2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476, + 2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676, + 2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888, + 2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094, + 3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132, + 3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219, + 3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315, + 3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469, + 3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631, + 3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793, + 3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955, + 3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137, + 4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349, + 4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536, + 4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575, + 4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661, + 4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758, + 4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917, + 4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079, + 5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241, + 5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403, + 5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580, + 5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792, + 5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998, + 6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036, + 6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123, + 6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219, + 6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373, + 6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535, + 6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697, + 6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859, + 6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036, + 7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103, + 7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275, + 7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372, + 7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458, + 7465, 7472, 7475, 7477, 7480, 7483, 7485 }; static const short _indic_syllable_machine_indicies[] = { - 1, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 3, 0, 4, 4, 5, 0, 6, - 6, 5, 0, 5, 0, 7, 7, 8, - 0, 9, 9, 8, 0, 8, 0, 10, - 10, 11, 0, 12, 12, 11, 0, 11, - 0, 13, 13, 14, 0, 15, 15, 14, - 0, 14, 0, 16, 0, 17, 0, 18, - 0, 19, 13, 13, 14, 0, 20, 0, - 21, 0, 22, 10, 10, 11, 0, 23, - 0, 24, 0, 25, 7, 7, 8, 0, - 26, 0, 27, 0, 28, 4, 4, 5, - 0, 0, 0, 0, 0, 0, 28, 0, - 28, 4, 4, 5, 0, 0, 0, 0, - 0, 29, 28, 0, 30, 4, 4, 5, - 0, 0, 0, 0, 0, 0, 30, 0, - 30, 4, 4, 5, 0, 0, 0, 0, - 0, 31, 30, 0, 32, 4, 4, 5, - 0, 0, 0, 0, 0, 0, 32, 0, - 32, 4, 4, 5, 0, 0, 0, 0, - 0, 33, 32, 0, 34, 4, 4, 5, - 0, 0, 0, 0, 0, 0, 34, 0, - 34, 4, 4, 5, 0, 0, 0, 0, - 0, 35, 34, 0, 36, 4, 4, 5, - 0, 0, 0, 0, 0, 0, 36, 0, - 36, 4, 4, 5, 0, 0, 0, 0, - 0, 37, 36, 0, 39, 40, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 39, 38, 41, 38, 42, - 42, 43, 38, 44, 44, 43, 38, 43, - 38, 45, 45, 46, 38, 47, 47, 46, - 38, 46, 38, 48, 48, 49, 38, 50, - 50, 49, 38, 49, 38, 51, 51, 52, - 38, 53, 53, 52, 38, 52, 38, 54, - 38, 55, 38, 56, 38, 57, 51, 51, - 52, 38, 58, 38, 59, 38, 60, 48, - 48, 49, 38, 61, 38, 62, 38, 63, - 45, 45, 46, 38, 64, 38, 65, 38, - 66, 42, 42, 43, 38, 38, 38, 38, - 38, 38, 66, 38, 66, 42, 42, 43, - 38, 38, 38, 38, 38, 67, 66, 38, - 68, 42, 42, 43, 38, 38, 38, 38, - 38, 38, 68, 38, 68, 42, 42, 43, - 38, 38, 38, 38, 38, 69, 68, 38, - 70, 42, 42, 43, 38, 38, 38, 38, - 38, 38, 70, 38, 70, 42, 42, 43, - 38, 38, 38, 38, 38, 71, 70, 38, - 72, 42, 42, 43, 38, 38, 38, 38, - 38, 38, 72, 38, 72, 42, 42, 43, - 38, 38, 38, 38, 38, 73, 72, 38, - 74, 42, 42, 43, 38, 38, 38, 38, - 38, 38, 74, 38, 74, 42, 42, 43, - 38, 38, 38, 38, 38, 75, 74, 38, - 77, 78, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 77, - 76, 79, 76, 80, 80, 81, 76, 83, - 83, 81, 82, 81, 82, 84, 84, 85, - 76, 86, 86, 85, 76, 85, 76, 87, - 87, 88, 76, 89, 89, 88, 76, 88, - 76, 90, 90, 91, 76, 92, 92, 91, - 76, 91, 76, 93, 76, 94, 76, 95, - 76, 96, 90, 90, 91, 76, 97, 76, - 98, 76, 99, 87, 87, 88, 76, 100, - 76, 101, 76, 102, 84, 84, 85, 76, - 103, 76, 104, 76, 105, 80, 80, 81, - 76, 76, 76, 76, 76, 76, 105, 76, - 105, 80, 80, 81, 76, 76, 76, 76, - 76, 106, 105, 76, 107, 80, 80, 81, - 76, 76, 76, 76, 76, 76, 107, 76, - 107, 80, 80, 81, 76, 76, 76, 76, - 76, 108, 107, 76, 109, 80, 80, 81, - 76, 76, 76, 76, 76, 76, 109, 76, - 109, 80, 80, 81, 76, 76, 76, 76, - 76, 110, 109, 76, 111, 80, 80, 81, - 82, 82, 82, 82, 82, 82, 111, 82, - 111, 80, 80, 81, 76, 76, 76, 76, - 76, 112, 111, 76, 113, 80, 80, 81, - 76, 76, 76, 76, 76, 76, 113, 76, - 115, 116, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 115, - 114, 117, 114, 118, 118, 119, 114, 120, - 120, 119, 114, 119, 114, 121, 121, 122, - 114, 123, 123, 122, 114, 122, 114, 124, - 124, 125, 114, 126, 126, 125, 114, 125, - 114, 127, 127, 128, 114, 129, 129, 128, - 114, 128, 114, 130, 114, 131, 114, 132, - 114, 133, 127, 127, 128, 114, 134, 114, - 135, 114, 136, 124, 124, 125, 114, 137, - 114, 138, 114, 139, 121, 121, 122, 114, - 140, 114, 141, 114, 142, 118, 118, 119, - 114, 114, 114, 114, 114, 114, 142, 114, - 142, 118, 118, 119, 114, 114, 114, 114, - 114, 143, 142, 114, 144, 118, 118, 119, - 114, 114, 114, 114, 114, 114, 144, 114, - 144, 118, 118, 119, 114, 114, 114, 114, - 114, 145, 144, 114, 146, 118, 118, 119, - 114, 114, 114, 114, 114, 114, 146, 114, - 146, 118, 118, 119, 114, 114, 114, 114, - 114, 147, 146, 114, 148, 118, 118, 119, - 114, 114, 114, 114, 114, 114, 148, 114, - 148, 118, 118, 119, 114, 114, 114, 114, - 114, 149, 148, 114, 150, 118, 118, 119, - 114, 114, 114, 114, 114, 114, 150, 114, - 150, 118, 118, 119, 114, 114, 114, 114, - 114, 151, 150, 114, 113, 80, 80, 81, - 76, 76, 76, 76, 76, 152, 113, 76, - 111, 80, 80, 81, 0, 0, 0, 0, - 0, 153, 111, 0, 154, 154, 155, 0, - 6, 6, 155, 0, 156, 156, 157, 0, - 158, 158, 157, 0, 157, 0, 159, 159, - 160, 0, 161, 161, 160, 0, 160, 0, - 162, 162, 163, 0, 164, 164, 163, 0, - 163, 0, 165, 166, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 165, 0, 167, 0, 168, 0, 169, - 0, 170, 0, 171, 162, 162, 163, 0, - 172, 0, 173, 0, 174, 159, 159, 160, - 0, 175, 0, 176, 0, 177, 156, 156, - 157, 0, 178, 0, 179, 0, 181, 182, - 183, 184, 185, 186, 81, 187, 188, 189, - 190, 190, 152, 191, 192, 193, 194, 195, - 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 196, 180, 198, 199, - 200, 201, 5, 202, 203, 204, 197, 197, - 37, 205, 197, 197, 206, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 207, 197, 208, 199, 209, 209, - 5, 202, 203, 204, 197, 197, 197, 205, - 197, 197, 206, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 207, 197, 199, 209, 209, 5, 202, 203, - 204, 197, 197, 197, 205, 197, 197, 206, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 207, 197, 210, - 197, 197, 197, 18, 211, 197, 202, 203, - 204, 197, 197, 197, 212, 197, 210, 197, - 213, 214, 215, 216, 5, 202, 203, 204, - 197, 197, 35, 217, 197, 197, 206, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 207, 197, 218, 214, - 219, 219, 5, 202, 203, 204, 197, 197, - 197, 217, 197, 197, 206, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 207, 197, 214, 219, 219, 5, - 202, 203, 204, 197, 197, 197, 217, 197, - 197, 206, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 207, - 197, 220, 197, 197, 197, 18, 221, 197, - 202, 203, 204, 197, 197, 197, 212, 197, - 220, 197, 222, 223, 224, 225, 5, 202, - 203, 204, 197, 197, 33, 226, 197, 197, - 206, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 207, 197, - 227, 223, 228, 228, 5, 202, 203, 204, - 197, 197, 197, 226, 197, 197, 206, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 207, 197, 223, 228, - 228, 5, 202, 203, 204, 197, 197, 197, - 226, 197, 197, 206, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 207, 197, 229, 197, 197, 197, 18, - 230, 197, 202, 203, 204, 197, 197, 197, - 212, 197, 229, 197, 231, 232, 233, 234, - 5, 202, 203, 204, 197, 197, 31, 235, - 197, 197, 206, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 207, 197, 236, 232, 237, 237, 5, 202, - 203, 204, 197, 197, 197, 235, 197, 197, - 206, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 207, 197, - 232, 237, 237, 5, 202, 203, 204, 197, - 197, 197, 235, 197, 197, 206, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 207, 197, 238, 197, 197, - 197, 18, 239, 197, 202, 203, 204, 197, - 197, 197, 212, 197, 238, 197, 240, 241, - 242, 243, 5, 202, 203, 204, 197, 197, - 29, 244, 197, 197, 206, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 207, 197, 245, 241, 246, 246, - 5, 202, 203, 204, 197, 197, 197, 244, - 197, 197, 206, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 207, 197, 241, 246, 246, 5, 202, 203, - 204, 197, 197, 197, 244, 197, 197, 206, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 207, 197, 18, - 247, 197, 202, 203, 204, 197, 197, 197, - 212, 197, 202, 203, 204, 197, 197, 197, - 212, 197, 248, 197, 197, 249, 203, 204, - 197, 203, 204, 197, 250, 197, 203, 251, - 197, 203, 252, 197, 203, 197, 248, 197, - 197, 197, 203, 204, 197, 253, 197, 254, - 255, 197, 202, 203, 204, 197, 197, 3, - 197, 2, 197, 197, 197, 197, 202, 203, - 204, 197, 202, 203, 204, 197, 253, 197, - 197, 197, 197, 202, 203, 204, 197, 253, - 197, 254, 197, 197, 202, 203, 204, 197, - 197, 3, 197, 18, 197, 256, 256, 5, - 202, 203, 204, 197, 197, 197, 212, 197, - 257, 27, 258, 259, 8, 202, 203, 204, - 197, 197, 197, 212, 197, 27, 258, 259, - 8, 202, 203, 204, 197, 197, 197, 212, - 197, 258, 258, 8, 202, 203, 204, 197, - 197, 197, 212, 197, 260, 24, 261, 262, - 11, 202, 203, 204, 197, 197, 197, 212, - 197, 24, 261, 262, 11, 202, 203, 204, - 197, 197, 197, 212, 197, 261, 261, 11, - 202, 203, 204, 197, 197, 197, 212, 197, - 263, 21, 264, 265, 14, 202, 203, 204, - 197, 197, 197, 212, 197, 21, 264, 265, - 14, 202, 203, 204, 197, 197, 197, 212, - 197, 264, 264, 14, 202, 203, 204, 197, - 197, 197, 212, 197, 266, 18, 197, 267, - 197, 202, 203, 204, 197, 197, 197, 212, - 197, 18, 197, 267, 197, 202, 203, 204, - 197, 197, 197, 212, 197, 268, 197, 202, - 203, 204, 197, 197, 197, 212, 197, 18, - 197, 197, 197, 197, 202, 203, 204, 197, - 197, 197, 212, 197, 1, 2, 197, 197, - 18, 247, 197, 202, 203, 204, 197, 197, - 197, 212, 197, 1, 197, 241, 246, 246, - 5, 202, 203, 204, 197, 197, 197, 244, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 207, 197, 241, 246, 246, 5, 202, 203, - 204, 197, 197, 197, 244, 197, 240, 241, - 246, 246, 5, 202, 203, 204, 197, 197, - 197, 244, 197, 197, 206, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 207, 197, 240, 241, 242, 246, - 5, 202, 203, 204, 197, 197, 29, 244, - 197, 197, 206, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 207, 197, 238, 197, 269, 197, 256, 256, - 5, 202, 203, 204, 197, 197, 197, 212, - 197, 238, 197, 238, 197, 197, 197, 197, - 197, 197, 202, 203, 204, 197, 197, 197, - 212, 197, 238, 197, 238, 197, 197, 197, - 197, 270, 197, 202, 203, 204, 197, 197, - 197, 212, 197, 238, 197, 238, 197, 269, - 197, 197, 197, 197, 202, 203, 204, 197, - 197, 197, 212, 197, 238, 197, 238, 2, - 197, 197, 18, 239, 197, 202, 203, 204, - 197, 197, 197, 212, 197, 238, 197, 231, - 232, 237, 237, 5, 202, 203, 204, 197, - 197, 197, 235, 197, 197, 206, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 207, 197, 231, 232, 233, - 237, 5, 202, 203, 204, 197, 197, 31, - 235, 197, 197, 206, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 207, 197, 229, 197, 271, 197, 256, - 256, 5, 202, 203, 204, 197, 197, 197, - 212, 197, 229, 197, 229, 197, 197, 197, - 197, 197, 197, 202, 203, 204, 197, 197, - 197, 212, 197, 229, 197, 229, 197, 197, - 197, 197, 272, 197, 202, 203, 204, 197, - 197, 197, 212, 197, 229, 197, 229, 197, - 271, 197, 197, 197, 197, 202, 203, 204, - 197, 197, 197, 212, 197, 229, 197, 229, - 2, 197, 197, 18, 230, 197, 202, 203, - 204, 197, 197, 197, 212, 197, 229, 197, - 222, 223, 228, 228, 5, 202, 203, 204, - 197, 197, 197, 226, 197, 197, 206, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 207, 197, 222, 223, - 224, 228, 5, 202, 203, 204, 197, 197, - 33, 226, 197, 197, 206, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 207, 197, 220, 197, 273, 197, - 256, 256, 5, 202, 203, 204, 197, 197, - 197, 212, 197, 220, 197, 220, 197, 197, - 197, 197, 197, 197, 202, 203, 204, 197, - 197, 197, 212, 197, 220, 197, 220, 197, - 197, 197, 197, 274, 197, 202, 203, 204, - 197, 197, 197, 212, 197, 220, 197, 220, - 197, 273, 197, 197, 197, 197, 202, 203, - 204, 197, 197, 197, 212, 197, 220, 197, - 220, 2, 197, 197, 18, 221, 197, 202, - 203, 204, 197, 197, 197, 212, 197, 220, - 197, 213, 214, 219, 219, 5, 202, 203, - 204, 197, 197, 197, 217, 197, 197, 206, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 207, 197, 213, - 214, 215, 219, 5, 202, 203, 204, 197, - 197, 35, 217, 197, 197, 206, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 207, 197, 210, 197, 275, - 197, 256, 256, 5, 202, 203, 204, 197, - 197, 197, 212, 197, 210, 197, 210, 197, - 197, 197, 197, 197, 197, 202, 203, 204, - 197, 197, 197, 212, 197, 210, 197, 210, - 197, 197, 197, 197, 276, 197, 202, 203, - 204, 197, 197, 197, 212, 197, 210, 197, - 210, 197, 275, 197, 197, 197, 197, 202, - 203, 204, 197, 197, 197, 212, 197, 210, - 197, 210, 2, 197, 197, 18, 211, 197, - 202, 203, 204, 197, 197, 197, 212, 197, - 210, 197, 198, 199, 209, 209, 5, 202, - 203, 204, 197, 197, 197, 205, 197, 197, - 206, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 207, 197, - 198, 199, 200, 209, 5, 202, 203, 204, - 197, 197, 37, 205, 197, 197, 206, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 207, 197, 278, 279, - 280, 281, 43, 282, 283, 284, 277, 277, - 75, 285, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 288, 279, 289, 281, - 43, 282, 283, 284, 277, 277, 277, 285, - 277, 277, 286, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 287, 277, 279, 289, 281, 43, 282, 283, - 284, 277, 277, 277, 285, 277, 277, 286, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 287, 277, 290, - 277, 277, 277, 56, 291, 277, 282, 283, - 284, 277, 277, 277, 292, 277, 290, 277, - 293, 294, 295, 296, 43, 282, 283, 284, - 277, 277, 73, 297, 277, 277, 286, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 287, 277, 298, 294, - 299, 299, 43, 282, 283, 284, 277, 277, - 277, 297, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 294, 299, 299, 43, - 282, 283, 284, 277, 277, 277, 297, 277, - 277, 286, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 287, - 277, 300, 277, 277, 277, 56, 301, 277, - 282, 283, 284, 277, 277, 277, 292, 277, - 300, 277, 302, 303, 304, 305, 43, 282, - 283, 284, 277, 277, 71, 306, 277, 277, - 286, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 287, 277, - 307, 303, 308, 308, 43, 282, 283, 284, - 277, 277, 277, 306, 277, 277, 286, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 287, 277, 303, 308, - 308, 43, 282, 283, 284, 277, 277, 277, - 306, 277, 277, 286, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 287, 277, 309, 277, 277, 277, 56, - 310, 277, 282, 283, 284, 277, 277, 277, - 292, 277, 309, 277, 311, 312, 313, 314, - 43, 282, 283, 284, 277, 277, 69, 315, - 277, 277, 286, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 287, 277, 316, 312, 317, 317, 43, 282, - 283, 284, 277, 277, 277, 315, 277, 277, - 286, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 287, 277, - 312, 317, 317, 43, 282, 283, 284, 277, - 277, 277, 315, 277, 277, 286, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 287, 277, 318, 277, 277, - 277, 56, 319, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 318, 277, 320, 321, - 322, 323, 43, 282, 283, 284, 277, 277, - 67, 324, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 325, 321, 326, 326, - 43, 282, 283, 284, 277, 277, 277, 324, - 277, 277, 286, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 287, 277, 321, 326, 326, 43, 282, 283, - 284, 277, 277, 277, 324, 277, 277, 286, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 287, 277, 56, - 327, 277, 282, 283, 284, 277, 277, 277, - 292, 277, 282, 283, 284, 277, 277, 277, - 292, 277, 328, 277, 277, 329, 283, 284, - 277, 283, 284, 277, 330, 277, 283, 331, - 277, 283, 332, 277, 283, 277, 328, 277, - 277, 277, 283, 284, 277, 333, 277, 334, - 335, 277, 282, 283, 284, 277, 277, 41, - 277, 40, 277, 277, 277, 277, 282, 283, - 284, 277, 282, 283, 284, 277, 333, 277, - 277, 277, 277, 282, 283, 284, 277, 333, - 277, 334, 277, 277, 282, 283, 284, 277, - 277, 41, 277, 56, 277, 336, 336, 43, - 282, 283, 284, 277, 277, 277, 292, 277, - 337, 65, 338, 339, 46, 282, 283, 284, - 277, 277, 277, 292, 277, 65, 338, 339, - 46, 282, 283, 284, 277, 277, 277, 292, - 277, 338, 338, 46, 282, 283, 284, 277, - 277, 277, 292, 277, 340, 62, 341, 342, - 49, 282, 283, 284, 277, 277, 277, 292, - 277, 62, 341, 342, 49, 282, 283, 284, - 277, 277, 277, 292, 277, 341, 341, 49, - 282, 283, 284, 277, 277, 277, 292, 277, - 343, 59, 344, 345, 52, 282, 283, 284, - 277, 277, 277, 292, 277, 59, 344, 345, - 52, 282, 283, 284, 277, 277, 277, 292, - 277, 344, 344, 52, 282, 283, 284, 277, - 277, 277, 292, 277, 346, 56, 277, 347, - 277, 282, 283, 284, 277, 277, 277, 292, - 277, 56, 277, 347, 277, 282, 283, 284, - 277, 277, 277, 292, 277, 348, 277, 282, - 283, 284, 277, 277, 277, 292, 277, 56, - 277, 277, 277, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 39, 40, 277, 277, - 56, 327, 277, 282, 283, 284, 277, 277, - 277, 292, 277, 39, 277, 321, 326, 326, - 43, 282, 283, 284, 277, 277, 277, 324, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 287, 277, 321, 326, 326, 43, 282, 283, - 284, 277, 277, 277, 324, 277, 320, 321, - 326, 326, 43, 282, 283, 284, 277, 277, - 277, 324, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 320, 321, 322, 326, - 43, 282, 283, 284, 277, 277, 67, 324, - 277, 277, 286, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 287, 277, 318, 277, 349, 277, 336, 336, - 43, 282, 283, 284, 277, 277, 277, 292, - 277, 318, 277, 318, 277, 277, 277, 277, - 277, 277, 282, 283, 284, 277, 277, 277, - 292, 277, 318, 277, 318, 277, 277, 277, - 277, 350, 277, 282, 283, 284, 277, 277, - 277, 292, 277, 318, 277, 318, 277, 349, - 277, 277, 277, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 318, 277, 318, 40, - 277, 277, 56, 319, 277, 282, 283, 284, - 277, 277, 277, 292, 277, 318, 277, 311, - 312, 317, 317, 43, 282, 283, 284, 277, - 277, 277, 315, 277, 277, 286, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 287, 277, 311, 312, 313, - 317, 43, 282, 283, 284, 277, 277, 69, - 315, 277, 277, 286, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 287, 277, 309, 277, 351, 277, 336, - 336, 43, 282, 283, 284, 277, 277, 277, - 292, 277, 309, 277, 309, 277, 277, 277, - 277, 277, 277, 282, 283, 284, 277, 277, - 277, 292, 277, 309, 277, 309, 277, 277, - 277, 277, 352, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 309, 277, 309, 277, - 351, 277, 277, 277, 277, 282, 283, 284, - 277, 277, 277, 292, 277, 309, 277, 309, - 40, 277, 277, 56, 310, 277, 282, 283, - 284, 277, 277, 277, 292, 277, 309, 277, - 302, 303, 308, 308, 43, 282, 283, 284, - 277, 277, 277, 306, 277, 277, 286, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 287, 277, 302, 303, - 304, 308, 43, 282, 283, 284, 277, 277, - 71, 306, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 300, 277, 353, 277, - 336, 336, 43, 282, 283, 284, 277, 277, - 277, 292, 277, 300, 277, 300, 277, 277, - 277, 277, 277, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 300, 277, 300, 277, - 277, 277, 277, 354, 277, 282, 283, 284, - 277, 277, 277, 292, 277, 300, 277, 300, - 277, 353, 277, 277, 277, 277, 282, 283, - 284, 277, 277, 277, 292, 277, 300, 277, - 300, 40, 277, 277, 56, 301, 277, 282, - 283, 284, 277, 277, 277, 292, 277, 300, - 277, 293, 294, 299, 299, 43, 282, 283, - 284, 277, 277, 277, 297, 277, 277, 286, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 287, 277, 293, - 294, 295, 299, 43, 282, 283, 284, 277, - 277, 73, 297, 277, 277, 286, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 287, 277, 290, 277, 355, - 277, 336, 336, 43, 282, 283, 284, 277, - 277, 277, 292, 277, 290, 277, 290, 277, - 277, 277, 277, 277, 277, 282, 283, 284, - 277, 277, 277, 292, 277, 290, 277, 290, - 277, 277, 277, 277, 356, 277, 282, 283, - 284, 277, 277, 277, 292, 277, 290, 277, - 290, 277, 355, 277, 277, 277, 277, 282, - 283, 284, 277, 277, 277, 292, 277, 290, - 277, 74, 42, 42, 43, 277, 277, 277, - 277, 277, 277, 74, 277, 290, 40, 277, - 277, 56, 291, 277, 282, 283, 284, 277, - 277, 277, 292, 277, 290, 277, 278, 279, - 289, 281, 43, 282, 283, 284, 277, 277, - 277, 285, 277, 277, 286, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 287, 277, 358, 184, 359, 359, - 81, 187, 188, 189, 357, 357, 357, 191, - 357, 357, 194, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 184, 359, 359, 81, 187, 188, - 189, 357, 357, 357, 191, 357, 357, 194, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 196, 357, 360, - 357, 357, 357, 95, 361, 357, 187, 188, - 189, 357, 357, 357, 362, 357, 360, 357, - 363, 364, 365, 366, 81, 187, 188, 189, - 357, 357, 112, 367, 357, 357, 194, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 196, 357, 368, 364, - 369, 369, 81, 187, 188, 189, 357, 357, - 357, 367, 357, 357, 194, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 196, 357, 364, 369, 369, 81, - 187, 188, 189, 357, 357, 357, 367, 357, - 357, 194, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 196, - 357, 370, 357, 357, 357, 95, 371, 357, - 187, 188, 189, 357, 357, 357, 362, 357, - 370, 357, 372, 373, 374, 375, 81, 187, - 188, 189, 357, 357, 110, 376, 357, 357, - 194, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 196, 357, - 377, 373, 378, 378, 81, 187, 188, 189, - 357, 357, 357, 376, 357, 357, 194, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 196, 357, 373, 378, - 378, 81, 187, 188, 189, 357, 357, 357, - 376, 357, 357, 194, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 196, 357, 379, 357, 357, 357, 95, - 380, 357, 187, 188, 189, 357, 357, 357, - 362, 357, 379, 357, 381, 382, 383, 384, - 81, 187, 188, 189, 357, 357, 108, 385, - 357, 357, 194, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 386, 382, 387, 387, 81, 187, - 188, 189, 357, 357, 357, 385, 357, 357, - 194, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 196, 357, - 382, 387, 387, 81, 187, 188, 189, 357, - 357, 357, 385, 357, 357, 194, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 196, 357, 388, 357, 357, - 357, 95, 389, 357, 187, 188, 189, 357, - 357, 357, 362, 357, 388, 357, 390, 391, - 392, 393, 81, 187, 188, 189, 357, 357, - 106, 394, 357, 357, 194, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 196, 357, 395, 391, 396, 396, - 81, 187, 188, 189, 357, 357, 357, 394, - 357, 357, 194, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 391, 396, 396, 81, 187, 188, - 189, 357, 357, 357, 394, 357, 357, 194, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 196, 357, 95, - 397, 357, 187, 188, 189, 357, 357, 357, - 362, 357, 187, 188, 189, 357, 357, 357, - 362, 357, 398, 357, 357, 399, 188, 189, - 357, 188, 189, 357, 400, 357, 188, 401, - 357, 188, 402, 357, 188, 357, 398, 357, - 357, 357, 188, 189, 357, 403, 357, 404, - 405, 357, 187, 188, 189, 357, 357, 79, - 357, 78, 357, 357, 357, 357, 187, 188, - 189, 357, 187, 188, 189, 357, 403, 357, - 357, 357, 357, 187, 188, 189, 357, 403, - 357, 404, 357, 357, 187, 188, 189, 357, - 357, 79, 357, 95, 357, 406, 406, 81, - 187, 188, 189, 357, 357, 357, 362, 357, - 407, 104, 408, 409, 85, 187, 188, 189, - 357, 357, 357, 362, 357, 104, 408, 409, - 85, 187, 188, 189, 357, 357, 357, 362, - 357, 408, 408, 85, 187, 188, 189, 357, - 357, 357, 362, 357, 410, 101, 411, 412, - 88, 187, 188, 189, 357, 357, 357, 362, - 357, 101, 411, 412, 88, 187, 188, 189, - 357, 357, 357, 362, 357, 411, 411, 88, - 187, 188, 189, 357, 357, 357, 362, 357, - 413, 98, 414, 415, 91, 187, 188, 189, - 357, 357, 357, 362, 357, 98, 414, 415, - 91, 187, 188, 189, 357, 357, 357, 362, - 357, 414, 414, 91, 187, 188, 189, 357, - 357, 357, 362, 357, 416, 95, 357, 417, - 357, 187, 188, 189, 357, 357, 357, 362, - 357, 95, 357, 417, 357, 187, 188, 189, - 357, 357, 357, 362, 357, 418, 357, 187, - 188, 189, 357, 357, 357, 362, 357, 95, - 357, 357, 357, 357, 187, 188, 189, 357, - 357, 357, 362, 357, 77, 78, 357, 357, - 95, 397, 357, 187, 188, 189, 357, 357, - 357, 362, 357, 77, 357, 391, 396, 396, - 81, 187, 188, 189, 357, 357, 357, 394, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 391, 396, 396, 81, 187, 188, - 189, 357, 357, 357, 394, 357, 390, 391, - 396, 396, 81, 187, 188, 189, 357, 357, - 357, 394, 357, 357, 194, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 196, 357, 390, 391, 392, 396, - 81, 187, 188, 189, 357, 357, 106, 394, - 357, 357, 194, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 388, 357, 419, 357, 406, 406, - 81, 187, 188, 189, 357, 357, 357, 362, - 357, 388, 357, 388, 357, 357, 357, 357, - 357, 357, 187, 188, 189, 357, 357, 357, - 362, 357, 388, 357, 388, 357, 357, 357, - 357, 420, 357, 187, 188, 189, 357, 357, - 357, 362, 357, 388, 357, 388, 357, 419, - 357, 357, 357, 357, 187, 188, 189, 357, - 357, 357, 362, 357, 388, 357, 388, 78, - 357, 357, 95, 389, 357, 187, 188, 189, - 357, 357, 357, 362, 357, 388, 357, 381, - 382, 387, 387, 81, 187, 188, 189, 357, - 357, 357, 385, 357, 357, 194, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 196, 357, 381, 382, 383, - 387, 81, 187, 188, 189, 357, 357, 108, - 385, 357, 357, 194, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 196, 357, 379, 357, 421, 357, 406, - 406, 81, 187, 188, 189, 357, 357, 357, - 362, 357, 379, 357, 379, 357, 357, 357, - 357, 357, 357, 187, 188, 189, 357, 357, - 357, 362, 357, 379, 357, 379, 357, 357, - 357, 357, 422, 357, 187, 188, 189, 357, - 357, 357, 362, 357, 379, 357, 379, 357, - 421, 357, 357, 357, 357, 187, 188, 189, - 357, 357, 357, 362, 357, 379, 357, 379, - 78, 357, 357, 95, 380, 357, 187, 188, - 189, 357, 357, 357, 362, 357, 379, 357, - 372, 373, 378, 378, 81, 187, 188, 189, - 357, 357, 357, 376, 357, 357, 194, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 196, 357, 372, 373, - 374, 378, 81, 187, 188, 189, 357, 357, - 110, 376, 357, 357, 194, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 196, 357, 370, 357, 423, 357, - 406, 406, 81, 187, 188, 189, 357, 357, - 357, 362, 357, 370, 357, 370, 357, 357, - 357, 357, 357, 357, 187, 188, 189, 357, - 357, 357, 362, 357, 370, 357, 370, 357, - 357, 357, 357, 424, 357, 187, 188, 189, - 357, 357, 357, 362, 357, 370, 357, 370, - 357, 423, 357, 357, 357, 357, 187, 188, - 189, 357, 357, 357, 362, 357, 370, 357, - 370, 78, 357, 357, 95, 371, 357, 187, - 188, 189, 357, 357, 357, 362, 357, 370, - 357, 363, 364, 369, 369, 81, 187, 188, - 189, 357, 357, 357, 367, 357, 357, 194, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 196, 357, 363, - 364, 365, 369, 81, 187, 188, 189, 357, - 357, 112, 367, 357, 357, 194, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 196, 357, 360, 357, 425, - 357, 406, 406, 81, 187, 188, 189, 357, - 357, 357, 362, 357, 360, 357, 360, 357, - 357, 357, 357, 357, 357, 187, 188, 189, - 357, 357, 357, 362, 357, 360, 357, 360, - 357, 357, 357, 357, 426, 357, 187, 188, - 189, 357, 357, 357, 362, 357, 360, 357, - 360, 357, 425, 357, 357, 357, 357, 187, - 188, 189, 357, 357, 357, 362, 357, 360, - 357, 360, 78, 357, 357, 95, 361, 357, - 187, 188, 189, 357, 357, 357, 362, 357, - 360, 357, 113, 80, 80, 81, 427, 427, - 427, 427, 427, 152, 113, 427, 183, 184, - 359, 359, 81, 187, 188, 189, 357, 357, - 357, 191, 357, 357, 194, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 196, 357, 113, 80, 80, 81, - 427, 427, 427, 427, 427, 427, 113, 427, - 429, 430, 431, 432, 119, 433, 434, 435, - 428, 428, 151, 436, 428, 428, 437, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 438, 428, 439, 430, - 432, 432, 119, 433, 434, 435, 428, 428, - 428, 436, 428, 428, 437, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 438, 428, 430, 432, 432, 119, - 433, 434, 435, 428, 428, 428, 436, 428, - 428, 437, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 438, - 428, 440, 428, 428, 428, 132, 441, 428, - 433, 434, 435, 428, 428, 428, 442, 428, - 440, 428, 443, 444, 445, 446, 119, 433, - 434, 435, 428, 428, 149, 447, 428, 428, - 437, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 438, 428, - 448, 444, 449, 449, 119, 433, 434, 435, - 428, 428, 428, 447, 428, 428, 437, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 438, 428, 444, 449, - 449, 119, 433, 434, 435, 428, 428, 428, - 447, 428, 428, 437, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 438, 428, 450, 428, 428, 428, 132, - 451, 428, 433, 434, 435, 428, 428, 428, - 442, 428, 450, 428, 452, 453, 454, 455, - 119, 433, 434, 435, 428, 428, 147, 456, - 428, 428, 437, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 438, 428, 457, 453, 458, 458, 119, 433, - 434, 435, 428, 428, 428, 456, 428, 428, - 437, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 438, 428, - 453, 458, 458, 119, 433, 434, 435, 428, - 428, 428, 456, 428, 428, 437, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 438, 428, 459, 428, 428, - 428, 132, 460, 428, 433, 434, 435, 428, - 428, 428, 442, 428, 459, 428, 461, 462, - 463, 464, 119, 433, 434, 435, 428, 428, - 145, 465, 428, 428, 437, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 438, 428, 466, 462, 467, 467, - 119, 433, 434, 435, 428, 428, 428, 465, - 428, 428, 437, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 438, 428, 462, 467, 467, 119, 433, 434, - 435, 428, 428, 428, 465, 428, 428, 437, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 438, 428, 468, - 428, 428, 428, 132, 469, 428, 433, 434, - 435, 428, 428, 428, 442, 428, 468, 428, - 470, 471, 472, 473, 119, 433, 434, 435, - 428, 428, 143, 474, 428, 428, 437, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 438, 428, 475, 471, - 476, 476, 119, 433, 434, 435, 428, 428, - 428, 474, 428, 428, 437, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 438, 428, 471, 476, 476, 119, - 433, 434, 435, 428, 428, 428, 474, 428, - 428, 437, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 438, - 428, 132, 477, 428, 433, 434, 435, 428, - 428, 428, 442, 428, 433, 434, 435, 428, - 428, 428, 442, 428, 478, 428, 428, 479, - 434, 435, 428, 434, 435, 428, 480, 428, - 434, 481, 428, 434, 482, 428, 434, 428, - 478, 428, 428, 428, 434, 435, 428, 483, - 428, 484, 485, 428, 433, 434, 435, 428, - 428, 117, 428, 116, 428, 428, 428, 428, - 433, 434, 435, 428, 433, 434, 435, 428, - 483, 428, 428, 428, 428, 433, 434, 435, - 428, 483, 428, 484, 428, 428, 433, 434, - 435, 428, 428, 117, 428, 132, 428, 486, - 486, 119, 433, 434, 435, 428, 428, 428, - 442, 428, 487, 141, 488, 489, 122, 433, - 434, 435, 428, 428, 428, 442, 428, 141, - 488, 489, 122, 433, 434, 435, 428, 428, - 428, 442, 428, 488, 488, 122, 433, 434, - 435, 428, 428, 428, 442, 428, 490, 138, - 491, 492, 125, 433, 434, 435, 428, 428, - 428, 442, 428, 138, 491, 492, 125, 433, - 434, 435, 428, 428, 428, 442, 428, 491, - 491, 125, 433, 434, 435, 428, 428, 428, - 442, 428, 493, 135, 494, 495, 128, 433, - 434, 435, 428, 428, 428, 442, 428, 135, - 494, 495, 128, 433, 434, 435, 428, 428, - 428, 442, 428, 494, 494, 128, 433, 434, - 435, 428, 428, 428, 442, 428, 496, 132, - 428, 497, 428, 433, 434, 435, 428, 428, - 428, 442, 428, 132, 428, 497, 428, 433, - 434, 435, 428, 428, 428, 442, 428, 498, - 428, 433, 434, 435, 428, 428, 428, 442, - 428, 132, 428, 428, 428, 428, 433, 434, - 435, 428, 428, 428, 442, 428, 115, 116, - 428, 428, 132, 477, 428, 433, 434, 435, - 428, 428, 428, 442, 428, 115, 428, 471, - 476, 476, 119, 433, 434, 435, 428, 428, - 428, 474, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 438, 428, 471, 476, 476, 119, - 433, 434, 435, 428, 428, 428, 474, 428, - 470, 471, 476, 476, 119, 433, 434, 435, - 428, 428, 428, 474, 428, 428, 437, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 438, 428, 470, 471, - 472, 476, 119, 433, 434, 435, 428, 428, - 143, 474, 428, 428, 437, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 438, 428, 468, 428, 499, 428, - 486, 486, 119, 433, 434, 435, 428, 428, - 428, 442, 428, 468, 428, 468, 428, 428, - 428, 428, 428, 428, 433, 434, 435, 428, - 428, 428, 442, 428, 468, 428, 468, 428, - 428, 428, 428, 500, 428, 433, 434, 435, - 428, 428, 428, 442, 428, 468, 428, 468, - 428, 499, 428, 428, 428, 428, 433, 434, - 435, 428, 428, 428, 442, 428, 468, 428, - 468, 116, 428, 428, 132, 469, 428, 433, - 434, 435, 428, 428, 428, 442, 428, 468, - 428, 461, 462, 467, 467, 119, 433, 434, - 435, 428, 428, 428, 465, 428, 428, 437, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 438, 428, 461, - 462, 463, 467, 119, 433, 434, 435, 428, - 428, 145, 465, 428, 428, 437, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 438, 428, 459, 428, 501, - 428, 486, 486, 119, 433, 434, 435, 428, - 428, 428, 442, 428, 459, 428, 459, 428, - 428, 428, 428, 428, 428, 433, 434, 435, - 428, 428, 428, 442, 428, 459, 428, 459, - 428, 428, 428, 428, 502, 428, 433, 434, - 435, 428, 428, 428, 442, 428, 459, 428, - 459, 428, 501, 428, 428, 428, 428, 433, - 434, 435, 428, 428, 428, 442, 428, 459, - 428, 459, 116, 428, 428, 132, 460, 428, - 433, 434, 435, 428, 428, 428, 442, 428, - 459, 428, 452, 453, 458, 458, 119, 433, - 434, 435, 428, 428, 428, 456, 428, 428, - 437, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 438, 428, - 452, 453, 454, 458, 119, 433, 434, 435, - 428, 428, 147, 456, 428, 428, 437, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 438, 428, 450, 428, - 503, 428, 486, 486, 119, 433, 434, 435, - 428, 428, 428, 442, 428, 450, 428, 450, - 428, 428, 428, 428, 428, 428, 433, 434, - 435, 428, 428, 428, 442, 428, 450, 428, - 450, 428, 428, 428, 428, 504, 428, 433, - 434, 435, 428, 428, 428, 442, 428, 450, - 428, 450, 428, 503, 428, 428, 428, 428, - 433, 434, 435, 428, 428, 428, 442, 428, - 450, 428, 450, 116, 428, 428, 132, 451, - 428, 433, 434, 435, 428, 428, 428, 442, - 428, 450, 428, 443, 444, 449, 449, 119, - 433, 434, 435, 428, 428, 428, 447, 428, - 428, 437, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 438, - 428, 443, 444, 445, 449, 119, 433, 434, - 435, 428, 428, 149, 447, 428, 428, 437, - 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 438, 428, 440, - 428, 505, 428, 486, 486, 119, 433, 434, - 435, 428, 428, 428, 442, 428, 440, 428, - 440, 428, 428, 428, 428, 428, 428, 433, - 434, 435, 428, 428, 428, 442, 428, 440, - 428, 440, 428, 428, 428, 428, 506, 428, - 433, 434, 435, 428, 428, 428, 442, 428, - 440, 428, 440, 428, 505, 428, 428, 428, - 428, 433, 434, 435, 428, 428, 428, 442, - 428, 440, 428, 440, 116, 428, 428, 132, - 441, 428, 433, 434, 435, 428, 428, 428, - 442, 428, 440, 428, 429, 430, 432, 432, - 119, 433, 434, 435, 428, 428, 428, 436, - 428, 428, 437, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 438, 428, 181, 182, 183, 184, 507, 359, - 81, 187, 188, 189, 190, 190, 152, 191, - 357, 181, 194, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 196, 357, 198, 508, 200, 201, 5, 202, - 203, 204, 197, 197, 37, 205, 197, 197, - 206, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 207, 197, - 210, 182, 183, 184, 509, 510, 81, 511, - 512, 513, 197, 190, 152, 514, 197, 210, - 194, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 196, 197, - 113, 80, 80, 81, 202, 203, 204, 197, - 197, 152, 515, 197, 516, 2, 357, 357, - 357, 426, 357, 187, 188, 189, 357, 357, - 357, 362, 357, 516, 357, 517, 364, 518, - 519, 81, 511, 512, 513, 197, 197, 153, - 367, 197, 197, 194, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 196, 197, 520, 364, 369, 369, 81, - 511, 512, 513, 197, 197, 197, 367, 197, - 197, 194, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 196, - 197, 364, 369, 369, 81, 511, 512, 513, - 197, 197, 197, 367, 197, 197, 194, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 196, 197, 521, 197, - 197, 522, 512, 513, 197, 512, 513, 197, - 250, 197, 512, 523, 197, 512, 524, 197, - 512, 197, 521, 197, 197, 197, 512, 513, - 197, 517, 364, 369, 369, 81, 511, 512, - 513, 197, 197, 197, 367, 197, 197, 194, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 196, 197, 517, - 364, 518, 369, 81, 511, 512, 513, 197, - 197, 153, 367, 197, 197, 194, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 196, 197, 210, 197, 275, - 113, 525, 525, 155, 202, 203, 204, 197, - 197, 197, 515, 197, 210, 197, 526, 179, - 527, 528, 157, 511, 512, 513, 197, 197, - 197, 529, 197, 179, 527, 528, 157, 511, - 512, 513, 197, 197, 197, 529, 197, 527, - 527, 157, 511, 512, 513, 197, 197, 197, - 529, 197, 530, 176, 531, 532, 160, 511, - 512, 513, 197, 197, 197, 529, 197, 176, - 531, 532, 160, 511, 512, 513, 197, 197, - 197, 529, 197, 531, 531, 160, 511, 512, - 513, 197, 197, 197, 529, 197, 533, 173, - 534, 535, 163, 511, 512, 513, 197, 197, - 197, 529, 197, 173, 534, 535, 163, 511, - 512, 513, 197, 197, 197, 529, 197, 534, - 534, 163, 511, 512, 513, 197, 197, 197, - 529, 197, 536, 170, 197, 537, 197, 511, - 512, 513, 197, 197, 197, 529, 197, 170, - 197, 537, 197, 511, 512, 513, 197, 197, - 197, 529, 197, 511, 512, 513, 197, 197, - 197, 529, 197, 538, 197, 539, 540, 197, - 511, 512, 513, 197, 197, 167, 197, 166, - 197, 197, 197, 197, 511, 512, 513, 197, - 511, 512, 513, 197, 538, 197, 197, 197, - 197, 511, 512, 513, 197, 538, 197, 539, - 197, 197, 511, 512, 513, 197, 197, 167, - 197, 516, 166, 357, 357, 95, 361, 357, - 187, 188, 189, 357, 357, 357, 362, 357, - 516, 357, 542, 541, 541, 541, 541, 543, - 544, 545, 541, 543, 544, 545, 541, 546, - 541, 541, 547, 544, 545, 541, 544, 545, - 541, 548, 541, 544, 549, 541, 544, 550, - 541, 544, 541, 546, 541, 541, 541, 544, - 545, 541, 0 + 1, 0, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 1, 0, 0, 0, 0, + 4, 0, 5, 5, 6, 1, 0, 7, + 7, 6, 0, 6, 0, 8, 8, 9, + 1, 0, 10, 10, 9, 0, 9, 0, + 11, 11, 12, 1, 0, 13, 13, 12, + 0, 12, 0, 14, 14, 15, 1, 0, + 16, 16, 15, 0, 15, 0, 17, 0, + 0, 0, 1, 0, 18, 0, 19, 0, + 20, 14, 14, 15, 1, 0, 21, 0, + 22, 0, 23, 11, 11, 12, 1, 0, + 24, 0, 25, 0, 26, 8, 8, 9, + 1, 0, 27, 0, 28, 0, 29, 5, + 5, 6, 1, 0, 0, 0, 0, 0, + 29, 0, 29, 5, 5, 6, 1, 0, + 0, 0, 0, 30, 29, 0, 31, 5, + 5, 6, 1, 0, 0, 0, 0, 0, + 31, 0, 31, 5, 5, 6, 1, 0, + 0, 0, 0, 32, 31, 0, 33, 5, + 5, 6, 1, 0, 0, 0, 0, 0, + 33, 0, 33, 5, 5, 6, 1, 0, + 0, 0, 0, 34, 33, 0, 35, 5, + 5, 6, 1, 0, 0, 0, 0, 0, + 35, 0, 35, 5, 5, 6, 1, 0, + 0, 0, 0, 36, 35, 0, 37, 5, + 5, 6, 1, 0, 0, 0, 0, 0, + 37, 0, 37, 5, 5, 6, 1, 0, + 0, 0, 0, 38, 37, 0, 40, 39, + 41, 42, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 41, + 39, 40, 39, 39, 39, 39, 43, 39, + 44, 44, 45, 40, 39, 46, 46, 45, + 39, 45, 39, 47, 47, 48, 40, 39, + 49, 49, 48, 39, 48, 39, 50, 50, + 51, 40, 39, 52, 52, 51, 39, 51, + 39, 53, 53, 54, 40, 39, 55, 55, + 54, 39, 54, 39, 56, 39, 39, 39, + 40, 39, 57, 39, 58, 39, 59, 53, + 53, 54, 40, 39, 60, 39, 61, 39, + 62, 50, 50, 51, 40, 39, 63, 39, + 64, 39, 65, 47, 47, 48, 40, 39, + 66, 39, 67, 39, 68, 44, 44, 45, + 40, 39, 39, 39, 39, 39, 68, 39, + 68, 44, 44, 45, 40, 39, 39, 39, + 39, 69, 68, 39, 70, 44, 44, 45, + 40, 39, 39, 39, 39, 39, 70, 39, + 70, 44, 44, 45, 40, 39, 39, 39, + 39, 71, 70, 39, 72, 44, 44, 45, + 40, 39, 39, 39, 39, 39, 72, 39, + 72, 44, 44, 45, 40, 39, 39, 39, + 39, 73, 72, 39, 74, 44, 44, 45, + 40, 39, 39, 39, 39, 39, 74, 39, + 74, 44, 44, 45, 40, 39, 39, 39, + 39, 75, 74, 39, 76, 44, 44, 45, + 40, 39, 39, 39, 39, 39, 76, 39, + 76, 44, 44, 45, 40, 39, 39, 39, + 39, 77, 76, 39, 79, 78, 80, 81, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 80, 78, 79, + 78, 78, 78, 78, 82, 78, 83, 83, + 84, 79, 78, 86, 86, 84, 85, 84, + 85, 87, 87, 88, 79, 78, 89, 89, + 88, 78, 88, 78, 90, 90, 91, 79, + 78, 92, 92, 91, 78, 91, 78, 93, + 93, 94, 79, 78, 95, 95, 94, 78, + 94, 78, 96, 78, 78, 78, 79, 78, + 97, 78, 98, 78, 99, 93, 93, 94, + 79, 78, 100, 78, 101, 78, 102, 90, + 90, 91, 79, 78, 103, 78, 104, 78, + 105, 87, 87, 88, 79, 78, 106, 78, + 107, 78, 108, 83, 83, 84, 79, 78, + 78, 78, 78, 78, 108, 78, 108, 83, + 83, 84, 79, 78, 78, 78, 78, 109, + 108, 78, 110, 83, 83, 84, 79, 78, + 78, 78, 78, 78, 110, 78, 110, 83, + 83, 84, 79, 78, 78, 78, 78, 111, + 110, 78, 112, 83, 83, 84, 79, 78, + 78, 78, 78, 78, 112, 78, 112, 83, + 83, 84, 79, 78, 78, 78, 78, 113, + 112, 78, 114, 83, 83, 84, 79, 78, + 78, 78, 78, 78, 114, 78, 114, 83, + 83, 84, 79, 78, 78, 78, 78, 115, + 114, 78, 116, 83, 83, 84, 79, 78, + 78, 78, 78, 78, 116, 78, 118, 117, + 119, 120, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 119, + 117, 118, 117, 117, 117, 117, 121, 117, + 122, 122, 123, 118, 117, 124, 124, 123, + 117, 123, 117, 125, 125, 126, 118, 117, + 127, 127, 126, 117, 126, 117, 128, 128, + 129, 118, 117, 130, 130, 129, 117, 129, + 117, 131, 131, 132, 118, 117, 133, 133, + 132, 117, 132, 117, 134, 117, 117, 117, + 118, 117, 135, 117, 136, 117, 137, 131, + 131, 132, 118, 117, 138, 117, 139, 117, + 140, 128, 128, 129, 118, 117, 141, 117, + 142, 117, 143, 125, 125, 126, 118, 117, + 144, 117, 145, 117, 146, 122, 122, 123, + 118, 117, 117, 117, 117, 117, 146, 117, + 146, 122, 122, 123, 118, 117, 117, 117, + 117, 147, 146, 117, 148, 122, 122, 123, + 118, 117, 117, 117, 117, 117, 148, 117, + 148, 122, 122, 123, 118, 117, 117, 117, + 117, 149, 148, 117, 150, 122, 122, 123, + 118, 117, 117, 117, 117, 117, 150, 117, + 150, 122, 122, 123, 118, 117, 117, 117, + 117, 151, 150, 117, 152, 122, 122, 123, + 118, 117, 117, 117, 117, 117, 152, 117, + 152, 122, 122, 123, 118, 117, 117, 117, + 117, 153, 152, 117, 154, 122, 122, 123, + 118, 117, 117, 117, 117, 117, 154, 117, + 154, 122, 122, 123, 118, 117, 117, 117, + 117, 155, 154, 117, 116, 83, 83, 84, + 79, 78, 78, 78, 78, 156, 116, 78, + 86, 86, 84, 1, 0, 114, 83, 83, + 84, 157, 0, 0, 0, 0, 0, 114, + 0, 114, 83, 83, 84, 157, 0, 0, + 0, 0, 158, 114, 0, 159, 159, 160, + 1, 0, 7, 7, 160, 0, 161, 161, + 162, 157, 0, 163, 163, 162, 0, 162, + 0, 164, 164, 165, 157, 0, 166, 166, + 165, 0, 165, 0, 167, 167, 168, 157, + 0, 169, 169, 168, 0, 168, 0, 157, + 0, 170, 171, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 170, 0, 157, 0, 0, 0, 0, 172, + 0, 173, 0, 0, 0, 157, 0, 174, + 0, 175, 0, 176, 167, 167, 168, 157, + 0, 177, 0, 178, 0, 179, 164, 164, + 165, 157, 0, 180, 0, 181, 0, 182, + 161, 161, 162, 157, 0, 183, 0, 184, + 0, 186, 185, 188, 189, 190, 191, 192, + 193, 84, 79, 194, 195, 196, 196, 156, + 197, 198, 199, 200, 201, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, + 187, 202, 187, 204, 205, 206, 207, 6, + 1, 208, 209, 203, 203, 38, 210, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 213, 205, 214, 214, 6, 1, 208, + 209, 203, 203, 203, 210, 203, 203, 211, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 212, 203, 205, + 214, 214, 6, 1, 208, 209, 203, 203, + 203, 210, 203, 203, 211, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 212, 203, 215, 203, 203, 203, + 19, 216, 203, 1, 208, 209, 203, 203, + 203, 217, 203, 215, 203, 218, 219, 220, + 221, 6, 1, 208, 209, 203, 203, 36, + 222, 203, 203, 211, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 212, 203, 223, 219, 224, 224, 6, + 1, 208, 209, 203, 203, 203, 222, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 219, 224, 224, 6, 1, 208, 209, + 203, 203, 203, 222, 203, 203, 211, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 212, 203, 225, 203, + 203, 203, 19, 226, 203, 1, 208, 209, + 203, 203, 203, 217, 203, 225, 203, 227, + 228, 229, 230, 6, 1, 208, 209, 203, + 203, 34, 231, 203, 203, 211, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 212, 203, 232, 228, 233, + 233, 6, 1, 208, 209, 203, 203, 203, + 231, 203, 203, 211, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 212, 203, 228, 233, 233, 6, 1, + 208, 209, 203, 203, 203, 231, 203, 203, + 211, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 212, 203, + 234, 203, 203, 203, 19, 235, 203, 1, + 208, 209, 203, 203, 203, 217, 203, 234, + 203, 236, 237, 238, 239, 6, 1, 208, + 209, 203, 203, 32, 240, 203, 203, 211, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 212, 203, 241, + 237, 242, 242, 6, 1, 208, 209, 203, + 203, 203, 240, 203, 203, 211, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 212, 203, 237, 242, 242, + 6, 1, 208, 209, 203, 203, 203, 240, + 203, 203, 211, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 212, 203, 243, 203, 203, 203, 19, 244, + 203, 1, 208, 209, 203, 203, 203, 217, + 203, 243, 203, 245, 246, 247, 248, 6, + 1, 208, 209, 203, 203, 30, 249, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 250, 246, 251, 251, 6, 1, 208, + 209, 203, 203, 203, 249, 203, 203, 211, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 212, 203, 246, + 251, 251, 6, 1, 208, 209, 203, 203, + 203, 249, 203, 203, 211, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 212, 203, 19, 252, 203, 1, + 208, 209, 203, 203, 203, 217, 203, 253, + 253, 203, 1, 208, 209, 203, 203, 203, + 217, 203, 254, 203, 203, 255, 208, 209, + 203, 208, 209, 203, 256, 203, 208, 257, + 203, 208, 258, 203, 208, 203, 254, 203, + 203, 203, 208, 209, 203, 259, 203, 260, + 261, 203, 1, 208, 209, 203, 203, 4, + 203, 3, 203, 253, 253, 203, 1, 208, + 209, 203, 253, 253, 203, 1, 208, 209, + 203, 259, 203, 253, 253, 203, 1, 208, + 209, 203, 259, 203, 260, 253, 203, 1, + 208, 209, 203, 203, 4, 203, 19, 203, + 262, 262, 6, 1, 208, 209, 203, 203, + 203, 217, 203, 263, 28, 264, 265, 9, + 1, 208, 209, 203, 203, 203, 217, 203, + 28, 264, 265, 9, 1, 208, 209, 203, + 203, 203, 217, 203, 264, 264, 9, 1, + 208, 209, 203, 203, 203, 217, 203, 266, + 25, 267, 268, 12, 1, 208, 209, 203, + 203, 203, 217, 203, 25, 267, 268, 12, + 1, 208, 209, 203, 203, 203, 217, 203, + 267, 267, 12, 1, 208, 209, 203, 203, + 203, 217, 203, 269, 22, 270, 271, 15, + 1, 208, 209, 203, 203, 203, 217, 203, + 22, 270, 271, 15, 1, 208, 209, 203, + 203, 203, 217, 203, 270, 270, 15, 1, + 208, 209, 203, 203, 203, 217, 203, 272, + 19, 253, 273, 203, 1, 208, 209, 203, + 203, 203, 217, 203, 19, 253, 273, 203, + 1, 208, 209, 203, 203, 203, 217, 203, + 253, 274, 203, 1, 208, 209, 203, 203, + 203, 217, 203, 19, 203, 253, 253, 203, + 1, 208, 209, 203, 203, 203, 217, 203, + 2, 3, 203, 203, 19, 252, 203, 1, + 208, 209, 203, 203, 203, 217, 203, 2, + 203, 246, 251, 251, 6, 1, 208, 209, + 203, 203, 203, 249, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 212, 203, 246, 251, + 251, 6, 1, 208, 209, 203, 203, 203, + 249, 203, 245, 246, 251, 251, 6, 1, + 208, 209, 203, 203, 203, 249, 203, 203, + 211, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 212, 203, + 245, 246, 247, 251, 6, 1, 208, 209, + 203, 203, 30, 249, 203, 203, 211, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 212, 203, 243, 203, + 275, 203, 262, 262, 6, 1, 208, 209, + 203, 203, 203, 217, 203, 243, 203, 243, + 203, 203, 203, 253, 253, 203, 1, 208, + 209, 203, 203, 203, 217, 203, 243, 203, + 243, 203, 203, 203, 253, 276, 203, 1, + 208, 209, 203, 203, 203, 217, 203, 243, + 203, 243, 203, 275, 203, 253, 253, 203, + 1, 208, 209, 203, 203, 203, 217, 203, + 243, 203, 243, 3, 203, 203, 19, 244, + 203, 1, 208, 209, 203, 203, 203, 217, + 203, 243, 203, 236, 237, 242, 242, 6, + 1, 208, 209, 203, 203, 203, 240, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 236, 237, 238, 242, 6, 1, 208, + 209, 203, 203, 32, 240, 203, 203, 211, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 212, 203, 234, + 203, 277, 203, 262, 262, 6, 1, 208, + 209, 203, 203, 203, 217, 203, 234, 203, + 234, 203, 203, 203, 253, 253, 203, 1, + 208, 209, 203, 203, 203, 217, 203, 234, + 203, 234, 203, 203, 203, 253, 278, 203, + 1, 208, 209, 203, 203, 203, 217, 203, + 234, 203, 234, 203, 277, 203, 253, 253, + 203, 1, 208, 209, 203, 203, 203, 217, + 203, 234, 203, 234, 3, 203, 203, 19, + 235, 203, 1, 208, 209, 203, 203, 203, + 217, 203, 234, 203, 227, 228, 233, 233, + 6, 1, 208, 209, 203, 203, 203, 231, + 203, 203, 211, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 212, 203, 227, 228, 229, 233, 6, 1, + 208, 209, 203, 203, 34, 231, 203, 203, + 211, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 212, 203, + 225, 203, 279, 203, 262, 262, 6, 1, + 208, 209, 203, 203, 203, 217, 203, 225, + 203, 225, 203, 203, 203, 253, 253, 203, + 1, 208, 209, 203, 203, 203, 217, 203, + 225, 203, 225, 203, 203, 203, 253, 280, + 203, 1, 208, 209, 203, 203, 203, 217, + 203, 225, 203, 225, 203, 279, 203, 253, + 253, 203, 1, 208, 209, 203, 203, 203, + 217, 203, 225, 203, 225, 3, 203, 203, + 19, 226, 203, 1, 208, 209, 203, 203, + 203, 217, 203, 225, 203, 218, 219, 224, + 224, 6, 1, 208, 209, 203, 203, 203, + 222, 203, 203, 211, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 212, 203, 218, 219, 220, 224, 6, + 1, 208, 209, 203, 203, 36, 222, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 215, 203, 281, 203, 262, 262, 6, + 1, 208, 209, 203, 203, 203, 217, 203, + 215, 203, 215, 203, 203, 203, 253, 253, + 203, 1, 208, 209, 203, 203, 203, 217, + 203, 215, 203, 215, 203, 203, 203, 253, + 282, 203, 1, 208, 209, 203, 203, 203, + 217, 203, 215, 203, 215, 203, 281, 203, + 253, 253, 203, 1, 208, 209, 203, 203, + 203, 217, 203, 215, 203, 215, 3, 203, + 203, 19, 216, 203, 1, 208, 209, 203, + 203, 203, 217, 203, 215, 203, 204, 205, + 214, 214, 6, 1, 208, 209, 203, 203, + 203, 210, 203, 203, 211, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 212, 203, 204, 205, 206, 214, + 6, 1, 208, 209, 203, 203, 38, 210, + 203, 203, 211, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 212, 203, 284, 285, 286, 287, 45, 40, + 288, 289, 283, 283, 77, 290, 283, 283, + 291, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 292, 283, + 293, 285, 294, 287, 45, 40, 288, 289, + 283, 283, 283, 290, 283, 283, 291, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 292, 283, 285, 294, + 287, 45, 40, 288, 289, 283, 283, 283, + 290, 283, 283, 291, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 292, 283, 295, 283, 283, 283, 58, + 296, 283, 40, 288, 289, 283, 283, 283, + 297, 283, 295, 283, 298, 299, 300, 301, + 45, 40, 288, 289, 283, 283, 75, 302, + 283, 283, 291, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 292, 283, 303, 299, 304, 304, 45, 40, + 288, 289, 283, 283, 283, 302, 283, 283, + 291, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 292, 283, + 299, 304, 304, 45, 40, 288, 289, 283, + 283, 283, 302, 283, 283, 291, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 292, 283, 305, 283, 283, + 283, 58, 306, 283, 40, 288, 289, 283, + 283, 283, 297, 283, 305, 283, 307, 308, + 309, 310, 45, 40, 288, 289, 283, 283, + 73, 311, 283, 283, 291, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 292, 283, 312, 308, 313, 313, + 45, 40, 288, 289, 283, 283, 283, 311, + 283, 283, 291, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 292, 283, 308, 313, 313, 45, 40, 288, + 289, 283, 283, 283, 311, 283, 283, 291, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 292, 283, 314, + 283, 283, 283, 58, 315, 283, 40, 288, + 289, 283, 283, 283, 297, 283, 314, 283, + 316, 317, 318, 319, 45, 40, 288, 289, + 283, 283, 71, 320, 283, 283, 291, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 292, 283, 321, 317, + 322, 322, 45, 40, 288, 289, 283, 283, + 283, 320, 283, 283, 291, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 292, 283, 317, 322, 322, 45, + 40, 288, 289, 283, 283, 283, 320, 283, + 283, 291, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 292, + 283, 323, 283, 283, 283, 58, 324, 283, + 40, 288, 289, 283, 283, 283, 297, 283, + 323, 283, 325, 326, 327, 328, 45, 40, + 288, 289, 283, 283, 69, 329, 283, 283, + 291, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 292, 283, + 330, 326, 331, 331, 45, 40, 288, 289, + 283, 283, 283, 329, 283, 283, 291, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 292, 283, 326, 331, + 331, 45, 40, 288, 289, 283, 283, 283, + 329, 283, 283, 291, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 292, 283, 58, 332, 283, 40, 288, + 289, 283, 283, 283, 297, 283, 333, 333, + 283, 40, 288, 289, 283, 283, 283, 297, + 283, 334, 283, 283, 335, 288, 289, 283, + 288, 289, 283, 336, 283, 288, 337, 283, + 288, 338, 283, 288, 283, 334, 283, 283, + 283, 288, 289, 283, 339, 283, 340, 341, + 283, 40, 288, 289, 283, 283, 43, 283, + 42, 283, 333, 333, 283, 40, 288, 289, + 283, 333, 333, 283, 40, 288, 289, 283, + 339, 283, 333, 333, 283, 40, 288, 289, + 283, 339, 283, 340, 333, 283, 40, 288, + 289, 283, 283, 43, 283, 58, 283, 342, + 342, 45, 40, 288, 289, 283, 283, 283, + 297, 283, 343, 67, 344, 345, 48, 40, + 288, 289, 283, 283, 283, 297, 283, 67, + 344, 345, 48, 40, 288, 289, 283, 283, + 283, 297, 283, 344, 344, 48, 40, 288, + 289, 283, 283, 283, 297, 283, 346, 64, + 347, 348, 51, 40, 288, 289, 283, 283, + 283, 297, 283, 64, 347, 348, 51, 40, + 288, 289, 283, 283, 283, 297, 283, 347, + 347, 51, 40, 288, 289, 283, 283, 283, + 297, 283, 349, 61, 350, 351, 54, 40, + 288, 289, 283, 283, 283, 297, 283, 61, + 350, 351, 54, 40, 288, 289, 283, 283, + 283, 297, 283, 350, 350, 54, 40, 288, + 289, 283, 283, 283, 297, 283, 352, 58, + 333, 353, 283, 40, 288, 289, 283, 283, + 283, 297, 283, 58, 333, 353, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 333, + 354, 283, 40, 288, 289, 283, 283, 283, + 297, 283, 58, 283, 333, 333, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 41, + 42, 283, 283, 58, 332, 283, 40, 288, + 289, 283, 283, 283, 297, 283, 41, 283, + 326, 331, 331, 45, 40, 288, 289, 283, + 283, 283, 329, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 292, 283, 326, 331, 331, + 45, 40, 288, 289, 283, 283, 283, 329, + 283, 325, 326, 331, 331, 45, 40, 288, + 289, 283, 283, 283, 329, 283, 283, 291, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 292, 283, 325, + 326, 327, 331, 45, 40, 288, 289, 283, + 283, 69, 329, 283, 283, 291, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 292, 283, 323, 283, 355, + 283, 342, 342, 45, 40, 288, 289, 283, + 283, 283, 297, 283, 323, 283, 323, 283, + 283, 283, 333, 333, 283, 40, 288, 289, + 283, 283, 283, 297, 283, 323, 283, 323, + 283, 283, 283, 333, 356, 283, 40, 288, + 289, 283, 283, 283, 297, 283, 323, 283, + 323, 283, 355, 283, 333, 333, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 323, + 283, 323, 42, 283, 283, 58, 324, 283, + 40, 288, 289, 283, 283, 283, 297, 283, + 323, 283, 316, 317, 322, 322, 45, 40, + 288, 289, 283, 283, 283, 320, 283, 283, + 291, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 292, 283, + 316, 317, 318, 322, 45, 40, 288, 289, + 283, 283, 71, 320, 283, 283, 291, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 292, 283, 314, 283, + 357, 283, 342, 342, 45, 40, 288, 289, + 283, 283, 283, 297, 283, 314, 283, 314, + 283, 283, 283, 333, 333, 283, 40, 288, + 289, 283, 283, 283, 297, 283, 314, 283, + 314, 283, 283, 283, 333, 358, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 314, + 283, 314, 283, 357, 283, 333, 333, 283, + 40, 288, 289, 283, 283, 283, 297, 283, + 314, 283, 314, 42, 283, 283, 58, 315, + 283, 40, 288, 289, 283, 283, 283, 297, + 283, 314, 283, 307, 308, 313, 313, 45, + 40, 288, 289, 283, 283, 283, 311, 283, + 283, 291, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 292, + 283, 307, 308, 309, 313, 45, 40, 288, + 289, 283, 283, 73, 311, 283, 283, 291, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 292, 283, 305, + 283, 359, 283, 342, 342, 45, 40, 288, + 289, 283, 283, 283, 297, 283, 305, 283, + 305, 283, 283, 283, 333, 333, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 305, + 283, 305, 283, 283, 283, 333, 360, 283, + 40, 288, 289, 283, 283, 283, 297, 283, + 305, 283, 305, 283, 359, 283, 333, 333, + 283, 40, 288, 289, 283, 283, 283, 297, + 283, 305, 283, 305, 42, 283, 283, 58, + 306, 283, 40, 288, 289, 283, 283, 283, + 297, 283, 305, 283, 298, 299, 304, 304, + 45, 40, 288, 289, 283, 283, 283, 302, + 283, 283, 291, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 292, 283, 298, 299, 300, 304, 45, 40, + 288, 289, 283, 283, 75, 302, 283, 283, + 291, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 292, 283, + 295, 283, 361, 283, 342, 342, 45, 40, + 288, 289, 283, 283, 283, 297, 283, 295, + 283, 295, 283, 283, 283, 333, 333, 283, + 40, 288, 289, 283, 283, 283, 297, 283, + 295, 283, 295, 283, 283, 283, 333, 362, + 283, 40, 288, 289, 283, 283, 283, 297, + 283, 295, 283, 295, 283, 361, 283, 333, + 333, 283, 40, 288, 289, 283, 283, 283, + 297, 283, 295, 283, 76, 44, 44, 45, + 40, 283, 283, 283, 283, 283, 76, 283, + 295, 42, 283, 283, 58, 296, 283, 40, + 288, 289, 283, 283, 283, 297, 283, 295, + 283, 284, 285, 294, 287, 45, 40, 288, + 289, 283, 283, 283, 290, 283, 283, 291, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 292, 283, 364, + 191, 365, 365, 84, 79, 194, 195, 363, + 363, 363, 197, 363, 363, 200, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 202, 363, 191, 365, 365, + 84, 79, 194, 195, 363, 363, 363, 197, + 363, 363, 200, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 202, 363, 366, 363, 363, 363, 98, 367, + 363, 79, 194, 195, 363, 363, 363, 368, + 363, 366, 363, 369, 370, 371, 372, 84, + 79, 194, 195, 363, 363, 115, 373, 363, + 363, 200, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 202, + 363, 374, 370, 375, 375, 84, 79, 194, + 195, 363, 363, 363, 373, 363, 363, 200, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 202, 363, 370, + 375, 375, 84, 79, 194, 195, 363, 363, + 363, 373, 363, 363, 200, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 202, 363, 376, 363, 363, 363, + 98, 377, 363, 79, 194, 195, 363, 363, + 363, 368, 363, 376, 363, 378, 379, 380, + 381, 84, 79, 194, 195, 363, 363, 113, + 382, 363, 363, 200, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 202, 363, 383, 379, 384, 384, 84, + 79, 194, 195, 363, 363, 363, 382, 363, + 363, 200, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 202, + 363, 379, 384, 384, 84, 79, 194, 195, + 363, 363, 363, 382, 363, 363, 200, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 202, 363, 385, 363, + 363, 363, 98, 386, 363, 79, 194, 195, + 363, 363, 363, 368, 363, 385, 363, 387, + 388, 389, 390, 84, 79, 194, 195, 363, + 363, 111, 391, 363, 363, 200, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 202, 363, 392, 388, 393, + 393, 84, 79, 194, 195, 363, 363, 363, + 391, 363, 363, 200, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 202, 363, 388, 393, 393, 84, 79, + 194, 195, 363, 363, 363, 391, 363, 363, + 200, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 202, 363, + 394, 363, 363, 363, 98, 395, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 394, + 363, 396, 397, 398, 399, 84, 79, 194, + 195, 363, 363, 109, 400, 363, 363, 200, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 202, 363, 401, + 397, 402, 402, 84, 79, 194, 195, 363, + 363, 363, 400, 363, 363, 200, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 202, 363, 397, 402, 402, + 84, 79, 194, 195, 363, 363, 363, 400, + 363, 363, 200, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 202, 363, 98, 403, 363, 79, 194, 195, + 363, 363, 363, 368, 363, 404, 404, 363, + 79, 194, 195, 363, 363, 363, 368, 363, + 405, 363, 363, 406, 194, 195, 363, 194, + 195, 363, 407, 363, 194, 408, 363, 194, + 409, 363, 194, 363, 405, 363, 363, 363, + 194, 195, 363, 410, 363, 411, 412, 363, + 79, 194, 195, 363, 363, 82, 363, 81, + 363, 404, 404, 363, 79, 194, 195, 363, + 404, 404, 363, 79, 194, 195, 363, 410, + 363, 404, 404, 363, 79, 194, 195, 363, + 410, 363, 411, 404, 363, 79, 194, 195, + 363, 363, 82, 363, 98, 363, 413, 413, + 84, 79, 194, 195, 363, 363, 363, 368, + 363, 414, 107, 415, 416, 88, 79, 194, + 195, 363, 363, 363, 368, 363, 107, 415, + 416, 88, 79, 194, 195, 363, 363, 363, + 368, 363, 415, 415, 88, 79, 194, 195, + 363, 363, 363, 368, 363, 417, 104, 418, + 419, 91, 79, 194, 195, 363, 363, 363, + 368, 363, 104, 418, 419, 91, 79, 194, + 195, 363, 363, 363, 368, 363, 418, 418, + 91, 79, 194, 195, 363, 363, 363, 368, + 363, 420, 101, 421, 422, 94, 79, 194, + 195, 363, 363, 363, 368, 363, 101, 421, + 422, 94, 79, 194, 195, 363, 363, 363, + 368, 363, 421, 421, 94, 79, 194, 195, + 363, 363, 363, 368, 363, 423, 98, 404, + 424, 363, 79, 194, 195, 363, 363, 363, + 368, 363, 98, 404, 424, 363, 79, 194, + 195, 363, 363, 363, 368, 363, 404, 425, + 363, 79, 194, 195, 363, 363, 363, 368, + 363, 98, 363, 404, 404, 363, 79, 194, + 195, 363, 363, 363, 368, 363, 80, 81, + 363, 363, 98, 403, 363, 79, 194, 195, + 363, 363, 363, 368, 363, 80, 363, 397, + 402, 402, 84, 79, 194, 195, 363, 363, + 363, 400, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 202, 363, 397, 402, 402, 84, + 79, 194, 195, 363, 363, 363, 400, 363, + 396, 397, 402, 402, 84, 79, 194, 195, + 363, 363, 363, 400, 363, 363, 200, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 202, 363, 396, 397, + 398, 402, 84, 79, 194, 195, 363, 363, + 109, 400, 363, 363, 200, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 202, 363, 394, 363, 426, 363, + 413, 413, 84, 79, 194, 195, 363, 363, + 363, 368, 363, 394, 363, 394, 363, 363, + 363, 404, 404, 363, 79, 194, 195, 363, + 363, 363, 368, 363, 394, 363, 394, 363, + 363, 363, 404, 427, 363, 79, 194, 195, + 363, 363, 363, 368, 363, 394, 363, 394, + 363, 426, 363, 404, 404, 363, 79, 194, + 195, 363, 363, 363, 368, 363, 394, 363, + 394, 81, 363, 363, 98, 395, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 394, + 363, 387, 388, 393, 393, 84, 79, 194, + 195, 363, 363, 363, 391, 363, 363, 200, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 202, 363, 387, + 388, 389, 393, 84, 79, 194, 195, 363, + 363, 111, 391, 363, 363, 200, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 202, 363, 385, 363, 428, + 363, 413, 413, 84, 79, 194, 195, 363, + 363, 363, 368, 363, 385, 363, 385, 363, + 363, 363, 404, 404, 363, 79, 194, 195, + 363, 363, 363, 368, 363, 385, 363, 385, + 363, 363, 363, 404, 429, 363, 79, 194, + 195, 363, 363, 363, 368, 363, 385, 363, + 385, 363, 428, 363, 404, 404, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 385, + 363, 385, 81, 363, 363, 98, 386, 363, + 79, 194, 195, 363, 363, 363, 368, 363, + 385, 363, 378, 379, 384, 384, 84, 79, + 194, 195, 363, 363, 363, 382, 363, 363, + 200, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 202, 363, + 378, 379, 380, 384, 84, 79, 194, 195, + 363, 363, 113, 382, 363, 363, 200, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 202, 363, 376, 363, + 430, 363, 413, 413, 84, 79, 194, 195, + 363, 363, 363, 368, 363, 376, 363, 376, + 363, 363, 363, 404, 404, 363, 79, 194, + 195, 363, 363, 363, 368, 363, 376, 363, + 376, 363, 363, 363, 404, 431, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 376, + 363, 376, 363, 430, 363, 404, 404, 363, + 79, 194, 195, 363, 363, 363, 368, 363, + 376, 363, 376, 81, 363, 363, 98, 377, + 363, 79, 194, 195, 363, 363, 363, 368, + 363, 376, 363, 369, 370, 375, 375, 84, + 79, 194, 195, 363, 363, 363, 373, 363, + 363, 200, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 202, + 363, 369, 370, 371, 375, 84, 79, 194, + 195, 363, 363, 115, 373, 363, 363, 200, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 202, 363, 366, + 363, 432, 363, 413, 413, 84, 79, 194, + 195, 363, 363, 363, 368, 363, 366, 363, + 366, 363, 363, 363, 404, 404, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 366, + 363, 366, 363, 363, 363, 404, 433, 363, + 79, 194, 195, 363, 363, 363, 368, 363, + 366, 363, 366, 363, 432, 363, 404, 404, + 363, 79, 194, 195, 363, 363, 363, 368, + 363, 366, 363, 366, 81, 363, 363, 98, + 367, 363, 79, 194, 195, 363, 363, 363, + 368, 363, 366, 363, 116, 83, 83, 84, + 79, 434, 434, 434, 434, 156, 116, 434, + 190, 191, 365, 365, 84, 79, 194, 195, + 363, 363, 363, 197, 363, 363, 200, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 202, 363, 116, 83, + 83, 84, 79, 434, 434, 434, 434, 434, + 116, 434, 436, 437, 438, 439, 123, 118, + 440, 441, 435, 435, 155, 442, 435, 435, + 443, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 444, 435, + 445, 437, 439, 439, 123, 118, 440, 441, + 435, 435, 435, 442, 435, 435, 443, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 444, 435, 437, 439, + 439, 123, 118, 440, 441, 435, 435, 435, + 442, 435, 435, 443, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 444, 435, 446, 435, 435, 435, 136, + 447, 435, 118, 440, 441, 435, 435, 435, + 448, 435, 446, 435, 449, 450, 451, 452, + 123, 118, 440, 441, 435, 435, 153, 453, + 435, 435, 443, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 444, 435, 454, 450, 455, 455, 123, 118, + 440, 441, 435, 435, 435, 453, 435, 435, + 443, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 444, 435, + 450, 455, 455, 123, 118, 440, 441, 435, + 435, 435, 453, 435, 435, 443, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 444, 435, 456, 435, 435, + 435, 136, 457, 435, 118, 440, 441, 435, + 435, 435, 448, 435, 456, 435, 458, 459, + 460, 461, 123, 118, 440, 441, 435, 435, + 151, 462, 435, 435, 443, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 444, 435, 463, 459, 464, 464, + 123, 118, 440, 441, 435, 435, 435, 462, + 435, 435, 443, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 444, 435, 459, 464, 464, 123, 118, 440, + 441, 435, 435, 435, 462, 435, 435, 443, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 444, 435, 465, + 435, 435, 435, 136, 466, 435, 118, 440, + 441, 435, 435, 435, 448, 435, 465, 435, + 467, 468, 469, 470, 123, 118, 440, 441, + 435, 435, 149, 471, 435, 435, 443, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 444, 435, 472, 468, + 473, 473, 123, 118, 440, 441, 435, 435, + 435, 471, 435, 435, 443, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 444, 435, 468, 473, 473, 123, + 118, 440, 441, 435, 435, 435, 471, 435, + 435, 443, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 444, + 435, 474, 435, 435, 435, 136, 475, 435, + 118, 440, 441, 435, 435, 435, 448, 435, + 474, 435, 476, 477, 478, 479, 123, 118, + 440, 441, 435, 435, 147, 480, 435, 435, + 443, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 444, 435, + 481, 477, 482, 482, 123, 118, 440, 441, + 435, 435, 435, 480, 435, 435, 443, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 444, 435, 477, 482, + 482, 123, 118, 440, 441, 435, 435, 435, + 480, 435, 435, 443, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 444, 435, 136, 483, 435, 118, 440, + 441, 435, 435, 435, 448, 435, 484, 484, + 435, 118, 440, 441, 435, 435, 435, 448, + 435, 485, 435, 435, 486, 440, 441, 435, + 440, 441, 435, 487, 435, 440, 488, 435, + 440, 489, 435, 440, 435, 485, 435, 435, + 435, 440, 441, 435, 490, 435, 491, 492, + 435, 118, 440, 441, 435, 435, 121, 435, + 120, 435, 484, 484, 435, 118, 440, 441, + 435, 484, 484, 435, 118, 440, 441, 435, + 490, 435, 484, 484, 435, 118, 440, 441, + 435, 490, 435, 491, 484, 435, 118, 440, + 441, 435, 435, 121, 435, 136, 435, 493, + 493, 123, 118, 440, 441, 435, 435, 435, + 448, 435, 494, 145, 495, 496, 126, 118, + 440, 441, 435, 435, 435, 448, 435, 145, + 495, 496, 126, 118, 440, 441, 435, 435, + 435, 448, 435, 495, 495, 126, 118, 440, + 441, 435, 435, 435, 448, 435, 497, 142, + 498, 499, 129, 118, 440, 441, 435, 435, + 435, 448, 435, 142, 498, 499, 129, 118, + 440, 441, 435, 435, 435, 448, 435, 498, + 498, 129, 118, 440, 441, 435, 435, 435, + 448, 435, 500, 139, 501, 502, 132, 118, + 440, 441, 435, 435, 435, 448, 435, 139, + 501, 502, 132, 118, 440, 441, 435, 435, + 435, 448, 435, 501, 501, 132, 118, 440, + 441, 435, 435, 435, 448, 435, 503, 136, + 484, 504, 435, 118, 440, 441, 435, 435, + 435, 448, 435, 136, 484, 504, 435, 118, + 440, 441, 435, 435, 435, 448, 435, 484, + 505, 435, 118, 440, 441, 435, 435, 435, + 448, 435, 136, 435, 484, 484, 435, 118, + 440, 441, 435, 435, 435, 448, 435, 119, + 120, 435, 435, 136, 483, 435, 118, 440, + 441, 435, 435, 435, 448, 435, 119, 435, + 477, 482, 482, 123, 118, 440, 441, 435, + 435, 435, 480, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 444, 435, 477, 482, 482, + 123, 118, 440, 441, 435, 435, 435, 480, + 435, 476, 477, 482, 482, 123, 118, 440, + 441, 435, 435, 435, 480, 435, 435, 443, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 444, 435, 476, + 477, 478, 482, 123, 118, 440, 441, 435, + 435, 147, 480, 435, 435, 443, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 444, 435, 474, 435, 506, + 435, 493, 493, 123, 118, 440, 441, 435, + 435, 435, 448, 435, 474, 435, 474, 435, + 435, 435, 484, 484, 435, 118, 440, 441, + 435, 435, 435, 448, 435, 474, 435, 474, + 435, 435, 435, 484, 507, 435, 118, 440, + 441, 435, 435, 435, 448, 435, 474, 435, + 474, 435, 506, 435, 484, 484, 435, 118, + 440, 441, 435, 435, 435, 448, 435, 474, + 435, 474, 120, 435, 435, 136, 475, 435, + 118, 440, 441, 435, 435, 435, 448, 435, + 474, 435, 467, 468, 473, 473, 123, 118, + 440, 441, 435, 435, 435, 471, 435, 435, + 443, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 444, 435, + 467, 468, 469, 473, 123, 118, 440, 441, + 435, 435, 149, 471, 435, 435, 443, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 444, 435, 465, 435, + 508, 435, 493, 493, 123, 118, 440, 441, + 435, 435, 435, 448, 435, 465, 435, 465, + 435, 435, 435, 484, 484, 435, 118, 440, + 441, 435, 435, 435, 448, 435, 465, 435, + 465, 435, 435, 435, 484, 509, 435, 118, + 440, 441, 435, 435, 435, 448, 435, 465, + 435, 465, 435, 508, 435, 484, 484, 435, + 118, 440, 441, 435, 435, 435, 448, 435, + 465, 435, 465, 120, 435, 435, 136, 466, + 435, 118, 440, 441, 435, 435, 435, 448, + 435, 465, 435, 458, 459, 464, 464, 123, + 118, 440, 441, 435, 435, 435, 462, 435, + 435, 443, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 444, + 435, 458, 459, 460, 464, 123, 118, 440, + 441, 435, 435, 151, 462, 435, 435, 443, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 444, 435, 456, + 435, 510, 435, 493, 493, 123, 118, 440, + 441, 435, 435, 435, 448, 435, 456, 435, + 456, 435, 435, 435, 484, 484, 435, 118, + 440, 441, 435, 435, 435, 448, 435, 456, + 435, 456, 435, 435, 435, 484, 511, 435, + 118, 440, 441, 435, 435, 435, 448, 435, + 456, 435, 456, 435, 510, 435, 484, 484, + 435, 118, 440, 441, 435, 435, 435, 448, + 435, 456, 435, 456, 120, 435, 435, 136, + 457, 435, 118, 440, 441, 435, 435, 435, + 448, 435, 456, 435, 449, 450, 455, 455, + 123, 118, 440, 441, 435, 435, 435, 453, + 435, 435, 443, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 444, 435, 449, 450, 451, 455, 123, 118, + 440, 441, 435, 435, 153, 453, 435, 435, + 443, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 444, 435, + 446, 435, 512, 435, 493, 493, 123, 118, + 440, 441, 435, 435, 435, 448, 435, 446, + 435, 446, 435, 435, 435, 484, 484, 435, + 118, 440, 441, 435, 435, 435, 448, 435, + 446, 435, 446, 435, 435, 435, 484, 513, + 435, 118, 440, 441, 435, 435, 435, 448, + 435, 446, 435, 446, 435, 512, 435, 484, + 484, 435, 118, 440, 441, 435, 435, 435, + 448, 435, 446, 435, 446, 120, 435, 435, + 136, 447, 435, 118, 440, 441, 435, 435, + 435, 448, 435, 446, 435, 436, 437, 439, + 439, 123, 118, 440, 441, 435, 435, 435, + 442, 435, 435, 443, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 435, + 435, 444, 435, 188, 189, 190, 191, 514, + 365, 84, 79, 194, 195, 196, 196, 156, + 197, 363, 188, 200, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, + 363, 202, 363, 204, 515, 206, 207, 6, + 1, 208, 209, 203, 203, 38, 210, 203, + 203, 211, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 212, + 203, 215, 189, 190, 191, 516, 517, 84, + 157, 518, 519, 203, 196, 156, 520, 203, + 215, 200, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 202, + 203, 116, 521, 521, 84, 157, 208, 209, + 203, 203, 156, 522, 203, 523, 203, 203, + 524, 518, 519, 203, 518, 519, 203, 256, + 203, 518, 525, 203, 518, 526, 203, 518, + 203, 523, 203, 203, 203, 518, 519, 203, + 527, 3, 363, 363, 404, 433, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 527, + 363, 528, 370, 529, 530, 84, 157, 518, + 519, 203, 203, 158, 373, 203, 203, 200, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 202, 203, 531, + 370, 532, 532, 84, 157, 518, 519, 203, + 203, 203, 373, 203, 203, 200, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 202, 203, 370, 532, 532, + 84, 157, 518, 519, 203, 203, 203, 373, + 203, 203, 200, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 202, 203, 528, 370, 532, 532, 84, 157, + 518, 519, 203, 203, 203, 373, 203, 203, + 200, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 202, 203, + 528, 370, 529, 532, 84, 157, 518, 519, + 203, 203, 158, 373, 203, 203, 200, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 202, 203, 215, 203, + 281, 116, 533, 533, 160, 157, 208, 209, + 203, 203, 203, 522, 203, 215, 203, 534, + 184, 535, 536, 162, 157, 518, 519, 203, + 203, 203, 537, 203, 184, 535, 536, 162, + 157, 518, 519, 203, 203, 203, 537, 203, + 535, 535, 162, 157, 518, 519, 203, 203, + 203, 537, 203, 538, 181, 539, 540, 165, + 157, 518, 519, 203, 203, 203, 537, 203, + 181, 539, 540, 165, 157, 518, 519, 203, + 203, 203, 537, 203, 539, 539, 165, 157, + 518, 519, 203, 203, 203, 537, 203, 541, + 178, 542, 543, 168, 157, 518, 519, 203, + 203, 203, 537, 203, 178, 542, 543, 168, + 157, 518, 519, 203, 203, 203, 537, 203, + 542, 542, 168, 157, 518, 519, 203, 203, + 203, 537, 203, 544, 175, 545, 546, 203, + 157, 518, 519, 203, 203, 203, 537, 203, + 175, 545, 546, 203, 157, 518, 519, 203, + 203, 203, 537, 203, 545, 545, 203, 157, + 518, 519, 203, 203, 203, 537, 203, 547, + 203, 548, 549, 203, 157, 518, 519, 203, + 203, 172, 203, 171, 203, 545, 545, 203, + 157, 518, 519, 203, 545, 545, 203, 157, + 518, 519, 203, 547, 203, 545, 545, 203, + 157, 518, 519, 203, 547, 203, 548, 545, + 203, 157, 518, 519, 203, 203, 172, 203, + 527, 171, 363, 363, 98, 367, 363, 79, + 194, 195, 363, 363, 363, 368, 363, 527, + 363, 551, 550, 552, 552, 550, 186, 553, + 554, 550, 552, 552, 550, 186, 553, 554, + 550, 555, 550, 550, 556, 553, 554, 550, + 553, 554, 550, 557, 550, 553, 558, 550, + 553, 559, 550, 553, 550, 555, 550, 550, + 550, 553, 554, 550, 0 }; static const short _indic_syllable_machine_trans_targs[] = { - 170, 199, 201, 202, 3, 205, 4, 6, - 208, 7, 9, 211, 10, 12, 214, 13, - 15, 16, 191, 18, 19, 213, 21, 22, - 210, 24, 25, 207, 216, 221, 225, 228, - 232, 235, 239, 242, 246, 249, 170, 279, - 281, 282, 39, 285, 40, 42, 288, 43, - 45, 291, 46, 48, 294, 49, 51, 52, - 271, 54, 55, 293, 57, 58, 290, 60, - 61, 287, 296, 301, 305, 308, 312, 315, - 319, 322, 326, 330, 170, 358, 360, 361, - 75, 364, 170, 76, 78, 367, 79, 81, - 370, 82, 84, 373, 85, 87, 88, 350, - 90, 91, 372, 93, 94, 369, 96, 97, - 366, 375, 380, 384, 387, 391, 394, 398, - 401, 405, 170, 439, 441, 442, 110, 445, - 111, 113, 448, 114, 116, 451, 117, 119, - 454, 120, 122, 123, 431, 125, 126, 453, - 128, 129, 450, 131, 132, 447, 456, 461, - 465, 468, 472, 475, 479, 482, 486, 489, - 409, 505, 146, 508, 148, 511, 149, 151, - 514, 152, 154, 517, 155, 520, 522, 523, - 159, 160, 519, 162, 163, 516, 165, 166, - 513, 168, 169, 510, 170, 171, 251, 331, - 333, 408, 410, 351, 353, 354, 411, 407, - 490, 491, 378, 526, 379, 170, 172, 174, - 35, 250, 192, 194, 195, 248, 219, 220, - 173, 34, 175, 244, 0, 176, 178, 33, - 243, 241, 177, 32, 179, 237, 180, 182, - 31, 236, 234, 181, 30, 183, 230, 184, - 186, 29, 229, 227, 185, 28, 187, 223, - 188, 190, 27, 222, 218, 189, 26, 204, - 193, 198, 170, 196, 197, 200, 1, 203, - 2, 206, 5, 23, 209, 8, 20, 212, - 11, 17, 215, 14, 217, 224, 226, 231, - 233, 238, 240, 245, 247, 170, 252, 254, - 71, 328, 272, 274, 275, 329, 299, 300, - 253, 70, 255, 324, 36, 256, 258, 69, - 323, 321, 257, 68, 259, 317, 260, 262, - 67, 316, 314, 261, 66, 263, 310, 264, - 266, 65, 309, 307, 265, 64, 267, 303, - 268, 270, 63, 302, 298, 269, 62, 284, - 273, 278, 170, 276, 277, 280, 37, 283, - 38, 286, 41, 59, 289, 44, 56, 292, - 47, 53, 295, 50, 297, 304, 306, 311, - 313, 318, 320, 325, 327, 170, 332, 106, - 334, 403, 72, 335, 337, 105, 402, 400, - 336, 104, 338, 396, 339, 341, 103, 395, - 393, 340, 102, 342, 389, 343, 345, 101, - 388, 386, 344, 100, 346, 382, 347, 349, - 99, 381, 377, 348, 98, 363, 352, 357, - 170, 355, 356, 359, 73, 362, 74, 365, - 77, 95, 368, 80, 92, 371, 83, 89, - 374, 86, 376, 383, 385, 390, 392, 397, - 399, 404, 406, 170, 170, 412, 414, 142, - 141, 432, 434, 435, 488, 459, 460, 413, - 415, 484, 107, 416, 418, 140, 483, 481, - 417, 139, 419, 477, 420, 422, 138, 476, - 474, 421, 137, 423, 470, 424, 426, 136, - 469, 467, 425, 135, 427, 463, 428, 430, - 134, 462, 458, 429, 133, 444, 433, 438, - 170, 436, 437, 440, 108, 443, 109, 446, - 112, 130, 449, 115, 127, 452, 118, 124, - 455, 121, 457, 464, 466, 471, 473, 478, - 480, 485, 487, 143, 492, 493, 507, 498, - 500, 501, 525, 494, 495, 496, 144, 506, - 497, 499, 504, 502, 503, 145, 509, 147, - 167, 156, 512, 150, 164, 515, 153, 161, - 518, 158, 521, 157, 524, 170, 527, 528, - 530, 531, 529, 534, 170, 532, 533 + 178, 200, 207, 209, 210, 4, 213, 5, + 7, 216, 8, 10, 219, 11, 13, 222, + 14, 16, 17, 199, 19, 20, 221, 22, + 23, 218, 25, 26, 215, 224, 229, 233, + 236, 240, 243, 247, 250, 254, 257, 178, + 280, 287, 289, 290, 41, 293, 42, 44, + 296, 45, 47, 299, 48, 50, 302, 51, + 53, 54, 279, 56, 57, 301, 59, 60, + 298, 62, 63, 295, 304, 309, 313, 316, + 320, 323, 327, 330, 334, 338, 178, 359, + 366, 368, 369, 78, 372, 178, 79, 81, + 375, 82, 84, 378, 85, 87, 381, 88, + 90, 91, 358, 93, 94, 380, 96, 97, + 377, 99, 100, 374, 383, 388, 392, 395, + 399, 402, 406, 409, 413, 178, 440, 447, + 449, 450, 114, 453, 115, 117, 456, 118, + 120, 459, 121, 123, 462, 124, 126, 127, + 439, 129, 130, 461, 132, 133, 458, 135, + 136, 455, 464, 469, 473, 476, 480, 483, + 487, 490, 494, 497, 417, 502, 513, 152, + 516, 154, 519, 155, 157, 522, 158, 160, + 525, 161, 528, 530, 531, 166, 167, 527, + 169, 170, 524, 172, 173, 521, 175, 176, + 518, 178, 536, 178, 179, 259, 339, 341, + 416, 418, 361, 362, 419, 415, 498, 499, + 386, 534, 387, 178, 180, 182, 36, 258, + 202, 203, 256, 227, 228, 181, 35, 183, + 252, 1, 184, 186, 34, 251, 249, 185, + 33, 187, 245, 188, 190, 32, 244, 242, + 189, 31, 191, 238, 192, 194, 30, 237, + 235, 193, 29, 195, 231, 196, 198, 28, + 230, 226, 197, 27, 212, 0, 201, 206, + 178, 204, 205, 208, 2, 211, 3, 214, + 6, 24, 217, 9, 21, 220, 12, 18, + 223, 15, 225, 232, 234, 239, 241, 246, + 248, 253, 255, 178, 260, 262, 73, 336, + 282, 283, 337, 307, 308, 261, 72, 263, + 332, 38, 264, 266, 71, 331, 329, 265, + 70, 267, 325, 268, 270, 69, 324, 322, + 269, 68, 271, 318, 272, 274, 67, 317, + 315, 273, 66, 275, 311, 276, 278, 65, + 310, 306, 277, 64, 292, 37, 281, 286, + 178, 284, 285, 288, 39, 291, 40, 294, + 43, 61, 297, 46, 58, 300, 49, 55, + 303, 52, 305, 312, 314, 319, 321, 326, + 328, 333, 335, 178, 340, 109, 342, 411, + 75, 343, 345, 108, 410, 408, 344, 107, + 346, 404, 347, 349, 106, 403, 401, 348, + 105, 350, 397, 351, 353, 104, 396, 394, + 352, 103, 354, 390, 355, 357, 102, 389, + 385, 356, 101, 371, 74, 360, 365, 178, + 363, 364, 367, 76, 370, 77, 373, 80, + 98, 376, 83, 95, 379, 86, 92, 382, + 89, 384, 391, 393, 398, 400, 405, 407, + 412, 414, 178, 178, 420, 422, 146, 145, + 442, 443, 496, 467, 468, 421, 423, 492, + 111, 424, 426, 144, 491, 489, 425, 143, + 427, 485, 428, 430, 142, 484, 482, 429, + 141, 431, 478, 432, 434, 140, 477, 475, + 433, 139, 435, 471, 436, 438, 138, 470, + 466, 437, 137, 452, 110, 441, 446, 178, + 444, 445, 448, 112, 451, 113, 454, 116, + 134, 457, 119, 131, 460, 122, 128, 463, + 125, 465, 472, 474, 479, 481, 486, 488, + 493, 495, 147, 500, 501, 515, 504, 505, + 533, 148, 509, 503, 508, 506, 507, 510, + 511, 150, 514, 512, 149, 151, 517, 153, + 174, 163, 520, 156, 171, 523, 159, 168, + 526, 162, 165, 529, 164, 532, 178, 535, + 177, 538, 539, 537, 542, 178, 540, 541 }; static const char _indic_syllable_machine_trans_actions[] = { - 1, 2, 0, 0, 0, 2, 0, 0, + 1, 0, 2, 2, 2, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 0, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 3, + 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 2, - 0, 0, 0, 2, 0, 0, 2, 0, + 2, 2, 2, 2, 2, 2, 4, 0, + 2, 2, 2, 0, 2, 5, 0, 0, + 2, 0, 0, 2, 0, 0, 2, 0, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 0, 2, 2, 6, 2, 6, + 2, 6, 2, 6, 2, 7, 0, 2, + 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 4, 2, 0, 0, - 0, 2, 5, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 0, 0, 2, + 2, 2, 2, 2, 6, 0, 8, 0, + 2, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, - 2, 2, 6, 2, 6, 2, 6, 2, - 6, 2, 7, 2, 0, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 6, 8, 0, 2, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 2, 0, 0, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 11, 2, 2, 6, - 2, 12, 12, 0, 0, 0, 2, 2, - 6, 2, 6, 0, 6, 13, 2, 2, - 0, 2, 0, 0, 0, 2, 2, 2, - 2, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 2, 2, 2, - 0, 2, 2, 2, 0, 2, 2, 2, - 2, 0, 2, 2, 2, 0, 2, 2, - 2, 2, 0, 2, 2, 2, 0, 2, - 0, 0, 14, 0, 0, 0, 0, 2, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 0, 2, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 15, 2, 2, - 0, 2, 0, 0, 0, 2, 2, 2, - 2, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 2, 2, 2, - 0, 2, 2, 2, 0, 2, 2, 2, - 2, 0, 2, 2, 2, 0, 2, 2, - 2, 2, 0, 2, 2, 2, 0, 2, - 0, 0, 16, 0, 0, 0, 0, 2, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 0, 2, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 17, 6, 0, - 6, 6, 0, 6, 2, 0, 6, 2, - 6, 0, 6, 6, 6, 2, 0, 6, - 2, 6, 0, 6, 6, 6, 2, 0, - 6, 2, 6, 0, 6, 6, 6, 2, - 0, 6, 2, 6, 0, 6, 0, 0, - 18, 0, 0, 0, 0, 2, 0, 2, + 2, 9, 0, 12, 2, 2, 6, 2, + 13, 13, 0, 0, 2, 2, 6, 2, + 6, 2, 6, 14, 2, 2, 0, 2, + 0, 0, 2, 2, 2, 2, 0, 2, + 2, 0, 2, 2, 0, 2, 2, 2, + 0, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 0, 2, 2, 2, 2, 0, + 2, 2, 2, 0, 2, 0, 0, 0, + 15, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 19, 20, 2, 2, 0, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 2, 0, 2, 2, 0, 2, 2, + 2, 2, 2, 16, 2, 2, 0, 2, + 0, 0, 2, 2, 2, 2, 0, 2, + 2, 0, 2, 2, 0, 2, 2, 2, + 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, - 2, 2, 2, 0, 2, 2, 2, 2, - 0, 2, 2, 2, 0, 2, 0, 0, - 21, 0, 0, 0, 0, 2, 0, 2, + 2, 2, 2, 0, 2, 0, 0, 0, + 17, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 0, 0, 8, 2, 0, - 0, 0, 2, 2, 8, 8, 0, 8, - 8, 0, 0, 0, 0, 0, 2, 0, + 2, 2, 2, 18, 6, 0, 6, 6, + 0, 6, 2, 0, 6, 2, 6, 0, + 6, 6, 6, 2, 0, 6, 2, 6, + 0, 6, 6, 6, 2, 0, 6, 2, + 6, 0, 6, 6, 6, 2, 0, 6, + 2, 6, 0, 6, 0, 0, 0, 19, + 0, 0, 2, 0, 2, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 20, 21, 2, 2, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 0, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 0, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 0, 2, 0, 0, 0, 22, + 0, 0, 2, 0, 2, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 8, 2, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 8, + 8, 0, 8, 8, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 2, 22, 0, 0, - 0, 0, 0, 0, 23, 0, 0 + 2, 0, 0, 2, 0, 2, 23, 2, + 0, 0, 0, 0, 0, 24, 0, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -1331,7 +1354,8 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1401,7 +1425,8 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1454,76 +1479,77 @@ static const short _indic_syllable_machine_eof_trans[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 77, 77, 77, 83, 83, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 83, 77, 77, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 77, + 1, 1, 1, 1, 1, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 79, 79, 79, 79, 86, 86, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 79, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, - 428, 358, 428, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 358, 198, 198, 198, 358, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 358, 542, 542, - 542, 542, 542, 542, 542, 542, 542 + 1, 186, 0, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, + 435, 364, 435, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 364, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 364, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 364, 551, 551, + 551, 551, 551, 551, 551, 551, 551 }; -static const int indic_syllable_machine_start = 170; -static const int indic_syllable_machine_first_final = 170; +static const int indic_syllable_machine_start = 178; +static const int indic_syllable_machine_first_final = 178; static const int indic_syllable_machine_error = -1; -static const int indic_syllable_machine_en_main = 170; +static const int indic_syllable_machine_en_main = 178; #line 36 "hb-ot-shape-complex-indic-machine.rl" @@ -1550,7 +1576,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1554 "hb-ot-shape-complex-indic-machine.hh" +#line 1580 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1567,7 +1593,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 1571 "hb-ot-shape-complex-indic-machine.hh" +#line 1597 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; @@ -1577,11 +1603,11 @@ find_syllables (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _indic_syllable_machine_from_state_actions[cs] ) { - case 10: + case 11: #line 1 "NONE" {ts = p;} break; -#line 1585 "hb-ot-shape-complex-indic-machine.hh" +#line 1611 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1603,51 +1629,51 @@ _eof_trans: #line 1 "NONE" {te = p+1;} break; - case 14: + case 15: #line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; - case 16: + case 17: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (vowel_syllable); }} break; - case 21: + case 22: #line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (standalone_cluster); }} break; - case 23: + case 24: #line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (symbol_cluster); }} break; - case 18: + case 19: #line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; - case 11: + case 12: #line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} break; - case 13: + case 14: #line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 15: + case 16: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; - case 20: + case 21: #line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; - case 22: + case 23: #line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 17: + case 18: #line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 19: + case 20: #line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; @@ -1663,6 +1689,10 @@ _eof_trans: #line 90 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} break; + case 9: +#line 91 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} + break; case 4: #line 92 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} @@ -1694,22 +1724,22 @@ _eof_trans: #line 92 "hb-ot-shape-complex-indic-machine.rl" {act = 5;} break; - case 12: + case 13: #line 1 "NONE" {te = p+1;} #line 93 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1704 "hb-ot-shape-complex-indic-machine.hh" +#line 1734 "hb-ot-shape-complex-indic-machine.hh" } _again: switch ( _indic_syllable_machine_to_state_actions[cs] ) { - case 9: + case 10: #line 1 "NONE" {ts = 0;} break; -#line 1713 "hb-ot-shape-complex-indic-machine.hh" +#line 1743 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc index f58380e0c8..2e159a12b0 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc @@ -861,41 +861,41 @@ hb_indic_get_categories (hb_codepoint_t u) switch (u >> 12) { case 0x0u: - if (hb_in_range (u, 0x0028u, 0x0040u)) return indic_table[u - 0x0028u + indic_offset_0x0028u]; - if (hb_in_range (u, 0x00D0u, 0x00D8u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u]; - if (hb_in_range (u, 0x0900u, 0x0DF8u)) return indic_table[u - 0x0900u + indic_offset_0x0900u]; + if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u]; + if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u]; + if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u]; if (unlikely (u == 0x00A0u)) return _(CP,x); break; case 0x1u: - if (hb_in_range (u, 0x1000u, 0x10A0u)) return indic_table[u - 0x1000u + indic_offset_0x1000u]; - if (hb_in_range (u, 0x1700u, 0x17F0u)) return indic_table[u - 0x1700u + indic_offset_0x1700u]; - if (hb_in_range (u, 0x1900u, 0x1AA0u)) return indic_table[u - 0x1900u + indic_offset_0x1900u]; - if (hb_in_range (u, 0x1B00u, 0x1C50u)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u]; - if (hb_in_range (u, 0x1CD0u, 0x1CF8u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u]; + if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u]; + if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u]; + if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u]; + if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u]; + if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u]; break; case 0x2u: - if (hb_in_range (u, 0x2008u, 0x2018u)) return indic_table[u - 0x2008u + indic_offset_0x2008u]; + if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u]; if (unlikely (u == 0x25CCu)) return _(CP,x); break; case 0xAu: - if (hb_in_range (u, 0xA800u, 0xAAF8u)) return indic_table[u - 0xA800u + indic_offset_0xa800u]; - if (hb_in_range (u, 0xABC0u, 0xAC00u)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u]; + if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u]; + if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u]; break; case 0x10u: - if (hb_in_range (u, 0x10A00u, 0x10A48u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u]; + if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u]; break; case 0x11u: - if (hb_in_range (u, 0x11000u, 0x110C0u)) return indic_table[u - 0x11000u + indic_offset_0x11000u]; - if (hb_in_range (u, 0x11100u, 0x11238u)) return indic_table[u - 0x11100u + indic_offset_0x11100u]; - if (hb_in_range (u, 0x112B0u, 0x11378u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u]; - if (hb_in_range (u, 0x11480u, 0x114E0u)) return indic_table[u - 0x11480u + indic_offset_0x11480u]; - if (hb_in_range (u, 0x11580u, 0x115C8u)) return indic_table[u - 0x11580u + indic_offset_0x11580u]; - if (hb_in_range (u, 0x11600u, 0x116D0u)) return indic_table[u - 0x11600u + indic_offset_0x11600u]; + if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u]; + if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u]; + if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u]; + if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u]; + if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u]; + if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u]; break; default: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc index 33215a304f..7723600410 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc @@ -921,14 +921,32 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, info[start].indic_position() = POS_RA_TO_BECOME_REPH; /* For old-style Indic script tags, move the first post-base Halant after - * last consonant. Only do this if there is *not* a Halant after last - * consonant. Otherwise it becomes messy. */ - if (indic_plan->is_old_spec) { + * last consonant. + * + * Reports suggest that in some scripts Uniscribe does this only if there + * is *not* a Halant after last consonant already (eg. Kannada), while it + * does it unconditionally in other scripts (eg. Malayalam). We don't + * currently know about other scripts, so we single out Malayalam for now. + * + * Kannada test case: + * U+0C9A,U+0CCD,U+0C9A,U+0CCD + * With some versions of Lohit Kannada. + * https://bugs.freedesktop.org/show_bug.cgi?id=59118 + * + * Malayalam test case: + * U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D + * With lohit-ttf-20121122/Lohit-Malayalam.ttf + */ + if (indic_plan->is_old_spec) + { + bool disallow_double_halants = buffer->props.script != HB_SCRIPT_MALAYALAM; for (unsigned int i = base + 1; i < end; i++) - if (info[i].indic_category() == OT_H) { + if (info[i].indic_category() == OT_H) + { unsigned int j; for (j = end - 1; j > i; j--) - if (is_consonant (info[j]) || info[j].indic_category() == OT_H) + if (is_consonant (info[j]) || + (disallow_double_halants && info[j].indic_category() == OT_H)) break; if (info[j].indic_category() != OT_H && j > i) { /* Move Halant to after last consonant. */ @@ -1267,6 +1285,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, info.cluster = buffer->cur().cluster; info.mask = buffer->cur().mask; info.syllable() = buffer->cur().syllable(); + /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ while (buffer->idx < buffer->len && diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc index 258ccc470c..d016380cc6 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc @@ -536,6 +536,24 @@ final_reordering (const hb_ot_shape_plan_t *plan, } +/* Uniscribe seems to have a shaper for 'mymr' that is like the + * generic shaper, except that it zeros mark advances GDEF_LATE. */ +const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old = +{ + "default", + NULL, /* collect_features */ + NULL, /* override_features */ + NULL, /* data_create */ + NULL, /* data_destroy */ + NULL, /* preprocess_text */ + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, + NULL, /* decompose */ + NULL, /* compose */ + NULL, /* setup_masks */ + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, + true, /* fallback_position */ +}; + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = { "myanmar", diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh index 3e581afa9c..e268933ce4 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh @@ -56,6 +56,7 @@ enum hb_ot_shape_zero_width_marks_type_t { HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \ HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \ HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \ + HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \ HB_COMPLEX_SHAPER_IMPLEMENT (indic) \ HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \ HB_COMPLEX_SHAPER_IMPLEMENT (sea) \ @@ -258,6 +259,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) /* Unicode-4.1 additions */ case HB_SCRIPT_KHAROSHTHI: + case HB_SCRIPT_NEW_TAI_LUE: case HB_SCRIPT_SYLOTI_NAGRI: /* Unicode-5.1 additions */ @@ -329,16 +331,15 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) return &_hb_ot_complex_shaper_default; case HB_SCRIPT_MYANMAR: - /* For Myanmar, we only want to use the Myanmar shaper if the "new" script - * tag is found. For "old" script tag we want to use the default shaper. */ if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','2')) return &_hb_ot_complex_shaper_myanmar; + else if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','r')) + return &_hb_ot_complex_shaper_myanmar_old; else return &_hb_ot_complex_shaper_default; /* Unicode-4.1 additions */ case HB_SCRIPT_BUGINESE: - case HB_SCRIPT_NEW_TAI_LUE: /* Unicode-5.1 additions */ case HB_SCRIPT_CHAM: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc index a774f95185..80d7da82f3 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc @@ -415,6 +415,8 @@ _hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { + _hb_buffer_assert_gsubgpos_vars (buffer); + unsigned int start = 0; unsigned int last_cluster = buffer->info[0].cluster; unsigned int count = buffer->len; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc index 2a6a439003..4287253aed 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc @@ -289,6 +289,8 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, hb_font_t *font) { + _hb_buffer_assert_unicode_vars (buffer); + hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference; const hb_ot_shape_normalize_context_t c = { plan, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc index 1f99014c62..a0b503ab0f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc @@ -43,7 +43,6 @@ static hb_tag_t common_features[] = { HB_TAG('c','c','m','p'), - HB_TAG('l','i','g','a'), HB_TAG('l','o','c','l'), HB_TAG('m','a','r','k'), HB_TAG('m','k','m','k'), @@ -56,6 +55,7 @@ static hb_tag_t horizontal_features[] = { HB_TAG('c','l','i','g'), HB_TAG('c','u','r','s'), HB_TAG('k','e','r','n'), + HB_TAG('l','i','g','a'), HB_TAG('r','c','l','t'), }; @@ -236,6 +236,7 @@ static void hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font) { if (!(buffer->flags & HB_BUFFER_FLAG_BOT) || + buffer->context_len[0] || _hb_glyph_info_get_general_category (&buffer->info[0]) != HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) return; @@ -243,7 +244,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font) if (!font->has_glyph (0x25CCu)) return; - hb_glyph_info_t dottedcircle; + hb_glyph_info_t dottedcircle = {0}; dottedcircle.codepoint = 0x25CCu; _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode); @@ -447,6 +448,7 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c) { hb_buffer_t *buffer = c->buffer; + _hb_buffer_allocate_gsubgpos_vars (buffer); hb_ot_layout_substitute_start (c->font, buffer); if (!hb_ot_layout_has_glyph_classes (c->face)) @@ -635,6 +637,8 @@ hb_ot_position (hb_ot_shape_context_t *c) if (fallback) _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer); + + _hb_buffer_deallocate_gsubgpos_vars (c->buffer); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-private.hh index 3f70d74c26..c92cdec516 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-private.hh @@ -87,7 +87,7 @@ #endif #ifndef HB_INTERNAL -# ifndef __MINGW32__ +# if !defined(__MINGW32__) && !defined(__CYGWIN__) # define HB_INTERNAL __attribute__((__visibility__("hidden"))) # else # define HB_INTERNAL @@ -96,6 +96,8 @@ #if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER) #define snprintf _snprintf +/* Windows CE only has _strdup, while rest of Windows has both. */ +#define strdup _strdup #endif #ifdef _MSC_VER @@ -116,15 +118,56 @@ #define HB_FUNC __func__ #endif -// Take from https://github.com/behdad/harfbuzz/commit/26a963b9cb4af3119177f277a2d48a5d537458fb -#if defined(_WIN32_WCE) +#if defined(_WIN32) || defined(__CYGWIN__) + /* We need Windows Vista for both Uniscribe backend and for + * MemoryBarrier. We don't support compiling on Windows XP, + * though we run on it fine. */ +# if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600 +# undef _WIN32_WINNT +# endif +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0600 +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# ifndef STRICT +# define STRICT 1 +# endif +#endif + +#ifdef _WIN32_WCE /* Some things not defined on Windows CE. */ #define MemoryBarrier() #define getenv(Name) NULL #define setlocale(Category, Locale) "C" static int errno = 0; /* Use something better? */ -#elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) -#define getenv(Name) NULL +#endif + +#if HAVE_ATEXIT +/* atexit() is only safe to be called from shared libraries on certain + * platforms. Whitelist. + * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */ +# if defined(__linux) && defined(__GLIBC_PREREQ) +# if __GLIBC_PREREQ(2,3) +/* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */ +# define HB_USE_ATEXIT 1 +# endif +# elif defined(_MSC_VER) || defined(__MINGW32__) +/* For MSVC: + * http://msdn.microsoft.com/en-ca/library/tze57ck3.aspx + * http://msdn.microsoft.com/en-ca/library/zk17ww08.aspx + * mingw32 headers say atexit is safe to use in shared libraries. + */ +# define HB_USE_ATEXIT 1 +# elif defined(__ANDROID__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +/* This was fixed in Android NKD r8 or r8b: + * https://code.google.com/p/android/issues/detail?id=6455 + * which introduced GCC 4.6: + * https://developer.android.com/tools/sdk/ndk/index.html + */ +# define HB_USE_ATEXIT 1 +# endif #endif /* Basics */ @@ -280,7 +323,7 @@ typedef int (*hb_compare_func_t) (const void *, const void *); /* arrays and maps */ -#define HB_PREALLOCED_ARRAY_INIT {0} +#define HB_PREALLOCED_ARRAY_INIT {0, 0, NULL} template struct hb_prealloced_array_t { @@ -496,47 +539,6 @@ struct hb_lockable_set_t }; - - -/* Big-endian handling */ - -static inline uint16_t hb_be_uint16 (const uint16_t v) -{ - const uint8_t *V = (const uint8_t *) &v; - return (V[0] << 8) | V[1]; -} - -static inline uint16_t hb_uint16_swap (const uint16_t v) -{ - return (v >> 8) | (v << 8); -} - -static inline uint32_t hb_uint32_swap (const uint32_t v) -{ - return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); -} - -/* Note, of the following macros, uint16_get is the one called many many times. - * If there is any optimizations to be done, it's in that macro. However, I - * already confirmed that on my T400 ThinkPad at least, using bswap_16(), which - * results in a single ror instruction, does NOT speed this up. In fact, it - * resulted in a minor slowdown. At any rate, note that v may not be correctly - * aligned, so I think the current implementation is optimal. - */ - -#define hb_be_uint16_put(v,V) HB_STMT_START { v[0] = (V>>8); v[1] = (V); } HB_STMT_END -#define hb_be_uint16_get(v) (uint16_t) ((v[0] << 8) + v[1]) -#define hb_be_uint16_eq(a,b) (a[0] == b[0] && a[1] == b[1]) - -#define hb_be_uint32_put(v,V) HB_STMT_START { v[0] = (V>>24); v[1] = (V>>16); v[2] = (V>>8); v[3] = (V); } HB_STMT_END -#define hb_be_uint32_get(v) (uint32_t) ((v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3]) -#define hb_be_uint32_eq(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3]) - -#define hb_be_uint24_put(v,V) HB_STMT_START { v[0] = (V>>16); v[1] = (V>>8); v[2] = (V); } HB_STMT_END -#define hb_be_uint24_get(v) (uint32_t) ((v[0] << 16) + (v[1] << 8) + v[2]) -#define hb_be_uint24_eq(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]) - - /* ASCII tag/character handling */ static inline bool ISALPHA (unsigned char c) @@ -581,6 +583,15 @@ _hb_debug (unsigned int level, #define DEBUG_LEVEL_ENABLED(WHAT, LEVEL) (_hb_debug ((LEVEL), HB_DEBUG_##WHAT)) #define DEBUG_ENABLED(WHAT) (DEBUG_LEVEL_ENABLED (WHAT, 0)) +template static inline void +_hb_debug_msg_va (const char *what, + const void *obj, + const char *func, + bool indented, + unsigned int level, + int level_dir, + const char *message, + va_list ap) HB_PRINTF_FUNC(7, 0); template static inline void _hb_debug_msg_va (const char *what, const void *obj, @@ -704,7 +715,9 @@ _hb_debug_msg<0> (const char *what HB_UNUSED, */ template -struct hb_printer_t {}; +struct hb_printer_t { + const char *print (const T&) { return "something"; } +}; template <> struct hb_printer_t { @@ -811,7 +824,9 @@ hb_in_range (T u, T lo, T hi) * to generate a warning than unused variables. */ ASSERT_STATIC (sizeof (hb_assert_unsigned_t) >= 0); - return (u - lo) <= (hi - lo); + /* The casts below are important as if T is smaller than int, + * the subtract results will become a signed int! */ + return (T)(u - lo) <= (T)(hi - lo); } template static inline bool @@ -835,7 +850,7 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x)) -template inline void +template static inline void hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2) { if (unlikely (!len)) @@ -868,7 +883,7 @@ hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), } while (k); } -template inline void +template static inline void hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *)) { hb_bubble_sort (array, len, compar, (int *) NULL); @@ -897,12 +912,12 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o struct hb_options_t { - int initialized : 1; - int uniscribe_bug_compatible : 1; + unsigned int initialized : 1; + unsigned int uniscribe_bug_compatible : 1; }; union hb_options_union_t { - int i; + unsigned int i; hb_options_t opts; }; ASSERT_STATIC (sizeof (int) == sizeof (hb_options_union_t)); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh index 705f554ce6..59e8f4559f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh @@ -150,7 +150,7 @@ struct hb_set_t bool in_error; inline void init (void) { - header.init (); + hb_object_init (this); clear (); } inline void fini (void) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc index 5ffc6b1362..2166173f9e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc @@ -29,6 +29,12 @@ #include "hb-font-private.hh" #include "hb-buffer-private.hh" + +#ifndef HB_DEBUG_SHAPE_PLAN +#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0) +#endif + + #define HB_SHAPER_IMPLEMENT(shaper) \ HB_SHAPER_DATA_ENSURE_DECLARE(shaper, face) \ HB_SHAPER_DATA_ENSURE_DECLARE(shaper, font) @@ -42,6 +48,11 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, + "num_features=%d shaper_list=%p", + num_user_features, + shaper_list); + const hb_shaper_pair_t *shapers = _hb_shapers_get (); #define HB_SHAPER_PLAN(shaper) \ @@ -104,6 +115,12 @@ hb_shape_plan_create (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + "face=%p num_features=%d shaper_list=%p", + face, + num_user_features, + shaper_list); + hb_shape_plan_t *shape_plan; hb_feature_t *features = NULL; @@ -271,6 +288,11 @@ hb_shape_plan_execute (hb_shape_plan_t *shape_plan, const hb_feature_t *features, unsigned int num_features) { + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, + "num_features=%d shaper_func=%p", + num_features, + shape_plan->shaper_func); + if (unlikely (hb_object_is_inert (shape_plan) || hb_object_is_inert (font) || hb_object_is_inert (buffer))) @@ -383,6 +405,12 @@ hb_shape_plan_create_cached (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { + DEBUG_MSG_FUNC (SHAPE_PLAN, NULL, + "face=%p num_features=%d shaper_list=%p", + face, + num_user_features, + shaper_list); + hb_shape_plan_proposal_t proposal = { *props, shaper_list, @@ -392,25 +420,22 @@ hb_shape_plan_create_cached (hb_face_t *face, }; if (shaper_list) { - /* Choose shaper. Adapted from hb_shape_plan_plan(). */ -#define HB_SHAPER_PLAN(shaper) \ - HB_STMT_START { \ - if (hb_##shaper##_shaper_face_data_ensure (face)) \ - proposal.shaper_func = _hb_##shaper##_shape; \ - } HB_STMT_END - + /* Choose shaper. Adapted from hb_shape_plan_plan(). + * Must choose shaper exactly the same way as that function. */ for (const char * const *shaper_item = shaper_list; *shaper_item; shaper_item++) if (0) ; #define HB_SHAPER_IMPLEMENT(shaper) \ - else if (0 == strcmp (*shaper_item, #shaper)) \ - HB_SHAPER_PLAN (shaper); + else if (0 == strcmp (*shaper_item, #shaper) && \ + hb_##shaper##_shaper_face_data_ensure (face)) \ + { \ + proposal.shaper_func = _hb_##shaper##_shape; \ + break; \ + } #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT -#undef HB_SHAPER_PLAN - - if (unlikely (!proposal.shaper_list)) + if (unlikely (!proposal.shaper_func)) return hb_shape_plan_get_empty (); } @@ -419,7 +444,10 @@ retry: hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans); for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next) if (hb_shape_plan_matches (node->shape_plan, &proposal)) + { + DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache"); return hb_shape_plan_reference (node->shape_plan); + } /* Not found. */ @@ -442,6 +470,7 @@ retry: free (node); goto retry; } + DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, "inserted into cache"); return hb_shape_plan_reference (shape_plan); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-shape.cc index c1b752405e..9a59c08556 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-shape.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-shape.cc @@ -34,15 +34,15 @@ #include "hb-font-private.hh" -static void +static bool parse_space (const char **pp, const char *end) { - char c; - while (*pp < end && (c = **pp, ISSPACE (c))) + while (*pp < end && ISSPACE (**pp)) (*pp)++; + return true; } -static hb_bool_t +static bool parse_char (const char **pp, const char *end, char c) { parse_space (pp, end); @@ -54,7 +54,7 @@ parse_char (const char **pp, const char *end, char c) return true; } -static hb_bool_t +static bool parse_uint (const char **pp, const char *end, unsigned int *pv) { char buf[32]; @@ -78,7 +78,27 @@ parse_uint (const char **pp, const char *end, unsigned int *pv) return true; } -static hb_bool_t +static bool +parse_bool (const char **pp, const char *end, unsigned int *pv) +{ + parse_space (pp, end); + + const char *p = *pp; + while (*pp < end && ISALPHA(**pp)) + (*pp)++; + + /* CSS allows on/off as aliases 1/0. */ + if (*pp - p == 2 || 0 == strncmp (p, "on", 2)) + *pv = 1; + else if (*pp - p == 3 || 0 == strncmp (p, "off", 2)) + *pv = 0; + else + return false; + + return true; +} + +static bool parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feature) { if (parse_char (pp, end, '-')) @@ -91,32 +111,48 @@ parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feat return true; } -static hb_bool_t +static bool parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) { - const char *p = *pp; - char c; - parse_space (pp, end); -#define ISALNUM(c) (('a' <= (c) && (c) <= 'z') || ('A' <= (c) && (c) <= 'Z') || ('0' <= (c) && (c) <= '9')) - while (*pp < end && (c = **pp, ISALNUM(c))) + char quote = 0; + + if (*pp < end && (**pp == '\'' || **pp == '"')) + { + quote = **pp; + (*pp)++; + } + + const char *p = *pp; + while (*pp < end && ISALNUM(**pp)) (*pp)++; -#undef ISALNUM - if (p == *pp) + if (p == *pp || *pp - p > 4) return false; feature->tag = hb_tag_from_string (p, *pp - p); + + if (quote) + { + /* CSS expects exactly four bytes. And we only allow quotations for + * CSS compatibility. So, enforce the length. */ + if (*pp - p != 4) + return false; + if (*pp == end || **pp != quote) + return false; + (*pp)++; + } + return true; } -static hb_bool_t +static bool parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) { parse_space (pp, end); - hb_bool_t has_start; + bool has_start; feature->start = 0; feature->end = (unsigned int) -1; @@ -136,20 +172,27 @@ parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) return parse_char (pp, end, ']'); } -static hb_bool_t +static bool parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature) { - return !parse_char (pp, end, '=') || parse_uint (pp, end, &feature->value); + bool had_equal = parse_char (pp, end, '='); + bool had_value = parse_uint (pp, end, &feature->value) || + parse_bool (pp, end, &feature->value); + /* CSS doesn't use equal-sign between tag and value. + * If there was an equal-sign, then there *must* be a value. + * A value without an eqaul-sign is ok, but not required. */ + return !had_equal || had_value; } -static hb_bool_t +static bool parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) { return parse_feature_value_prefix (pp, end, feature) && parse_feature_tag (pp, end, feature) && parse_feature_indices (pp, end, feature) && parse_feature_value_postfix (pp, end, feature) && + parse_space (pp, end) && *pp == end; } @@ -157,7 +200,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) * hb_feature_from_string: * @str: (array length=len): * @len: - * @feature: (out): + * @feature: (out) (optional): * * * @@ -169,10 +212,21 @@ hb_bool_t hb_feature_from_string (const char *str, int len, hb_feature_t *feature) { + hb_feature_t feat; + if (len < 0) len = strlen (str); - return parse_one_feature (&str, str + len, feature); + if (likely (parse_one_feature (&str, str + len, &feat))) + { + if (feature) + *feature = feat; + return true; + } + + if (feature) + memset (feature, 0, sizeof (*feature)); + return false; } /** @@ -203,18 +257,18 @@ hb_feature_to_string (hb_feature_t *feature, { s[len++] = '['; if (feature->start) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->start)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start)); if (feature->end != feature->start + 1) { s[len++] = ':'; if (feature->end != (unsigned int) -1) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->end)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end)); } s[len++] = ']'; } if (feature->value > 1) { s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->value)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value)); } assert (len < ARRAY_LENGTH (s)); len = MIN (len, size - 1); @@ -225,11 +279,13 @@ hb_feature_to_string (hb_feature_t *feature, static const char **static_shaper_list; -static inline +#ifdef HB_USE_ATEXIT +static void free_static_shaper_list (void) { free (static_shaper_list); } +#endif /** * hb_shape_list_shapers: @@ -266,7 +322,7 @@ retry: goto retry; } -#ifdef HAVE_ATEXIT +#ifdef HB_USE_ATEXIT atexit (free_static_shaper_list); /* First person registers atexit() callback. */ #endif } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc b/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc index 44f718aa70..580b95c84b 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc @@ -40,12 +40,14 @@ static const hb_shaper_pair_t all_shapers[] = { static const hb_shaper_pair_t *static_shapers; -static inline +#ifdef HB_USE_ATEXIT +static void free_static_shapers (void) { if (unlikely (static_shapers != all_shapers)) free ((void *) static_shapers); } +#endif const hb_shaper_pair_t * _hb_shapers_get (void) @@ -100,7 +102,7 @@ retry: goto retry; } -#ifdef HAVE_ATEXIT +#ifdef HB_USE_ATEXIT atexit (free_static_shapers); /* First person registers atexit() callback. */ #endif } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc b/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc index 84e5c06fd3..fc19006d3e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc @@ -157,7 +157,7 @@ hb_unicode_funcs_get_default (void) /** * hb_unicode_funcs_create: (Xconstructor) - * @parent: (allow-none): + * @parent: (nullable): * * * @@ -310,7 +310,7 @@ hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, void hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs) { - if (hb_object_is_inert (ufuncs)) + if (unlikely (hb_object_is_inert (ufuncs))) return; ufuncs->immutable = true; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-version.h b/src/3rdparty/harfbuzz-ng/src/hb-version.h index 517cc8f26e..b9f8a057c9 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-version.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 0 #define HB_VERSION_MINOR 9 -#define HB_VERSION_MICRO 32 +#define HB_VERSION_MICRO 38 -#define HB_VERSION_STRING "0.9.32" +#define HB_VERSION_STRING "0.9.38" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ -- cgit v1.2.3