summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/3rdparty/harfbuzz-ng/NEWS135
-rw-r--r--src/3rdparty/harfbuzz-ng/README3
-rw-r--r--src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro1
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh1
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-blob.cc9
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh4
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh7
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer.cc6
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-common.cc12
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-common.h24
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face-private.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face.cc8
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-font.cc4
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh13
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-object-private.hh107
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh122
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc205
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh65
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh37
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh63
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh18
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh91
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh18
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc4
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh148
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc44
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc11
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh2570
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc36
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc29
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc18
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh7
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc8
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-private.hh123
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set-private.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc53
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape.cc108
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper.cc6
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode.cc4
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-version.h4
45 files changed, 2344 insertions, 1796 deletions
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 <windows.h>
/* 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<hb_blob_t> ())) {
+ if (!length ||
+ length >= 1u << 31 ||
+ data + length < data /* overflows */ ||
+ !(blob = hb_object_create<hb_blob_t> ())) {
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_t *> (&_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 <locale.h>
-#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<hb_face_t *> (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 <windows.h>
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 <typename Type>
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 <typename Type>
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 <typename Type>
+static inline void hb_object_init (Type *obj)
+{
+ obj->header.ref_count.init (1);
+ obj->header.user_data.init ();
+}
+template <typename Type>
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 <typename Type>
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 <typename Type>
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 <typename Type>
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 <typename Type>
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<HB_DEBUG_SANITIZE, bool> 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<HB_DEBUG_SANITIZE, bool> 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 <typename Type>
@@ -255,15 +259,14 @@ struct hb_sanitize_context_t
const char *p = (const char *) base;
this->edit_count++;
- hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> 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 <typename Type, typename ValueType>
@@ -289,7 +292,7 @@ template <typename Type>
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 <typename Type>
struct BEInt<Type, 2>
{
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<Type, 2>& 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<Type, 2>& o) const
+ {
+ return v[0] == o.v[0]
+ && v[1] == o.v[1];
+ }
inline bool operator != (const BEInt<Type, 2>& o) const { return !(*this == o); }
private: uint8_t v[2];
};
template <typename Type>
-struct BEInt<Type, 4>
+struct BEInt<Type, 3>
{
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<Type, 4>& o) const { return hb_be_uint32_eq (v, o.v); }
- inline bool operator != (const BEInt<Type, 4>& 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<Type, 3>& o) const
+ {
+ return v[0] == o.v[0]
+ && v[1] == o.v[1]
+ && v[2] == o.v[2];
+ }
+ inline bool operator != (const BEInt<Type, 3>& o) const { return !(*this == o); }
+ private: uint8_t v[3];
};
template <typename Type>
-struct BEInt<Type, 3>
+struct BEInt<Type, 4>
{
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<Type, 3>& o) const { return hb_be_uint24_eq (v, o.v); }
- inline bool operator != (const BEInt<Type, 3>& 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<Type, 4>& 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<Type, 4>& 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<OT::_hea>::sanitize (face->reference_table (_hea_tag));
+ const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::lock_instance (_hea_blob);
+ this->num_advances = _hea->numberOfLongMetrics;
+ hb_blob_destroy (_hea_blob);
+
+ this->blob = OT::Sanitizer<OT::_mtx>::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<OT::_mtx>::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<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
+ const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::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<OT::hhea>::sanitize (font->face->reference_table (HB_OT_TAG_hhea));
- const OT::hhea *hhea = OT::Sanitizer<OT::hhea>::lock_instance (hhea_blob);
- ot_font->num_hmetrics = hhea->numberOfHMetrics;
- hb_blob_destroy (hhea_blob);
- }
- ot_font->hmtx_blob = OT::Sanitizer<OT::hmtx>::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<OT::hmtx>::lock_instance (ot_font->hmtx_blob);
-
- ot_font->cmap_blob = OT::Sanitizer<OT::cmap>::sanitize (font->face->reference_table (HB_OT_TAG_cmap));
- const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::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. <a
- * href="http://developer.apple.com/fonts/TTRefMan/RM06/Chap6hhea.html">
- * (Distance from baseline of highest
- * ascender)</a> */
- FWORD descender; /* Typographic descent. <a
- * href="http://developer.apple.com/fonts/TTRefMan/RM06/Chap6hhea.html">
- * (Distance from baseline of lowest
- * descender)</a> */
- 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<Anchor>
- 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 <typename context_t>
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<PairValueRecord> (array);
+ const PairValueRecord *record = CastP<PairValueRecord> (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<PairValueRecord> (array);
+ const PairValueRecord *record_array = CastP<PairValueRecord> (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<PairValueRecord> (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<PairValueRecord> (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<PairValueRecord> (array);
+ PairValueRecord *record = CastP<PairValueRecord> (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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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 <typename context_t>
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<context_t::max_debug_depth, typename context_t::return_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 <typename T>
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<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (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<LookupRecord> (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<LookupRecord> (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<LookupRecord> (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<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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<LookupRecord> (coverage, coverage[0].static_size * count);
+ if (!coverageZ[i].sanitize (c, this)) return TRACE_RETURN (false);
+ LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (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>
- 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 <typename context_t>
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<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
if (!input.sanitize (c, this)) return TRACE_RETURN (false);
+ if (!input.len) return TRACE_RETURN (false); /* To be consistent with Context. */
OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
if (!lookahead.sanitize (c, this)) return TRACE_RETURN (false);
ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
@@ -2122,7 +2143,7 @@ struct ChainContext
template <typename context_t>
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 <typename TLookup>
- inline void fini (const TLookup &lookup)
+ inline void fini (void)
{
}
@@ -420,6 +419,13 @@ _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
}
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)
{
HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
@@ -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<OT::GlyphID> first_glyphs_supplier (first_glyphs, num_first_glyphs);
OT::Supplier<unsigned int > ligature_per_first_glyph_count_supplier (ligature_per_first_glyph_count_list, num_first_glyphs);
OT::Supplier<OT::GlyphID> 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<OT::SubstLookup> lookupOffset;
+};
+typedef OT::ArrayOf<ManifestLookup> 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<const Manifest&> (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<OT::SubstLookup*> (&(&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_t *> (&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_t *> (&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 <typename Type, unsigned int StaticSize=16>
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)
@@ -589,6 +591,15 @@ _hb_debug_msg_va (const char *what,
unsigned int level,
int level_dir,
const char *message,
+ va_list ap) HB_PRINTF_FUNC(7, 0);
+template <int max_level> 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)
{
if (!_hb_debug (level, max_level))
@@ -704,7 +715,9 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
*/
template <typename T>
-struct hb_printer_t {};
+struct hb_printer_t {
+ const char *print (const T&) { return "something"; }
+};
template <>
struct hb_printer_t<bool> {
@@ -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<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 <typename T> 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 <typename T, typename T2> inline void
+template <typename T, typename T2> 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 <typename T> inline void
+template <typename T> 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) <= \