From 8db058d20c1b7efce33157c676d4aee97591deb1 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 5 Dec 2017 17:43:09 +0000 Subject: [PATCH 001/617] Indic: always hyphenate pre-base-reordering, for clarity. --- src/hb-ot-shape-complex-indic.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 7d0e7c5a4..97d6d3828 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -714,7 +714,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, * following algorithm: starting from the end of the syllable, move backwards * until a consonant is found that does not have a below-base or post-base * form (post-base forms have to follow below-base forms), or that is not a - * pre-base reordering Ra, or arrive at the first consonant. The consonant + * pre-base-reordering Ra, or arrive at the first consonant. The consonant * stopped at will be the base. * * o If the syllable starts with Ra + Halant (in a script that has Reph) @@ -785,11 +785,11 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, if (info[i].indic_position() == POS_BELOW_C) seen_below = true; - /* -> or that is not a pre-base reordering Ra, + /* -> or that is not a pre-base-reordering Ra, * * IMPLEMENTATION NOTES: * - * Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped + * Our pre-base-reordering Ra's are marked POS_POST_C, so will be skipped * by the logic above already. */ @@ -1124,7 +1124,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, unsigned int pref_len = 2; if (indic_plan->mask_array[PREF] && base + pref_len < end) { - /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */ + /* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */ for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) { hb_codepoint_t glyphs[2]; for (unsigned int j = 0; j < pref_len; j++) @@ -1518,7 +1518,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* 3. If reph should be repositioned after the main consonant: find the * first consonant not ligated with main, or find the first - * consonant that is not a potential pre-base reordering Ra. + * consonant that is not a potential pre-base-reordering Ra. */ if (reph_pos == REPH_POS_AFTER_MAIN) { @@ -1607,13 +1607,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, } - /* o Reorder pre-base reordering consonants: + /* o Reorder pre-base-reordering consonants: * - * If a pre-base reordering consonant is found, reorder it according to + * If a pre-base-reordering consonant is found, reorder it according to * the following rules: */ - if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */ + if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */ { for (unsigned int i = base + 1; i < end; i++) if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) From 3f74b7a14bffb8e91cd98edd0c3ddf0b0ddc169a Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sun, 14 Apr 2019 15:20:56 +0100 Subject: [PATCH 002/617] Docs: Regularize GTK-Doc comments for hb-ot-color. --- src/hb-ot-color.cc | 132 +++++++++++++++++++++++++-------------------- src/hb-ot-color.h | 6 +-- 2 files changed, 78 insertions(+), 60 deletions(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index 791135b10..f6844a29c 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -47,6 +47,8 @@ * @include: hb-ot.h * * Functions for fetching color-font information from OpenType font faces. + * + * HarfBuzz supports COLR/CPAL, sbix, CBDT, and SVG color fonts. **/ @@ -57,9 +59,11 @@ /** * hb_ot_color_has_palettes: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Returns: whether CPAL table is available. + * Tests whether a face includes a CPAL color-palette table. + * + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ @@ -71,10 +75,11 @@ hb_ot_color_has_palettes (hb_face_t *face) /** * hb_ot_color_palette_get_count: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Returns: the number of color palettes in @face, or zero if @face has - * no colors. + * Fetches the number of color palettes in a face. + * + * Return value: the number of palettes found * * Since: 2.1.0 */ @@ -86,13 +91,16 @@ hb_ot_color_palette_get_count (hb_face_t *face) /** * hb_ot_color_palette_get_name_id: - * @face: a font face. - * @palette_index: the index of the color palette whose name is being requested. + * @face: #hb_face_t to work upon + * @palette_index: The index of the color palette * - * Retrieves the name id of a color palette. For example, a color font can - * have themed palettes like "Spring", "Summer", "Fall", and "Winter". + * Fetches the 'name' table Name ID that provides display names for + * a CPAL color palette. * - * Returns: an identifier within @face's `name` table. + * Palette display names can be generic (e.g., "Default") or provide + * specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter"). + * + * Return value: the Named ID found for the palette. * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID. * * Since: 2.1.0 @@ -106,10 +114,16 @@ hb_ot_color_palette_get_name_id (hb_face_t *face, /** * hb_ot_color_palette_color_get_name_id: - * @face: a font face. - * @color_index: palette entry index. + * @face: #hb_face_t to work upon + * @color_index: The index of the color * - * Returns: Name ID associated with a palette entry, e.g. eye color + * Fetches the 'name' table Name ID that provides display names for + * the specificed color in a face's CPAL color palette. + * + * Display names can be generic (e.g., "Background") or specific + * (e.g., "Eye color"). + * + * Return value: the Name ID found for the color. * * Since: 2.1.0 */ @@ -122,10 +136,12 @@ hb_ot_color_palette_color_get_name_id (hb_face_t *face, /** * hb_ot_color_palette_get_flags: - * @face: a font face - * @palette_index: the index of the color palette whose flags are being requested + * @face: #hb_face_t to work upon + * @palette_index: The index of the color palette * - * Returns: the flags for the requested color palette. + * Fetches the flags defined for a color palette. + * + * Return value: the #hb_ot_color_palette_flags_t of the requested color palette * * Since: 2.1.0 */ @@ -138,25 +154,22 @@ hb_ot_color_palette_get_flags (hb_face_t *face, /** * hb_ot_color_palette_get_colors: - * @face: a font face. - * @palette_index:the index of the color palette whose colors - * are being requested. - * @start_offset: the index of the first color being requested. - * @color_count: (inout) (optional): on input, how many colors - * can be maximally stored into the @colors array; - * on output, how many colors were actually stored. - * @colors: (array length=color_count) (out) (optional): - * an array of #hb_color_t records. After calling - * this function, @colors will be filled with - * the palette colors. If @colors is NULL, the function - * will just return the number of total colors - * without storing any actual colors; this can be used - * for allocating a buffer of suitable size before calling - * hb_ot_color_palette_get_colors() a second time. + * @face: #hb_face_t to work upon + * @palette_index: the index of the color palette to query + * @start_offset: offset of the first color to retrieve + * @color_count: (inout) (optional): Input = the maximum number of colors to return; + * Output = the actual number of colors returned (may be zero) + * @colors: (array length=color_count) (out) (optional): The array of #hb_color_t records found * - * Retrieves the colors in a color palette. + * Fetches a list of the colors in a color palette. * - * Returns: the total number of colors in the palette. + * After calling this function, @colors will be filled with the palette + * colors. If @colors is NULL, the function will just return the number + * of total colors without storing any actual colors; this can be used + * for allocating a buffer of suitable size before calling + * #hb_ot_color_palette_get_colors() a second time. + * + * Return value: the total number of colors in the palette * * Since: 2.1.0 */ @@ -177,9 +190,11 @@ hb_ot_color_palette_get_colors (hb_face_t *face, /** * hb_ot_color_has_layers: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Returns: whether COLR table is available. + * Tests whether a face includes any COLR color layers. + * + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ @@ -191,14 +206,17 @@ hb_ot_color_has_layers (hb_face_t *face) /** * hb_ot_color_glyph_get_layers: - * @face: a font face. - * @glyph: a layered color glyph id. - * @start_offset: starting offset of layers. - * @count: (inout) (optional): gets number of layers available to be written on buffer - * and returns number of written layers. - * @layers: (array length=count) (out) (optional): layers buffer to buffer. + * @face: #hb_face_t to work upon + * @glyph: The glyph index to query + * @start_offset: offset of the first layer to retrieve + * @count: (inout) (optional): Input = the maximum number of layers to return; + * Output = the actual number of layers returned (may be zero) + * @layers: (array length=count) (out) (optional): The array of layers found * - * Returns: Total number of layers a layered color glyph have. + * Fetches a list of all color layers for the specified glyph index in the specified + * face. The list returned will begin at the offset provided. + * + * Return value: Total number of layers available for the glyph index queried * * Since: 2.1.0 */ @@ -219,11 +237,11 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, /** * hb_ot_color_has_svg: - * @face: a font face. + * @face: #hb_face_t to work upon. * - * Check whether @face has SVG glyph images. + * Tests whether a face includes any SVG glyph images. * - * Returns true if available, false otherwise. + * Return value: true if data found, false otherwise. * * Since: 2.1.0 */ @@ -235,12 +253,12 @@ hb_ot_color_has_svg (hb_face_t *face) /** * hb_ot_color_glyph_reference_svg: - * @face: a font face. - * @glyph: a svg glyph index. + * @face: #hb_face_t to work upon + * @glyph: a svg glyph index * - * Get SVG document for a glyph. The blob may be either plain text or gzip-encoded. + * Fetches the SVG document for a glyph. The blob may be either plain text or gzip-encoded. * - * Returns: (transfer full): respective svg blob of the glyph, if available. + * Return value: (transfer full): An #hb_blob_t containing the SVG document of the glyph, if available * * Since: 2.1.0 */ @@ -257,11 +275,11 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) /** * hb_ot_color_has_png: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Check whether @face has PNG glyph images (either CBDT or sbix tables). + * Tests whether a face has PNG glyph images (either in CBDT or sbix tables). * - * Returns true if available, false otherwise. + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ @@ -273,14 +291,14 @@ hb_ot_color_has_png (hb_face_t *face) /** * hb_ot_color_glyph_reference_png: - * @font: a font object, not face. upem should be set on - * that font object if one wants to get optimal png blob, otherwise - * return the biggest one + * @font: #hb_font_t to work upon * @glyph: a glyph index. * - * Get PNG image for a glyph. + * Fetches the PNG image for a glyph. This function takes a font object, not a face object, + * as input. To get an optimally sized PNG blob, the UPEM value must be set on the @font + * object. If UPEM is unset, the blob returned will be the largest PNG available. * - * Returns: (transfer full): respective PNG blob of the glyph, if available. + * Return value: (transfer full): An #hb_blob_t containing the PNG image for the glyph, if available * * Since: 2.1.0 */ diff --git a/src/hb-ot-color.h b/src/hb-ot-color.h index 49646bf3a..bc6c844e1 100644 --- a/src/hb-ot-color.h +++ b/src/hb-ot-color.h @@ -59,11 +59,11 @@ hb_ot_color_palette_color_get_name_id (hb_face_t *face, /** * hb_ot_color_palette_flags_t: - * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special + * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: Default indicating that there is nothing special * to note about a color palette. - * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: Flag indicating that the color * palette is appropriate to use when displaying the font on a light background such as white. - * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: flag indicating that the color + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: Flag indicating that the color * palette is appropriate to use when displaying the font on a dark background such as black. * * Since: 2.1.0 From cd9889cac3ac3b271f7335f3e94acc4667a59b40 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sun, 14 Apr 2019 15:33:56 +0100 Subject: [PATCH 003/617] Docs: update and extended GTK-Doc comments for hb-ot-math. --- src/hb-ot-math.cc | 131 +++++++++++++++++++++++++++------------------- src/hb-ot-math.h | 21 ++++++++ 2 files changed, 98 insertions(+), 54 deletions(-) diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index bd31bf565..99ce74443 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -37,6 +37,11 @@ * @include: hb-ot.h * * Functions for fetching mathematics layout data from OpenType fonts. + * + * HarfBuzz itself does not implement a math layout solution. The + * functions and types provided can be used by client programs to access + * the font data necessary for typesetting OpenType Math layout. + * **/ @@ -48,10 +53,9 @@ * hb_ot_math_has_data: * @face: #hb_face_t to test * - * This function allows to verify the presence of an OpenType MATH table on the - * face. + * Tests whether a face has a `MATH` table. * - * Return value: true if face has a MATH table, false otherwise + * Return value: true if the table is found, false otherwise * * Since: 1.3.3 **/ @@ -63,16 +67,18 @@ hb_ot_math_has_data (hb_face_t *face) /** * hb_ot_math_get_constant: - * @font: #hb_font_t from which to retrieve the value + * @font: #hb_font_t to work upon * @constant: #hb_ot_math_constant_t the constant to retrieve * - * This function returns the requested math constants as a #hb_position_t. - * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, - * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or - * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is - * actually an integer between 0 and 100 representing that percentage. + * Fetches the specified math constant. For most constants, the value returned + * is an #hb_position_t. * - * Return value: the requested constant or 0 + * However, if the requested constant is #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, + * #HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or + * #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, then the return value is + * an integer between 0 and 100 representing that percentage. + * + * Return value: the requested constant or zero * * Since: 1.3.3 **/ @@ -85,8 +91,11 @@ hb_ot_math_get_constant (hb_font_t *font, /** * hb_ot_math_get_glyph_italics_correction: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value + * + * Fetches an italics-correction value (if one exists) for the specified + * glyph index. * * Return value: the italics correction of the glyph or 0 * @@ -101,8 +110,11 @@ hb_ot_math_get_glyph_italics_correction (hb_font_t *font, /** * hb_ot_math_get_glyph_top_accent_attachment: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value + * + * Fetches a top-accent-attachment value (if one exists) for the specified + * glyph index. * * Return value: the top accent attachment of the glyph or 0 * @@ -117,8 +129,10 @@ hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font, /** * hb_ot_math_is_glyph_extended_shape: - * @face: a #hb_face_t to test - * @glyph: a glyph index to test + * @face: #hb_face_t to work upon + * @glyph: The glyph index to test + * + * Tests whether the given glyph index is an extended shape in the face. * * Return value: true if the glyph is an extended shape, false otherwise * @@ -133,18 +147,20 @@ hb_ot_math_is_glyph_extended_shape (hb_face_t *face, /** * hb_ot_math_get_glyph_kerning: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value - * @kern: the #hb_ot_math_kern_t from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value + * @kern: The #hb_ot_math_kern_t from which to retrieve the value * @correction_height: the correction height to use to determine the kerning. * - * This function tries to retrieve the MathKern table for the specified font, - * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the - * MathKern table to find one value that is greater or equal to specified - * correction_height. If one is found the corresponding value from the list of - * kerns is returned and otherwise the last kern value is returned. + * Fetches the MathKern table for the specified font, glyph index, and + * @kern. * - * Return value: requested kerning or 0 + * If the MathKern table is found, the function examines it to find a height + * value that is greater or equal to @correction_height. If such a height + * value is found, corresponding kerning value from the table is returned. If + * no such height value is found, the last kerning value is returned. + * + * Return value: requested kerning value or zero * * Since: 1.3.3 **/ @@ -162,20 +178,22 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, /** * hb_ot_math_get_glyph_variants: - * @font: #hb_font_t from which to retrieve the values - * @glyph: index of the glyph to stretch - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @glyph: The index of the glyph to stretch + * @direction: The direction of the stretching (H or V) * @start_offset: offset of the first variant to retrieve - * @variants_count: maximum number of variants to retrieve after start_offset - * (IN) and actual number of variants retrieved (OUT) - * @variants: array of size at least @variants_count to store the result + * @variants_count: (inout): Input = the maximum number of variants to return; + * Output = the actual number of variants returned + * @variants: (out) (array length=variants_count): array of variants returned * - * This function tries to retrieve the MathGlyphConstruction for the specified - * font, glyph and direction. Note that only the value of - * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list - * of size variants as an array of hb_ot_math_glyph_variant_t structs. + * Fetches the MathGlyphConstruction for the specified font, glyph index, and + * direction. The corresponding list of size variants is returned as a list of + * #hb_ot_math_glyph_variant_t structs. * - * Return value: the total number of size variants available or 0 + * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered + * from the @direction parameter. + * + * Return value: the total number of size variants available or zero * * Since: 1.3.3 **/ @@ -195,15 +213,17 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, /** * hb_ot_math_get_min_connector_overlap: - * @font: #hb_font_t from which to retrieve the value - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @direction: direction of the stretching (H or V) * - * This function tries to retrieve the MathVariants table for the specified - * font and returns the minimum overlap of connecting glyphs to draw a glyph - * assembly in the specified direction. Note that only the value of - * #HB_DIRECTION_IS_HORIZONTAL is considered. + * Fetches the MathVariants table for the specified font and returns the + * minimum overlap of connecting glyphs that are required to draw a glyph + * assembly in the specified direction. * - * Return value: requested min connector overlap or 0 + * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered + * from the @direction parameter. + * + * Return value: requested minimum connector overlap or zero * * Since: 1.3.3 **/ @@ -216,19 +236,22 @@ hb_ot_math_get_min_connector_overlap (hb_font_t *font, /** * hb_ot_math_get_glyph_assembly: - * @font: #hb_font_t from which to retrieve the values - * @glyph: index of the glyph to stretch - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @glyph: The index of the glyph to stretch + * @direction: direction of the stretching (H or V) * @start_offset: offset of the first glyph part to retrieve - * @parts_count: maximum number of glyph parts to retrieve after start_offset - * (IN) and actual number of parts retrieved (OUT) - * @parts: array of size at least @parts_count to store the result - * @italics_correction: italic correction of the glyph assembly + * @parts_count: (inout): Input = maximum number of glyph parts to return; + * Output = actual number of parts returned + * @parts: (out) (array length=parts_count): the glyph parts returned + * @italics_correction: (out): italics correction of the glyph assembly * - * This function tries to retrieve the GlyphAssembly for the specified font, - * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL - * is considered. It provides the information necessary to draw the glyph - * assembly as an array of #hb_ot_math_glyph_part_t. + * Fetches the GlyphAssembly for the specified font, glyph index, and direction. + * Returned are a list of #hb_ot_math_glyph_part_t glyph parts that can be + * used to draw the glyph and an italics-correction value (if one is defined + * in the font). + * + * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered + * from the @direction parameter. * * Return value: the total number of parts in the glyph assembly * diff --git a/src/hb-ot-math.h b/src/hb-ot-math.h index 521a5ca03..d88aef8e9 100644 --- a/src/hb-ot-math.h +++ b/src/hb-ot-math.h @@ -50,6 +50,9 @@ HB_BEGIN_DECLS /** * hb_ot_math_constant_t: * + * The 'MATH' table constants specified at + * https://docs.microsoft.com/en-us/typography/opentype/spec/math + * * Since: 1.3.3 */ typedef enum { @@ -114,6 +117,9 @@ typedef enum { /** * hb_ot_math_kern_t: * + * The math kerning-table types defined for the four corners + * of a glyph. + * * Since: 1.3.3 */ typedef enum { @@ -125,6 +131,10 @@ typedef enum { /** * hb_ot_math_glyph_variant_t: + * @glyph: The glyph index of the variant + * @advance: The advance width of the variant + * + * Data type to hold math-variant information for a glyph. * * Since: 1.3.3 */ @@ -136,6 +146,8 @@ typedef struct hb_ot_math_glyph_variant_t { /** * hb_ot_math_glyph_part_flags_t: * + * Flags for math glyph parts. + * * Since: 1.3.3 */ typedef enum { /*< flags >*/ @@ -144,6 +156,15 @@ typedef enum { /*< flags >*/ /** * hb_ot_math_glyph_part_t: + * @glyph: The glyph index of the variant part + * @start_connector_length: The length of the connector on the starting side of the variant part + * @end_connection_length: The length of the conector on the ending side of the variant part + * @full_advance: The total advance of the part + * @flags: #hb_ot_math_glyph_part_flags_t flags for the part + * + * Data type to hold information for a "part" component of a math-variant glyph. + * Large variants for stretchable math glyphs (such as parentheses) can be constructed + * on the fly from parts. * * Since: 1.3.3 */ From 98c54cdef8b0615a95382bdba4ecd008789f8c9e Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 23 Apr 2019 17:48:42 +0100 Subject: [PATCH 004/617] Usermanual: add chapter on object model. --- docs/harfbuzz-docs.xml | 1 + docs/usermanual-object-model.xml | 249 +++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 docs/usermanual-object-model.xml diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml index f4ad134ea..63863350e 100644 --- a/docs/harfbuzz-docs.xml +++ b/docs/harfbuzz-docs.xml @@ -37,6 +37,7 @@ + diff --git a/docs/usermanual-object-model.xml b/docs/usermanual-object-model.xml new file mode 100644 index 000000000..f0b76ce91 --- /dev/null +++ b/docs/usermanual-object-model.xml @@ -0,0 +1,249 @@ + + + +]> + + The HarfBuzz object model +
+ An overview of data types in HarfBuzz + + HarfBuzz features two kinds of data types: non-opaque, + pass-by-value types and opaque, heap-allocated types. This kind + of separation is common in C libraries that have to provide + API/ABI compatibility (almost) indefinitely. + + + Value types: The non-opaque, pass-by-value + types include integer types, enums, and small structs. Exposing + a struct in the public API makes it impossible to expand the + struct in the future. As such, exposing structs is reserved for + cases where it’s extremely inefficient to do otherwise. + + + In HarfBuzz, several structs, like hb_glyph_info_t and + hb_glyph_position_t, fall into that efficiency-sensitive + category and are non-opaque. + + + For all non-opaque structs where future extensibility may be + necessary, reserved members are included to hold space for + possible future members. As such, it’s important to provide + equal(), and hash() + methods for such structs, allowing users of the API do + effectively deal with the type without having to + adapt their code to future changes. + + + Important value types provided by HarfBuzz include the structs + for working with Unicode code points, glyphs, and tags for font + tables and features, as well as the enums for many Unicode and + OpenType properties. + +
+ +
+ Objects in HarfBuzz + + Object types: Opaque struct types are used + for what HarfBuzz loosely calls "objects." This doesn’t have + much to do with the terminology from object-oriented programming + (OOP), although some of the concepts are similar. + + + In HarfBuzz, all object types provide certain + lifecycle-management APIs. Objects are reference-counted, and + constructed with various create() methods, referenced via + reference() and dereferenced using + destroy(). + + + For example, + the hb_buffer_t object has + hb_buffer_create() as its constructor, + hb_buffer_reference() to reference, and + hb_buffer_destroy() to dereference. + + + After construction, each object's properties are accessible only + through the setter and getter functions described in the API + Reference manual. + + + Key object types provided by HarfBuzz include: + + + + + blobs, which act as low-level wrappers around binary + data. Blobs are typically used to hold the contents of a + binary font file. + + + + + faces, which represent typefaces from a + font file, but without specific parameters (such as size) set. + + + + + fonts, which represent instances of a + face will all of their parameters specified. + + + + + buffers, which hold Unicode code points + for characters (before shaping) and the shaped glyph output + (after shaping). + + + + + shape plans, which store the settings + that HarfBuzz will use when shaping a particular text segment. + + + + +
+ + + +
+ Object lifecycle management + + Each object type in HarfBuzz provides a + create() method. Some object types provide + additional variants of create() to handle + special cases or to speed up common tasks; those variants are + documented in the API reference. For example, + hb_blob_create_from_file() constructs a new + blob directly from the contents of a file. + + + Client programs can increase the reference count on an object by + calling its reference() method. Whenever a + client program is finished with an object, it should call its + corresponding destroy() method. The destroy + method will decrease the reference count on the object and, + whenever the reference count reaches zero, it will also destroy + the object and free all of the associated memory. + + + All of HarfBuzz's object-lifecycle-management APIs are + thread-safe, even when the object as a whole is not thread-safe . + It is also permissible to reference() or to + destroy() the NULL + value. + + + Some objects are thread-safe after they have been constructed + and set up. The general pattern is to + create() the object, make a few + set_*() calls to set up the + object, and then use it without further modification. + + + To ensure that such an object is not modified, client programs + can explicitly mark an object as immutable. HarfBuzz provides + make_immutable() methods to mark an object + as immutable and is_immutable() methods to + test whether or not an object is immutable. Attempts to use + setter functions on immutable objects will fail; see the API + Reference manual for specifics. + + + Note also that there are no "make mutable" methods. If client + programs need to alter an object previously marked as immutable, + they will need to make a duplicate of the original. + + + Finally, object constructors (and, indeed, as much of the API as + possible) will never return NULL. Instead, + if there is an allocation error, each constructor will + return an “empty” object singleton. + + + These empty-object singletons are inert and safe (although + typically useless) to pass around. This design choice avoids + having to check for NULL pointers all + throughout the code. + + + In addition, this “empty” object singleton can also be accessed + using the get_empty() method of the object + type in question. + +
+ + +
+ User data + + To better integrate with client programs, HarfBuzz's objects + offer a "user data" mechanism that can be used to attach + arbitrary data to the object. User-data attachment can be + useful for tying the lifecycles of various pieces of data + together, or for creating language bindings. + + + Each object type has a set_user_data() + method and a get_user_data() method. The + set_user_data() methods take a client-provided + key and a pointer, + user_data, pointing to the data itself. Once + the key-data pair has been attached to the object, the + get_user_data() method can be called with + the key, returning the user_data pointer. + + + The set_user_data() methods also support an + optional destroy callback. Client programs + can set the destroy callback and receive + notification from HarfBuzz whenever the object is destructed. + + + Finally, each set_user_data() method allows + the client program to set a replace Boolean + indicating whether or not the user_data + associated with a key ought to be replaceable. + +
+ + + +
+ Blobs + + While most of HarfBuzz's object types are specific to the + shaping process, blobs are somewhat + different. + + + Blobs are an abstraction desgined to negotiate lifecycle and + permissions for raw pieces of data. For example, when you load + the raw font data into memory and want to pass it to HarfBuzz, + you do so in a hb_blob_t wrapper. + + + This allows you to take advantage of HarffBuzz's + reference-counting and destroy + callbacks. If you allocated the memory for the data using + malloc(), you would create the blob using + + + hb_blob_create (data, length, HB_MEMORY_MODE_WRITABLE, NULL, free) + + + That way, HarfBuzz will call free() on the + allocated memory whenever the blob drops its last reference and + is deconstructed. Consequently, the user code can stop worrying + about freeing memory and let the reference-counting machinery + take care of that. + +
+ +
From aa6692cb0079bbe1e003f211a321e8fe6a18ea94 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 23 Apr 2019 17:56:44 +0100 Subject: [PATCH 005/617] Usermanual: update Makefile SGML list. Again. --- docs/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Makefile.am b/docs/Makefile.am index 9b54b40e1..7020273df 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -76,6 +76,7 @@ content_files= \ usermanual-install-harfbuzz.xml \ usermanual-getting-started.xml \ usermanual-shaping-concepts.xml \ + usermanual-object-model.xml \ usermanual-buffers-language-script-and-direction.xml \ usermanual-fonts-and-faces.xml \ usermanual-clusters.xml \ From 6d9a86ae7535ea8e3c108a49c6da877a78cdac26 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 16:09:01 +0100 Subject: [PATCH 006/617] [Docs] Usermanual; fixes to Object Model chapter --- docs/usermanual-object-model.xml | 35 ++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/usermanual-object-model.xml b/docs/usermanual-object-model.xml index f0b76ce91..f571c477f 100644 --- a/docs/usermanual-object-model.xml +++ b/docs/usermanual-object-model.xml @@ -90,7 +90,7 @@ fonts, which represent instances of a - face will all of their parameters specified. + face with all of their parameters specified. @@ -103,7 +103,10 @@ shape plans, which store the settings - that HarfBuzz will use when shaping a particular text segment. + that HarfBuzz will use when shaping a particular text + segment. Shape plans are not generally used by client + programs directly, but as we will see in a later chapter, + they are still valuable to understand. @@ -124,9 +127,11 @@ blob directly from the contents of a file. - Client programs can increase the reference count on an object by - calling its reference() method. Whenever a - client program is finished with an object, it should call its + All objects are created with an initial reference count of + 1. Client programs can increase the reference + count on an object by calling its + reference() method. Whenever a client + program is finished with an object, it should call its corresponding destroy() method. The destroy method will decrease the reference count on the object and, whenever the reference count reaches zero, it will also destroy @@ -134,7 +139,9 @@ All of HarfBuzz's object-lifecycle-management APIs are - thread-safe, even when the object as a whole is not thread-safe . + thread-safe (unless you compiled HarfBuzz from source with the + HB_NO_MT configuration flag), even when the + object as a whole is not thread-safe. It is also permissible to reference() or to destroy() the NULL value. @@ -152,7 +159,7 @@ make_immutable() methods to mark an object as immutable and is_immutable() methods to test whether or not an object is immutable. Attempts to use - setter functions on immutable objects will fail; see the API + setter functions on immutable objects will fail silently; see the API Reference manual for specifics. @@ -161,10 +168,11 @@ they will need to make a duplicate of the original. - Finally, object constructors (and, indeed, as much of the API as - possible) will never return NULL. Instead, - if there is an allocation error, each constructor will - return an “empty” object singleton. + Finally, object constructors (and, indeed, as much of the + shaping API as possible) will never return + NULL. Instead, if there is an allocation + error, each constructor will return an “empty” object + singleton. These empty-object singletons are inert and safe (although @@ -208,8 +216,9 @@ Finally, each set_user_data() method allows the client program to set a replace Boolean - indicating whether or not the user_data - associated with a key ought to be replaceable. + indicating whether or not the function call should replace any + existing user_data + associated with the specified key. From 3b301c5ac6b15728f858cb6f5de8dfc6a77209fa Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 17:21:33 +0100 Subject: [PATCH 007/617] [Docs] Usermanual; fill out Buffers chapter. --- ...-buffers-language-script-and-direction.xml | 358 ++++++++++++++++-- 1 file changed, 335 insertions(+), 23 deletions(-) diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index 1c6b5dab1..719b6880f 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -7,30 +7,38 @@ Buffers, language, script and direction - The input to HarfBuzz is a series of Unicode characters, stored in a + The input to the HarfBuzz shaper is a series of Unicode characters, stored in a buffer. In this chapter, we'll look at how to set up a buffer with - the text that we want and then customize the properties of the - buffer. + the text that we want and how to customize the properties of the + buffer. We'll also look at a piece of lower-level machinery that + you will need to understand before proceeding: the functions that + HarfBuzz uses to retrieve Unicode information. + + + After shaping is complete, HarfBuzz puts its output back + into the buffer. But getting that output requires setting up a + face and a font first, so we will look at that in the next chapter + instead of here.
Creating and destroying buffers As we saw in our Getting Started example, a buffer is created and - initialized with hb_buffer_create(). This + initialized with hb_buffer_create(). This produces a new, empty buffer object, instantiated with some default values and ready to accept your Unicode strings. HarfBuzz manages the memory of objects (such as buffers) that it creates, so you don't have to. When you have finished working on - a buffer, you can call hb_buffer_destroy(): + a buffer, you can call hb_buffer_destroy(): - hb_buffer_t *buffer = hb_buffer_create(); - ... - hb_buffer_destroy(buffer); - + hb_buffer_t *buf = hb_buffer_create(); + ... + hb_buffer_destroy(buf); + This will destroy the object and free its associated memory - unless some other part of the program holds a reference to this @@ -39,46 +47,350 @@ else destroying it, you should increase its reference count: -void somefunc(hb_buffer_t *buffer) { - buffer = hb_buffer_reference(buffer); - ... - + void somefunc(hb_buffer_t *buf) { + buf = hb_buffer_reference(buf); + ... + And then decrease it once you're done with it: - hb_buffer_destroy(buffer); -} - + hb_buffer_destroy(buf); + } + + + While we are on the subject of reference-counting buffers, it is + worth noting that an individual buffer can only meaningfully be + used by one thread at a time. + To throw away all the data in your buffer and start from scratch, - call hb_buffer_reset(buffer). If you want to + call hb_buffer_reset(buf). If you want to throw away the string in the buffer but keep the options, you can - instead call hb_buffer_clear_contents(buffer). + instead call hb_buffer_clear_contents(buf).
+
Adding text to the buffer Now we have a brand new HarfBuzz buffer. Let's start filling it with text! From HarfBuzz's perspective, a buffer is just a stream - of Unicode codepoints, but your input string is probably in one of - the standard Unicode character encodings (UTF-8, UTF-16, UTF-32) + of Unicode code points, but your input string is probably in one of + the standard Unicode character encodings (UTF-8, UTF-16, or + UTF-32). HarfBuzz provides convenience functions that accept + each of these encodings: + hb_buffer_add_utf8(), + hb_buffer_add_utf16(), and + hb_buffer_add_utf32(). Other than the + character encoding they accept, they function identically. + + You can add UTF-8 text to a buffer by passing in the text array, + the array's length, an offset into the array for the first + character to add, and the length of the segment to add: + + + hb_buffer_add_utf8 (hb_buffer_t *buf, + const char *text, + int text_length, + unsigned int item_offset, + int item_length) + + + So, in practice, you can say: + + + hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text)); + + + This will append your new characters to + buf, not replace its existing + contents. Also, note that you can use -1 in + place of the first instance of strlen(text) + if your text array is NULL-terminated. Similarly, you can also use + -1 as the final argument want to add its full + contents. + + + Whatever start item_offset and + item_length you provide, HarfBuzz will also + attempt to grab the five characters before + the offset point and the five characters + after the designated end. These are the + before and after "context" segments, which are used internally + for HarfBuzz to make shaping decisions. They will not be part of + the final output, but they ensure that HarfBuzz's + script-specific shaping operations are correct. If there are + fewer than five characters available for the before or after + contexts, HarfBuzz will just grab what is there. + + + For longer text runs, such as full paragraphs, it might be + tempting to only add smaller sub-segments to a buffer and + shape them in piecemeal fashion. Generally, this is not a good + idea, however, because a lot of shaping decisions are + dependent on this context information. For example, in Arabic + and other connected scripts, HarfBuzz needs to know the code + points before and after each character in order to correctly + determine which glyph to return. + + + The safest approach is to add all of the text available, then + use item_offset and + item_length to indicate which characters you + want shaped, so that HarfBuzz has access to any context. + + + You can also add Unicode code points directly with + hb_buffer_add_codepoints(). The arguments + to this function are the same as those for the UTF + encodings. But it is particularly important to note that + HarfBuzz does not do validity checking on the text that is added + to a buffer. Invalid code points will be replaced, but it is up + to you to do any deep-sanity checking necessary. + +
+
Setting buffer properties + Buffers containing input characters still need several + properties set before HarfBuzz can shape their text correctly. -
-
- What about the other scripts? + Initially, all buffers are set to the + HB_BUFFER_CONTENT_TYPE_INVALID content + type. After adding text, the buffer should be set to + HB_BUFFER_CONTENT_TYPE_UNICODE instead, which + indicates that it contains un-shaped input + characters. After shaping, the buffer will have the + HB_BUFFER_CONTENT_TYPE_GLYPHS content type. + + + hb_buffer_add_utf8() and the + other UTF functions set the content type of their buffer + automatically. But if you are reusing a buffer you may want to + check its state with + hb_buffer_get_content_type(buffer). If + necessary you can set the content type with + + + hb_buffer_set_content_type(buf, HB_BUFFER_CONTENT_TYPE_UNICODE); + + + to prepare for shaping. + + + Buffers also need to carry information about the script, + language, and text direction of their contents. You can set + these properties individually: + + + hb_buffer_set_direction(buf, HB_DIRECTION_LTR); + hb_buffer_set_script(buf, HB_SCRIPT_LATIN); + hb_buffer_set_language(buf, hb_language_from_string("en", -1)); + + + However, since these properties are often the repeated for + multiple text runs, you can also save them in a + hb_segment_properties_t for reuse: + + + hb_segment_properties_t *savedprops; + hb_buffer_get_segment_properties (buf, savedprops); + ... + hb_buffer_set_segment_properties (buf2, savedprops); + + + HarfBuzz also provides getter functions to retrieve a buffer's + direction, script, and language properties individually. + + + HarfBuzz recognizes four text directions in + hb_direction_t: left-to-right + (HB_DIRECTION_LTR), right-to-left (HB_DIRECTION_RTL), + top-to-bottom (HB_DIRECTION_TTB), and + bottom-to-top (HB_DIRECTION_BTT). For the + script property, HarfBuzz uses identifiers based on the + ISO-15924 + standard. For languages, HarfBuzz uses tags based on the + IETF BCP 47 standard. + + + Helper functions are provided to convert character strings into + the necessary script and language tag types. + + + Two additional buffer properties to be aware of are the + "invisible glyph" and the replacement code point. The + replacement code point is inserted into buffer output in place of + any invalid code points encountered in the input. By default, it + is the Unicode REPLACEMENT CHARACTER code + point, U+FFFD "�". You can change this with + + + hb_buffer_set_replacement_codepoint(buf, replacement); + + + The invisible glyph is used to replace all output glyphs that + are invisible. By default, the standard space character + U+0020 is used; you can replace this (for + example, when using a font that provides script-specific + spaces) with + + + hb_buffer_set_invisible_glyph(buf, replacement); + + + HarfBuzz supports a few additional flags you might want to set + on your buffer under certain circumstances. The + HB_BUFFER_FLAG_BOT and + HB_BUFFER_FLAG_EOT flags tell HarfBuzz + that the buffer represents the beginning or end (respectively) + of a text element (such as a paragraph or other block). Knowing + this allows HarfBuzz to apply certain contextual font features + when shaping, such as initial or final variants in connected + scripts. + + + HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES + tells HarfBuzz not to hide glyphs with the + Default_Ignorable property in Unicode. This + property designates control characters and other non-printing + code points, such as joiners and variation selectors. Normally + HarfBuzz replaces them in the output buffer with zero-width + space glyphs; setting this flag causes them to be printed, + which can be helpful for troubleshooting. + + + Conversely, setting the + HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES flag + tells HarfBuzz to remove Default_Ignorable + glyphs from the output buffer entirely. Finally, setting the + HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE + flag tells HarfBuzz not to insert the dotted-circle glyph + (U+25CC, "◌"), which is normally + inserted into buffer output when broken character sequences are + encountered (such as combining marks that are not attached to a + base character).
+
Customizing Unicode functions + HarfBuzz requires some simple functions for accessing + information from the Unicode Character Database (such as the + General_Category (gc) and + Script (sc) properties) that is useful + for shaping, as well as some useful operations like composing and + decomposing code points. + + + At build time, HarfBuzz looks first for the GLib library. If + it is found, HarfBuzz will use GLib's Unicode functions by + default. If there is no GLib, HarfBuzz will fall back to its own + internal, lightweight set of Unicode functions instead. + + + If your program has access to other Unicode functions, however, + such as through a system library or application framework, you + might prefer to use those instead of the built-in + options. HarfBuzz supports this by implementing its Unicode + functions as a set of virtual methods that you can replace — + without otherwise affecting HarfBuzz's functionality. + + + The Unicode functions are specified in a structure called + unicode_funcs which is attached to each + buffer. But even though unicode_funcs is + associated with a hb_buffer_t, the functions + themselves are called by other HarfBuzz APIs that access + buffers, so it would be unwise for you to hook different + functions into different buffers. + + + In addition, you can mark your unicode_funcs + as immutable by calling + hb_unicode_funcs_make_immutable (ufuncs). This is especially useful if your code is a + library or framework that will have its own client programs. By + marking your Unicode function choices as immutable, you prevent + your own client programs from changing the + unicode_funcs configuration and introducing + inconsistencies and errors downstream. + + + You can retrieve the Unicode-functions configuration for + your buffer by calling hb_buffer_get_unicode_funcs(): + + + hb_unicode_funcs_t *ufunctions; + ufunctions = hb_buffer_get_unicode_funcs(buf); + + + The current version of unicode_funcs uses six functions: + + + + + hb_unicode_combining_class_func_t: + returns the Canonical Combining Class of a code point. + + + + + hb_unicode_general_category_func_t: + returns the General Category (gc) of a code point. + + + + + hb_unicode_mirroring_func_t: returns + the Mirroring Glyph code point (for bi-directional + replacement) of a code point. + + + + + hb_unicode_script_func_t: returns the + Script (sc) property of a code point. + + + + + hb_unicode_compose_func_t: returns the + canonical composition of a sequence of two code points. + + + + + hb_unicode_decompose_func_t: returns + the canonical decomposition of a code point. + + + + + Note, however, that future HarfBuzz releases may alter this set. + + + Each Unicode function has a corresponding setter, with which you + can assign a callback to your replacement function. For example, + to replace + hb_unicode_general_category_func_t, you can call + + + hb_unicode_funcs_set_general_category_func (*ufuncs, func, *user_data, destroy) + + + Virtualizing this set of Unicode functions is primarily intended + to improve portability. There is no need for every client + program to make the effort to replace the default options, so if + you are unsure, do not feel any pressure to customize + unicode_funcs.
+
From 8354c99fbee2887cb71440f4e25ad1e6f46b2592 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 17:22:08 +0100 Subject: [PATCH 008/617] [Docs] Usermanual; add Fonts And Faces chapter. --- docs/usermanual-fonts-and-faces.xml | 447 +++++++++++++++++++++++++++- 1 file changed, 438 insertions(+), 9 deletions(-) diff --git a/docs/usermanual-fonts-and-faces.xml b/docs/usermanual-fonts-and-faces.xml index 553600439..c1787bddf 100644 --- a/docs/usermanual-fonts-and-faces.xml +++ b/docs/usermanual-fonts-and-faces.xml @@ -5,20 +5,449 @@ ]> - Fonts and faces -
+ Fonts, faces, and output + + In the previous chapter, we saw how to set up a buffer and fill + it with text as Unicode code points. In order to shape this + buffer text with HarfBuzz, you will need also need a font + object. + + + HarfBuzz provides abstractions to help you cache and reuse the + heavier parts of working with binary fonts, so we will look at + how to do that. We will also look at how to work with the + FreeType font-rendering library and at how you can customize + HarfBuzz to work with other libraries. + + + Finally, we will look at how to work with OpenType variable + fonts, the latest update to the OpenType font format, and at + some other recent additions to OpenType. + + +
+ Font and face objects + + The outcome of shaping a run of text depends on the contents of + a specific font file (such as the substitutions and positioning + moves in the 'GSUB' and 'GPOS' tables), so HarfBuzz makes + accessing those internals fast. + + + An hb_face_t represents a face + in HarfBuzz. This data type is a wrapper around an + hb_blob_t blob that holds the contents of a binary + fotn file. Since HarfBuzz supports TrueType Collections and + OpenType Collections (each of which can include multiple + typefaces), a HarfBuzz face also requires an index number + specifying which typeface in the file you want to use. Most of + the font files you will encounter in the wild include just a + single face, however, so most of the time you would pass in + 0 as the index when you create a face: + + + hb_blob_t* blob = hb_blob_create_from_file(file); + ... + hb_face_t* face = hb_face_create(blob, 0); + + + On its own, a face object is not quite ready to use for + shaping. The typeface must be set to a specific point size in + order for some details (such as hinting) to work. In addition, + if the font file in question is an OpenType Variable Font, then + you may need to specify one or variation-axis settings (or a + named instance) in order to get the output you need. + + + In HarfBuzz, you do this by creating a font + object from your face. + + + Font objects also have the advantage of being considerably + lighter-weight than face objects (remember that a face contains + the contents of a binary font file mapped into memory). As a + result, you can cache and reuse a font object, but you could + also create a new one for each additional size you needed. + Creating new fonts incurs some additional overhead, of course, + but whether or not it is excessive is your call in the end. In + contrast, face objects are substantially larger, and you really + should cache them and reuse them whenever possible. + + + You can create a font object from a face object: + + + hb_font_t* hb_font = hb_font_create(hb_face); + + + After creating a font, there are a few properties you should + set. Many fonts enable and disable hints based on the size it + is used at, so setting this is important for font + objects. hb_font_set_ppem(font, x_ppem, + y_ppem) sets the pixels-per-EM value of the font. You + can also set the point size of the font with + hb_font_set_ppem(font, ptem). HarfBuzz uses the + industry standard 72 points per inch. + + + HarfBuzz lets you specify the degree subpixel precision you want + through a scaling factor. You can set horizontal and + vertical scaling factors on the + font by calling hb_font_set_scale(font, x_scale, + y_scale). + + + There may be times when you are handed a font object and need to + access the face object that it comes from. For that, you can call + + + hb_face = hb_font_get_face(hb_font); + + + You can also create a font object from an existing font object + using the hb_font_create_sub_font() + function. This creates a child font object that is initiated + with the same attributes as its parent; it can be used to + quickly set up a new font for the purpose of overriding a specific + font-functions method. + + + All face objects and font objects are lifecycle-managed by + HarfBuzz. After creating a face, you increase its reference + count with hb_face_reference(face) and + decrease it with + hb_face_destroy(face). Likewise, you + increase the reference count on a font with + hb_font_reference(font) and decrease it + with hb_font_destroy(font). + + + You can also attach user data to face objects and font objects. + +
+ +
+ Customizing font functions + + During shaping, HarfBuzz frequently needs to query font objects + to get at the contents and parameters of the glyphs in a font + file. It includes a built-in set of functions that is tailored + to working with OpenType fonts. However, as was the case with + Unicode functions in the buffers chapter, HarfBuzz also wants to + make it easy for you to assign a substitute set of font + functions if you are developing a program to work with a library + or platform that provides its own font functions. + + + Therefore, the HarfBuzz API defines a set of virtual + methods for accessing font-object properties, and you can + replace the defaults with your own selections without + interfering with the shaping process. Each font object in + HarfBuzz includes a structure called + font_funcs that serves as a vtable for the + font object. The virtual methods in + font_funcs are: + + + + + hb_font_get_font_h_extents_func_t: returns + the extents of the font for horizontal text. + + + + + hb_font_get_font_v_extents_func_t: returns + the extents of the font for vertical text. + + + + + hb_font_get_nominal_glyph_func_t: returns + the font's nominal glyph for a given code point. + + + + + hb_font_get_variation_glyph_func_t: returns + the font's glyph for a given code point when it is followed by a + given Variation Selector. + + + + + hb_font_get_nominal_glyphs_func_t: returns + the font's nominal glyphs for a series of code points. + + + + + hb_font_get_glyph_advance_func_t: returns + the advance for a glyph. + + + + + hb_font_get_glyph_h_advance_func_t: returns + the advance for a glyph for horizontal text. + + + + + hb_font_get_glyph_v_advance_func_t:returns + the advance for a glyph for vertical text. + + + + + hb_font_get_glyph_advances_func_t: returns + the advances for a series of glyphs. + + + + + hb_font_get_glyph_h_advances_func_t: returns + the advances for a series of glyphs for horizontal text . + + + + + hb_font_get_glyph_v_advances_func_t: returns + the advances for a series of glyphs for vertical text. + + + + + hb_font_get_glyph_origin_func_t: returns + the origin coordinates of a glyph. + + + + + hb_font_get_glyph_h_origin_func_t: returns + the origin coordinates of a glyph for horizontal text. + + + + + hb_font_get_glyph_v_origin_func_t: returns + the origin coordinates of a glyph for vertical text. + + + + + hb_font_get_glyph_extents_func_t: returns + the extents for a glyph. + + + + + hb_font_get_glyph_contour_point_func_t: + returns the coordinates of a specific contour point from a glyph. + + + + + hb_font_get_glyph_name_func_t: returns the + name of a glyph (from its glyph index). + + + + + hb_font_get_glyph_from_name_func_t: returns + the glyph index that corresponds to a given glyph name. + + + + + You can fetch the font-functions configuration for a font object + by calling hb_font_get_font_funcs(): + + + hb_font_funcs_t *ffunctions; + ffunctions = hb_font_get_font_funcs (font); + + + The individual methods can each be replaced with their own setter + function, such as + hb_font_funcs_set_nominal_glyph_func(*ffunctions, + func, *user_data, destroy). + + + Font-functions structures can be reused for multiple font + objects, and can be reference counted with + hb_font_funcs_reference() and + hb_font_funcs_destroy(). Just like other + objects in HarfBuzz, you can set user-data for each + font-functions structure and assign a destroy callback for + it. + + + You can also mark a font-functions structure as immutable, + with hb_font_funcs_make_immutable(). This + is especially useful if your code is a library or framework that + will have its own client programs. By marking your + font-functions structures as immutable, you prevent your client + programs from changing the configuration and introducing + inconsistencies and errors downstream. + +
+ +
+ Font objects and HarfBuzz's native OpenType implementation + + By default, whenever HarfBuzz creates a font object, it will + configure the font to use a built-in set of font functions that + supports contemporary OpenType font internals. If you want to + work with OpenType or TrueType fonts, you should be able to use + these functions without difficulty. + + + Many of the methods in the font-functions structure deal with + the fundamental properties of glyphs that are required for + shaping text: extents (the maximums and minimums on each axis), + origins (the (0,0) coordinate point which + glyphs are drawn in reference to), and advances (the amount that + the cursor needs to be moved after drawing each glyph, including + any empty space for the glyph's side bearings). + + + As you can see in the list of functions, there are separate "horizontal" + and "vertical" variants depending on whether the text is set in + the horizontal or vertical direction. For some scripts, fonts + that are designed to support text set horizontally or vertically (for + example, in Japanese) may include metrics for both text + directions. When fonts don't include this information, HarfBuzz + does its best to transform what the font provides. + + + In addition to the direction-specific functions, HarfBuzz + provides some higher-level functions for fetching information + like extents and advances for a glyph. If you call + + + hb_font_get_glyph_advance_for_direction(font, direction, extents); + + + then you can provide any hb_direction_t as the + direction parameter, and HarfBuzz will + use the correct function variant for the text direction. There + are similar higher-level versions of the functions for fetching + extents, origin coordinates, and contour-point + coordinates. There are also addition and subtraction functions + for moving points with respect to the origin. + + + There are also methods for fetching the glyph ID that + corresponds to a Unicode code point (possibly when followed by a + variation-selector code point), fetching the glyph name from the + font, and fetching the glyph ID that corresponds to a glyph name + you already have. + + + HarfBuzz also provides functions for converting between glyph + names and string + variables. hb_font_glyph_to_string(font, glyph, s, + size) retrieves the name for the glyph ID + glyph from the font object. It generates a + generic name of the form gidDDD (where DDD is + the glyph index) if there is no name for the glyph in the + font. The hb_font_glyph_from_string(font, s, len, + glyph) takes an input string s + and looks for a glyph with that name in the font, returning its + glyph ID in the glyph + output parameter. It automatically parses + gidDDD and uniUUUU strings. + +
+ + + + + + +
+ Working with OpenType Variable Fonts + If you are working with OpenType Variable Fonts, there are a few + additional functions you should use to specify the + variation-axis settings of your font object. Without doing so, + your variable font's font object can still be used, but only at + the default setting for every axis (which, of course, is + sometimes what you want, but does not cover general usage). + + + HarfBuzz manages variation settings in the + hb_variation_t data type, which holds a tag for the + variation-axis identifier tag and a value for its + setting. You can retrieve the list of variation axes in a font + binary from the face object (not from a font object, notably) by + calling hb_ot_var_get_axis_count(face) to + find the number of axes, then using + hb_ot_var_get_axis_infos() to collect the + axis structures: + + + axes = hb_ot_var_get_axis_count(face); + ... + hb_ot_var_get_axis_infos(face, 0, axes, axes_array); + + + For each axis returned in the array, you can can access the + identifier in its tag. HarfBuzz also has + tag definitions predefined for the five standard axes specified + in OpenType (ital for italic, + opsz for optical size, + slnt for slant, wdth for + width, and wght for weight). Each axis also + has a min_value, a + default_value, and a max_value. + + + To set your font object's variation settings, you call the + hb_font_set_variations() function with an + array of hb_variation_t variation settings. Let's + say our font has weight and width axes. We need to specify each + of the axes by tag and assign a value on the axis: + + + unsigned int variation_count = 2; + hb_variation_t variation_data[variation_count]; + variation_data[0].tag = HB_OT_TAG_VAR_AXIS_WIDTH; + variation_data[1].tag = HB_OT_TAG_VAR_AXIS_WEIGHT; + variation_data[0].value = 80; + variation_data[1].value = 750; + ... + hb_font_set_variations(font, variation_data, variation_count); + + + That should give us a slightly condensed font ("normal" on the + wdth axis is 100) at a noticeably bolder + weight ("regular" is 400 on the wght axis). + + + In practice, though, you should always check that the value you + want to set on the axis is within the + [min_value,max_value] + range actually implemented in the font's variation axis. After + all, a font might only provide lighter-than-regular weights, and + setting a heavier value on the wght axis will + not change that. + + + Once your variation settings are specified on your font object, + however, shaping with a variable font is just like shaping a + static font.
- + + From d0f5a05aef73293fe21ddb022084166a7a095862 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 17:22:54 +0100 Subject: [PATCH 009/617] [Docs] Usermanual; add Shaping, Features, and Plans. --- docs/usermanual-opentype-features.xml | 279 +++++++++++++++++++++++++- 1 file changed, 277 insertions(+), 2 deletions(-) diff --git a/docs/usermanual-opentype-features.xml b/docs/usermanual-opentype-features.xml index 51ff55a77..4405328bf 100644 --- a/docs/usermanual-opentype-features.xml +++ b/docs/usermanual-opentype-features.xml @@ -6,14 +6,289 @@ ]> Shaping and shape plans -
+ + Once you have your face and font objects configured as desired and + your input buffer is filled with the characters you need to shape, + all you need to do is call hb_shape(). + + + HarfBuzz will return the shaped version of the text in the same + buffer that you provided, but it will be in output mode. At that + point, you can iterate through the glyphs in the buffer, drawing + each one at the specified position or handing them off to the + appropriate graphics library. + + + For the most part, HarfBuzz's shaping step is straightforward from + the outside. But that doesn't mean there will never be cases where + you want to look under the hood and see what is happening on the + inside. HarfBuzz provides facilities for doing that, too. + + +
+ Shaping and buffer output + + The hb_shape() function call takes four arguments: the font + object to use, the buffer of characters to shape, an array of + user-specified features to apply, and the length of that feature + array. The feature array can be NULL, so for the sake of + simplicity we will start with that case. + + + Internally, HarfBuzz looks at the tables of the font file to + determine where glyph classes, substitutions, and positioning + are defined, using that information to decide which + shaper to use (ot for + OpenType fonts, aat for Apple Advanced + Typography fonts, and so on). It also looks at the direction, + script, and language properties of the segment to figure out + which script-specific shaping model is needed (at least, in + shapers that support multiple options). + + + If a font has a GDEF table, then that is used for + glyph classes; if not, HarfBuzz will fall back to Unicode + categorization by code point. If a font has an AAT "morx" table, + then it is used for substitutions; if not, but there is a GSUB + table, then the GSUB table is used. If the font has an AAT + "kerx" table, then it is used for positioning; if not, but + there is a GPOS table, then the GPOS table is used. If neither + table is found, but there is a "kern" table, then HarfBuzz will + use the "kern" table. If there is no "kerx", no GPOS, and no + "kern", HarfBuzz will fall back to positioning marks itself. + + + With a well-behaved OpenType font, you expect GDEF, GSUB, and + GPOS tables to all be applied. HarfBuzz implements the + script-specific shaping models in internal functions, rather + than in the public API. + + + The algorithms + used for complex scripts can be quite involved; HarfBuzz tries + to be 100% compatible with the OpenType Layout specification + and, wherever there is any ambiguity, HarfBuzz attempts to replicate the + output of Microsoft's Uniscribe engine. See the Microsoft + Typeography pages for more detail. + + + In general, though, all that you need to know if that + hb-shape() returns the results of shaping + in the same buffer that you provided. The buffer's content type + will now be set to + HB_BUFFER_CONTENT_TYPE_GLYPHS, indicating + that it contains shaped output, rather than input text. You can + now extract the glyph information and positioning arrays: + + + hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); + hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); + + + The glyph information array holds a hb_glyph_info_t + for each output glyph, which has two fields: + codepoint and + cluster. Whereas, in the input buffer, + the codepoint field contained the Unicode + code point, it now contains the glyph ID of the corresponding + glyph in the font. The cluster field is + an integer that you can use to help identify when shaping has + reordered, split, or combined code points; we will say more + about that in the next chapter. + + + The glyph positions array holds a corresponding + hb_glyph_position_t for each output glyph, + containing four fields: x_advance, + y_advance, + x_offset, and + y_offset. The advances tell you how far + you need to move the drawing point after drawing this glyph, + depending on whether you are setting horizontal text (in which + case you will have x advances) or vertical text (for which you + will have y advances). The x and y offsets tell you where to + move to start drawing the glyph; usually you will have both and + x and a y offset, regardless of the text direction. + + + Most of the time, you will rely on a font-rendering library or + other graphics library to do the actual drawing of glyphs, so + you will need to iterate through the glyphs in the buffer and + pass the corresponding values off. + +
+ +
OpenType features + OpenType features enable fonts to include smart behavior, + implemented as "lookup" rules stored in the GSUB and GPOS + tables. The OpenType specification defines a long list of + standard features that fonts can use for these behaviors; each + feature has a four-character reserved name and a well-defined + semantic meaning. + + + Some OpenType features are defined for the purpose of supporting + complex-script shaping, and are automatically activated, but + only when a buffer's script property is set to a script that the + feature supports. + + + Other features are more generic and can apply to several (or + any) script, and shaping engines are expected to implement + them. By default, HarfBuzz activates several of these features + on every text run. They include ccmp, + locl, mark, + mkmk, and rlig. + + + In addition, if the text direction is horizontal, HarfBuzz + also applies the calt, + clig, curs, + kern, liga, + rclt, and frac features. + + + If the text direction is vertical, HarfBuzz applies + the vert feature by default. + + + Still other features are designed to be purely optional and left + up to the application or the end user to enable or disable as desired. + + + You can adjust the set of features that HarfBuzz applies to a + buffer by supplying an array of hb_feature_t + features as the third argument to + hb_shape(). For a simple case, let's just + enable the dlig feature, which turns on any + "discretionary" ligatures in the font: + + + unsigned int num_features = 1; + hb_feature_t userfeatures[num_features]; + userfeatures[0].tag = HB_TAG('d','l','i','g'); + userfeatures[0].value = 1; + userfeatures[0].start = 0; + userfeatures[0].end = (unsigned int) -1; + + + When we pass the userfeatures array to + hb_shape(), any discretionary ligature + substitutions from our font that match the text in our buffer + will get performed: + + + hb_shape(font, buf, userfeatures, num_features); + + + Just like we enabled the dlig feature by + setting its value to + 1, you would disable a feature by setting its + value to 0.
-
+ +
+ Shaper selection + + The basic version of hb_shape() determines + its shaping strategy based on examining the capabilities of the + font file. OpenType font tables cause HarfBuzz to try the + ot shaper, while AAT font tables cause HarfBuzz to try the + aat shaper. + + + In the real world, however, a font might include some unusual + mix of tables, or one of the tables might simply be broken for + the script you need to shape. So, sometimes, you might not + want to rely on HarfBuzz's process for deciding what to do, and + just tell hb-shape what you want it to try. + + + hb_shape_full() is an alternate shaping + function that lets you supply a list of shapers for HarfBuzz to + try, in order, when shaping your buffer. For example, if you + have determined that HarfBuzz's attempts to work around broken + tables gives you better results than the AAT shaper itself does, + you might move the AAT shaper to the end of your list of + preferences and call hb_shape_full() + + + char *shaperprefs[3] = {"ot", "default", "aat"}; + ... + hb_shape_full(font, buf, userfeatures, num_features, shaperprefs); + + + to get results you are happier with. + + + You may also want to call + hb_shape_list_shapers() to get a list of + the shapers that were built at compile time in your copy of HarfBuzz. + +
+ +
Plans and caching + Internally, HarfBuzz uses a structure called a shape plan to + track its decisions about how to shape the contents of a + buffer. The hb-shape function builds up the shape plan by + examining segment properties and by inspecting the contents of + the font. + + + This process can involve some decision-making and + trade-offs — for example, HarfBuzz inspects the GSUB and GPOS + lookups for the script and language tags set on the segment + properties, but it falls back on the lookups under the + DFLT tag (and sometimes other common tags) + if there are actually no lookups for the tag requested. + + + HarfBuzz also includes some work-arounds for + handling well-known older font conventions that do not follow + OpenType or Unicode specifications, for buggy system fonts, and for + peculiarities of Microsoft Uniscribe. All of that means that a + shape plan, while not something that you should edit directly in + client code, still might be an object that you want to + inspect. Furthermore, if resources are tight, you might want to + cache the shape plan that HarfBuzz builds for your buffer and + font, so that you do not have to rebuild it for every shaping call. + + + You can create a cacheable shape plan with + hb_shape_plan_create_cached(face, props, + user_features, num_user_features, shaper_list), where + face is a face object (not a font object, + notably), props is an + hb_segment_properties_t, + user_features is an array of + hb_feature_ts (with length + num_user_features), and + shaper_list is a list of shapers to try. + + + Shape plans are objects in HarfBuzz, so there are + reference-counting functions and user-data attachment functions + you can + use. hb_shape_plan_reference(shape_plan) + increases the reference count on a shape plan, while + hb_shape_plan_destroy(shape_plan) decreases + the reference count, destroying the shape plan when the last + reference is dropped. + + + You can attach user data to a shaper (with a key) using the + hb_shape_plan_set_user_data(shape_plan,key,data,destroy,replace) + function, optionally supplying a destroy + callback to use. You can then fetch the user data attached to a + shape plan with + hb_shape_plan_get_user_data(shape_plan, key).
+ From 30d7d1064ee339ca216699851030f9bae8c07c68 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 17:23:19 +0100 Subject: [PATCH 010/617] [Docs] Usermanual; add Utilities chapter. --- docs/usermanual-utilities.xml | 244 ++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 docs/usermanual-utilities.xml diff --git a/docs/usermanual-utilities.xml b/docs/usermanual-utilities.xml new file mode 100644 index 000000000..1c5370c11 --- /dev/null +++ b/docs/usermanual-utilities.xml @@ -0,0 +1,244 @@ + + + +]> + + Utilities + + HarfBuzz includes several auxiliary components in addition to the + main APIs. These include a set of command-line tools, a set of + lower-level APIs for common data types that may be of interest to + client programs, and an embedded library for working with + Unicode Character Database (UCD) data. + + +
+ Command-line tools + + HarfBuzz include three command-line tools: + hb-shape, hb-view, and + hb-subset. They can be used to examine + HarfBuzz's functionality, debug font binaries, or explore the + various shaping models and features from a terminal. + + +
+ hb-shape + + hb-shape allows you to run HarfBuzz's + hb_shape() function on an input string and + to examine the outcome, in human-readable form, as terminal + output. hb-shape does + not render the results of the shaping call + into rendered text (you can use hb-view, below, for + that). Instead, it prints out the final glyph indices and + positions, taking all shaping operations into account, as if the + input string were a HarfBuzz input buffer. + + + You can specify the font to be used for shaping and, with + command-line options, you can add various aspects of the + internal state to the output that is sent to the terminal. The + general format is + + + hb-shape [OPTIONS] + path/to/font/file.ttf + yourinputtext + + + The default output format is plain text (although JSON output + can be selected instead by specifying the option + --output-format=json). The default output + syntax reports each glyph name (or glyph index if there is no + name) followed by its cluster value, its horizontal and vertical + position displacement, and its horizontal and vertical advances. + + + Output options exist to skip any of these elements in the + output, and to include additional data, such as Unicode + code-point values, glyph extents, glyph flags, or interim + shaping results. + + + Output can also be redirected to a file, or input read from a + file. Additional options enable you to enable or disable + specific font features, to set variation-font axis values, to + alter the language, script, direction, and clustering settings + used, to enable sanity checks, or to change which shaping engine is used. + + + For a complete explanation of the options available, run + + + hb-shape --help + +
+ +
+ hb-view + + hb-view allows you to + see the shaped output of an input string in rendered + form. Like hb-shape, + hb-view takes a font file and a text string + as its arguments: + + + hb-view [OPTIONS] + path/to/font/file.ttf + yourinputtext + + + By default, hb-view renders the shaped + text in ASCII block-character images as terminal output. By + appending the + --output-file=filename + switch, you can write the output to a PNG, SVG, or PDF file + (among other formats). + + + As with hb-shape, a lengthy set of options + is available, with which you can enable or disable + specific font features, set variation-font axis values, + alter the language, script, direction, and clustering settings + used, enable sanity checks, or change which shaping engine is + used. + + + You can also set the foreground and background colors used for + the output, independently control the width of all four + margins, alter the line spacing, and annotate the output image + with + + + In general, hb-view is a quick way to + verify that the output of HarfBuzz's shaping operation looks + correct for a given text-and-font combination, but you may + want to use hb-shape to figure out exactly + why something does not appear as expected. + +
+ +
+ hb-subset + + hb-subset allows you + to generate a subset of a given font, with a limited set of + supported characters, features, and variation settings. + + + By default, you provide an input font and an input text string + as the arguments to hb-subset, and it will + generate a font that covers the input text exactly like the + input font does, but includes no other characters or features. + + + hb-subset [OPTIONS] + path/to/font/file.ttf + yourinputtext + + + For example, to create a subset of Noto Serif that just includes the + numerals and the lowercase Latin alphabet, you could run + + + hb-subset [OPTIONS] + NotoSerif-Regular.ttf + 0123456789abcdefghijklmnopqrstuvwxyz + + + There are options available to remove hinting from the + subsetted font and to specify a list of variation-axis settings. + +
+ +
+ +
+ Common data types and APIs + + HarfBuzz includes several APIs for working with general-purpose + data that you may find convenient to leverage in your own + software. They include set operations and integer-to-integer + mapping operations. + + + HarfBuzz uses set operations for internal bookkeeping, such as + when it collects all of the glyph IDs covered by a particular + font feature. You can also use the set API to build sets, add + and remove elements, test whether or not sets contain particular + elements, or compute the unions, intersections, or differences + between sets. + + + All set elements are integers (specifically, + hb_codepoint_t 32-bit unsigned ints), and there are + functions for fetching the minimum and maximum element from a + set. The set API also includes some functions that might not + be part of a generic set facility, such as the ability to add a + contiguous range of integer elements to a set in bulk, and the + ability to fetch the next-smallest or next-largest element. + + + The HarfBuzz set API includes some conveniences as well. All + sets are lifecycle-managed, just like other HarfBuzz + objects. You increase the reference count on a set with + hb_set_reference() and decrease it with + hb_set_destroy(). You can also attach + user data to a set, just like you can to blobs, buffers, faces, + fonts, and other objects, and set destroy callbacks. + + + HarfBuzz also provides an API for keeping track of + integer-to-integer mappings. As with the set API, each integer is + stored as an unsigned 32-bit hb_codepoint_t + element. Maps, like other objects, are reference counted with + reference and destroy functions, and you can attach user data to + them. The mapping operations include adding and deleting + integer-to-integer key:value pairs to the map, testing for the + presence of a key, fetching the population of the map, and so on. + + + There are several other internal HarfBuzz facilities that are + exposed publicly and which you may want to take advantage of + while processing text. HarfBuzz uses a common + hb_tag_t for a variety of OpenType tag identifiers (for + scripts, languages, font features, table names, variation-axis + names, and more), and provides functions for converting strings + to tags and vice-versa. + + + Finally, HarfBuzz also includes data type for Booleans, bit + masks, and other simple types. + +
+ +
+ UCDN + + HarfBuzz includes a copy of the UCDN (Unicode + Database and Normalization) library, which provides functions + for accessing basic Unicode character properties, performing + canonical composition, and performing both canonical and + compatibility decomposition. + + + Currently, UCDN supports direct queries for several more character + properties than HarfBuzz's built-in set of Unicode functions + does, such as the BiDirectional Class, East Asian Width, Paired + Bracket and Resolved Linebreak properties. If you need to access + more properties than HarfBuzz's internal implementation + provides, using the built-in UCDN functions may be a useful solution. + + + The built-in UCDN functions are compiled by default when + building HarfBuzz from source, but this can be disabled with a + compile-time switch. + +
+ +
From 68749e996aedbae9b1c4553f5672f74e1727b850 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Tue, 30 Apr 2019 17:23:55 +0100 Subject: [PATCH 011/617] [Docs] Usermanual; update XML manifest for new chapters. --- docs/Makefile.am | 4 ++-- docs/harfbuzz-docs.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Makefile.am b/docs/Makefile.am index 7020273df..0c76b2ed3 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -79,9 +79,9 @@ content_files= \ usermanual-object-model.xml \ usermanual-buffers-language-script-and-direction.xml \ usermanual-fonts-and-faces.xml \ - usermanual-clusters.xml \ usermanual-opentype-features.xml \ - usermanual-glyph-information.xml \ + usermanual-clusters.xml \ + usermanual-utilities.xml \ version.xml # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml index 63863350e..e3f314d92 100644 --- a/docs/harfbuzz-docs.xml +++ b/docs/harfbuzz-docs.xml @@ -40,9 +40,9 @@ - - + + From fe4a0ac707802b5bb36787723f8d55a58c2946a5 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Tue, 30 Apr 2019 13:35:50 -0400 Subject: [PATCH 012/617] Fix some dead links --- src/gen-os2-unicode-ranges.py | 2 +- src/gen-use-table.py | 6 +++--- src/hb-ot-shape-complex-myanmar.hh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gen-os2-unicode-ranges.py b/src/gen-os2-unicode-ranges.py index 8cf598588..95f1f1156 100644 --- a/src/gen-os2-unicode-ranges.py +++ b/src/gen-os2-unicode-ranges.py @@ -2,7 +2,7 @@ # Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh # Input is a tab seperated list of unicode ranges from the otspec -# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ulunicoderange1). +# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur). from __future__ import print_function, division, absolute_import diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 1a33b8af5..0060e101d 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -54,7 +54,7 @@ data[0][0x1B5C] = 'Consonant_Placeholder' data[0][0x1B5F] = 'Consonant_Placeholder' data[0][0x1B62] = 'Consonant_Placeholder' data[0][0x1B68] = 'Consonant_Placeholder' -# TODO https://github.com/roozbehp/unicode-data/issues/9 +# TODO https://github.com/harfbuzz/harfbuzz/issues/1035 data[0][0x11C44] = 'Consonant_Placeholder' data[0][0x11C45] = 'Consonant_Placeholder' # TODO https://github.com/harfbuzz/harfbuzz/pull/1399 @@ -240,11 +240,11 @@ def is_SYM_MOD(U, UISC, UGC): def is_VARIATION_SELECTOR(U, UISC, UGC): return 0xFE00 <= U <= 0xFE0F def is_VOWEL(U, UISC, UGC): - # https://github.com/roozbehp/unicode-data/issues/6 + # https://github.com/harfbuzz/harfbuzz/issues/376 return (UISC == Pure_Killer or (UGC != Lo and UISC in [Vowel, Vowel_Dependent] and U not in [0xAA29])) def is_VOWEL_MOD(U, UISC, UGC): - # https://github.com/roozbehp/unicode-data/issues/6 + # https://github.com/harfbuzz/harfbuzz/issues/376 return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or (UGC != Lo and (UISC == Bindu or U in [0xAA29]))) diff --git a/src/hb-ot-shape-complex-myanmar.hh b/src/hb-ot-shape-complex-myanmar.hh index 3e9537a64..9ec78ef89 100644 --- a/src/hb-ot-shape-complex-myanmar.hh +++ b/src/hb-ot-shape-complex-myanmar.hh @@ -146,7 +146,7 @@ set_myanmar_properties (hb_glyph_info_t &info) break; case 0xAA74u: case 0xAA75u: case 0xAA76u: - /* https://github.com/roozbehp/unicode-data/issues/3 */ + /* https://github.com/harfbuzz/harfbuzz/issues/218 */ cat = OT_C; break; } From f27fdca4aa438ec366ee17370fbc9fdeb962c397 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 30 Apr 2019 13:01:04 -0700 Subject: [PATCH 013/617] [doc] Add documentation to hb_color_get_* and hb_directwrite_face_* (#1690) --- src/hb-common.cc | 12 ++++++++---- src/hb-directwrite.cc | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index c453443e7..6db801cdd 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -1162,8 +1162,9 @@ hb_variation_to_string (hb_variation_t *variation, /** * hb_color_get_alpha: + * color: a #hb_color_t we are interested in its channels. * - * + * Return value: Alpha channel value of the given color * * Since: REPLACEME */ @@ -1175,8 +1176,9 @@ uint8_t /** * hb_color_get_red: + * color: a #hb_color_t we are interested in its channels. * - * + * Return value: Red channel value of the given color * * Since: REPLACEME */ @@ -1188,8 +1190,9 @@ uint8_t /** * hb_color_get_green: + * color: a #hb_color_t we are interested in its channels. * - * + * Return value: Green channel value of the given color * * Since: REPLACEME */ @@ -1201,8 +1204,9 @@ uint8_t /** * hb_color_get_blue: + * color: a #hb_color_t we are interested in its channels. * - * + * Return value: Blue channel value of the given color * * Since: REPLACEME */ diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index d8076c922..8f2e66025 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -930,7 +930,9 @@ _hb_directwrite_font_release (void *data) /** * hb_directwrite_face_create: - * @font_face: + * @font_face: a DirectWrite IDWriteFontFace object. + * + * Return value: #hb_face_t object corresponding to the given input * * Since: 2.4.0 **/ @@ -945,7 +947,9 @@ hb_directwrite_face_create (IDWriteFontFace *font_face) /** * hb_directwrite_face_get_font_face: -* @face: +* @face: a #hb_face_t object +* +* Return value: DirectWrite IDWriteFontFace object corresponding to the given input * * Since: REPLACEME **/ From 92588782d7a45e0c023c5f48cbd19b11cfa8f0d2 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 30 Apr 2019 13:05:10 -0700 Subject: [PATCH 014/617] Remove space between right angle brackets now that we have C++11 (#1689) --- src/hb-aat-layout-ankr-table.hh | 2 +- src/hb-aat-layout-common.hh | 14 +++--- src/hb-aat-layout-just-table.hh | 4 +- src/hb-aat-layout-kerx-table.hh | 14 +++--- src/hb-aat-layout-lcar-table.hh | 2 +- src/hb-aat-layout-morx-table.hh | 14 +++--- src/hb-aat-layout-trak-table.hh | 2 +- src/hb-aat-ltag-table.hh | 2 +- src/hb-cff-interp-cs-common.hh | 2 +- src/hb-cff1-interp-cs.hh | 2 +- src/hb-cff2-interp-cs.hh | 2 +- src/hb-iter.hh | 4 +- src/hb-null.hh | 8 +-- src/hb-open-file.hh | 8 +-- src/hb-open-type.hh | 8 +-- src/hb-ot-color-cbdt-table.hh | 2 +- src/hb-ot-color-colr-table.hh | 4 +- src/hb-ot-color-cpal-table.hh | 8 +-- src/hb-ot-color-sbix-table.hh | 2 +- src/hb-ot-color-svg-table.hh | 4 +- src/hb-ot-kern-table.hh | 6 +-- src/hb-ot-layout-base-table.hh | 2 +- src/hb-ot-layout-common.hh | 10 ++-- src/hb-ot-layout-gdef-table.hh | 4 +- src/hb-ot-layout-gpos-table.hh | 6 +-- src/hb-ot-layout-gsub-table.hh | 18 +++---- src/hb-ot-layout-gsubgpos.hh | 86 ++++++++++++++++----------------- src/hb-ot-math-table.hh | 2 +- src/hb-ot-name-table.hh | 10 ++-- src/hb-ot-stat-table.hh | 4 +- src/hb-subset-cff1.cc | 2 +- src/test-iter.cc | 10 ++-- 32 files changed, 134 insertions(+), 134 deletions(-) diff --git a/src/hb-aat-layout-ankr-table.hh b/src/hb-aat-layout-ankr-table.hh index 4087b8c1f..ef988841a 100644 --- a/src/hb-aat-layout-ankr-table.hh +++ b/src/hb-aat-layout-ankr-table.hh @@ -83,7 +83,7 @@ struct ankr protected: HBUINT16 version; /* Version number (set to zero) */ HBUINT16 flags; /* Flags (currently unused; set to zero) */ - LOffsetTo > > + LOffsetTo>> lookupTable; /* Offset to the table's lookup table */ LNNOffsetTo anchorData; /* Offset to the glyph data table */ diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 7c74d7938..95ac27128 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -125,7 +125,7 @@ struct LookupFormat2 protected: HBUINT16 format; /* Format identifier--format = 2 */ - VarSizedBinSearchArrayOf > + VarSizedBinSearchArrayOf> segments; /* The actual segments. These must already be sorted, * according to the first word in each one (the last * glyph in each segment). */ @@ -164,7 +164,7 @@ struct LookupSegmentArray GlyphID last; /* Last GlyphID in this segment */ GlyphID first; /* First GlyphID in this segment */ - NNOffsetTo > + NNOffsetTo> valuesZ; /* A 16-bit offset from the start of * the table to the data. */ public: @@ -196,7 +196,7 @@ struct LookupFormat4 protected: HBUINT16 format; /* Format identifier--format = 4 */ - VarSizedBinSearchArrayOf > + VarSizedBinSearchArrayOf> segments; /* The actual segments. These must already be sorted, * according to the first word in each one (the last * glyph in each segment). */ @@ -253,7 +253,7 @@ struct LookupFormat6 protected: HBUINT16 format; /* Format identifier--format = 6 */ - VarSizedBinSearchArrayOf > + VarSizedBinSearchArrayOf> entries; /* The actual entries, sorted by glyph index. */ public: DEFINE_SIZE_ARRAY (8, entries); @@ -419,7 +419,7 @@ struct Lookup /* Ugly hand-coded null objects for template Lookup<> :(. */ extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; template -struct Null > { +struct Null> { static AAT::Lookup const & get_null () { return *reinterpret_cast *> (_hb_Null_AAT_Lookup); } }; @@ -510,7 +510,7 @@ struct StateTable const Entry &get_entry (int state, unsigned int klass) const { if (unlikely (klass >= nClasses)) - klass = StateTable >::CLASS_OUT_OF_BOUNDS; + klass = StateTable>::CLASS_OUT_OF_BOUNDS; const HBUSHORT *states = (this+stateArrayTable).arrayZ; const Entry *entries = (this+entryTable).arrayZ; @@ -631,7 +631,7 @@ struct StateTable classTable; /* Offset to the class table. */ NNOffsetTo, HBUINT> stateArrayTable;/* Offset to the state array. */ - NNOffsetTo >, HBUINT> + NNOffsetTo>, HBUINT> entryTable; /* Offset to the entry array. */ public: diff --git a/src/hb-aat-layout-just-table.hh b/src/hb-aat-layout-just-table.hh index d53f8f19e..e15c946a2 100644 --- a/src/hb-aat-layout-just-table.hh +++ b/src/hb-aat-layout-just-table.hh @@ -309,7 +309,7 @@ struct WidthDeltaPair public: DEFINE_SIZE_STATIC (24); }; - + typedef OT::LArrayOf WidthDeltaCluster; struct JustificationCategory @@ -371,7 +371,7 @@ struct JustificationHeader * of postcompensation subtable (set to zero if none). * * The postcompensation subtable, if present in the font. */ - Lookup > + Lookup> lookupTable; /* Lookup table associating glyphs with width delta * clusters. See the description of Width Delta Clusters * table for details on how to interpret the lookup values. */ diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index a64c80738..b740f1e8f 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -712,18 +712,18 @@ struct KerxSubTableFormat6 { struct Long { - LNNOffsetTo > rowIndexTable; - LNNOffsetTo > columnIndexTable; - LNNOffsetTo > array; + LNNOffsetTo> rowIndexTable; + LNNOffsetTo> columnIndexTable; + LNNOffsetTo> array; } l; struct Short { - LNNOffsetTo > rowIndexTable; - LNNOffsetTo > columnIndexTable; - LNNOffsetTo > array; + LNNOffsetTo> rowIndexTable; + LNNOffsetTo> columnIndexTable; + LNNOffsetTo> array; } s; } u; - LNNOffsetTo > vector; + LNNOffsetTo> vector; public: DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24); }; diff --git a/src/hb-aat-layout-lcar-table.hh b/src/hb-aat-layout-lcar-table.hh index 4be799fbc..cd96d034d 100644 --- a/src/hb-aat-layout-lcar-table.hh +++ b/src/hb-aat-layout-lcar-table.hh @@ -81,7 +81,7 @@ struct lcar protected: FixedVersion<>version; /* Version number of the ligature caret table */ HBUINT16 format; /* Format of the ligature caret table. */ - Lookup > + Lookup> lookup; /* data Lookup table associating glyphs */ public: diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 4a1d959ef..466842483 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -969,7 +969,7 @@ struct Chain void apply (hb_aat_apply_context_t *c, hb_mask_t flags) const { - const ChainSubtable *subtable = &StructAfter > (featureZ.as_array (featureCount)); + const ChainSubtable *subtable = &StructAfter> (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { @@ -1031,7 +1031,7 @@ struct Chain if (unlikely (!c->buffer->successful)) return; skip: - subtable = &StructAfter > (*subtable); + subtable = &StructAfter> (*subtable); c->set_lookup_index (c->lookup_index + 1); } } @@ -1049,13 +1049,13 @@ struct Chain if (!c->check_array (featureZ.arrayZ, featureCount)) return_trace (false); - const ChainSubtable *subtable = &StructAfter > (featureZ.as_array (featureCount)); + const ChainSubtable *subtable = &StructAfter> (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { if (!subtable->sanitize (c)) return_trace (false); - subtable = &StructAfter > (*subtable); + subtable = &StructAfter> (*subtable); } return_trace (true); @@ -1095,7 +1095,7 @@ struct mortmorx for (unsigned int i = 0; i < count; i++) { map->chain_flags.push (chain->compile_flags (mapper)); - chain = &StructAfter > (*chain); + chain = &StructAfter> (*chain); } } @@ -1109,7 +1109,7 @@ struct mortmorx { chain->apply (c, c->plan->aat_map.chain_flags[i]); if (unlikely (!c->buffer->successful)) return; - chain = &StructAfter > (*chain); + chain = &StructAfter> (*chain); } } @@ -1125,7 +1125,7 @@ struct mortmorx { if (!chain->sanitize (c, version)) return_trace (false); - chain = &StructAfter > (*chain); + chain = &StructAfter> (*chain); } return_trace (true); diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 0c8e4558f..2688270aa 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -66,7 +66,7 @@ struct TrackTableEntry NameID trackNameID; /* The 'name' table index for this track. * (a short word or phrase like "loose" * or "very tight") */ - NNOffsetTo > + NNOffsetTo> valuesZ; /* Offset from start of tracking table to * per-size tracking values for this track. */ diff --git a/src/hb-aat-ltag-table.hh b/src/hb-aat-ltag-table.hh index 6f34a0095..711f9aa6c 100644 --- a/src/hb-aat-ltag-table.hh +++ b/src/hb-aat-ltag-table.hh @@ -50,7 +50,7 @@ struct FTStringRange } protected: - NNOffsetTo > + NNOffsetTo> tag; /* Offset from the start of the table to * the beginning of the string */ HBUINT16 length; /* String length (in bytes) */ diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 283bdf14a..71bc29282 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -246,7 +246,7 @@ struct path_procs_null_t static void flex1 (ENV &env, PARAM& param) {} }; -template > +template > struct cs_opset_t : opset_t { static void process_op (op_code_t op, ENV &env, PARAM& param) diff --git a/src/hb-cff1-interp-cs.hh b/src/hb-cff1-interp-cs.hh index c7209ed80..cc528564c 100644 --- a/src/hb-cff1-interp-cs.hh +++ b/src/hb-cff1-interp-cs.hh @@ -81,7 +81,7 @@ struct cff1_cs_interp_env_t : cs_interp_env_t typedef cs_interp_env_t SUPER; }; -template > +template > struct cff1_cs_opset_t : cs_opset_t { /* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */ diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh index 49e5ee739..1faf20831 100644 --- a/src/hb-cff2-interp-cs.hh +++ b/src/hb-cff2-interp-cs.hh @@ -193,7 +193,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t typedef cs_interp_env_t SUPER; }; -template > +template > struct cff2_cs_opset_t : cs_opset_t { static void process_op (op_code_t op, cff2_cs_interp_env_t &env, PARAM& param) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index f0947282d..6fe984fc6 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -387,7 +387,7 @@ struct template struct hb_zip_iter_t : hb_iter_t, - hb_pair_t > + hb_pair_t> { hb_zip_iter_t () {} hb_zip_iter_t (const A& a, const B& b) : a (a), b (b) {} @@ -427,7 +427,7 @@ template struct hb_enumerate_iter_t : hb_iter_t, - hb_pair_t > + hb_pair_t> { hb_enumerate_iter_t (const Iter& it) : i (0), it (it) {} diff --git a/src/hb-null.hh b/src/hb-null.hh index 1e20a47e9..562c4abc0 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -50,7 +50,7 @@ template struct _hb_null_size { enum { value = sizeof (T) }; }; template -struct _hb_null_size > +struct _hb_null_size> { enum { value = T::null_size }; }; template @@ -67,7 +67,7 @@ template struct _hb_static_size { enum { value = sizeof (T) }; }; template -struct _hb_static_size > +struct _hb_static_size> { enum { value = T::static_size }; }; template @@ -95,7 +95,7 @@ struct Null { template struct NullHelper { - typedef hb_remove_const > Type; + typedef hb_remove_const> Type; static const Type & get_null () { return Null::get_null (); } }; #define Null(Type) NullHelper::get_null () @@ -148,7 +148,7 @@ static inline Type& Crap () { template struct CrapHelper { - typedef hb_remove_const > Type; + typedef hb_remove_const> Type; static Type & get_crap () { return Crap (); } }; #define Crap(Type) CrapHelper::get_crap () diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh index 7e916aeb6..0689facd0 100644 --- a/src/hb-open-file.hh +++ b/src/hb-open-file.hh @@ -222,7 +222,7 @@ struct TTCHeaderVersion1 Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ FixedVersion<>version; /* Version of the TTC Header (1.0), * 0x00010000u */ - LArrayOf > + LArrayOf> table; /* Array of offsets to the OffsetTable for each font * from the beginning of the file */ public: @@ -334,7 +334,7 @@ struct ResourceTypeRecord protected: Tag tag; /* Resource type. */ HBUINT16 resCountM1; /* Number of resources minus 1. */ - NNOffsetTo > + NNOffsetTo> resourcesZ; /* Offset from beginning of resource type list * to reference item list for this type. */ public: @@ -390,7 +390,7 @@ struct ResourceMap HBUINT32 reserved1; /* Reserved for handle to next resource map */ HBUINT16 resreved2; /* Reserved for file reference number */ HBUINT16 attrs; /* Resource fork attribute */ - NNOffsetTo > + NNOffsetTo> typeList; /* Offset from beginning of map to * resource type list */ Offset16 nameList; /* Offset from beginning of map to @@ -422,7 +422,7 @@ struct ResourceForkHeader } protected: - LNNOffsetTo > + LNNOffsetTo> data; /* Offset from beginning of resource fork * to resource data */ LNNOffsetTo diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 041b9843f..bde059602 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -442,7 +442,7 @@ struct UnsizedArrayOf /* Unsized array of offset's */ template -using UnsizedOffsetArrayOf = UnsizedArrayOf >; +using UnsizedOffsetArrayOf = UnsizedArrayOf>; /* Unsized array of offsets relative to the beginning of the array itself. */ template @@ -628,9 +628,9 @@ using PString = ArrayOf; /* Array of Offset's */ template -using OffsetArrayOf = ArrayOf >; +using OffsetArrayOf = ArrayOf>; template -using LOffsetArrayOf = ArrayOf >; +using LOffsetArrayOf = ArrayOf>; template using LOffsetLArrayOf = ArrayOf, HBUINT32>; @@ -882,7 +882,7 @@ struct BinSearchHeader }; template -using BinSearchArrayOf = SortedArrayOf >; +using BinSearchArrayOf = SortedArrayOf>; struct VarSizedBinSearchHeader diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index 333ceaaba..b6dc364a1 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -144,7 +144,7 @@ struct IndexSubtableFormat1Or3 } IndexSubtableHeader header; - UnsizedArrayOf > + UnsizedArrayOf> offsetArrayZ; public: DEFINE_SIZE_ARRAY(8, offsetArrayZ); diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh index a57911ad0..90f89d583 100644 --- a/src/hb-ot-color-colr-table.hh +++ b/src/hb-ot-color-colr-table.hh @@ -125,9 +125,9 @@ struct COLR protected: HBUINT16 version; /* Table version number (starts at 0). */ HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */ - LNNOffsetTo > + LNNOffsetTo> baseGlyphsZ; /* Offset to Base Glyph records. */ - LNNOffsetTo > + LNNOffsetTo> layersZ; /* Offset to Layer Records. */ HBUINT16 numLayers; /* Number of Layer Records. */ public: diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index 407049350..7df7059a8 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -87,15 +87,15 @@ struct CPALV1Tail } protected: - LNNOffsetTo > + LNNOffsetTo> paletteFlagsZ; /* Offset from the beginning of CPAL table to * the Palette Type Array. Set to 0 if no array * is provided. */ - LNNOffsetTo > + LNNOffsetTo> paletteLabelsZ; /* Offset from the beginning of CPAL table to * the palette labels array. Set to 0 if no * array is provided. */ - LNNOffsetTo > + LNNOffsetTo> colorLabelsZ; /* Offset from the beginning of CPAL table to * the color labels array. Set to 0 * if no array is provided. */ @@ -176,7 +176,7 @@ struct CPAL HBUINT16 numPalettes; /* Number of palettes in the table. */ HBUINT16 numColorRecords; /* Total number of color records, combined for * all palettes. */ - LNNOffsetTo > + LNNOffsetTo> colorRecordsZ; /* Offset from the beginning of CPAL table to * the first ColorRecord. */ UnsizedArrayOf diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index f6bdbb3dd..670c05504 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -121,7 +121,7 @@ struct SBIXStrike HBUINT16 resolution; /* The device pixel density (in PPI) for which this * strike was designed. (E.g., 96 PPI, 192 PPI.) */ protected: - UnsizedArrayOf > + UnsizedArrayOf> imageOffsetsZ; /* Offset from the beginning of the strike data header * to bitmap data for an individual glyph ID. */ public: diff --git a/src/hb-ot-color-svg-table.hh b/src/hb-ot-color-svg-table.hh index 6e8eddf24..926d61e0f 100644 --- a/src/hb-ot-color-svg-table.hh +++ b/src/hb-ot-color-svg-table.hh @@ -62,7 +62,7 @@ struct SVGDocumentIndexEntry * this index entry. */ HBUINT16 endGlyphID; /* The last glyph ID in the range described by * this index entry. Must be >= startGlyphID. */ - LNNOffsetTo > + LNNOffsetTo> svgDoc; /* Offset from the beginning of the SVG Document Index * to an SVG document. Must be non-zero. */ HBUINT32 svgDocLength; /* Length of the SVG document. @@ -107,7 +107,7 @@ struct SVG protected: HBUINT16 version; /* Table version (starting at 0). */ - LOffsetTo > + LOffsetTo> svgDocEntries; /* Offset (relative to the start of the SVG table) to the * SVG Documents Index. Must be non-zero. */ /* Array of SVG Document Index Entries. */ diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index ec6a3c84c..0b55dabdc 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -47,9 +47,9 @@ struct KernSubTableFormat3 int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { hb_array_t kernValue = kernValueZ.as_array (kernValueCount); - hb_array_t leftClass = StructAfter > (kernValue).as_array (glyphCount); - hb_array_t rightClass = StructAfter > (leftClass).as_array (glyphCount); - hb_array_t kernIndex = StructAfter > (rightClass).as_array (leftClassCount * rightClassCount); + hb_array_t leftClass = StructAfter> (kernValue).as_array (glyphCount); + hb_array_t rightClass = StructAfter> (leftClass).as_array (glyphCount); + hb_array_t kernIndex = StructAfter> (rightClass).as_array (leftClassCount * rightClassCount); unsigned int leftC = leftClass[left]; unsigned int rightC = rightClass[right]; diff --git a/src/hb-ot-layout-base-table.hh b/src/hb-ot-layout-base-table.hh index 7ef573ea8..091236294 100644 --- a/src/hb-ot-layout-base-table.hh +++ b/src/hb-ot-layout-base-table.hh @@ -447,7 +447,7 @@ struct Axis } protected: - OffsetTo > + OffsetTo> baseTagList; /* Offset to BaseTagList table, from beginning * of Axis table (may be NULL) * Array of 4-byte baseline identification tags — must diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index b85d1226e..c8dcc3208 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -103,7 +103,7 @@ struct Record }; template -struct RecordArrayOf : SortedArrayOf > +struct RecordArrayOf : SortedArrayOf> { const OffsetTo& get_offset (unsigned int i) const { return (*this)[i].offset; } @@ -649,14 +649,14 @@ struct Lookup template const TSubTable& get_subtable (unsigned int i) const - { return this+CastR > (subTable)[i]; } + { return this+CastR> (subTable)[i]; } template const OffsetArrayOf& get_subtables () const - { return CastR > (subTable); } + { return CastR> (subTable); } template OffsetArrayOf& get_subtables () - { return CastR > (subTable); } + { return CastR> (subTable); } unsigned int get_size () const { @@ -774,7 +774,7 @@ struct Lookup if (!markFilteringSet.sanitize (c)) return_trace (false); } - if (unlikely (!CastR > > (subTable) + if (unlikely (!CastR>> (subTable) .sanitize (c, this, get_type ()))) return_trace (false); diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index dc8b9b847..5d9a3ec78 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -220,7 +220,7 @@ struct LigGlyph { if (caret_count) { - hb_array_t > array = carets.sub_array (start_offset, caret_count); + hb_array_t > array = carets.sub_array (start_offset, caret_count); unsigned int count = array.length; for (unsigned int i = 0; i < count; i++) caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store); @@ -296,7 +296,7 @@ struct MarkGlyphSetsFormat1 protected: HBUINT16 format; /* Format identifier--format = 1 */ - ArrayOf > + ArrayOf> coverage; /* Array of long offsets to mark set * coverage tables */ public: diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index a7257dfbb..407ce9e27 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -174,11 +174,11 @@ struct ValueFormat : HBUINT16 } HB_INTERNAL static OffsetTo& get_device (Value* value) - { return *CastP > (value); } + { return *CastP> (value); } HB_INTERNAL static const OffsetTo& get_device (const Value* value, bool *worked=nullptr) { if (worked) *worked |= bool (*value); - return *CastP > (value); + return *CastP> (value); } HB_INTERNAL static const HBINT16& get_short (const Value* value, bool *worked=nullptr) @@ -393,7 +393,7 @@ struct AnchorMatrix HBUINT16 rows; /* Number of rows */ protected: - UnsizedArrayOf > + UnsizedArrayOf> matrixZ; /* Matrix of offsets to Anchor tables-- * from beginning of AnchorMatrix table */ public: diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 10c35e32c..be78c1aaa 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -983,7 +983,7 @@ struct ReverseChainSingleSubstFormat1 if (!(this+coverage).intersects (glyphs)) return false; - const OffsetArrayOf &lookahead = StructAfter > (backtrack); + const OffsetArrayOf &lookahead = StructAfter> (backtrack); unsigned int count; @@ -1004,8 +1004,8 @@ struct ReverseChainSingleSubstFormat1 { if (!intersects (c->glyphs)) return; - const OffsetArrayOf &lookahead = StructAfter > (backtrack); - const ArrayOf &substitute = StructAfter > (lookahead); + const OffsetArrayOf &lookahead = StructAfter> (backtrack); + const ArrayOf &substitute = StructAfter> (lookahead); + hb_zip (this+coverage, substitute) | hb_filter (*c->glyphs, hb_first) @@ -1024,12 +1024,12 @@ struct ReverseChainSingleSubstFormat1 for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return; - const OffsetArrayOf &lookahead = StructAfter > (backtrack); + const OffsetArrayOf &lookahead = StructAfter> (backtrack); count = lookahead.len; for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return; - const ArrayOf &substitute = StructAfter > (lookahead); + const ArrayOf &substitute = StructAfter> (lookahead); count = substitute.len; c->output->add_array (substitute.arrayZ, substitute.len); } @@ -1048,8 +1048,8 @@ struct ReverseChainSingleSubstFormat1 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const OffsetArrayOf &lookahead = StructAfter > (backtrack); - const ArrayOf &substitute = StructAfter > (lookahead); + const OffsetArrayOf &lookahead = StructAfter> (backtrack); + const ArrayOf &substitute = StructAfter> (lookahead); unsigned int start_index = 0, end_index = 0; if (match_backtrack (c, @@ -1084,10 +1084,10 @@ struct ReverseChainSingleSubstFormat1 TRACE_SANITIZE (this); if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this))) return_trace (false); - const OffsetArrayOf &lookahead = StructAfter > (backtrack); + const OffsetArrayOf &lookahead = StructAfter> (backtrack); if (!lookahead.sanitize (c, this)) return_trace (false); - const ArrayOf &substitute = StructAfter > (lookahead); + const ArrayOf &substitute = StructAfter> (lookahead); return_trace (substitute.sanitize (c)); } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 840c142ab..6b0b7ad5d 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1299,7 +1299,7 @@ struct Rule void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { - const UnsizedArrayOf &lookupRecord = StructAfter > + const UnsizedArrayOf &lookupRecord = StructAfter> (inputZ.as_array ((inputCount ? inputCount - 1 : 0))); context_closure_lookup (c, inputCount, inputZ.arrayZ, @@ -1310,7 +1310,7 @@ struct Rule void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const { - const UnsizedArrayOf &lookupRecord = StructAfter > + const UnsizedArrayOf &lookupRecord = StructAfter> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); context_collect_glyphs_lookup (c, inputCount, inputZ.arrayZ, @@ -1321,7 +1321,7 @@ struct Rule bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { - const UnsizedArrayOf &lookupRecord = StructAfter > + const UnsizedArrayOf &lookupRecord = StructAfter> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); return context_would_apply_lookup (c, inputCount, inputZ.arrayZ, @@ -1333,7 +1333,7 @@ struct Rule ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const UnsizedArrayOf &lookupRecord = StructAfter > + const UnsizedArrayOf &lookupRecord = StructAfter> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); } @@ -1751,7 +1751,7 @@ struct ContextFormat3 HBUINT16 glyphCount; /* Number of glyphs in the input glyph * sequence */ HBUINT16 lookupCount; /* Number of LookupRecords */ - UnsizedArrayOf > + UnsizedArrayOf> coverageZ; /* Array of offsets to Coverage * table in glyph sequence order */ /*UnsizedArrayOf @@ -1923,8 +1923,8 @@ struct ChainRule { bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const { - const HeadlessArrayOf &input = StructAfter > (backtrack); - const ArrayOf &lookahead = StructAfter > (input); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); return chain_context_intersects (glyphs, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1935,9 +1935,9 @@ struct ChainRule void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const { - const HeadlessArrayOf &input = StructAfter > (backtrack); - const ArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); chain_context_closure_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1949,9 +1949,9 @@ struct ChainRule void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const { - const HeadlessArrayOf &input = StructAfter > (backtrack); - const ArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); chain_context_collect_glyphs_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1963,9 +1963,9 @@ struct ChainRule bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { - const HeadlessArrayOf &input = StructAfter > (backtrack); - const ArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); return chain_context_would_apply_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1976,9 +1976,9 @@ struct ChainRule bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const HeadlessArrayOf &input = StructAfter > (backtrack); - const ArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const HeadlessArrayOf &input = StructAfter> (backtrack); + const ArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); return_trace (chain_context_apply_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1990,11 +1990,11 @@ struct ChainRule { TRACE_SANITIZE (this); if (!backtrack.sanitize (c)) return_trace (false); - const HeadlessArrayOf &input = StructAfter > (backtrack); + const HeadlessArrayOf &input = StructAfter> (backtrack); if (!input.sanitize (c)) return_trace (false); - const ArrayOf &lookahead = StructAfter > (input); + const ArrayOf &lookahead = StructAfter> (input); if (!lookahead.sanitize (c)) return_trace (false); - const ArrayOf &lookup = StructAfter > (lookahead); + const ArrayOf &lookup = StructAfter> (lookahead); return_trace (lookup.sanitize (c)); } @@ -2330,12 +2330,12 @@ struct ChainContextFormat3 { bool intersects (const hb_set_t *glyphs) const { - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); if (!(this+input[0]).intersects (glyphs)) return false; - const OffsetArrayOf &lookahead = StructAfter > (input); + const OffsetArrayOf &lookahead = StructAfter> (input); struct ChainContextClosureLookupContext lookup_context = { {intersects_coverage}, {this, this, this} @@ -2349,13 +2349,13 @@ struct ChainContextFormat3 void closure (hb_closure_context_t *c) const { - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); if (!(this+input[0]).intersects (c->glyphs)) return; - const OffsetArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const OffsetArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); struct ChainContextClosureLookupContext lookup_context = { {intersects_coverage}, {this, this, this} @@ -2370,12 +2370,12 @@ struct ChainContextFormat3 void collect_glyphs (hb_collect_glyphs_context_t *c) const { - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); (this+input[0]).add_coverage (c->input); - const OffsetArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const OffsetArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); struct ChainContextCollectGlyphsLookupContext lookup_context = { {collect_coverage}, {this, this, this} @@ -2390,9 +2390,9 @@ struct ChainContextFormat3 bool would_apply (hb_would_apply_context_t *c) const { - const OffsetArrayOf &input = StructAfter > (backtrack); - const OffsetArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const OffsetArrayOf &input = StructAfter> (backtrack); + const OffsetArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); struct ChainContextApplyLookupContext lookup_context = { {match_coverage}, {this, this, this} @@ -2406,20 +2406,20 @@ struct ChainContextFormat3 const Coverage &get_coverage () const { - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); return this+input[0]; } bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const OffsetArrayOf &lookahead = StructAfter > (input); - const ArrayOf &lookup = StructAfter > (lookahead); + const OffsetArrayOf &lookahead = StructAfter> (input); + const ArrayOf &lookup = StructAfter> (lookahead); struct ChainContextApplyLookupContext lookup_context = { {match_coverage}, {this, this, this} @@ -2442,12 +2442,12 @@ struct ChainContextFormat3 { TRACE_SANITIZE (this); if (!backtrack.sanitize (c, this)) return_trace (false); - const OffsetArrayOf &input = StructAfter > (backtrack); + const OffsetArrayOf &input = StructAfter> (backtrack); if (!input.sanitize (c, this)) return_trace (false); if (!input.len) return_trace (false); /* To be consistent with Context. */ - const OffsetArrayOf &lookahead = StructAfter > (input); + const OffsetArrayOf &lookahead = StructAfter> (input); if (!lookahead.sanitize (c, this)) return_trace (false); - const ArrayOf &lookup = StructAfter > (lookahead); + const ArrayOf &lookup = StructAfter> (lookahead); return_trace (lookup.sanitize (c)); } @@ -2674,9 +2674,9 @@ struct GSUBGPOS typedef OffsetListOf TLookupList; /* TODO Use intersects() to count how many subtables survive? */ - CastR > (out->lookupList) + CastR> (out->lookupList) .serialize_subset (c, - this+CastR > (lookupList), + this+CastR> (lookupList), out); if (version.to_int () >= 0x00010001u) @@ -2700,7 +2700,7 @@ struct GSUBGPOS likely (version.major == 1) && scriptList.sanitize (c, this) && featureList.sanitize (c, this) && - CastR > (lookupList).sanitize (c, this) && + CastR> (lookupList).sanitize (c, this) && (version.to_int () < 0x00010001u || featureVars.sanitize (c, this))); } diff --git a/src/hb-ot-math-table.hh b/src/hb-ot-math-table.hh index 62bf072e9..dd6226404 100644 --- a/src/hb-ot-math-table.hh +++ b/src/hb-ot-math-table.hh @@ -664,7 +664,7 @@ struct MathVariants /* Array of offsets to MathGlyphConstruction tables - from the beginning of the MathVariants table, for shapes growing in vertical/horizontal direction. */ - UnsizedArrayOf > + UnsizedArrayOf> glyphConstruction; public: diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 72deb10b4..c8b38a68d 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -213,7 +213,7 @@ struct name c->push (); char *new_pos = c->allocate_size (size); - + if (unlikely (new_pos == nullptr)) { acc.fini (); @@ -233,7 +233,7 @@ struct name } bool pack_record_and_strings (name *dest_name_unpacked, - hb_serialize_context_t *c, + hb_serialize_context_t *c, unsigned length) { hb_hashmap_t id_str_idx_map; @@ -243,7 +243,7 @@ struct name id_str_idx_map.set ((unsigned)i, objidx); } - const void *base = & (dest_name_unpacked->nameRecordZ[length]); + const void *base = & (dest_name_unpacked->nameRecordZ[length]); for (int i = length-1; i >= 0; i--) { unsigned str_idx = id_str_idx_map.get ((unsigned)i); @@ -298,7 +298,7 @@ struct name DEBUG_MSG (SUBSET, nullptr, "Failed to serialize write new name."); return false; } - + return true; } @@ -409,7 +409,7 @@ struct name /* We only implement format 0 for now. */ HBUINT16 format; /* Format selector (=0/1). */ HBUINT16 count; /* Number of name records. */ - NNOffsetTo > + NNOffsetTo> stringOffset; /* Offset to start of string storage (from start of table). */ UnsizedArrayOf nameRecordZ; /* The name records where count is the number of records. */ diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 04a2ee99e..e29d1ced7 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -249,7 +249,7 @@ struct STAT * in the 'fvar' table. In all fonts, must * be greater than zero if axisValueCount * is greater than zero. */ - LNNOffsetTo > + LNNOffsetTo> designAxesOffset; /* Offset in bytes from the beginning of * the STAT table to the start of the design @@ -257,7 +257,7 @@ struct STAT * set to zero; if designAxisCount is greater * than zero, must be greater than zero. */ HBUINT16 axisValueCount; /* The number of axis value tables. */ - LNNOffsetTo > > + LNNOffsetTo>> offsetToAxisValueOffsets; /* Offset in bytes from the beginning of * the STAT table to the start of the design diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index 601cbe9a1..39bf5acdd 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -912,7 +912,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, /* top dict INDEX */ { assert (plan.offsets.topDictInfo.offset == (unsigned) (c.head - c.start)); - CFF1IndexOf *dest = c.start_embed< CFF1IndexOf > (); + CFF1IndexOf *dest = c.start_embed< CFF1IndexOf> (); if (dest == nullptr) return false; cff1_top_dict_op_serializer_t topSzr; top_dict_modifiers_t modifier (plan.offsets, plan.topDictModSIDs); diff --git a/src/test-iter.cc b/src/test-iter.cc index 3de340145..01ec93a7e 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -56,7 +56,7 @@ struct some_array_t typedef array_iter_t iter_t; array_iter_t iter () { return array_iter_t (arr); } operator array_iter_t () { return iter (); } - operator hb_iter_t > () { return iter (); } + operator hb_iter_t> () { return iter (); } private: hb_array_t arr; @@ -134,9 +134,9 @@ main (int argc, char **argv) (void) static_cast, int&>&> (sa); test_iterable (sa); - test_iterable > (); - test_iterable > (); - test_iterable > (); + test_iterable> (); + test_iterable> (); + test_iterable> (); test_iterable (); test_iterable (); @@ -144,7 +144,7 @@ main (int argc, char **argv) hb_any (st); - hb_array_t > pa; + hb_array_t> pa; pa->as_array (); + hb_iter (src) From 026ab825c8e41980e286be911cc6fbb958dd7cd3 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Wed, 1 May 2019 16:15:58 -0400 Subject: [PATCH 015/617] Add dotted circles to more broken clusters --- src/gen-use-table.py | 9 + src/hb-ot-shape-complex-myanmar-machine.hh | 196 +++---- src/hb-ot-shape-complex-myanmar-machine.rl | 4 +- src/hb-ot-shape-complex-use-machine.hh | 602 +++++++++++---------- src/hb-ot-shape-complex-use-machine.rl | 11 +- src/hb-ot-shape-complex-use-table.cc | 2 +- 6 files changed, 433 insertions(+), 391 deletions(-) diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 0060e101d..9b1a00a68 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -47,6 +47,14 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block') # TODO Characters that are not in Unicode Indic files, but used in USE data[0][0x034F] = defaults[0] +data[0][0x1B61] = defaults[0] +data[0][0x1B63] = defaults[0] +data[0][0x1B64] = defaults[0] +data[0][0x1B65] = defaults[0] +data[0][0x1B66] = defaults[0] +data[0][0x1B67] = defaults[0] +data[0][0x1B69] = defaults[0] +data[0][0x1B6A] = defaults[0] data[0][0x2060] = defaults[0] # TODO https://github.com/harfbuzz/harfbuzz/pull/1685 data[0][0x1B5B] = 'Consonant_Placeholder' @@ -222,6 +230,7 @@ def is_Word_Joiner(U, UISC, UGC): def is_OTHER(U, UISC, UGC): #SPEC-OUTDATED return UGC == Zs # or any other SCRIPT_COMMON characters return (UISC == Other + and not is_SYM(U, UISC, UGC) and not is_SYM_MOD(U, UISC, UGC) and not is_CGJ(U, UISC, UGC) and not is_Word_Joiner(U, UISC, UGC) diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index 0c19e4f68..d03832fa7 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -38,9 +38,9 @@ static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, - 0 + 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, + 1u, 32u, 8u, 8u, 0 }; static const char _myanmar_syllable_machine_key_spans[] = { @@ -48,8 +48,9 @@ static const char _myanmar_syllable_machine_key_spans[] = { 27, 27, 27, 27, 16, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 25, 4, 25, 23, 21, 21, 27, 27, 27, - 27, 28, 27, 32, 27, 27, 27, 27, - 27, 28, 27, 27, 27, 27, 32, 1 + 27, 16, 28, 27, 27, 27, 27, 27, + 28, 27, 27, 27, 27, 28, 27, 32, + 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { @@ -57,8 +58,9 @@ static const short _myanmar_syllable_machine_index_offsets[] = { 187, 215, 243, 271, 299, 316, 344, 372, 400, 428, 456, 485, 513, 541, 569, 597, 623, 628, 654, 678, 700, 722, 750, 778, - 806, 834, 863, 891, 924, 952, 980, 1008, - 1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238 + 806, 834, 851, 880, 908, 936, 964, 992, + 1020, 1049, 1077, 1105, 1133, 1161, 1190, 1218, + 1251, 1284 }; static const char _myanmar_syllable_machine_indicies[] = { @@ -136,108 +138,115 @@ static const char _myanmar_syllable_machine_indicies[] = { 21, 22, 23, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, 27, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 21, 3, 3, 44, + 33, 34, 35, 36, 21, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 45, 44, 44, 44, 44, 44, - 44, 14, 44, 44, 44, 18, 44, 3, - 3, 44, 5, 44, 3, 3, 44, 5, + 44, 44, 46, 44, 44, 44, 44, 44, + 44, 14, 44, 44, 44, 18, 44, 45, + 45, 44, 5, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 44, 46, 44, - 3, 3, 44, 5, 44, 14, 44, 44, - 44, 44, 44, 44, 44, 47, 44, 44, - 44, 44, 44, 44, 14, 44, 3, 3, + 14, 44, 44, 44, 18, 44, 47, 44, + 45, 45, 44, 5, 44, 14, 44, 44, + 44, 44, 44, 44, 44, 48, 44, 44, + 44, 44, 44, 44, 14, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 47, 44, 44, 44, 44, - 44, 44, 14, 44, 3, 3, 44, 5, + 44, 44, 44, 48, 44, 44, 44, 44, + 44, 44, 14, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 2, 44, 3, 3, 44, 5, + 14, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, - 44, 48, 44, 44, 48, 44, 44, 44, - 14, 49, 44, 44, 18, 44, 2, 44, - 3, 3, 44, 5, 44, 6, 44, 44, + 44, 49, 44, 44, 49, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 14, 44, 44, 44, - 18, 44, 2, 44, 3, 3, 44, 5, + 18, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, - 44, 48, 44, 44, 44, 44, 44, 44, - 14, 49, 44, 44, 18, 44, 2, 44, - 3, 3, 44, 5, 44, 6, 44, 44, + 44, 49, 44, 44, 44, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 49, 44, 44, - 18, 44, 22, 23, 24, 24, 21, 25, - 21, 26, 21, 21, 21, 21, 21, 21, - 21, 50, 21, 21, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 21, 22, - 51, 24, 24, 21, 25, 21, 26, 21, - 21, 21, 21, 21, 21, 21, 27, 21, - 21, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 21, 1, 1, 2, 3, 3, - 3, 44, 5, 44, 6, 1, 44, 44, - 44, 44, 1, 44, 8, 44, 44, 10, - 11, 12, 13, 14, 15, 16, 17, 18, - 19, 44, 1, 44, 2, 44, 3, 3, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 8, 44, 44, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 52, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 44, 2, 44, 3, 3, - 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 50, 44, 44, + 18, 44, 51, 51, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 51, 44, 2, 3, 45, 45, 44, + 5, 44, 6, 44, 44, 44, 44, 44, + 44, 44, 8, 44, 44, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 44, + 2, 44, 45, 45, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 8, + 44, 44, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 52, 44, 44, 44, 44, 44, 44, 14, 15, 16, 17, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, + 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 14, 15, - 16, 44, 18, 44, 2, 44, 3, 3, + 16, 17, 18, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 44, 16, 44, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, + 44, 44, 14, 15, 16, 44, 18, 44, + 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 52, 44, 2, 44, 3, - 3, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 52, 44, 44, 10, - 44, 12, 44, 14, 15, 16, 17, 18, - 44, 2, 44, 3, 3, 44, 5, 44, + 44, 44, 44, 44, 44, 44, 14, 44, + 16, 44, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 17, 18, 52, + 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 44, 44, 44, 14, - 15, 16, 17, 18, 44, 2, 44, 3, - 3, 44, 5, 44, 6, 44, 44, 44, + 52, 44, 44, 10, 44, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 44, 45, + 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 52, 44, 44, 10, - 11, 12, 44, 14, 15, 16, 17, 18, - 44, 2, 3, 3, 3, 44, 5, 44, + 44, 44, 44, 14, 15, 16, 17, 18, + 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, - 8, 44, 44, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 44, 1, 1, 53, - 53, 53, 53, 53, 53, 53, 53, 1, - 53, 53, 53, 53, 1, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 1, 53, 54, 53, - 0 + 52, 44, 44, 10, 11, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 3, 45, + 45, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 8, 44, 44, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 44, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 53, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 22, 54, + 24, 24, 21, 25, 21, 26, 21, 21, + 21, 21, 21, 21, 21, 27, 21, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 21, 1, 1, 2, 3, 45, 45, + 44, 5, 44, 6, 1, 44, 44, 44, + 44, 1, 44, 8, 44, 44, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 44, 1, 44, 1, 1, 55, 55, 55, + 55, 55, 55, 55, 55, 1, 55, 55, + 55, 55, 1, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 1, 55, 56, 55, 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { - 0, 1, 23, 0, 0, 24, 30, 33, - 36, 46, 37, 42, 43, 44, 26, 39, - 40, 41, 29, 45, 47, 0, 2, 12, + 0, 1, 23, 33, 0, 24, 30, 45, + 35, 48, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 49, 0, 2, 12, 0, 3, 9, 13, 14, 19, 20, 21, 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 25, 27, 28, - 31, 32, 34, 35, 38, 0, 0 + 7, 10, 11, 15, 0, 0, 25, 27, + 28, 31, 32, 34, 37, 46, 47, 0, + 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { - 3, 0, 0, 4, 5, 0, 0, 0, + 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 10 + 0, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -246,7 +255,8 @@ static const char _myanmar_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, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -255,7 +265,8 @@ static const char _myanmar_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, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { @@ -263,8 +274,9 @@ static const short _myanmar_syllable_machine_eof_trans[] = { 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 22, 22, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 54, 54 + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 22, 22, 45, + 56, 56 }; static const int myanmar_syllable_machine_start = 0; @@ -297,7 +309,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 301 "hb-ot-shape-complex-myanmar-machine.hh" +#line 313 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -313,7 +325,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 317 "hb-ot-shape-complex-myanmar-machine.hh" +#line 329 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -327,7 +339,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 331 "hb-ot-shape-complex-myanmar-machine.hh" +#line 343 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -345,11 +357,11 @@ _eof_trans: goto _again; switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { - case 7: + case 6: #line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; - case 5: + case 4: #line 87 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; @@ -357,7 +369,7 @@ _eof_trans: #line 88 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (punctuation_cluster); }} break; - case 4: + case 8: #line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; @@ -365,11 +377,11 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; - case 6: + case 5: #line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 8: + case 7: #line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; @@ -377,7 +389,7 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 381 "hb-ot-shape-complex-myanmar-machine.hh" +#line 393 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -386,7 +398,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 390 "hb-ot-shape-complex-myanmar-machine.hh" +#line 402 "hb-ot-shape-complex-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shape-complex-myanmar-machine.rl b/src/hb-ot-shape-complex-myanmar-machine.rl index 7845a86d4..c4e300fda 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/src/hb-ot-shape-complex-myanmar-machine.rl @@ -75,9 +75,9 @@ post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?; pwo_tone_group = PT A* DB? As?; complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?; -syllable_tail = (H | complex_syllable_tail); +syllable_tail = (H (c|IV).VS?)* (H | complex_syllable_tail); -consonant_syllable = (k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail; +consonant_syllable = (k|CS)? (c|IV|D|GB).VS? syllable_tail; punctuation_cluster = P V; broken_cluster = k? VS? syllable_tail; other = any; diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index c9410e4e5..f83e09fbc 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -36,279 +36,294 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, - 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, - 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, 12u, 44u, 1u, 44u, 8u, 44u, 21u, 42u, - 41u, 42u, 42u, 42u, 1u, 5u, 0 + 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, + 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, + 8u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, + 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, + 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, 1u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, + 21u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 33, 15, 1, 33, 45, 1, 37, 37, - 15, 1, 37, 37, 32, 19, 19, 19, - 32, 32, 32, 37, 37, 37, 37, 37, - 37, 37, 37, 39, 37, 9, 1, 1, - 37, 37, 37, 32, 19, 19, 19, 32, - 32, 32, 37, 37, 37, 37, 37, 37, - 37, 37, 39, 15, 33, 44, 37, 22, - 2, 1, 5 + 33, 15, 1, 33, 45, 1, 37, 37, + 15, 1, 37, 37, 32, 19, 19, 19, + 32, 32, 32, 37, 37, 37, 37, 37, + 37, 37, 37, 39, 37, 9, 1, 1, + 37, 37, 2, 1, 37, 37, 37, 32, + 19, 19, 19, 32, 32, 32, 37, 37, + 37, 37, 37, 37, 37, 37, 39, 15, + 1, 9, 1, 33, 44, 37, 2, 1, + 22, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 34, 50, 52, 86, 132, 134, 172, - 210, 226, 228, 266, 304, 337, 357, 377, - 397, 430, 463, 496, 534, 572, 610, 648, - 686, 724, 762, 800, 840, 878, 888, 890, - 892, 930, 968, 1006, 1039, 1059, 1079, 1099, - 1132, 1165, 1198, 1236, 1274, 1312, 1350, 1388, - 1426, 1464, 1502, 1542, 1558, 1592, 1637, 1675, - 1698, 1701, 1703 + 0, 34, 50, 52, 86, 132, 134, 172, + 210, 226, 228, 266, 304, 337, 357, 377, + 397, 430, 463, 496, 534, 572, 610, 648, + 686, 724, 762, 800, 840, 878, 888, 890, + 892, 930, 968, 971, 973, 1011, 1049, 1087, + 1120, 1140, 1160, 1180, 1213, 1246, 1279, 1317, + 1355, 1393, 1431, 1469, 1507, 1545, 1583, 1623, + 1639, 1641, 1651, 1653, 1687, 1732, 1770, 1773, + 1775, 1798 }; static const char _use_syllable_machine_indicies[] = { - 1, 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, 0, 0, + 1, 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, 0, 0, 1, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 3, 2, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 7, 8, - 9, 7, 10, 8, 9, 9, 11, 9, - 9, 3, 12, 9, 9, 13, 7, 7, - 14, 15, 9, 9, 16, 17, 18, 19, - 20, 21, 22, 16, 23, 24, 25, 26, - 27, 28, 9, 29, 30, 31, 9, 9, - 9, 32, 33, 9, 35, 34, 37, 36, - 36, 38, 1, 36, 36, 39, 36, 36, - 36, 36, 36, 40, 41, 42, 43, 44, - 45, 46, 47, 41, 48, 40, 49, 50, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 56, 36, 37, 36, 36, 38, - 1, 36, 36, 39, 36, 36, 36, 36, - 36, 57, 41, 42, 43, 44, 45, 46, - 47, 41, 48, 49, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 56, 36, 38, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, - 59, 58, 38, 58, 37, 36, 36, 38, - 1, 36, 36, 39, 36, 36, 36, 36, - 36, 36, 41, 42, 43, 44, 45, 46, - 47, 41, 48, 49, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 56, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 36, 36, 36, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 42, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 42, - 43, 44, 45, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 53, 54, 55, - 36, 37, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 43, 44, 45, 36, 37, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 44, 45, - 36, 37, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 45, 36, 37, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 43, 44, 45, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 53, 54, 55, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 43, 44, - 45, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 54, 55, 36, 37, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 43, - 44, 45, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 55, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 42, - 43, 44, 45, 36, 36, 36, 36, 36, - 36, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 42, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 42, 43, 44, - 45, 36, 36, 36, 36, 36, 36, 36, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 42, 36, 37, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 42, 43, 44, 45, 36, - 36, 36, 36, 36, 36, 36, 36, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 42, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 36, 47, 41, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 42, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 41, 42, - 43, 44, 45, 36, 60, 41, 36, 36, - 36, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 42, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 41, 42, 43, 44, - 45, 36, 36, 41, 36, 36, 36, 50, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 42, 36, 37, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 41, 42, 43, 44, 45, 46, - 47, 41, 36, 36, 36, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 42, 36, 37, 36, 36, 38, 1, 36, - 36, 39, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 46, 47, 41, - 48, 36, 49, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 56, 36, - 38, 58, 58, 58, 58, 58, 58, 37, - 58, 58, 58, 58, 58, 58, 59, 58, - 58, 58, 58, 58, 58, 58, 42, 43, - 44, 45, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 53, 54, 55, 58, - 37, 36, 36, 38, 1, 36, 36, 39, - 36, 36, 36, 36, 36, 36, 41, 42, - 43, 44, 45, 46, 47, 41, 48, 40, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 56, 36, 62, 61, - 61, 61, 61, 61, 61, 61, 63, 61, - 10, 64, 62, 61, 11, 65, 65, 3, - 6, 65, 65, 66, 65, 65, 65, 65, - 65, 67, 16, 17, 18, 19, 20, 21, - 22, 16, 23, 25, 25, 26, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 33, 65, 11, 65, 65, 3, 6, 65, - 65, 66, 65, 65, 65, 65, 65, 65, - 16, 17, 18, 19, 20, 21, 22, 16, - 23, 25, 25, 26, 27, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 33, 65, - 11, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 65, 65, 65, 65, 65, - 65, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 17, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 17, 18, 19, - 20, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 29, 30, 31, 65, 11, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 18, - 19, 20, 65, 11, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 19, 20, 65, 11, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 20, 65, 11, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 18, 19, 20, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 29, 30, 31, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 18, 19, 20, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 30, 31, 65, 11, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 18, 19, 20, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 31, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 17, 18, 19, - 20, 65, 65, 65, 65, 65, 65, 26, - 27, 28, 65, 29, 30, 31, 65, 65, - 65, 65, 17, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 17, 18, 19, 20, 65, - 65, 65, 65, 65, 65, 65, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 17, 65, 11, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 17, 18, 19, 20, 65, 65, 65, - 65, 65, 65, 65, 65, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 17, 65, - 11, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 65, 22, 16, 65, 65, - 65, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 17, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 16, 17, 18, 19, - 20, 65, 68, 16, 65, 65, 65, 26, - 27, 28, 65, 29, 30, 31, 65, 65, - 65, 65, 17, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 16, 17, 18, 19, 20, 65, - 65, 16, 65, 65, 65, 26, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 17, 65, 11, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 16, 17, 18, 19, 20, 21, 22, 16, - 65, 65, 65, 26, 27, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 17, 65, - 11, 65, 65, 3, 6, 65, 65, 66, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 21, 22, 16, 23, 65, - 25, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 33, 65, 3, 65, - 65, 65, 65, 65, 65, 11, 65, 65, - 65, 65, 65, 65, 4, 65, 65, 65, - 65, 65, 65, 65, 17, 18, 19, 20, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 29, 30, 31, 65, 3, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 4, 69, 6, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 6, 69, - 8, 65, 65, 65, 8, 65, 65, 11, - 65, 65, 3, 6, 65, 65, 66, 65, - 65, 65, 65, 65, 65, 16, 17, 18, - 19, 20, 21, 22, 16, 23, 24, 25, - 26, 27, 28, 65, 29, 30, 31, 65, - 65, 65, 65, 33, 65, 11, 65, 65, - 3, 6, 65, 65, 66, 65, 65, 65, - 65, 65, 65, 16, 17, 18, 19, 20, - 21, 22, 16, 23, 24, 25, 26, 27, - 28, 65, 29, 30, 31, 65, 65, 65, - 65, 33, 65, 71, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 71, - 72, 70, 71, 72, 70, 72, 70, 8, - 69, 69, 69, 8, 69, 0 + 4, 2, 3, 2, 6, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 5, 7, 8, + 9, 7, 10, 11, 9, 9, 12, 9, + 9, 3, 13, 14, 9, 15, 7, 7, + 16, 17, 9, 9, 18, 19, 20, 21, + 22, 23, 24, 18, 25, 26, 27, 28, + 29, 30, 9, 31, 32, 33, 9, 34, + 35, 36, 37, 9, 39, 38, 41, 40, + 40, 42, 1, 40, 40, 43, 40, 40, + 40, 40, 40, 44, 45, 46, 47, 48, + 49, 50, 51, 45, 52, 44, 53, 54, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 60, 40, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 61, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 53, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 60, 40, 42, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 63, 62, 42, 62, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 53, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 60, 40, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 40, 40, + 40, 40, 40, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 46, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 57, 58, 59, + 40, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 47, 48, 49, 40, 41, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 48, 49, + 40, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 49, 40, 41, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 47, 48, 49, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 57, 58, 59, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 58, 59, 40, 41, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 47, + 48, 49, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 59, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 46, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 40, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 46, 40, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 46, 47, 48, 49, 40, + 40, 40, 40, 40, 40, 40, 40, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 46, 40, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 51, 45, + 40, 40, 40, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 46, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 45, 46, + 47, 48, 49, 40, 64, 45, 40, 40, + 40, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 46, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 45, 46, 47, 48, + 49, 40, 40, 45, 40, 40, 40, 54, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 46, 40, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 40, 40, 40, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 46, 40, 41, 40, 40, 42, 1, 40, + 40, 43, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 40, 53, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 60, 40, + 42, 62, 62, 62, 62, 62, 62, 41, + 62, 62, 62, 62, 62, 62, 63, 62, + 62, 62, 62, 62, 62, 62, 46, 47, + 48, 49, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 57, 58, 59, 62, + 41, 40, 40, 42, 1, 40, 40, 43, + 40, 40, 40, 40, 40, 40, 45, 46, + 47, 48, 49, 50, 51, 45, 52, 44, + 53, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 60, 40, 66, 65, + 65, 65, 65, 65, 65, 65, 67, 65, + 10, 68, 66, 65, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 69, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 44, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 70, 71, 40, + 60, 40, 41, 40, 40, 42, 1, 40, + 40, 43, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 44, 53, 54, 55, 56, 40, 57, + 58, 59, 40, 70, 71, 40, 60, 40, + 70, 71, 72, 71, 72, 12, 73, 73, + 3, 6, 73, 73, 74, 73, 73, 73, + 73, 73, 75, 18, 19, 20, 21, 22, + 23, 24, 18, 25, 27, 27, 28, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 37, 73, 12, 73, 73, 3, 6, + 73, 73, 74, 73, 73, 73, 73, 73, + 73, 18, 19, 20, 21, 22, 23, 24, + 18, 25, 27, 27, 28, 29, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 37, + 73, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 73, 73, 73, 73, + 73, 73, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 19, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 19, 20, + 21, 22, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 31, 32, 33, 73, + 12, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 20, 21, 22, 73, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 21, 22, 73, + 12, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 22, 73, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 31, 32, 33, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 32, 33, 73, 12, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 33, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 19, 20, + 21, 22, 73, 73, 73, 73, 73, 73, + 28, 29, 30, 73, 31, 32, 33, 73, + 73, 73, 73, 19, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 19, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 19, 73, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 19, + 73, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 73, 24, 18, 73, + 73, 73, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 19, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 18, 19, 20, + 21, 22, 73, 76, 18, 73, 73, 73, + 28, 29, 30, 73, 31, 32, 33, 73, + 73, 73, 73, 19, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 18, 19, 20, 21, 22, + 73, 73, 18, 73, 73, 73, 28, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 19, 73, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 18, 19, 20, 21, 22, 23, 24, + 18, 73, 73, 73, 28, 29, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 19, + 73, 12, 73, 73, 3, 6, 73, 73, + 74, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 73, 27, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 37, 73, 3, + 73, 73, 73, 73, 73, 73, 12, 73, + 73, 73, 73, 73, 73, 4, 73, 73, + 73, 73, 73, 73, 73, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 31, 32, 33, 73, 3, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 4, 77, 78, + 73, 14, 73, 73, 73, 73, 73, 73, + 73, 79, 73, 14, 73, 6, 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, 77, 77, 77, 77, 6, 77, 8, + 73, 73, 73, 8, 73, 73, 12, 73, + 73, 3, 6, 14, 73, 74, 73, 73, + 73, 73, 73, 73, 18, 19, 20, 21, + 22, 23, 24, 18, 25, 26, 27, 28, + 29, 30, 73, 31, 32, 33, 73, 34, + 35, 73, 37, 73, 12, 73, 73, 3, + 6, 73, 73, 74, 73, 73, 73, 73, + 73, 73, 18, 19, 20, 21, 22, 23, + 24, 18, 25, 26, 27, 28, 29, 30, + 73, 31, 32, 33, 73, 73, 73, 73, + 37, 73, 34, 35, 73, 35, 73, 70, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 70, 71, 72, 8, 77, + 77, 77, 8, 77, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 32, 2, 4, 1, 5, - 6, 4, 29, 4, 51, 52, 53, 55, - 34, 35, 36, 37, 38, 45, 46, 48, - 54, 49, 42, 43, 44, 39, 40, 41, - 58, 50, 4, 4, 4, 4, 7, 0, - 28, 11, 12, 13, 14, 15, 22, 23, - 25, 26, 19, 20, 21, 16, 17, 18, - 27, 10, 4, 9, 24, 4, 30, 31, - 4, 4, 3, 33, 47, 4, 4, 56, - 57 + 4, 8, 4, 36, 2, 4, 1, 5, + 6, 4, 29, 32, 4, 55, 56, 59, + 60, 64, 38, 39, 40, 41, 42, 49, + 50, 52, 61, 53, 46, 47, 48, 43, + 44, 45, 62, 63, 65, 54, 4, 4, + 4, 4, 7, 0, 28, 11, 12, 13, + 14, 15, 22, 23, 25, 26, 19, 20, + 21, 16, 17, 18, 27, 10, 4, 9, + 24, 4, 30, 31, 4, 33, 34, 35, + 4, 4, 3, 37, 51, 4, 57, 58 }; static const char _use_syllable_machine_trans_actions[] = { 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 9, 10, 10, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 0, 0, 0, 0, - 0, 3, 11, 12, 13, 14, 7, 0, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 7, 15, 0, 0, 16, 0, 0, - 17, 18, 0, 3, 0, 19, 20, 0, - 0 + 7, 8, 0, 7, 9, 10, 0, 10, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 11, 12, + 13, 14, 7, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, 15, 0, + 0, 16, 0, 0, 17, 7, 0, 0, + 18, 19, 0, 3, 0, 20, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -319,7 +334,8 @@ static const char _use_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, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -330,18 +346,20 @@ static const char _use_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, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 35, 37, 37, - 59, 59, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 59, 37, 62, 65, 62, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 70, 70, 66, 66, 71, - 71, 71, 70 + 1, 3, 3, 6, 0, 39, 41, 41, + 63, 63, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 63, 41, 66, 69, 66, + 41, 41, 73, 73, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 78, + 74, 74, 74, 78, 74, 74, 74, 74, + 73, 78 }; static const int use_syllable_machine_start = 4; @@ -355,7 +373,7 @@ static const int use_syllable_machine_en_main = 4; -#line 143 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -374,7 +392,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 378 "hb-ot-shape-complex-use-machine.hh" +#line 396 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -382,7 +400,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 163 "hb-ot-shape-complex-use-machine.rl" +#line 166 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -390,7 +408,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 394 "hb-ot-shape-complex-use-machine.hh" +#line 412 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -404,7 +422,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 408 "hb-ot-shape-complex-use-machine.hh" +#line 426 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -427,59 +445,59 @@ _eof_trans: {te = p+1;} break; case 12: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 14: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 137 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; case 9: -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 8: -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 142 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 11: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 15: -#line 133 "hb-ot-shape-complex-use-machine.rl" +#line 136 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 13: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 137 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; case 17: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; case 16: -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 20: -#line 137 "hb-ot-shape-complex-use-machine.rl" + case 18: +#line 140 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 18: -#line 138 "hb-ot-shape-complex-use-machine.rl" + case 19: +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 19: -#line 139 "hb-ot-shape-complex-use-machine.rl" + case 20: +#line 142 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 137 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; case 4: -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 2: @@ -497,16 +515,16 @@ _eof_trans: case 3: #line 1 "NONE" {te = p+1;} -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {act = 7;} break; case 10: #line 1 "NONE" {te = p+1;} -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 142 "hb-ot-shape-complex-use-machine.rl" {act = 8;} break; -#line 510 "hb-ot-shape-complex-use-machine.hh" +#line 528 "hb-ot-shape-complex-use-machine.hh" } _again: @@ -515,7 +533,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 519 "hb-ot-shape-complex-use-machine.hh" +#line 537 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -531,7 +549,7 @@ _again: } -#line 171 "hb-ot-shape-complex-use-machine.rl" +#line 174 "hb-ot-shape-complex-use-machine.rl" } diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index 7702cd94d..82803da0c 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -107,6 +107,9 @@ complex_syllable_tail = vowel_modifiers final_consonants ; +number_joiner_terminated_cluster_tail = (HN N VS?)* HN; +numeral_cluster_tail = (HN N VS?)+; +symbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+; virama_terminated_cluster = (R|CS)? (B | GB) VS? @@ -119,12 +122,12 @@ standard_cluster = ; broken_cluster = R? - complex_syllable_tail + (complex_syllable_tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail | symbol_cluster_tail) ; -number_joiner_terminated_cluster = N VS? (HN N VS?)* HN; -numeral_cluster = N VS? (HN N VS?)*; -symbol_cluster = S VS? SMAbv* SMBlw*; +number_joiner_terminated_cluster = N VS? number_joiner_terminated_cluster_tail; +numeral_cluster = N VS? numeral_cluster_tail?; +symbol_cluster = (S | GB) VS? symbol_cluster_tail?; independent_cluster = (IND | O | Rsv | WJ) VS?; other = any; diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index ddf7053db..f47d5e847 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -319,7 +319,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre, /* 1B40 */ VPst, VPst, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O, /* 1B50 */ B, B, B, B, B, B, B, B, B, B, O, GB, GB, O, O, GB, - /* 1B60 */ O, O, GB, O, O, O, O, O, GB, O, O, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv, + /* 1B60 */ O, S, GB, S, S, S, S, S, GB, S, S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv, /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv, O, O, O, O, O, O, O, O, O, O, O, O, /* Sundanese */ From 14e1fabc41a9a5ead3d91d560773050469982f54 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Wed, 1 May 2019 21:29:06 -0400 Subject: [PATCH 016/617] Sync gen-vowel-constraints.py with current output --- src/gen-vowel-constraints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gen-vowel-constraints.py b/src/gen-vowel-constraints.py index afb21d928..1340d97dc 100755 --- a/src/gen-vowel-constraints.py +++ b/src/gen-vowel-constraints.py @@ -180,6 +180,9 @@ print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB print ('\t\t\t\t hb_buffer_t *buffer,') print ('\t\t\t\t hb_font_t *font HB_UNUSED)') print ('{') +print ('#if defined(HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS)') +print (' return;') +print ('#endif') print (' if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)') print (' return;') print () From bf22338f49fb1711f7cbcad2d9949d7962cdc0bc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 13:51:52 -0700 Subject: [PATCH 017/617] Remove dead code --- src/hb-algs.hh | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index c3467800b..e0700100b 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -86,9 +86,6 @@ struct (hb_deref_pointer (hb_forward (a)) (hb_forward (vs)...)) public: - template auto - impl2 (Appl&& a, hb_priority<2>, Val1 &&v1, Vals &&...vs) const HB_AUTO_RETURN - (hb_deref_pointer (hb_forward (v1)).*hb_forward (a) (hb_forward (vs)...)) template auto operator () (Appl&& a, Vals &&...vs) const HB_AUTO_RETURN From 273ed6127bd9471fd11b3c1c7f232638f1ff1dba Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:04:51 -0700 Subject: [PATCH 018/617] [serializer] Add serialize_copy() --- src/hb-open-type.hh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index bde059602..17e8d2a97 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -305,6 +305,20 @@ struct OffsetTo : Offset return ret; } + template + bool serialize_copy (hb_serialize_context_t *c, const T &src, const void *base) + { + *this = 0; + if (has_null && &src == &Null (T)) + return false; + + c->push (); + + c->copy (src); + + c->add_link (*this, c->pop_pack (), base); + } + bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); From 88fdeeecc0ef57e41219d92c90f35f13cbd3a35e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:14:33 -0700 Subject: [PATCH 019/617] [serialize] Take arguments in copy() --- src/hb-open-type.hh | 6 +++--- src/hb-serialize.hh | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 17e8d2a97..cd80b3a7f 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -305,8 +305,8 @@ struct OffsetTo : Offset return ret; } - template - bool serialize_copy (hb_serialize_context_t *c, const T &src, const void *base) + template + bool serialize_copy (hb_serialize_context_t *c, const T &src, const void *base, Ts &&...ds) { *this = 0; if (has_null && &src == &Null (T)) @@ -314,7 +314,7 @@ struct OffsetTo : Offset c->push (); - c->copy (src); + c->copy (src, hb_forward (ds)...); c->add_link (*this, c->pop_pack (), base); } diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 7566881a8..61195a4d7 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -366,8 +366,9 @@ struct hb_serialize_context_t return ret; } - template auto - _copy (const Type &obj, hb_priority<1>) const HB_RETURN (Type *, obj.copy (this)) + template auto + _copy (const Type &obj, hb_priority<1>, Ts &&...ds) const HB_RETURN + (Type *, obj.copy (this, hb_forward (ds)...)) template auto _copy (const Type &obj, hb_priority<0>) const -> decltype (&(obj = obj)) @@ -380,8 +381,9 @@ struct hb_serialize_context_t /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data * instead of memcpy(). */ - template - Type *copy (const Type &obj) { return _copy (obj, hb_prioritize); } + template + Type *copy (const Type &obj, Ts &&...ds) + { return _copy (obj, hb_prioritize, hb_forward (ds)...); } template hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; } From 88a41472404a8e7754e1099ca4a5b2146dae5298 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:22:31 -0700 Subject: [PATCH 020/617] [serializer] Accept exact type in serialize_subset/copy() --- src/hb-open-type.hh | 12 ++++++------ src/hb-ot-layout-common.hh | 33 ++------------------------------- src/hb-ot-layout-gpos-table.hh | 6 ++++++ src/hb-ot-layout-gsub-table.hh | 6 ++++++ 4 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index cd80b3a7f..808e1829b 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -284,11 +284,11 @@ struct OffsetTo : Offset return * (Type *) Offset::serialize (c, base); } - template - bool serialize_subset (hb_subset_context_t *c, const T &src, const void *base, Ts &&...ds) + template + bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts &&...ds) { *this = 0; - if (has_null && &src == &Null (T)) + if (has_null && &src == &Null (Type)) return false; auto *s = c->serializer; @@ -305,11 +305,11 @@ struct OffsetTo : Offset return ret; } - template - bool serialize_copy (hb_serialize_context_t *c, const T &src, const void *base, Ts &&...ds) + template + bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts &&...ds) { *this = 0; - if (has_null && &src == &Null (T)) + if (has_null && &src == &Null (Type)) return false; c->push (); diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index c8dcc3208..3089801d2 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -715,23 +715,6 @@ struct Lookup return_trace (true); } - /* Older compilers need this to NOT be locally defined in a function. */ - template - struct SubTableSubsetWrapper - { - SubTableSubsetWrapper (const TSubTable &subtable_, - unsigned int lookup_type_) : - subtable (subtable_), - lookup_type (lookup_type_) {} - - bool subset (hb_subset_context_t *c) const - { return subtable.dispatch (c, lookup_type); } - - private: - const TSubTable &subtable; - unsigned int lookup_type; - }; - template bool subset (hb_subset_context_t *c) const { @@ -746,23 +729,11 @@ struct Lookup OffsetArrayOf& out_subtables = out->get_subtables (); unsigned int count = subTable.len; for (unsigned int i = 0; i < count; i++) - { - SubTableSubsetWrapper wrapper (this+subtables[i], get_type ()); - - out_subtables[i].serialize_subset (c, wrapper, out); - } + out_subtables[i].serialize_subset (c, this+subtables[i], out, get_type ()); return_trace (true); } - /* Older compilers need this to NOT be locally defined in a function. */ - template - struct SubTableSanitizeWrapper : TSubTable - { - bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) const - { return this->dispatch (c, lookup_type); } - }; - template bool sanitize (hb_sanitize_context_t *c) const { @@ -774,7 +745,7 @@ struct Lookup if (!markFilteringSet.sanitize (c)) return_trace (false); } - if (unlikely (!CastR>> (subTable) + if (unlikely (!CastR> (subTable) .sanitize (c, this, get_type ()))) return_trace (false); diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 407ce9e27..4b752fc11 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1525,6 +1525,12 @@ struct PosLookupSubTable } } + /* XXX Remove? */ + bool subset (hb_subset_context_t *c, unsigned lookup_type) const + { return dispatch (c, lookup_type); } + bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const + { return dispatch (c, lookup_type); } + protected: union { SinglePos single; diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index be78c1aaa..4a6f48f91 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1170,6 +1170,12 @@ struct SubstLookupSubTable } } + /* XXX Remove? */ + bool subset (hb_subset_context_t *c, unsigned lookup_type) const + { return dispatch (c, lookup_type); } + bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const + { return dispatch (c, lookup_type); } + protected: union { SingleSubst single; From 998b0b68ac2eafd1d5bca51b3723fa753e4db7c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:39:52 -0700 Subject: [PATCH 021/617] [serializer] Add copy() to (Unsized)ArrayOf --- src/hb-open-type.hh | 41 +++++++++++++++++++++++++++++++++++++++++ src/hb-serialize.hh | 4 ++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 808e1829b..6fd6fa652 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -409,6 +409,36 @@ struct UnsizedArrayOf void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1) { as_array (len).qsort (start, end); } + bool serialize (hb_serialize_context_t *c, unsigned int items_len) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend (*this, items_len))) return_trace (false); + return_trace (true); + } + template + bool serialize (hb_serialize_context_t *c, Iterator items) + { + TRACE_SERIALIZE (this); + unsigned count = items.len (); + if (unlikely (!serialize (c, count))) return_trace (false); + /* TODO Umm. Just exhaust the iterator instead? Being extra + * cautious right now.. */ + for (unsigned i = 0; i < count; i++, items++) + arrayZ[i] = *items; + return_trace (true); + } + + UnsizedArrayOf* copy (hb_serialize_context_t *c, unsigned count) + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (*this); + if (unlikely (!out->serialize (c, count))) return_trace (nullptr); + for (unsigned i = 0; i < count; i++) + out->arrayZ[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + return_trace (out); + } + bool sanitize (hb_sanitize_context_t *c, unsigned int count) const { TRACE_SANITIZE (this); @@ -580,6 +610,17 @@ struct ArrayOf return_trace (true); } + ArrayOf* copy (hb_serialize_context_t *c) + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (*this); + unsigned count = len; + if (unlikely (!out->serialize (c, count))) return_trace (nullptr); + for (unsigned i = 0; i < count; i++) + out->arrayZ[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + return_trace (out); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 61195a4d7..9fa0658b9 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -401,8 +401,8 @@ struct hb_serialize_context_t template Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); } - template - Type *extend (Type &obj) { return extend_size (obj, obj.get_size ()); } + template + Type *extend (Type &obj, Ts &&...ds) { return extend_size (obj, obj.get_size (hb_forward (ds)...)); } /* Output routines. */ hb_bytes_t copy_bytes () const From bf91b418b0e988619c230156f5f062c5d2802dd8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:42:37 -0700 Subject: [PATCH 022/617] [name] --- src/hb-ot-name-table.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index c8b38a68d..a15981ce5 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -98,8 +98,7 @@ struct NameRecord bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); - /* We can check from base all the way up to the end of string... */ - return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset)); + return_trace (c->check_struct (this) && offset.sanitize (c, base, length)); } HBUINT16 platformID; /* Platform ID. */ @@ -107,7 +106,8 @@ struct NameRecord HBUINT16 languageID; /* Language ID. */ HBUINT16 nameID; /* Name ID. */ HBUINT16 length; /* String length (in bytes). */ - HBUINT16 offset; /* String offset from start of storage area (in bytes). */ + OffsetTo> + offset; /* String offset from start of storage area (in bytes). */ public: DEFINE_SIZE_STATIC (12); }; From 87810fc958e28d0c5e05097b1b3fe78d962fdc62 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 14:45:57 -0700 Subject: [PATCH 023/617] [name] Use variable forwarding to simplify sanitize() --- src/hb-ot-name-table.hh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index a15981ce5..91a52148e 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -306,11 +306,8 @@ struct name { TRACE_SANITIZE (this); const void *string_pool = (this+stringOffset).arrayZ; - unsigned int _count = count; - /* Move to run-time?! */ - for (unsigned int i = 0; i < _count; i++) - if (!nameRecordZ[i].sanitize (c, string_pool)) return_trace (false); - return_trace (true); + /* TODO: Move to run-time?! */ + return_trace (nameRecordZ.sanitize (c, count, string_pool)); } bool sanitize (hb_sanitize_context_t *c) const From 0f1a6ce8268b197732aab40069bbda57eddac2e0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 15:03:41 -0700 Subject: [PATCH 024/617] [name] Fix format of susbetted table to 0 --- src/hb-ot-name-table.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 91a52148e..7f3b7a44c 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -267,7 +267,7 @@ struct name if (unlikely (!c->extend_min ((*this)))) return_trace (false); - this->format = source_name->format; + this->format = 0; this->count = name_record_idx_to_retain.length; this->stringOffset = min_size + name_record_idx_to_retain.length * NameRecord::static_size; From 91176d5b778b44172591e82ba84127e5eff1372d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 15:12:07 -0700 Subject: [PATCH 025/617] [serialize] Check offset base is within (possibly end of) object --- src/hb-serialize.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 9fa0658b9..e7c6445d4 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -295,6 +295,7 @@ struct hb_serialize_context_t { const object_t::link_t &link = *link_it; const object_t &child = *packed[link.objidx]; + assert (link.bias <= parent.tail - parent.head); unsigned offset = (child.head - parent.head) - link.bias; if (link.is_wide) From 49b1c763a0459d586b7f0aa86eadd13d21b24867 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:19:34 -0700 Subject: [PATCH 026/617] [test] Run "fonttools ttx" instead of "ttx" --- test/subset/run-tests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index fb4684cf1..0a1bb1076 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -32,11 +32,11 @@ def which(program): return None -ttx = which ("ttx") +fonttools = which ("fonttools") ots_sanitize = which ("ots-sanitize") -if not ttx: - print("TTX is not present, skipping test.") +if not fonttools: + print("fonttools is not present, skipping test.") sys.exit (77) def cmd(command): @@ -101,8 +101,8 @@ def run_test(test, should_check_ots): return 0 def run_ttx (file): - print ("ttx %s" % file) - return cmd([ttx, "-q", "-o-", file]) + print ("fonttools ttx %s" % file) + return cmd([fonttools, "ttx", "-q", "-o-", file]) def strip_check_sum (ttx_string): return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]', From 7d497a3a92973d4cec14888b932091f49de1d190 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:20:03 -0700 Subject: [PATCH 027/617] [debug] Allow return_trace() to return any type --- src/hb-debug.hh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hb-debug.hh b/src/hb-debug.hh index 52d5942c6..00696058c 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -330,18 +330,20 @@ struct hb_auto_trace_t<0, ret_t> const char *message, ...) HB_PRINTF_FUNC(6, 7) {} - ret_t ret (ret_t v, - const char *func HB_UNUSED = nullptr, - unsigned int line HB_UNUSED = 0) { return v; } + template + T ret (T&& v, + const char *func HB_UNUSED = nullptr, + unsigned int line HB_UNUSED = 0) { return hb_forward (v); } }; /* For disabled tracing; optimize out everything. * https://github.com/harfbuzz/harfbuzz/pull/605 */ template struct hb_no_trace_t { - ret_t ret (ret_t v, - const char *func HB_UNUSED = "", - unsigned int line HB_UNUSED = 0) { return v; } + template + T ret (T&& v, + const char *func HB_UNUSED = nullptr, + unsigned int line HB_UNUSED = 0) { return hb_forward (v); } }; #define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__) From 8a32c9eecbdc907415195eca9ebad47c8acf2df5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:20:18 -0700 Subject: [PATCH 028/617] [serialize] Misc getting copy() to work --- src/hb-open-type.hh | 16 +++++++++------- src/hb-serialize.hh | 26 ++++++++++++++++---------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 6fd6fa652..1deb63a35 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -288,7 +288,7 @@ struct OffsetTo : Offset bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts &&...ds) { *this = 0; - if (has_null && &src == &Null (Type)) + if (has_null && &src == _hb_has_null::get_null ()) return false; auto *s = c->serializer; @@ -309,14 +309,16 @@ struct OffsetTo : Offset bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts &&...ds) { *this = 0; - if (has_null && &src == &Null (Type)) + if (has_null && &src == _hb_has_null::get_null ()) return false; c->push (); - c->copy (src, hb_forward (ds)...); + bool ret = c->copy (src, hb_forward (ds)...); c->add_link (*this, c->pop_pack (), base); + + return ret; } bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const @@ -429,10 +431,10 @@ struct UnsizedArrayOf return_trace (true); } - UnsizedArrayOf* copy (hb_serialize_context_t *c, unsigned count) + UnsizedArrayOf* copy (hb_serialize_context_t *c, unsigned count) const { TRACE_SERIALIZE (this); - auto *out = c->start_embed (*this); + auto *out = c->start_embed (this); if (unlikely (!out->serialize (c, count))) return_trace (nullptr); for (unsigned i = 0; i < count; i++) out->arrayZ[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ @@ -610,10 +612,10 @@ struct ArrayOf return_trace (true); } - ArrayOf* copy (hb_serialize_context_t *c) + ArrayOf* copy (hb_serialize_context_t *c) const { TRACE_SERIALIZE (this); - auto *out = c->start_embed (*this); + auto *out = c->start_embed (this); unsigned count = len; if (unlikely (!out->serialize (c, count))) return_trace (nullptr); for (unsigned i = 0; i < count; i++) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index e7c6445d4..12ba95445 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -71,7 +71,7 @@ struct hb_serialize_context_t { bool is_wide: 1; unsigned position : 31; - int bias; + unsigned bias; objidx_t objidx; }; @@ -323,6 +323,9 @@ struct hb_serialize_context_t allocate_size (alignment - l); } + template + Type *start_embed (const Type &_ HB_UNUSED) const + { return start_embed (); } template Type *start_embed (const Type *_ HB_UNUSED = nullptr) const { @@ -358,33 +361,36 @@ struct hb_serialize_context_t } template - Type *embed (const Type &obj) + Type *embed (const Type *obj) { - unsigned int size = obj.get_size (); + unsigned int size = obj->get_size (); Type *ret = this->allocate_size (size); if (unlikely (!ret)) return nullptr; - memcpy (ret, &obj, size); + memcpy (ret, obj, size); return ret; } + template + Type *embed (const Type &obj) + { return embed (&obj); } template auto - _copy (const Type &obj, hb_priority<1>, Ts &&...ds) const HB_RETURN - (Type *, obj.copy (this, hb_forward (ds)...)) + _copy (const Type &src, hb_priority<1>, Ts &&...ds) HB_RETURN + (Type *, src.copy (this, hb_forward (ds)...)) template auto - _copy (const Type &obj, hb_priority<0>) const -> decltype (&(obj = obj)) + _copy (const Type &src, hb_priority<0>) -> decltype (&(src = src)) { Type *ret = this->allocate_size (sizeof (Type)); if (unlikely (!ret)) return nullptr; - *ret = obj; + *ret = src; return ret; } /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data * instead of memcpy(). */ template - Type *copy (const Type &obj, Ts &&...ds) - { return _copy (obj, hb_prioritize, hb_forward (ds)...); } + Type *copy (const Type &src, Ts &&...ds) + { return _copy (src, hb_prioritize, hb_forward (ds)...); } template hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; } From 431b6e1c449582619169722e16b472e872b02d58 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:22:32 -0700 Subject: [PATCH 029/617] [serialize] Disable assertion for now --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 12ba95445..d18934c4d 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -295,7 +295,7 @@ struct hb_serialize_context_t { const object_t::link_t &link = *link_it; const object_t &child = *packed[link.objidx]; - assert (link.bias <= parent.tail - parent.head); + //assert (link.bias <= parent.tail - parent.head); unsigned offset = (child.head - parent.head) - link.bias; if (link.is_wide) From 097bb3f0af391dbb5d498df548b769f165f35c8a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:25:00 -0700 Subject: [PATCH 030/617] [name] Minor changes --- src/hb-ot-name-table.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 7f3b7a44c..10a2255ab 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -106,7 +106,7 @@ struct NameRecord HBUINT16 languageID; /* Language ID. */ HBUINT16 nameID; /* Name ID. */ HBUINT16 length; /* String length (in bytes). */ - OffsetTo> + NNOffsetTo> offset; /* String offset from start of storage area (in bytes). */ public: DEFINE_SIZE_STATIC (12); @@ -261,7 +261,7 @@ struct name bool serialize (hb_serialize_context_t *c, const name *source_name, const hb_subset_plan_t *plan, - const hb_vector_t& name_record_idx_to_retain) + const hb_sorted_vector_t& name_record_idx_to_retain) { TRACE_SERIALIZE (this); @@ -287,7 +287,7 @@ struct name bool subset (hb_subset_context_t *c) const { hb_subset_plan_t *plan = c->plan; - hb_vector_t name_record_idx_to_retain; + hb_sorted_vector_t name_record_idx_to_retain; get_subsetted_ids (this, plan, name_record_idx_to_retain); From 8855af38a8497d7788924d368baa9eeae4916940 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:26:06 -0700 Subject: [PATCH 031/617] [name] Add NameRecord::copy() --- src/hb-ot-name-table.hh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 10a2255ab..00686ee2d 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -95,6 +95,16 @@ struct NameRecord return UNSUPPORTED; } + NameRecord* copy (hb_serialize_context_t *c, + const void *src_base, + const void *dst_base) const + { + auto *out = c->embed (this); + out->offset = 0; + out->offset.serialize_copy (c, src_base + offset, dst_base, length); + return out; + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); From c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:29:07 -0700 Subject: [PATCH 032/617] [WIP] [name] Port to fancy serializer machinery --- src/hb-ot-name-table.hh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 00686ee2d..72c0c642c 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -279,17 +279,21 @@ struct name this->format = 0; this->count = name_record_idx_to_retain.length; - this->stringOffset = min_size + name_record_idx_to_retain.length * NameRecord::static_size; + auto snap = c->snapshot (); + this->nameRecordZ.serialize (c, this->count); + this->stringOffset = c->length (); + c->revert (snap); - if (!serialize_name_record (c, source_name, name_record_idx_to_retain)) - return_trace (false); + auto src_array = source_name->nameRecordZ.as_array (source_name->count); + const void *src_base = &(source_name + source_name->stringOffset); + const void *dst_base = &(this + this->stringOffset); - if (!serialize_strings (c, source_name, plan, name_record_idx_to_retain)) - return_trace (false); + + hb_iter (name_record_idx_to_retain) + | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) + ; - if (!pack_record_and_strings (this, c, name_record_idx_to_retain.length)) - return_trace (false); + assert (this->stringOffset == c->length ()); return_trace (true); } From 72e3eba8f87e2a8b145a4f98e24499f0aafe099b Mon Sep 17 00:00:00 2001 From: Cody Planteen Date: Thu, 2 May 2019 13:03:15 -0600 Subject: [PATCH 033/617] Add configuration option HB_NO_GETENV to disable use of getenv() --- src/hb.hh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/hb.hh b/src/hb.hh index 0336ed568..11ca2fac4 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -343,19 +343,27 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); # if defined(_WIN32_WCE) /* Some things not defined on Windows CE. */ # define vsnprintf _vsnprintf -# define getenv(Name) nullptr +# ifndef HB_NO_GETENV +# define HB_NO_GETENV +# endif # if _WIN32_WCE < 0x800 # define setlocale(Category, Locale) "C" static int errno = 0; /* Use something better? */ # endif # elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) -# define getenv(Name) nullptr +# ifndef HB_NO_GETENV +# define HB_NO_GETENV +# endif # endif # if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf # endif #endif +#ifdef HB_NO_GETENV +#define getenv(Name) nullptr +#endif + #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) /* atexit() is only safe to be called from shared libraries on certain * platforms. Whitelist. From 0d5fd168f8e3c1202358a82161a28e407149b1b4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 3 May 2019 10:37:32 -0700 Subject: [PATCH 034/617] Revert "[WIP] [name] Port to fancy serializer machinery" This reverts commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4. Don't know how it got to master! --- src/hb-ot-name-table.hh | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 72c0c642c..00686ee2d 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -279,21 +279,17 @@ struct name this->format = 0; this->count = name_record_idx_to_retain.length; + this->stringOffset = min_size + name_record_idx_to_retain.length * NameRecord::static_size; - auto snap = c->snapshot (); - this->nameRecordZ.serialize (c, this->count); - this->stringOffset = c->length (); - c->revert (snap); - auto src_array = source_name->nameRecordZ.as_array (source_name->count); - const void *src_base = &(source_name + source_name->stringOffset); - const void *dst_base = &(this + this->stringOffset); + if (!serialize_name_record (c, source_name, name_record_idx_to_retain)) + return_trace (false); - + hb_iter (name_record_idx_to_retain) - | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) - ; + if (!serialize_strings (c, source_name, plan, name_record_idx_to_retain)) + return_trace (false); - assert (this->stringOffset == c->length ()); + if (!pack_record_and_strings (this, c, name_record_idx_to_retain.length)) + return_trace (false); return_trace (true); } From ac350c92fd6b04845c6240a5f3b77ceaf29e51d0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 5 May 2019 09:10:46 -0700 Subject: [PATCH 035/617] [dispatch] Try obj.dispatch(c) before trying c->dispatch(obj) --- src/hb-aat-layout-common.hh | 2 +- src/hb-dispatch.hh | 13 +++++++++++++ src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- src/hb-sanitize.hh | 2 +- src/hb-subset.hh | 4 ++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 95ac27128..a17da372d 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -807,7 +807,7 @@ struct hb_aat_apply_context_t : { const char *get_name () { return "APPLY"; } template - return_t dispatch (const T &obj) { return obj.apply (this); } + return_t _dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } diff --git a/src/hb-dispatch.hh b/src/hb-dispatch.hh index c4347a6ca..e5820744e 100644 --- a/src/hb-dispatch.hh +++ b/src/hb-dispatch.hh @@ -38,12 +38,25 @@ template struct hb_dispatch_context_t { + private: + /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ + const Context* thiz () const { return static_cast (this); } + Context* thiz () { return static_cast< Context *> (this); } + public: static constexpr unsigned max_debug_depth = MaxDebugDepth; typedef Return return_t; template bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } + template + return_t dispatch (const T &obj) { return _dispatch_impl (obj, hb_prioritize); } static return_t no_dispatch_return_value () { return Context::default_return_value (); } static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } + + private: + template + auto _dispatch_impl (const T &obj, hb_priority<1>) HB_AUTO_RETURN (obj.dispatch (thiz ())) + template + Return _dispatch_impl (const T &obj, hb_priority<0>) { return thiz()->_dispatch (obj); } }; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 6b0b7ad5d..9960b4032 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -46,7 +46,7 @@ struct hb_intersects_context_t : { const char *get_name () { return "INTERSECTS"; } template - return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); } + return_t _dispatch (const T &obj) { return obj.intersects (this->glyphs); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -64,7 +64,7 @@ struct hb_closure_context_t : const char *get_name () { return "CLOSURE"; } typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); template - return_t dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } + return_t _dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -128,7 +128,7 @@ struct hb_would_apply_context_t : { const char *get_name () { return "WOULD_APPLY"; } template - return_t dispatch (const T &obj) { return obj.would_apply (this); } + return_t _dispatch (const T &obj) { return obj.would_apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -156,7 +156,7 @@ struct hb_collect_glyphs_context_t : const char *get_name () { return "COLLECT_GLYPHS"; } typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); template - return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } + return_t _dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -235,7 +235,7 @@ struct hb_add_coverage_context_t : const char *get_name () { return "GET_COVERAGE"; } typedef const Coverage &return_t; template - return_t dispatch (const T &obj) { return obj.get_coverage (); } + return_t _dispatch (const T &obj) { return obj.get_coverage (); } static return_t default_return_value () { return Null(Coverage); } bool stop_sublookup_iteration (return_t r) const { @@ -438,7 +438,7 @@ struct hb_ot_apply_context_t : const char *get_name () { return "APPLY"; } typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index); template - return_t dispatch (const T &obj) { return obj.apply (this); } + return_t _dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } return_t recurse (unsigned int sub_lookup_index) @@ -648,7 +648,7 @@ struct hb_get_subtables_context_t : /* Dispatch interface. */ const char *get_name () { return "GET_SUBTABLES"; } template - return_t dispatch (const T &obj) + return_t _dispatch (const T &obj) { hb_applicable_t *entry = array.push(); entry->init (obj, apply_to); diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index e58202cf7..9cf17e5f4 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -131,7 +131,7 @@ struct hb_sanitize_context_t : bool may_dispatch (const T *obj HB_UNUSED, const F *format) { return format->sanitize (this); } template - return_t dispatch (const T &obj) { return obj.sanitize (this); } + return_t _dispatch (const T &obj) { return obj.sanitize (this); } static return_t default_return_value () { return true; } static return_t no_dispatch_return_value () { return false; } bool stop_sublookup_iteration (const return_t r) const { return !r; } diff --git a/src/hb-subset.hh b/src/hb-subset.hh index 45cb763ec..795859dd1 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -41,8 +41,8 @@ struct hb_subset_context_t : { const char *get_name () { return "SUBSET"; } template - bool dispatch (const T &obj) { return obj.subset (this); } - static bool default_return_value () { return true; } + return_t _dispatch (const T &obj) { return obj.subset (this); } + static return_t default_return_value () { return true; } hb_subset_plan_t *plan; hb_serialize_context_t *serializer; From b10f65933a77434bf8d68058793037f38a8ed5a6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 5 May 2019 09:23:35 -0700 Subject: [PATCH 036/617] [dispatch] Use functionality from previous commit To remove a couple of unwanted wrapper methods --- src/hb-dispatch.hh | 15 +++++++++------ src/hb-open-type.hh | 10 +++++----- src/hb-ot-layout-gpos-table.hh | 6 ------ src/hb-ot-layout-gsub-table.hh | 6 ------ src/hb-sanitize.hh | 5 +++-- src/hb-subset.hh | 5 +++-- 6 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/hb-dispatch.hh b/src/hb-dispatch.hh index e5820744e..0293fd14e 100644 --- a/src/hb-dispatch.hh +++ b/src/hb-dispatch.hh @@ -47,16 +47,19 @@ struct hb_dispatch_context_t typedef Return return_t; template bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } - template - return_t dispatch (const T &obj) { return _dispatch_impl (obj, hb_prioritize); } + template + return_t dispatch (const T &obj, Ts &&...ds) + { return _dispatch_impl (obj, hb_prioritize, hb_forward (ds)...); } static return_t no_dispatch_return_value () { return Context::default_return_value (); } static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } private: - template - auto _dispatch_impl (const T &obj, hb_priority<1>) HB_AUTO_RETURN (obj.dispatch (thiz ())) - template - Return _dispatch_impl (const T &obj, hb_priority<0>) { return thiz()->_dispatch (obj); } + template + auto _dispatch_impl (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + (obj.dispatch (thiz (), hb_forward (ds)...)) + template + Return _dispatch_impl (const T &obj, hb_priority<0>, Ts &&...ds) + { return thiz()->_dispatch (obj, hb_forward (ds)...); } }; diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 1deb63a35..2990b0d58 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -295,7 +295,7 @@ struct OffsetTo : Offset s->push (); - bool ret = src.subset (c, hb_forward (ds)...); + bool ret = c->dispatch (src, hb_forward (ds)...); if (ret || !has_null) s->add_link (*this, s->pop_pack (), base); @@ -336,7 +336,7 @@ struct OffsetTo : Offset TRACE_SANITIZE (this); return_trace (sanitize_shallow (c, base) && (this->is_null () || - StructAtOffset (base, *this).sanitize (c, hb_forward (ds)...) || + c->dispatch (StructAtOffset (base, *this), hb_forward (ds)...) || neuter (c))); } @@ -469,7 +469,7 @@ struct UnsizedArrayOf TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, hb_forward (ds)...))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) return_trace (false); return_trace (true); } @@ -652,7 +652,7 @@ struct ArrayOf if (unlikely (!sanitize_shallow (c))) return_trace (false); unsigned int count = len; for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, hb_forward (ds)...))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) return_trace (false); return_trace (true); } @@ -828,7 +828,7 @@ struct ArrayOfM1 if (unlikely (!sanitize_shallow (c))) return_trace (false); unsigned int count = lenM1 + 1; for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, hb_forward (ds)...))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) return_trace (false); return_trace (true); } diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 4b752fc11..407ce9e27 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1525,12 +1525,6 @@ struct PosLookupSubTable } } - /* XXX Remove? */ - bool subset (hb_subset_context_t *c, unsigned lookup_type) const - { return dispatch (c, lookup_type); } - bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const - { return dispatch (c, lookup_type); } - protected: union { SinglePos single; diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 4a6f48f91..be78c1aaa 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1170,12 +1170,6 @@ struct SubstLookupSubTable } } - /* XXX Remove? */ - bool subset (hb_subset_context_t *c, unsigned lookup_type) const - { return dispatch (c, lookup_type); } - bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const - { return dispatch (c, lookup_type); } - protected: union { SingleSubst single; diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 9cf17e5f4..71bf3a859 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -130,8 +130,9 @@ struct hb_sanitize_context_t : template bool may_dispatch (const T *obj HB_UNUSED, const F *format) { return format->sanitize (this); } - template - return_t _dispatch (const T &obj) { return obj.sanitize (this); } + template + return_t _dispatch (const T &obj, Ts &&...ds) + { return obj.sanitize (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } static return_t no_dispatch_return_value () { return false; } bool stop_sublookup_iteration (const return_t r) const { return !r; } diff --git a/src/hb-subset.hh b/src/hb-subset.hh index 795859dd1..4da2b675b 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -40,8 +40,9 @@ struct hb_subset_context_t : hb_dispatch_context_t { const char *get_name () { return "SUBSET"; } - template - return_t _dispatch (const T &obj) { return obj.subset (this); } + template + return_t _dispatch (const T &obj, Ts &&...ds) + { return obj.subset (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } hb_subset_plan_t *plan; From c14efb8e68e31fb7537bcfe5eea779c0830a0b0c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 5 May 2019 09:54:58 -0700 Subject: [PATCH 037/617] Fix previous commit Priority should be given to specific over dispatch. Broke sanitize before. This fixes it, by moving prioritization to the context implementation, since the correct priority cannot be done in the dispatch implementation. Done for subset and sanitize only, which need it. --- src/hb-aat-layout-common.hh | 2 +- src/hb-dispatch.hh | 10 +--------- src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- src/hb-sanitize.hh | 16 +++++++++++++--- src/hb-subset.hh | 15 ++++++++++++--- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index a17da372d..95ac27128 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -807,7 +807,7 @@ struct hb_aat_apply_context_t : { const char *get_name () { return "APPLY"; } template - return_t _dispatch (const T &obj) { return obj.apply (this); } + return_t dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } diff --git a/src/hb-dispatch.hh b/src/hb-dispatch.hh index 0293fd14e..6b497823d 100644 --- a/src/hb-dispatch.hh +++ b/src/hb-dispatch.hh @@ -49,17 +49,9 @@ struct hb_dispatch_context_t bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } template return_t dispatch (const T &obj, Ts &&...ds) - { return _dispatch_impl (obj, hb_prioritize, hb_forward (ds)...); } + { return obj.dispatch (thiz (), hb_forward (ds)...); } static return_t no_dispatch_return_value () { return Context::default_return_value (); } static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } - - private: - template - auto _dispatch_impl (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN - (obj.dispatch (thiz (), hb_forward (ds)...)) - template - Return _dispatch_impl (const T &obj, hb_priority<0>, Ts &&...ds) - { return thiz()->_dispatch (obj, hb_forward (ds)...); } }; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9960b4032..6b0b7ad5d 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -46,7 +46,7 @@ struct hb_intersects_context_t : { const char *get_name () { return "INTERSECTS"; } template - return_t _dispatch (const T &obj) { return obj.intersects (this->glyphs); } + return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -64,7 +64,7 @@ struct hb_closure_context_t : const char *get_name () { return "CLOSURE"; } typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } + return_t dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -128,7 +128,7 @@ struct hb_would_apply_context_t : { const char *get_name () { return "WOULD_APPLY"; } template - return_t _dispatch (const T &obj) { return obj.would_apply (this); } + return_t dispatch (const T &obj) { return obj.would_apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } @@ -156,7 +156,7 @@ struct hb_collect_glyphs_context_t : const char *get_name () { return "COLLECT_GLYPHS"; } typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } + return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } static return_t default_return_value () { return hb_void_t (); } void recurse (unsigned int lookup_index) { @@ -235,7 +235,7 @@ struct hb_add_coverage_context_t : const char *get_name () { return "GET_COVERAGE"; } typedef const Coverage &return_t; template - return_t _dispatch (const T &obj) { return obj.get_coverage (); } + return_t dispatch (const T &obj) { return obj.get_coverage (); } static return_t default_return_value () { return Null(Coverage); } bool stop_sublookup_iteration (return_t r) const { @@ -438,7 +438,7 @@ struct hb_ot_apply_context_t : const char *get_name () { return "APPLY"; } typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index); template - return_t _dispatch (const T &obj) { return obj.apply (this); } + return_t dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value () { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } return_t recurse (unsigned int sub_lookup_index) @@ -648,7 +648,7 @@ struct hb_get_subtables_context_t : /* Dispatch interface. */ const char *get_name () { return "GET_SUBTABLES"; } template - return_t _dispatch (const T &obj) + return_t dispatch (const T &obj) { hb_applicable_t *entry = array.push(); entry->init (obj, apply_to); diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 71bf3a859..6799b7862 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -130,13 +130,23 @@ struct hb_sanitize_context_t : template bool may_dispatch (const T *obj HB_UNUSED, const F *format) { return format->sanitize (this); } - template - return_t _dispatch (const T &obj, Ts &&...ds) - { return obj.sanitize (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } static return_t no_dispatch_return_value () { return false; } bool stop_sublookup_iteration (const return_t r) const { return !r; } + private: + template auto + _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + ( obj.sanitize (this, hb_forward (ds)...) ) + template auto + _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward (ds)...) ) + public: + template auto + dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) + + void init (hb_blob_t *b) { this->blob = hb_blob_reference (b); diff --git a/src/hb-subset.hh b/src/hb-subset.hh index 4da2b675b..1c3f41fdd 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -40,11 +40,20 @@ struct hb_subset_context_t : hb_dispatch_context_t { const char *get_name () { return "SUBSET"; } - template - return_t _dispatch (const T &obj, Ts &&...ds) - { return obj.subset (this, hb_forward (ds)...); } static return_t default_return_value () { return true; } + private: + template auto + _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + ( obj.subset (this, hb_forward (ds)...) ) + template auto + _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward (ds)...) ) + public: + template auto + dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) + hb_subset_plan_t *plan; hb_serialize_context_t *serializer; unsigned int debug_depth; From 36bb24f7b4dbbe171b945639bac749c46785e17c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 5 May 2019 10:14:17 -0700 Subject: [PATCH 038/617] [dispatch] Forward arguments in all dispatch multiplexers --- src/hb-aat-layout-kerx-table.hh | 14 +++---- src/hb-aat-layout-morx-table.hh | 14 +++---- src/hb-ot-kern-table.hh | 16 ++++---- src/hb-ot-layout-common.hh | 6 +-- src/hb-ot-layout-gpos-table.hh | 68 ++++++++++++++++----------------- src/hb-ot-layout-gsub-table.hh | 58 ++++++++++++++-------------- src/hb-ot-layout-gsubgpos.hh | 32 ++++++++-------- 7 files changed, 104 insertions(+), 104 deletions(-) diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index b740f1e8f..bb41fea9d 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -771,17 +771,17 @@ struct KerxSubTable unsigned int get_size () const { return u.header.length; } unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case 0: return_trace (c->dispatch (u.format0)); - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 4: return_trace (c->dispatch (u.format4)); - case 6: return_trace (c->dispatch (u.format6)); + case 0: return_trace (c->dispatch (u.format0, hb_forward (ds)...)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); + case 4: return_trace (c->dispatch (u.format4, hb_forward (ds)...)); + case 6: return_trace (c->dispatch (u.format6, hb_forward (ds)...)); default: return_trace (c->default_return_value ()); } } diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 466842483..4c4ea6206 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -883,17 +883,17 @@ struct ChainSubtable Insertion = 5 }; - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case Rearrangement: return_trace (c->dispatch (u.rearrangement)); - case Contextual: return_trace (c->dispatch (u.contextual)); - case Ligature: return_trace (c->dispatch (u.ligature)); - case Noncontextual: return_trace (c->dispatch (u.noncontextual)); - case Insertion: return_trace (c->dispatch (u.insertion)); + case Rearrangement: return_trace (c->dispatch (u.rearrangement, hb_forward (ds)...)); + case Contextual: return_trace (c->dispatch (u.contextual, hb_forward (ds)...)); + case Ligature: return_trace (c->dispatch (u.ligature, hb_forward (ds)...)); + case Noncontextual: return_trace (c->dispatch (u.noncontextual, hb_forward (ds)...)); + case Insertion: return_trace (c->dispatch (u.insertion, hb_forward (ds)...)); default: return_trace (c->default_return_value ()); } } diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 0b55dabdc..1310b843c 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -121,16 +121,16 @@ struct KernSubTable } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.format0)); - case 1: return_trace (u.header.apple ? c->dispatch (u.format1) : c->default_return_value ()); + case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward (ds)...) : c->default_return_value ()); case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (u.header.apple ? c->dispatch (u.format3) : c->default_return_value ()); + case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward (ds)...) : c->default_return_value ()); default: return_trace (c->default_return_value ()); } } @@ -304,14 +304,14 @@ struct kern bool apply (AAT::hb_aat_apply_context_t *c) const { return dispatch (c); } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case 0: return_trace (c->dispatch (u.ot)); - case 1: return_trace (c->dispatch (u.aat)); + case 0: return_trace (c->dispatch (u.ot, hb_forward (ds)...)); + case 1: return_trace (c->dispatch (u.aat, hb_forward (ds)...)); default: return_trace (c->default_return_value ()); } } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 3089801d2..09e7711c0 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -682,14 +682,14 @@ struct Lookup return flag; } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { 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); + typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type, hb_forward (ds)...); if (c->stop_sublookup_iteration (r)) return_trace (r); } diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 407ce9e27..556e4316d 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -576,14 +576,14 @@ struct SinglePosFormat2 struct SinglePos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -907,14 +907,14 @@ struct PairPosFormat2 struct PairPos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1092,13 +1092,13 @@ struct CursivePosFormat1 struct CursivePos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1208,13 +1208,13 @@ struct MarkBasePosFormat1 struct MarkBasePos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1333,13 +1333,13 @@ struct MarkLigPosFormat1 struct MarkLigPos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1455,13 +1455,13 @@ struct MarkMarkPosFormat1 struct MarkMarkPos { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1507,20 +1507,20 @@ struct PosLookupSubTable Extension = 9 }; - template - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const + template + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { - case Single: return_trace (u.single.dispatch (c)); - case Pair: return_trace (u.pair.dispatch (c)); - case Cursive: return_trace (u.cursive.dispatch (c)); - case MarkBase: return_trace (u.markBase.dispatch (c)); - case MarkLig: return_trace (u.markLig.dispatch (c)); - case MarkMark: return_trace (u.markMark.dispatch (c)); - case Context: return_trace (u.context.dispatch (c)); - case ChainContext: return_trace (u.chainContext.dispatch (c)); - case Extension: return_trace (u.extension.dispatch (c)); + case Single: return_trace (u.single.dispatch (c, hb_forward (ds)...)); + case Pair: return_trace (u.pair.dispatch (c, hb_forward (ds)...)); + case Cursive: return_trace (u.cursive.dispatch (c, hb_forward (ds)...)); + case MarkBase: return_trace (u.markBase.dispatch (c, hb_forward (ds)...)); + case MarkLig: return_trace (u.markLig.dispatch (c, hb_forward (ds)...)); + case MarkMark: return_trace (u.markMark.dispatch (c, hb_forward (ds)...)); + case Context: return_trace (u.context.dispatch (c, hb_forward (ds)...)); + case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward (ds)...)); + case Extension: return_trace (u.extension.dispatch (c, hb_forward (ds)...)); default: return_trace (c->default_return_value ()); } } @@ -1581,9 +1581,9 @@ struct PosLookup : Lookup template static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); - template - typename context_t::return_t dispatch (context_t *c) const - { return Lookup::dispatch (c); } + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + { return Lookup::dispatch (c, hb_forward (ds)...); } bool subset (hb_subset_context_t *c) const { return Lookup::subset (c); } diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index be78c1aaa..c5ebe44ec 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -251,14 +251,14 @@ struct SingleSubst } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -440,13 +440,13 @@ struct MultipleSubst } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -614,13 +614,13 @@ struct AlternateSubst } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -945,13 +945,13 @@ struct LigatureSubst } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1113,13 +1113,13 @@ struct ReverseChainSingleSubstFormat1 struct ReverseChainSingleSubst { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1153,19 +1153,19 @@ struct SubstLookupSubTable ReverseChainSingle = 8 }; - template - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const + template + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { - case Single: return_trace (u.single.dispatch (c)); - case Multiple: return_trace (u.multiple.dispatch (c)); - case Alternate: return_trace (u.alternate.dispatch (c)); - case Ligature: return_trace (u.ligature.dispatch (c)); - case Context: return_trace (u.context.dispatch (c)); - case ChainContext: return_trace (u.chainContext.dispatch (c)); - case Extension: return_trace (u.extension.dispatch (c)); - case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c)); + case Single: return_trace (u.single.dispatch (c, hb_forward (ds)...)); + case Multiple: return_trace (u.multiple.dispatch (c, hb_forward (ds)...)); + case Alternate: return_trace (u.alternate.dispatch (c, hb_forward (ds)...)); + case Ligature: return_trace (u.ligature.dispatch (c, hb_forward (ds)...)); + case Context: return_trace (u.context.dispatch (c, hb_forward (ds)...)); + case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward (ds)...)); + case Extension: return_trace (u.extension.dispatch (c, hb_forward (ds)...)); + case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, hb_forward (ds)...)); default: return_trace (c->default_return_value ()); } } @@ -1331,9 +1331,9 @@ struct SubstLookup : Lookup return ret; } - template - typename context_t::return_t dispatch (context_t *c) const - { return Lookup::dispatch (c); } + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + { return Lookup::dispatch (c, hb_forward (ds)...); } bool subset (hb_subset_context_t *c) const { return Lookup::subset (c); } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 6b0b7ad5d..0b4031499 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1763,15 +1763,15 @@ struct ContextFormat3 struct Context { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (c->dispatch (u.format3)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); + case 3: return_trace (c->dispatch (u.format3, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -2474,15 +2474,15 @@ struct ChainContextFormat3 struct ChainContext { - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (c->dispatch (u.format3)); + case 1: return_trace (c->dispatch (u.format1, hb_forward (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward (ds)...)); + case 3: return_trace (c->dispatch (u.format3, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -2510,12 +2510,12 @@ struct ExtensionFormat1 return StructAtOffset (this, offset); } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, format); if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ()); - return_trace (get_subtable ().dispatch (c, get_type ())); + return_trace (get_subtable ().dispatch (c, get_type (), hb_forward (ds)...)); } /* This is called from may_dispatch() above with hb_sanitize_context_t. */ @@ -2557,13 +2557,13 @@ struct Extension } } - template - typename context_t::return_t dispatch (context_t *c) const + template + typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (u.format1.dispatch (c)); + case 1: return_trace (u.format1.dispatch (c, hb_forward (ds)...)); default:return_trace (c->default_return_value ()); } } From 9f9890e9e82c620e733d123f421f7c63d91ce8e1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 12:16:51 -0700 Subject: [PATCH 039/617] Remove HB_NO_OPTIONS in favor of HB_NO_GETENV Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-debug.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-debug.hh b/src/hb-debug.hh index 00696058c..e5328e916 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -63,7 +63,7 @@ extern HB_INTERNAL hb_atomic_int_t _hb_options; static inline hb_options_t hb_options () { -#if defined(HB_NO_OPTIONS) +#if defined(HB_NO_GETENV) return hb_options_t (); #endif /* Make a local copy, so we can access bitfield threadsafely. */ From e261dc3a4043230ae1b4f56e2cc7d3133b7da4ca Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 7 May 2019 01:24:55 +0430 Subject: [PATCH 040/617] Ignore -Wc++11-compat as we require C++11 actually pollutes gcc bots logs https://circleci.com/gh/harfbuzz/harfbuzz/85395 --- src/hb.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb.hh b/src/hb.hh index 11ca2fac4..86dccd6ef 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -121,6 +121,7 @@ #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wtype-limits" +#pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it #endif #endif From 4c2fd05ca5fa34303b986c34948b512d770ab8fe Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 19:57:15 -0700 Subject: [PATCH 041/617] [iter] Implement range-based for loops Part of https://github.com/harfbuzz/harfbuzz/issues/1648 --- src/hb-array.hh | 6 ++++ src/hb-iter.hh | 74 ++++++++++++++++++++++++++++++++++++-- src/hb-ot-layout-common.hh | 14 ++++++++ src/hb-set.hh | 3 ++ src/test-iter.cc | 28 ++++++++++++--- 5 files changed, 118 insertions(+), 7 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index b4619ee9a..37ca63d35 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -80,6 +80,8 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> length -= n; } unsigned __len__ () const { return length; } + bool operator != (const hb_array_t& o) const + { return arrayZ != o.arrayZ || length != o.length; } /* Extra operators. */ @@ -224,6 +226,10 @@ struct hb_sorted_array_t : hb_sorted_array_t& operator = (const hb_array_t &o) { hb_array_t (*this) = o; return *this; } + /* Iterator implementation. */ + bool operator != (const hb_sorted_array_t& o) const + { return this->arrayZ != o.arrayZ || this->length != o.length; } + hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const { return hb_sorted_array_t (((const hb_array_t *) (this))->sub_array (start_offset, seg_count)); } hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 6fe984fc6..3240fc37a 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -42,6 +42,17 @@ * copied by value. If the collection / object being iterated on * is writable, then the iterator returns lvalues, otherwise it * returns rvalues. + * + * TODO Document more. + * + * If iterator implementation implements operator!=, then can be + * used in range-based for loop. That comes free if the iterator + * is random-access. Otherwise, the range-based for loop incurs + * one traversal to find end(), which can be avoided if written + * as a while-style for loop, or if iterator implements a faster + * __end__() method. + * TODO When opting in for C++17, address this by changing return + * type of .end()? */ @@ -72,10 +83,13 @@ struct hb_iter_t /* Operators. */ iter_t iter () const { return *thiz(); } iter_t operator + () const { return *thiz(); } + iter_t begin () const { return *thiz(); } + iter_t end () const { return thiz()->__end__ (); } explicit operator bool () const { return thiz()->__more__ (); } unsigned len () const { return thiz()->__len__ (); } /* The following can only be enabled if item_t is reference type. Otherwise - * it will be returning pointer to temporary rvalue. */ + * it will be returning pointer to temporary rvalue. + * TODO Use a wrapper return type to fix for non-reference type. */ template hb_remove_reference* operator -> () const { return hb_addressof (**thiz()); } @@ -107,6 +121,8 @@ struct hb_iter_t #define HB_ITER_USING(Name) \ using item_t = typename Name::item_t; \ + using Name::begin; \ + using Name::end; \ using Name::item_size; \ using Name::is_iterator; \ using Name::iter; \ @@ -150,7 +166,6 @@ struct } HB_FUNCOBJ (hb_iter); - /* Mixin to fill in what the subclass doesn't provide. */ template struct hb_iter_fallback_mixin_t @@ -178,6 +193,18 @@ struct hb_iter_fallback_mixin_t void __prev__ () { *thiz() -= 1; } void __rewind__ (unsigned n) { while (n--) --*thiz(); } + /* Range-based for: Implement __end__() if can be done faster, + * and operator!=. */ + iter_t __end__ () const + { + if (thiz()->is_random_access_iterator) + return *thiz() + thiz()->len (); + /* Above expression loops twice. Following loops once. */ + auto it = *thiz(); + while (it) ++it; + return it; + } + protected: hb_iter_fallback_mixin_t () {} hb_iter_fallback_mixin_t (const hb_iter_fallback_mixin_t &o HB_UNUSED) {} @@ -250,6 +277,31 @@ struct hb_is_iterator_of { enum { hb_is_sorted_iterator_of (Iter, typename Iter::item_t) +/* Range-based 'for' for iterables. */ + +template +static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) + +template +static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) + +/* begin()/end() are NOT looked up non-ADL. So each namespace must declare them. + * Do it for namespace OT. */ +namespace OT { + +template +static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) + +template +static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) + +} + + /* * Adaptors, combiners, etc. */ @@ -279,6 +331,8 @@ struct hb_map_iter_t : void __forward__ (unsigned n) { it += n; } void __prev__ () { --it; } void __rewind__ (unsigned n) { it -= n; } + bool operator != (const hb_map_iter_t& o) const + { return it != o.it || f != o.f; } private: Iter it; @@ -322,6 +376,8 @@ struct hb_filter_iter_t : bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !p (f (*it))); } void __prev__ () { --it; } + bool operator != (const hb_filter_iter_t& o) const + { return it != o.it || p != o.p || f != o.f; } private: Iter it; @@ -407,6 +463,9 @@ struct hb_zip_iter_t : void __forward__ (unsigned n) { a += n; b += n; } void __prev__ () { --a; --b; } void __rewind__ (unsigned n) { a -= n; b -= n; } + hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); } + bool operator != (const hb_zip_iter_t& o) const + { return a != o.a || b != o.b; } private: A a; @@ -442,6 +501,17 @@ struct hb_enumerate_iter_t : void __forward__ (unsigned n) { i += n; it += n; } void __prev__ () { --i; --it; } void __rewind__ (unsigned n) { i -= n; it -= n; } + hb_enumerate_iter_t __end__ () const + { + if (is_random_access_iterator) + return *this + this->len (); + /* Above expression loops twice. Following loops once. */ + auto it = *this; + while (it) ++it; + return it; + } + bool operator != (const hb_enumerate_iter_t& o) const + { return i != o.i || it != o.it; } private: unsigned i; diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 09e7711c0..a527b3966 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -835,6 +835,8 @@ struct CoverageFormat1 bool more () const { return i < c->glyphArray.len; } void next () { i++; } hb_codepoint_t get_glyph () const { return c->glyphArray[i]; } + bool operator != (const iter_t& o) const + { return i != o.i || c != o.c; } private: const struct CoverageFormat1 *c; @@ -987,6 +989,8 @@ struct CoverageFormat2 j++; } hb_codepoint_t get_glyph () const { return j; } + bool operator != (const iter_t& o) const + { return i != o.i || j != o.j || c != o.c; } private: const struct CoverageFormat2 *c; @@ -1136,6 +1140,16 @@ struct Coverage default:return 0; } } + bool operator != (const iter_t& o) const + { + if (format != o.format) return true; + switch (format) + { + case 1: return u.format1 != o.u.format1; + case 2: return u.format2 != o.u.format2; + default:return false; + } + } private: unsigned int format; diff --git a/src/hb-set.hh b/src/hb-set.hh index 76100f6bc..332e07bd0 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -701,6 +701,9 @@ struct hb_set_t void __next__ () { s->next (&v); if (l) l--; } void __prev__ () { s->previous (&v); } unsigned __len__ () const { return l; } + iter_t end () const { return iter_t (*s); } + bool operator != (const iter_t& o) const + { return s != o.s || v != o.v; } protected: const hb_set_t *s; diff --git a/src/test-iter.cc b/src/test-iter.cc index 01ec93a7e..8f2fc809f 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -43,6 +43,7 @@ struct array_iter_t : hb_iter_with_fallback_t, T&> void __forward__ (unsigned n) { arr += n; } void __rewind__ (unsigned n) { arr -= n; } unsigned __len__ () const { return arr.length; } + bool operator != (const array_iter_t& o) { return arr != o.arr; } private: hb_array_t arr; @@ -66,12 +67,8 @@ struct some_array_t template static void -test_iterator (Iter it) +test_iterator_non_default_constructable (Iter it) { - Iter default_constructed; - - assert (!default_constructed); - /* Iterate over a copy of it. */ for (auto c = it.iter (); c; c++) *c; @@ -80,6 +77,10 @@ test_iterator (Iter it) for (auto c = +it; c; c++) *c; + /* Range-based for over a copy. */ + for (auto _ : +it) + (void) _; + it += it.len (); it = it + 10; it = 10 + it; @@ -90,11 +91,25 @@ test_iterator (Iter it) static_assert (true || it.is_sorted_iterator, ""); } +template +static void +test_iterator (Iter it) +{ + Iter default_constructed; + assert (!default_constructed); + + test_iterator_non_default_constructable (it); +} + template static void test_iterable (const Iterable &lst = Null(Iterable)) { + for (auto _ : lst) + (void) _; + // Test that can take iterator from. test_iterator (lst.iter ()); } @@ -141,6 +156,9 @@ main (int argc, char **argv) test_iterable (); test_iterator (hb_zip (st, v)); + test_iterator_non_default_constructable (hb_enumerate (st)); + //test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); + //test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); hb_any (st); From 0b1ca5a13b6921cb4d00f8651bb99fc7c7037ec2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 23:04:32 -0700 Subject: [PATCH 042/617] [iter] Adjust hb_filter --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 3240fc37a..009511298 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -374,7 +374,7 @@ struct hb_filter_iter_t : static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; __item_t__ __item__ () const { return *it; } bool __more__ () const { return bool (it); } - void __next__ () { do ++it; while (it && !p (f (*it))); } + void __next__ () { do ++it; while (it && !hb_has (p, hb_get (f, *it))); } void __prev__ () { --it; } bool operator != (const hb_filter_iter_t& o) const { return it != o.it || p != o.p || f != o.f; } From 240f57e58d3b0161feb90621d5db9e2fc4d99b27 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 23:17:39 -0700 Subject: [PATCH 043/617] Rename hb_deref_pointer() to hb_deref() --- src/hb-algs.hh | 12 ++++++------ src/hb-map.hh | 2 +- src/hb-meta.hh | 2 +- src/hb-serialize.hh | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index e0700100b..ee604e88c 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -50,7 +50,7 @@ struct { private: template auto - impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref_pointer (v).hash ()) + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) template auto @@ -73,17 +73,17 @@ struct /* Pointer-to-member-function. */ template auto impl (Appl&& a, hb_priority<2>, Val1 &&v1, Vals &&...vs) const HB_AUTO_RETURN - ((hb_deref_pointer (hb_forward (v1)).*hb_forward (a)) (hb_forward (vs)...)) + ((hb_deref (hb_forward (v1)).*hb_forward (a)) (hb_forward (vs)...)) /* Pointer-to-member. */ template auto impl (Appl&& a, hb_priority<1>, Val &&v) const HB_AUTO_RETURN - ((hb_deref_pointer (hb_forward (v))).*hb_forward (a)) + ((hb_deref (hb_forward (v))).*hb_forward (a)) /* Operator(). */ template auto impl (Appl&& a, hb_priority<0>, Vals &&...vs) const HB_AUTO_RETURN - (hb_deref_pointer (hb_forward (a)) (hb_forward (vs)...)) + (hb_deref (hb_forward (a)) (hb_forward (vs)...)) public: @@ -102,7 +102,7 @@ struct template auto impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN - (hb_deref_pointer (hb_forward (p)).has (v)) + (hb_deref (hb_forward (p)).has (v)) template auto impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN @@ -127,7 +127,7 @@ struct template auto impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN - (hb_deref_pointer (hb_forward (f)).get (hb_forward (v))) + (hb_deref (hb_forward (f)).get (hb_forward (v))) template auto impl (Proj&& f, Val &&v, hb_priority<0>) const HB_AUTO_RETURN diff --git a/src/hb-map.hh b/src/hb-map.hh index bbb1bef5d..f27ca9cae 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -57,7 +57,7 @@ struct hb_hashmap_t void clear () { key = kINVALID; value = vINVALID; } - bool operator == (K o) { return hb_deref_pointer (key) == hb_deref_pointer (o); } + bool operator == (K o) { return hb_deref (key) == hb_deref (o); } bool operator == (const item_t &o) { return *this == o.key; } bool is_unused () const { return key == kINVALID; } bool is_tombstone () const { return key != kINVALID && value == vINVALID; } diff --git a/src/hb-meta.hh b/src/hb-meta.hh index b80358c2a..f7699d781 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -126,7 +126,7 @@ struct template auto operator () (T *v) const HB_AUTO_RETURN (*v) -} HB_FUNCOBJ (hb_deref_pointer); +} HB_FUNCOBJ (hb_deref); template struct hb_enable_if {}; diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index d18934c4d..afaa4c4f9 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -132,7 +132,7 @@ struct hb_serialize_context_t { return check_equal (v1 = v2, v2); } template bool propagate_error (T &&obj) - { return check_success (!hb_deref_pointer (obj).in_error ()); } + { return check_success (!hb_deref (obj).in_error ()); } template bool propagate_error (T1 &&o1, Ts &&...os) { return propagate_error (hb_forward (o1)) && From 72eb91deb9eb7a08e38e100a3234518651fe4cb8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 23:39:13 -0700 Subject: [PATCH 044/617] Add hb_ref() Unused. --- src/hb-meta.hh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index f7699d781..9ca63cd97 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -128,6 +128,16 @@ struct } HB_FUNCOBJ (hb_deref); +struct +{ + template auto + operator () (T&& v) const HB_AUTO_RETURN (hb_forward (v)) + + template auto + operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v)) + +} HB_FUNCOBJ (hb_ref); + template struct hb_enable_if {}; template struct hb_enable_if { typedef T type; }; From 0bf86d9c5dcb0de206b38c3cf1824d2254376f37 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 6 May 2019 23:39:26 -0700 Subject: [PATCH 045/617] Whitespace --- src/hb-meta.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 9ca63cd97..52f686628 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -139,8 +139,8 @@ struct } HB_FUNCOBJ (hb_ref); -template struct hb_enable_if {}; -template struct hb_enable_if { typedef T type; }; +template struct hb_enable_if {}; +template struct hb_enable_if { typedef T type; }; #define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr template struct hb_is_same : hb_false_t {}; From 03a68165d8296ed5cc0eb2434500381419409e79 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 00:03:35 -0700 Subject: [PATCH 046/617] [meta] Add hb_reference_wrapper<> Functionality kinda superset of std:: counterpart. --- src/hb-meta.hh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 52f686628..fc64e9707 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -138,6 +138,27 @@ struct } HB_FUNCOBJ (hb_ref); +template +struct hb_reference_wrapper +{ + hb_reference_wrapper (T v) : v (v) {} + hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} + bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } + bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } + T get () const { return v; } + T v; +}; +template +struct hb_reference_wrapper +{ + hb_reference_wrapper (T& v) : v (&v) {} + hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} + bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } + bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } + T* get () const { return v; } + T* v; +}; + template struct hb_enable_if {}; template struct hb_enable_if { typedef T type; }; From 025eaa3c81214cdb20f2f588bab665512d21507c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 00:05:37 -0700 Subject: [PATCH 047/617] [iter] Make filter/map copyable --- src/hb-iter.hh | 18 +++++++++--------- src/test-iter.cc | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 009511298..549b78865 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -319,12 +319,12 @@ struct hb_map_iter_t : hb_iter_t, decltype (hb_declval (Proj) (hb_declval (typename Iter::item_t)))> { - hb_map_iter_t (const Iter& it, Proj f) : it (it), f (f) {} + hb_map_iter_t (const Iter& it, Proj f_) : it (it), f (f_) {} typedef decltype (hb_declval (Proj) (hb_declval (typename Iter::item_t))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - __item_t__ __item__ () const { return hb_get (f, *it); } - __item_t__ __item_at__ (unsigned i) const { return hb_get (f, it[i]); } + __item_t__ __item__ () const { return hb_get (f.get (), *it); } + __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } bool __more__ () const { return bool (it); } unsigned __len__ () const { return it.len (); } void __next__ () { ++it; } @@ -336,7 +336,7 @@ struct hb_map_iter_t : private: Iter it; - Proj f; + hb_reference_wrapper f; }; template @@ -367,22 +367,22 @@ struct hb_filter_iter_t : hb_iter_with_fallback_t, typename Iter::item_t> { - hb_filter_iter_t (const Iter& it_, Pred p, Proj f) : it (it_), p (p), f (f) - { while (it && !hb_has (p, hb_get (f, *it))) ++it; } + hb_filter_iter_t (const Iter& it_, Pred p_, Proj f_) : it (it_), p (p_), f (f_) + { while (it && !hb_has (p.get (), hb_get (f.get (), *it))) ++it; } typedef typename Iter::item_t __item_t__; static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; __item_t__ __item__ () const { return *it; } bool __more__ () const { return bool (it); } - void __next__ () { do ++it; while (it && !hb_has (p, hb_get (f, *it))); } + void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } void __prev__ () { --it; } bool operator != (const hb_filter_iter_t& o) const { return it != o.it || p != o.p || f != o.f; } private: Iter it; - Pred p; - Proj f; + hb_reference_wrapper p; + hb_reference_wrapper f; }; template struct hb_filter_iter_factory_t diff --git a/src/test-iter.cc b/src/test-iter.cc index 8f2fc809f..afbcbe9b5 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -157,8 +157,8 @@ main (int argc, char **argv) test_iterator (hb_zip (st, v)); test_iterator_non_default_constructable (hb_enumerate (st)); - //test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); - //test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); + test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); + test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); hb_any (st); From 8903040fcd09e7d7ad5112ac2a583718bb85795d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 00:13:11 -0700 Subject: [PATCH 048/617] Actually make it work --- src/hb-iter.hh | 2 ++ src/hb-meta.hh | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 549b78865..63a178ae3 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -331,6 +331,7 @@ struct hb_map_iter_t : void __forward__ (unsigned n) { it += n; } void __prev__ () { --it; } void __rewind__ (unsigned n) { it -= n; } + hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); } bool operator != (const hb_map_iter_t& o) const { return it != o.it || f != o.f; } @@ -376,6 +377,7 @@ struct hb_filter_iter_t : bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } void __prev__ () { --it; } + hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); } bool operator != (const hb_filter_iter_t& o) const { return it != o.it || p != o.p || f != o.f; } diff --git a/src/hb-meta.hh b/src/hb-meta.hh index fc64e9707..b65a09efe 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -145,17 +145,19 @@ struct hb_reference_wrapper hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } + operator T () const { return v; } T get () const { return v; } T v; }; template struct hb_reference_wrapper { - hb_reference_wrapper (T& v) : v (&v) {} + hb_reference_wrapper (T& v) : v (hb_addressof (v)) {} hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } - T* get () const { return v; } + operator T& () const { return *v; } + T& get () const { return *v; } T* v; }; From c3e0eafc80481f8c16516fdae1841c563e7253d4 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 7 May 2019 12:04:00 +0430 Subject: [PATCH 049/617] [ci] Upgrade Ubuntu 17.10 bots to 19.04 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9eeb1549e..87d752589 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,7 +34,7 @@ jobs: distcheck: docker: - - image: ubuntu:17.10 + - image: ubuntu:19.04 steps: - checkout - run: apt update && apt install -y ninja-build binutils libtool autoconf automake make cmake gcc g++ pkg-config ragel gtk-doc-tools libfontconfig1-dev libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip @@ -203,7 +203,7 @@ jobs: cmake-gcc: docker: - - image: ubuntu:17.10 + - image: ubuntu:19.04 steps: - checkout - run: apt update && apt install -y ninja-build binutils cmake gcc g++ pkg-config ragel gtk-doc-tools libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip From 45f5e56236912359d0ac72310dcdba9259cfee66 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 00:33:32 -0700 Subject: [PATCH 050/617] Warn on -Wdeprecated --- src/hb.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb.hh b/src/hb.hh index 86dccd6ef..96db1f9d4 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -94,6 +94,7 @@ /* Warning. To be investigated if happens. */ #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING #pragma GCC diagnostic warning "-Wbuiltin-macro-redefined" +#pragma GCC diagnostic warning "-Wdeprecated" #pragma GCC diagnostic warning "-Wdisabled-optimization" #pragma GCC diagnostic warning "-Wformat=2" #pragma GCC diagnostic warning "-Wignored-pragma-optimize" From fa2d97161f8b7de3d7a70e06d41b6f7e154012ad Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 00:34:50 -0700 Subject: [PATCH 051/617] Remove use of deprecated implicit copy/move assignment operators By removing custom copy constructor. --- src/hb-meta.hh | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index b65a09efe..e8002f253 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -142,7 +142,6 @@ template struct hb_reference_wrapper { hb_reference_wrapper (T v) : v (v) {} - hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } operator T () const { return v; } @@ -153,7 +152,6 @@ template struct hb_reference_wrapper { hb_reference_wrapper (T& v) : v (hb_addressof (v)) {} - hb_reference_wrapper (const hb_reference_wrapper& o) : v (o.v) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } operator T& () const { return *v; } From c548fcedc404c03442c042059a71194d97d23bb6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:29:07 -0700 Subject: [PATCH 052/617] [WIP] [name] Port to fancy serializer machinery --- src/hb-ot-name-table.hh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 00686ee2d..72c0c642c 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -279,17 +279,21 @@ struct name this->format = 0; this->count = name_record_idx_to_retain.length; - this->stringOffset = min_size + name_record_idx_to_retain.length * NameRecord::static_size; + auto snap = c->snapshot (); + this->nameRecordZ.serialize (c, this->count); + this->stringOffset = c->length (); + c->revert (snap); - if (!serialize_name_record (c, source_name, name_record_idx_to_retain)) - return_trace (false); + auto src_array = source_name->nameRecordZ.as_array (source_name->count); + const void *src_base = &(source_name + source_name->stringOffset); + const void *dst_base = &(this + this->stringOffset); - if (!serialize_strings (c, source_name, plan, name_record_idx_to_retain)) - return_trace (false); + + hb_iter (name_record_idx_to_retain) + | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) + ; - if (!pack_record_and_strings (this, c, name_record_idx_to_retain.length)) - return_trace (false); + assert (this->stringOffset == c->length ()); return_trace (true); } From 5ac4ab686809be9352e91bc3213e1edf3ba66a93 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 2 May 2019 16:29:07 -0700 Subject: [PATCH 053/617] [subset] fix for name table serializing with new serializer machinery --- src/hb-ot-name-table.hh | 8 ++++++-- test/api/fonts/nameID.expected.ttf | Bin 170696 -> 2388 bytes 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 72c0c642c..855b86811 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -99,10 +99,12 @@ struct NameRecord const void *src_base, const void *dst_base) const { + TRACE_SERIALIZE (this); auto *out = c->embed (this); - out->offset = 0; + if (unlikely (!out)) return_trace (nullptr); + out->offset.serialize_copy (c, src_base + offset, dst_base, length); - return out; + return_trace (out); } bool sanitize (hb_sanitize_context_t *c, const void *base) const @@ -292,6 +294,8 @@ struct name + hb_iter (name_record_idx_to_retain) | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) ; + + if (unlikely (c->ran_out_of_room)) return_trace (false); assert (this->stringOffset == c->length ()); diff --git a/test/api/fonts/nameID.expected.ttf b/test/api/fonts/nameID.expected.ttf index ccd4b8bcd26816e7ffcd6afa58306373bc0534d9..00aecc0bbf60004d975f7fc12c716f34bbc728cd 100644 GIT binary patch delta 566 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%0Dkep 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 Date: Tue, 7 May 2019 11:01:02 -0700 Subject: [PATCH 054/617] [name] Remove dead code --- src/hb-ot-name-table.hh | 88 +---------------------------------------- 1 file changed, 1 insertion(+), 87 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 855b86811..07c3f28e6 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -102,7 +102,6 @@ struct NameRecord TRACE_SERIALIZE (this); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - out->offset.serialize_copy (c, src_base + offset, dst_base, length); return_trace (out); } @@ -185,91 +184,6 @@ struct name } } - bool serialize_name_record (hb_serialize_context_t *c, - const name *source_name, - const hb_vector_t& name_record_idx_to_retain) - { - for (unsigned int i = 0; i < name_record_idx_to_retain.length; i++) - { - unsigned int idx = name_record_idx_to_retain[i]; - if (unlikely (idx >= source_name->count)) - { - DEBUG_MSG (SUBSET, nullptr, "Invalid index: %d.", idx); - return false; - } - - c->push (); - - NameRecord *p = c->embed (source_name->nameRecordZ[idx]); - if (!p) - return false; - p->offset = 0; - } - - return true; - } - - bool serialize_strings (hb_serialize_context_t *c, - const name *source_name, - const hb_subset_plan_t *plan, - const hb_vector_t& name_record_idx_to_retain) - { - hb_face_t *face = plan->source; - accelerator_t acc; - acc.init (face); - - for (unsigned int i = 0; i < name_record_idx_to_retain.length; i++) - { - unsigned int idx = name_record_idx_to_retain[i]; - unsigned int size = acc.get_name (idx).get_size (); - - c->push (); - char *new_pos = c->allocate_size (size); - - if (unlikely (new_pos == nullptr)) - { - acc.fini (); - DEBUG_MSG (SUBSET, nullptr, "Couldn't allocate enough space for Name string: %u.", - size); - return false; - } - - const HBUINT8* source_string_pool = (source_name + source_name->stringOffset).arrayZ; - unsigned int name_record_offset = source_name->nameRecordZ[idx].offset; - - memcpy (new_pos, source_string_pool + name_record_offset, size); - } - - acc.fini (); - return true; - } - - bool pack_record_and_strings (name *dest_name_unpacked, - hb_serialize_context_t *c, - unsigned length) - { - hb_hashmap_t id_str_idx_map; - for (int i = length-1; i >= 0; i--) - { - unsigned objidx = c->pop_pack (); - id_str_idx_map.set ((unsigned)i, objidx); - } - - const void *base = & (dest_name_unpacked->nameRecordZ[length]); - for (int i = length-1; i >= 0; i--) - { - unsigned str_idx = id_str_idx_map.get ((unsigned)i); - NameRecord& namerecord = dest_name_unpacked->nameRecordZ[i]; - c->add_link (namerecord.offset, str_idx, base); - c->pop_pack (); - } - - if (c->in_error ()) - return false; - - return true; - } - bool serialize (hb_serialize_context_t *c, const name *source_name, const hb_subset_plan_t *plan, @@ -294,7 +208,7 @@ struct name + hb_iter (name_record_idx_to_retain) | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) ; - + if (unlikely (c->ran_out_of_room)) return_trace (false); assert (this->stringOffset == c->length ()); From 530ddbbc320bd24b4902ee6d49bf80242a591794 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:05:51 -0700 Subject: [PATCH 055/617] [serialize] Use range-based loop --- src/hb-serialize.hh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index afaa4c4f9..1a6ed2116 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -287,26 +287,23 @@ struct hb_serialize_context_t { assert (!current); - for (auto obj_it = ++hb_iter (packed); obj_it; ++obj_it) + for (const object_t *parent : ++hb_iter (packed)) { - const object_t &parent = **obj_it; - - for (auto link_it = parent.links.iter (); link_it; ++link_it) + for (const object_t::link_t &link : parent->links) { - const object_t::link_t &link = *link_it; const object_t &child = *packed[link.objidx]; - //assert (link.bias <= parent.tail - parent.head); - unsigned offset = (child.head - parent.head) - link.bias; + //assert (link.bias <= parent->tail - parent->head); + unsigned offset = (child.head - parent->head) - link.bias; if (link.is_wide) { - auto &off = * ((BEInt *) (parent.head + link.position)); + auto &off = * ((BEInt *) (parent->head + link.position)); assert (0 == off); check_assign (off, offset); } else { - auto &off = * ((BEInt *) (parent.head + link.position)); + auto &off = * ((BEInt *) (parent->head + link.position)); assert (0 == off); check_assign (off, offset); } From e6a622b5b202533d64f83e71d7ff8a8104d46e26 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:06:43 -0700 Subject: [PATCH 056/617] [serialize] Enable bias assertion --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 1a6ed2116..4e270ce8c 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -292,7 +292,7 @@ struct hb_serialize_context_t for (const object_t::link_t &link : parent->links) { const object_t &child = *packed[link.objidx]; - //assert (link.bias <= parent->tail - parent->head); + assert (link.bias <= parent->tail - parent->head); unsigned offset = (child.head - parent->head) - link.bias; if (link.is_wide) From 521262b236dacf7b2b64e0a1d3c79d6a10b07063 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:08:08 -0700 Subject: [PATCH 057/617] [subset] Add TODO --- src/hb-subset.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 5f482e18a..800bd35c8 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -76,6 +76,8 @@ _subset2 (hb_subset_plan_t *plan) if (source_blob->data) { hb_vector_t buf; + /* TODO Not all tables are glyph-related. 'name' table size for example should not be + * affected by number of glyphs. Accommodate that. */ unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length); DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size); if (unlikely (!buf.alloc (buf_size))) From 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:39:44 -0700 Subject: [PATCH 058/617] [ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018 --- src/hb-buffer-deserialize-json.hh | 1053 ++++---- src/hb-buffer-deserialize-text.hh | 1009 ++++---- src/hb-ot-shape-complex-indic-machine.hh | 2678 +++++++++++--------- src/hb-ot-shape-complex-khmer-machine.hh | 709 +++--- src/hb-ot-shape-complex-myanmar-machine.hh | 834 +++--- src/hb-ot-shape-complex-use-machine.hh | 1144 +++++---- 6 files changed, 3967 insertions(+), 3460 deletions(-) diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 1f9e2e91d..8631d52e8 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -1,30 +1,28 @@ - -#line 1 "hb-buffer-deserialize-json.rl" /* - * Copyright © 2013 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2013 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_BUFFER_DESERIALIZE_JSON_HH #define HB_BUFFER_DESERIALIZE_JSON_HH @@ -32,400 +30,208 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { - 0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, - 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, - 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, - 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, - 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, - 65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0 + 1u, 0u, 0u, 18u, 0u, 2u, 11u, 14u, + 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, + 6u, 7u, 0u, 19u, 0u, 19u, 0u, 19u, + 2u, 2u, 0u, 8u, 0u, 7u, 6u, 7u, + 0u, 19u, 0u, 19u, 15u, 15u, 2u, 2u, + 0u, 8u, 0u, 7u, 0u, 19u, 0u, 19u, + 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, + 6u, 7u, 0u, 19u, 0u, 19u, 2u, 2u, + 0u, 8u, 0u, 7u, 6u, 7u, 0u, 19u, + 0u, 19u, 2u, 2u, 0u, 8u, 0u, 7u, + 9u, 17u, 2u, 17u, 0u, 19u, 0u, 19u, + 0u, 10u, 0u, 18u, 1u, 0u, 0u }; -static const char _deserialize_json_key_spans[] = { - 0, 115, 26, 7, 2, 1, 50, 49, - 10, 117, 117, 117, 1, 50, 49, 10, - 117, 117, 1, 1, 50, 49, 117, 117, - 2, 1, 50, 49, 10, 117, 117, 1, - 50, 49, 10, 117, 117, 1, 50, 49, - 58, 89, 117, 117, 85, 115, 0 +static const char _deserialize_json_char_class[] = { + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 4, 5, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 1, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 10, 1, 5, 1, + 11, 9, 12, 13, 9, 9, 14, 9, + 9, 9, 9, 15, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 16, + 17, 9, 18, 1, 19, 0 }; static const short _deserialize_json_index_offsets[] = { - 0, 0, 116, 143, 151, 154, 156, 207, - 257, 268, 386, 504, 622, 624, 675, 725, - 736, 854, 972, 974, 976, 1027, 1077, 1195, - 1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, - 1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, - 2119, 2178, 2268, 2386, 2504, 2590, 2706 + 0, 0, 19, 22, 26, 28, 29, 38, + 46, 48, 68, 88, 108, 109, 118, 126, + 128, 148, 168, 169, 170, 179, 187, 207, + 227, 229, 230, 239, 247, 249, 269, 289, + 290, 299, 307, 309, 329, 349, 350, 359, + 367, 376, 392, 412, 432, 443, 462, 0 }; static const char _deserialize_json_indicies[] = { - 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 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, 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, 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, 2, 1, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 4, 1, - 5, 1, 6, 7, 1, 1, 8, 1, - 9, 10, 1, 11, 1, 11, 11, 11, - 11, 11, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 11, 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, 12, 1, - 12, 12, 12, 12, 12, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 12, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 13, 1, 1, 14, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 1, 16, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 1, 18, 18, 18, - 18, 18, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 18, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 19, 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, 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, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 20, 1, 21, 21, 21, 21, 21, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 21, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 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, 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, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 22, - 1, 18, 18, 18, 18, 18, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 18, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 19, 1, 1, 1, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 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, - 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, 1, 1, - 1, 1, 1, 1, 1, 20, 1, 23, - 1, 23, 23, 23, 23, 23, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 23, 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, 24, 1, 24, 24, 24, 24, - 24, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 24, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 25, 1, 1, 26, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 1, 28, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 1, 30, 30, 30, 30, 30, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 30, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 31, 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, 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, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 32, 1, 30, - 30, 30, 30, 30, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 30, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 31, 1, 1, 1, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 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, 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, 1, 1, 1, 1, - 1, 1, 1, 32, 1, 33, 1, 34, - 1, 34, 34, 34, 34, 34, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 34, 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, 35, 1, 35, 35, 35, 35, - 35, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 35, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 36, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 1, 38, 38, - 38, 38, 38, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 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, - 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, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 40, 1, 38, 38, 38, 38, - 38, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 38, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 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, 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, 1, 1, 1, 1, 1, 1, 1, - 40, 1, 42, 43, 1, 44, 1, 44, - 44, 44, 44, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 44, 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, - 45, 1, 45, 45, 45, 45, 45, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 45, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 46, 1, - 1, 47, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 1, 49, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 1, 51, - 51, 51, 51, 51, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 51, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 52, 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, 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, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 53, 1, 51, 51, 51, - 51, 51, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 52, 1, 1, 1, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 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, 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, 1, 1, 1, 1, 1, 1, - 1, 53, 1, 54, 1, 54, 54, 54, - 54, 54, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 54, 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, 55, 1, - 55, 55, 55, 55, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 55, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 56, 1, 1, 57, - 58, 58, 58, 58, 58, 58, 58, 58, - 58, 1, 59, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 1, 61, 61, 61, - 61, 61, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 61, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 62, 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, 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, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 63, 1, 61, 61, 61, 61, 61, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 61, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 62, 1, - 1, 1, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 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, 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, - 1, 1, 1, 1, 1, 1, 1, 63, - 1, 64, 1, 64, 64, 64, 64, 64, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 64, 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, 65, 1, 65, 65, - 65, 65, 65, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 65, 1, 66, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 67, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 1, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 1, 1, 1, 1, 1, 1, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 1, 70, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 71, 71, - 1, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 1, 1, 1, 1, 1, - 1, 1, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 1, 1, 1, 1, - 71, 1, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 1, 72, 72, 72, - 72, 72, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 72, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 73, 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, 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, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 74, 1, 72, 72, 72, 72, 72, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 72, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 73, 1, - 1, 1, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 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, 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, - 1, 1, 1, 1, 1, 1, 1, 74, - 1, 76, 76, 76, 76, 76, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 76, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 77, 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, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 78, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 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, 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, 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, 2, 1, 1, 0 + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 1, 4, 5, 6, + 7, 8, 9, 10, 11, 11, 1, 1, + 1, 1, 1, 1, 1, 12, 12, 1, + 1, 1, 13, 1, 14, 15, 16, 17, + 18, 1, 1, 19, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 20, 21, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 22, + 18, 1, 1, 19, 1, 1, 17, 17, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 20, 23, 23, 1, 1, + 1, 1, 1, 1, 1, 24, 24, 1, + 1, 1, 25, 1, 26, 27, 28, 29, + 30, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 32, 30, 1, 1, 31, + 1, 1, 29, 29, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 32, + 33, 34, 34, 1, 1, 1, 1, 1, + 1, 1, 35, 35, 1, 1, 1, 1, + 1, 36, 37, 38, 1, 1, 39, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 40, 38, + 1, 1, 39, 1, 1, 41, 41, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 40, 42, 43, 44, 44, 1, + 1, 1, 1, 1, 1, 1, 45, 45, + 1, 1, 1, 46, 1, 47, 48, 49, + 50, 51, 1, 1, 52, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 53, 51, 1, 1, + 52, 1, 1, 50, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 53, 54, 54, 1, 1, 1, 1, 1, + 1, 1, 55, 55, 1, 1, 1, 56, + 1, 57, 58, 59, 60, 61, 1, 1, + 62, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 63, 61, 1, 1, 62, 1, 1, 60, + 60, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 63, 64, 64, 1, + 1, 1, 1, 1, 1, 1, 65, 65, + 1, 66, 1, 1, 1, 67, 68, 69, + 1, 69, 69, 69, 69, 69, 69, 69, + 70, 1, 71, 71, 71, 71, 1, 71, + 1, 71, 71, 71, 71, 71, 71, 71, + 72, 1, 1, 73, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 74, 72, 1, 1, 73, + 1, 1, 75, 75, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 74, + 76, 1, 1, 77, 1, 1, 1, 1, + 1, 1, 78, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 0 }; -static const char _deserialize_json_trans_targs[] = { - 1, 0, 2, 2, 3, 4, 18, 24, - 37, 5, 12, 6, 7, 8, 9, 11, - 9, 11, 10, 2, 44, 10, 44, 13, - 14, 15, 16, 17, 16, 17, 10, 2, - 44, 19, 20, 21, 22, 23, 10, 2, - 44, 23, 25, 31, 26, 27, 28, 29, - 30, 29, 30, 10, 2, 44, 32, 33, - 34, 35, 36, 35, 36, 10, 2, 44, - 38, 39, 40, 42, 43, 41, 10, 41, - 10, 2, 44, 43, 44, 45, 46 +static const char _deserialize_json_index_defaults[] = { + 0, 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, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0 }; -static const char _deserialize_json_trans_actions[] = { - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 2, - 0, 0, 3, 3, 4, 0, 5, 0, - 0, 2, 2, 2, 0, 0, 6, 6, - 7, 0, 0, 0, 2, 2, 8, 8, - 9, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 10, 10, 11, 0, 0, - 2, 2, 2, 0, 0, 12, 12, 13, - 0, 0, 0, 2, 2, 2, 14, 0, - 15, 15, 16, 0, 0, 0, 0 +static const char _deserialize_json_trans_cond_spaces[] = { + -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, -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 0 +}; + +static const char _deserialize_json_cond_targs[] = { + 1, 0, 2, 2, 3, 4, 18, 24, + 37, 5, 12, 6, 7, 8, 9, 11, + 9, 11, 10, 2, 44, 10, 44, 13, + 14, 15, 16, 17, 16, 17, 10, 2, + 44, 19, 20, 21, 22, 23, 10, 2, + 44, 23, 25, 31, 26, 27, 28, 29, + 30, 29, 30, 10, 2, 44, 32, 33, + 34, 35, 36, 35, 36, 10, 2, 44, + 38, 39, 40, 42, 43, 41, 10, 41, + 10, 2, 44, 43, 44, 45, 46, 0 +}; + +static const char _deserialize_json_cond_actions[] = { + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, + 0, 0, 3, 3, 4, 0, 5, 0, + 0, 2, 2, 2, 0, 0, 6, 6, + 7, 0, 0, 0, 2, 2, 8, 8, + 9, 0, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 10, 10, 11, 0, 0, + 2, 2, 2, 0, 0, 12, 12, 13, + 0, 0, 0, 2, 2, 2, 14, 0, + 15, 15, 16, 0, 0, 0, 0, 0 +}; + +static const char _deserialize_json_eof_cond_spaces[] = { + -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, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0 +}; + +static const char _deserialize_json_eof_cond_key_offs[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const char _deserialize_json_eof_cond_key_lens[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const char _deserialize_json_eof_cond_keys[] = { + 0 +}; + +static const char _deserialize_json_nfa_targs[] = { + 0, 0 +}; + +static const char _deserialize_json_nfa_offsets[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const char _deserialize_json_nfa_push_actions[] = { + 0, 0 +}; + +static const char _deserialize_json_nfa_pop_trans[] = { + 0, 0 }; static const int deserialize_json_start = 1; @@ -435,209 +241,254 @@ static const int deserialize_json_error = 0; static const int deserialize_json_en_main = 1; -#line 97 "hb-buffer-deserialize-json.rl" - static hb_bool_t _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, - const char *buf, - unsigned int buf_len, - const char **end_ptr, - hb_font_t *font) +const char *buf, +unsigned int buf_len, +const char **end_ptr, +hb_font_t *font) { - const char *p = buf, *pe = buf + buf_len; - - /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, nullptr); - - while (p < pe && ISSPACE (*p)) - p++; - if (p < pe && *p == (buffer->len ? ',' : '[')) - { - *end_ptr = ++p; - } - - const char *tok = nullptr; - int cs; - hb_glyph_info_t info = {0}; - hb_glyph_position_t pos = {0}; - -#line 466 "hb-buffer-deserialize-json.hh" + const char *p = buf, *pe = buf + buf_len; + + /* Ensure we have positions. */ + (void) hb_buffer_get_glyph_positions (buffer, nullptr); + + while (p < pe && ISSPACE (*p)) + p++; + if (p < pe && *p == (buffer->len ? ',' : '[')) { - cs = deserialize_json_start; + *end_ptr = ++p; } - -#line 471 "hb-buffer-deserialize-json.hh" + + const char *tok = nullptr; + int cs; + hb_glyph_info_t info = {0}; + hb_glyph_position_t pos = {0}; + { - int _slen; - int _trans; - const unsigned char *_keys; - const char *_inds; - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - _keys = _deserialize_json_trans_keys + (cs<<1); - _inds = _deserialize_json_indicies + _deserialize_json_index_offsets[cs]; - - _slen = _deserialize_json_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=(*p) && - (*p) <= _keys[1] ? - (*p) - _keys[0] : _slen ]; - - cs = _deserialize_json_trans_targs[_trans]; - - if ( _deserialize_json_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _deserialize_json_trans_actions[_trans] ) { - case 1: -#line 38 "hb-buffer-deserialize-json.rl" - { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); -} - break; - case 5: -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 2: -#line 51 "hb-buffer-deserialize-json.rl" - { - tok = p; -} - break; - case 14: -#line 55 "hb-buffer-deserialize-json.rl" - { - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} - break; - case 15: -#line 62 "hb-buffer-deserialize-json.rl" - { if (!parse_uint (tok, p, &info.codepoint)) return false; } - break; - case 8: -#line 63 "hb-buffer-deserialize-json.rl" - { if (!parse_uint (tok, p, &info.cluster )) return false; } - break; - case 10: -#line 64 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.x_offset )) return false; } - break; - case 12: -#line 65 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.y_offset )) return false; } - break; - case 3: -#line 66 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.x_advance)) return false; } - break; - case 6: -#line 67 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.y_advance)) return false; } - break; - case 16: -#line 62 "hb-buffer-deserialize-json.rl" - { if (!parse_uint (tok, p, &info.codepoint)) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 9: -#line 63 "hb-buffer-deserialize-json.rl" - { if (!parse_uint (tok, p, &info.cluster )) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 11: -#line 64 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.x_offset )) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 13: -#line 65 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.y_offset )) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 4: -#line 66 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.x_advance)) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 7: -#line 67 "hb-buffer-deserialize-json.rl" - { if (!parse_int (tok, p, &pos.y_advance)) return false; } -#line 43 "hb-buffer-deserialize-json.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; -#line 624 "hb-buffer-deserialize-json.hh" + cs = (int)deserialize_json_start; } - -_again: - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - _out: {} + + { + unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; + _resume: { + _keys = ( _deserialize_json_trans_keys + ((cs<<1))); + _inds = ( _deserialize_json_indicies + (_deserialize_json_index_offsets[cs])); + + if ( ( (*( p))) <= 125 && ( (*( p))) >= 9 ) + { + int _ic = (int)_deserialize_json_char_class[(int)( (*( p))) - 9]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_deserialize_json_index_defaults[cs]; + } + else { + _trans = (unsigned int)_deserialize_json_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_deserialize_json_cond_targs[_trans]; + + if ( _deserialize_json_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _deserialize_json_cond_actions[_trans] ) { + case 1: { + { + #line 38 "hb-buffer-deserialize-json.rl" + + memset (&info, 0, sizeof (info)); + memset (&pos , 0, sizeof (pos )); + } + + break; } + case 5: { + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 2: { + { + #line 51 "hb-buffer-deserialize-json.rl" + + tok = p; + } + + break; } + case 14: { + { + #line 55 "hb-buffer-deserialize-json.rl" + + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; + } + + break; } + case 15: { + { + #line 62 "hb-buffer-deserialize-json.rl" + if (!parse_uint (tok, p, &info.codepoint)) return false; } + + break; } + case 8: { + { + #line 63 "hb-buffer-deserialize-json.rl" + if (!parse_uint (tok, p, &info.cluster )) return false; } + + break; } + case 10: { + { + #line 64 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.x_offset )) return false; } + + break; } + case 12: { + { + #line 65 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.y_offset )) return false; } + + break; } + case 3: { + { + #line 66 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.x_advance)) return false; } + + break; } + case 6: { + { + #line 67 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.y_advance)) return false; } + + break; } + case 16: { + { + #line 62 "hb-buffer-deserialize-json.rl" + if (!parse_uint (tok, p, &info.codepoint)) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 9: { + { + #line 63 "hb-buffer-deserialize-json.rl" + if (!parse_uint (tok, p, &info.cluster )) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 11: { + { + #line 64 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.x_offset )) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 13: { + { + #line 65 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.y_offset )) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 4: { + { + #line 66 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.x_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 7: { + { + #line 67 "hb-buffer-deserialize-json.rl" + if (!parse_int (tok, p, &pos.y_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-json.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + } + + + } + _again: { + if ( cs == 0 ) + goto _out; + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + } + _out: { {} + } + } } - -#line 125 "hb-buffer-deserialize-json.rl" - - - *end_ptr = p; - - return p == pe && *(p-1) != ']'; + + + *end_ptr = p; + + return p == pe && *(p-1) != ']'; } #endif /* HB_BUFFER_DESERIALIZE_JSON_HH */ diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index 67f0a1252..28ab3f1cd 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -1,30 +1,28 @@ - -#line 1 "hb-buffer-deserialize-text.rl" /* - * Copyright © 2013 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2013 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH #define HB_BUFFER_DESERIALIZE_TEXT_HH @@ -32,277 +30,160 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { - 0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, - 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, - 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, - 9u, 124u, 9u, 124u, 9u, 124u, 0 + 1u, 0u, 0u, 10u, 4u, 7u, 6u, 7u, + 4u, 7u, 6u, 7u, 6u, 7u, 4u, 7u, + 6u, 7u, 3u, 3u, 4u, 7u, 6u, 7u, + 3u, 7u, 0u, 12u, 0u, 12u, 1u, 0u, + 0u, 10u, 0u, 12u, 0u, 12u, 0u, 12u, + 0u, 12u, 0u, 12u, 0u, 12u, 0u, 12u, + 0u, 12u, 0u, 12u, 0u, 12u, 0u }; -static const char _deserialize_text_key_spans[] = { - 0, 114, 13, 10, 13, 10, 10, 13, - 10, 1, 13, 10, 14, 116, 116, 0, - 114, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116 +static const char _deserialize_text_char_class[] = { + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 4, 5, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 1, 1, 8, 1, 1, 9, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 1, 11, 1, 5, 1, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 12, 0 }; static const short _deserialize_text_index_offsets[] = { - 0, 0, 115, 129, 140, 154, 165, 176, - 190, 201, 203, 217, 228, 243, 360, 477, - 478, 593, 710, 827, 944, 1061, 1178, 1295, - 1412, 1529, 1646 + 0, 0, 11, 15, 17, 21, 23, 25, + 29, 31, 32, 36, 38, 43, 56, 69, + 69, 80, 93, 106, 119, 132, 145, 158, + 171, 184, 197, 0 }; static const char _deserialize_text_indicies[] = { - 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 1, 1, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 1, 5, 1, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 1, 10, 1, 1, - 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 1, 13, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 1, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 1, 17, 1, 1, 18, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 1, 20, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 1, 22, 1, 23, 1, 1, 24, - 25, 25, 25, 25, 25, 25, 25, 25, - 25, 1, 26, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 1, 22, 1, 1, - 1, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 1, 28, 28, 28, 28, - 28, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 28, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 29, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 30, 1, 1, 31, 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, - 32, 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, 33, - 1, 34, 34, 34, 34, 34, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 34, 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, 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, 35, 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, 36, 1, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 28, 28, 28, 28, 28, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 28, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 29, 1, 1, 1, - 1, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 1, 1, 1, 30, 1, - 1, 31, 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, 32, 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, 33, 1, 38, - 38, 38, 38, 38, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 38, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 39, 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, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 40, 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, 41, 1, 42, 42, 42, 42, - 42, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 42, 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, 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, - 43, 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, 44, - 1, 42, 42, 42, 42, 42, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 42, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 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, - 1, 1, 1, 1, 1, 43, 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, 44, 1, 38, 38, - 38, 38, 38, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 1, 1, 1, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 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, 1, 1, 1, - 1, 1, 40, 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, 41, 1, 45, 45, 45, 45, 45, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 45, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 46, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 47, 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, 48, - 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, 49, 1, - 50, 50, 50, 50, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 50, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 51, 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, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 52, 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, 53, 1, 50, 50, 50, - 50, 50, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 51, - 1, 1, 1, 1, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 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, 1, 1, 1, 1, - 1, 52, 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, - 53, 1, 45, 45, 45, 45, 45, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 45, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 46, 1, 1, 1, - 1, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 1, 1, 1, 1, 1, - 1, 47, 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, 48, 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, 49, 1, 28, - 28, 28, 28, 28, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 28, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 29, 1, 55, 55, 1, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 1, 1, 1, 30, 1, 1, 31, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 1, 1, 32, 1, 55, 1, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 1, 33, 1, 0 + 0, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 5, 1, 6, 7, 8, + 9, 10, 1, 11, 12, 13, 14, 15, + 16, 17, 1, 18, 19, 20, 21, 22, + 23, 1, 24, 25, 26, 27, 22, 1, + 1, 21, 21, 28, 1, 29, 1, 1, + 1, 1, 1, 30, 31, 1, 32, 33, + 34, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 35, 36, 0, 1, 1, + 1, 1, 1, 2, 3, 1, 1, 4, + 28, 1, 29, 1, 1, 1, 37, 37, + 30, 31, 1, 32, 33, 38, 1, 1, + 39, 1, 1, 1, 1, 1, 1, 1, + 40, 41, 42, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 43, 44, 42, + 1, 1, 1, 1, 1, 14, 14, 1, + 1, 1, 43, 44, 38, 1, 1, 39, + 1, 1, 9, 9, 1, 1, 1, 40, + 41, 45, 1, 46, 1, 1, 1, 1, + 1, 1, 47, 1, 48, 49, 50, 1, + 51, 1, 1, 1, 1, 1, 1, 1, + 1, 52, 53, 50, 1, 51, 1, 1, + 1, 27, 27, 1, 1, 1, 52, 53, + 45, 1, 46, 1, 1, 1, 54, 54, + 1, 47, 1, 48, 49, 28, 1, 29, + 1, 55, 55, 55, 55, 30, 31, 55, + 32, 33, 0 }; -static const char _deserialize_text_trans_targs[] = { - 1, 0, 13, 17, 26, 3, 18, 21, - 18, 21, 5, 19, 20, 19, 20, 22, - 25, 8, 9, 12, 9, 12, 10, 11, - 23, 24, 23, 24, 14, 2, 6, 7, - 15, 16, 14, 15, 16, 17, 14, 4, - 15, 16, 14, 15, 16, 14, 2, 7, - 15, 16, 14, 2, 15, 16, 25, 26 +static const char _deserialize_text_index_defaults[] = { + 0, 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 }; -static const char _deserialize_text_trans_actions[] = { - 0, 0, 1, 1, 1, 2, 2, 2, - 0, 0, 2, 2, 2, 0, 0, 2, - 2, 2, 2, 2, 0, 0, 3, 2, - 2, 2, 0, 0, 4, 5, 5, 5, - 4, 4, 0, 0, 0, 0, 6, 7, - 6, 6, 8, 8, 8, 9, 10, 10, - 9, 9, 11, 12, 11, 11, 0, 0 +static const char _deserialize_text_trans_cond_spaces[] = { + -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, -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 +}; + +static const char _deserialize_text_cond_targs[] = { + 1, 0, 13, 17, 26, 3, 18, 21, + 18, 21, 5, 19, 20, 19, 20, 22, + 25, 8, 9, 12, 9, 12, 10, 11, + 23, 24, 23, 24, 14, 2, 6, 7, + 15, 16, 14, 15, 16, 17, 14, 4, + 15, 16, 14, 15, 16, 14, 2, 7, + 15, 16, 14, 2, 15, 16, 25, 26, + 0 +}; + +static const char _deserialize_text_cond_actions[] = { + 0, 0, 1, 1, 1, 2, 2, 2, + 0, 0, 2, 2, 2, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 3, 2, + 2, 2, 0, 0, 4, 5, 5, 5, + 4, 4, 0, 0, 0, 0, 6, 7, + 6, 6, 8, 8, 8, 9, 10, 10, + 9, 9, 11, 12, 11, 11, 0, 0, + 0 +}; + +static const char _deserialize_text_eof_cond_spaces[] = { + -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 +}; + +static const char _deserialize_text_eof_cond_key_offs[] = { + 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 +}; + +static const char _deserialize_text_eof_cond_key_lens[] = { + 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 +}; + +static const char _deserialize_text_eof_cond_keys[] = { + 0 }; static const char _deserialize_text_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 4, 6, 8, 8, 6, 9, 11, - 11, 9, 4 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 4, 6, 8, 8, 6, 9, 11, + 11, 9, 4, 0 +}; + +static const char _deserialize_text_nfa_targs[] = { + 0, 0 +}; + +static const char _deserialize_text_nfa_offsets[] = { + 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 +}; + +static const char _deserialize_text_nfa_push_actions[] = { + 0, 0 +}; + +static const char _deserialize_text_nfa_pop_trans[] = { + 0, 0 }; static const int deserialize_text_start = 1; @@ -312,260 +193,338 @@ static const int deserialize_text_error = 0; static const int deserialize_text_en_main = 1; -#line 91 "hb-buffer-deserialize-text.rl" - static hb_bool_t _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer, - const char *buf, - unsigned int buf_len, - const char **end_ptr, - hb_font_t *font) +const char *buf, +unsigned int buf_len, +const char **end_ptr, +hb_font_t *font) { - const char *p = buf, *pe = buf + buf_len; - - /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, nullptr); - - while (p < pe && ISSPACE (*p)) - p++; - if (p < pe && *p == (buffer->len ? '|' : '[')) - { - *end_ptr = ++p; - } - - const char *eof = pe, *tok = nullptr; - int cs; - hb_glyph_info_t info = {0}; - hb_glyph_position_t pos = {0}; - -#line 343 "hb-buffer-deserialize-text.hh" + const char *p = buf, *pe = buf + buf_len; + + /* Ensure we have positions. */ + (void) hb_buffer_get_glyph_positions (buffer, nullptr); + + while (p < pe && ISSPACE (*p)) + p++; + if (p < pe && *p == (buffer->len ? '|' : '[')) { - cs = deserialize_text_start; + *end_ptr = ++p; } - -#line 348 "hb-buffer-deserialize-text.hh" + + const char *eof = pe, *tok = nullptr; + int cs; + hb_glyph_info_t info = {0}; + hb_glyph_position_t pos = {0}; + { - int _slen; - int _trans; - const unsigned char *_keys; - const char *_inds; - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - _keys = _deserialize_text_trans_keys + (cs<<1); - _inds = _deserialize_text_indicies + _deserialize_text_index_offsets[cs]; - - _slen = _deserialize_text_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=(*p) && - (*p) <= _keys[1] ? - (*p) - _keys[0] : _slen ]; - - cs = _deserialize_text_trans_targs[_trans]; - - if ( _deserialize_text_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _deserialize_text_trans_actions[_trans] ) { - case 2: -#line 51 "hb-buffer-deserialize-text.rl" - { - tok = p; -} - break; - case 5: -#line 55 "hb-buffer-deserialize-text.rl" - { - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} - break; - case 10: -#line 62 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.cluster )) return false; } - break; - case 3: -#line 63 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.x_offset )) return false; } - break; - case 12: -#line 64 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.y_offset )) return false; } - break; - case 7: -#line 65 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.x_advance)) return false; } - break; - case 1: -#line 38 "hb-buffer-deserialize-text.rl" - { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); -} -#line 51 "hb-buffer-deserialize-text.rl" - { - tok = p; -} - break; - case 4: -#line 55 "hb-buffer-deserialize-text.rl" - { - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 9: -#line 62 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.cluster )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 11: -#line 64 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.y_offset )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 6: -#line 65 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.x_advance)) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 8: -#line 66 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.y_advance)) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; -#line 480 "hb-buffer-deserialize-text.hh" + cs = (int)deserialize_text_start; } - -_again: - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) + { - switch ( _deserialize_text_eof_actions[cs] ) { - case 4: -#line 55 "hb-buffer-deserialize-text.rl" - { - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 9: -#line 62 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.cluster )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 11: -#line 64 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.y_offset )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 6: -#line 65 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.x_advance)) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 8: -#line 66 "hb-buffer-deserialize-text.rl" - { if (!parse_int (tok, p, &pos.y_advance)) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; -#line 557 "hb-buffer-deserialize-text.hh" + int _cpc; + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; + _resume: { + _keys = ( _deserialize_text_trans_keys + ((cs<<1))); + _inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs])); + + if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) + { + int _ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_deserialize_text_index_defaults[cs]; + } + else { + _trans = (unsigned int)_deserialize_text_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_deserialize_text_cond_targs[_trans]; + + if ( _deserialize_text_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _deserialize_text_cond_actions[_trans] ) { + case 2: { + { + #line 51 "hb-buffer-deserialize-text.rl" + + tok = p; + } + + break; } + case 5: { + { + #line 55 "hb-buffer-deserialize-text.rl" + + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; + } + + break; } + case 10: { + { + #line 62 "hb-buffer-deserialize-text.rl" + if (!parse_uint (tok, p, &info.cluster )) return false; } + + break; } + case 3: { + { + #line 63 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.x_offset )) return false; } + + break; } + case 12: { + { + #line 64 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.y_offset )) return false; } + + break; } + case 7: { + { + #line 65 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.x_advance)) return false; } + + break; } + case 1: { + { + #line 38 "hb-buffer-deserialize-text.rl" + + memset (&info, 0, sizeof (info)); + memset (&pos , 0, sizeof (pos )); + } + { + #line 51 "hb-buffer-deserialize-text.rl" + + tok = p; + } + + break; } + case 4: { + { + #line 55 "hb-buffer-deserialize-text.rl" + + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; + } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 9: { + { + #line 62 "hb-buffer-deserialize-text.rl" + if (!parse_uint (tok, p, &info.cluster )) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 11: { + { + #line 64 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.y_offset )) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 6: { + { + #line 65 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.x_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 8: { + { + #line 66 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.y_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + } + + + } + _again: { + if ( cs == 0 ) + goto _out; + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + if ( p == eof ) + { + if ( _deserialize_text_eof_cond_spaces[cs] != -1 ) { + _cekeys = ( _deserialize_text_eof_cond_keys + (_deserialize_text_eof_cond_key_offs[cs])); + _klen = (int)_deserialize_text_eof_cond_key_lens[cs]; + _cpc = 0; + { + const char *_lower = _cekeys; + const char *_upper = _cekeys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + goto _ok; + } + } + cs = 0; + goto _out; + } + _ok: {} + } + switch ( _deserialize_text_eof_actions[cs] ) { + case 4: { + { + #line 55 "hb-buffer-deserialize-text.rl" + + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; + } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 9: { + { + #line 62 "hb-buffer-deserialize-text.rl" + if (!parse_uint (tok, p, &info.cluster )) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 11: { + { + #line 64 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.y_offset )) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 6: { + { + #line 65 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.x_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + case 8: { + { + #line 66 "hb-buffer-deserialize-text.rl" + if (!parse_int (tok, p, &pos.y_advance)) return false; } + { + #line 43 "hb-buffer-deserialize-text.rl" + + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; + } + + break; } + } + } + + } + _out: { {} + } + } } - } - - _out: {} - } - -#line 119 "hb-buffer-deserialize-text.rl" - - - *end_ptr = p; - - return p == pe && *(p-1) != ']'; + + + *end_ptr = p; + + return p == pe && *(p-1) != ']'; } #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */ diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index 08b90e913..dbab7e042 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -1,30 +1,28 @@ - -#line 1 "hb-ot-shape-complex-indic-machine.rl" /* - * Copyright © 2011,2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2011,2012 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH @@ -32,952 +30,1226 @@ #include "hb.hh" -#line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 8u, 8u, 4u, 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, 13u, 4u, 8u, - 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, - 5u, 8u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, - 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, - 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, - 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, - 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 + 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 7u, 7u, 3u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 7u, 7u, 3u, 7u, 4u, 6u, + 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 12u, 3u, 7u, + 3u, 12u, 3u, 7u, 3u, 12u, 3u, 7u, + 3u, 12u, 3u, 7u, 3u, 12u, 3u, 12u, + 4u, 7u, 7u, 7u, 0u, 17u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 4u, 9u, 4u, 9u, + 4u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, + 4u, 9u, 2u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 3u, 9u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 3u, 7u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 4u, 9u, 4u, 9u, 4u, 9u, + 9u, 9u, 9u, 9u, 9u, 9u, 4u, 9u, + 2u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 3u, 9u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 3u, 12u, 2u, 15u, + 3u, 7u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 0u, 15u, 2u, 15u, + 0u, 15u, 3u, 12u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, + 2u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, + 0u }; -static const char _indic_syllable_machine_key_spans[] = { - 1, 5, 3, 1, 4, 3, 1, 4, - 3, 1, 4, 3, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 5, 1, - 1, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 1, 5, 3, 1, 4, 3, - 1, 4, 3, 1, 4, 3, 1, 5, - 1, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 1, 5, 3, 1, - 4, 3, 1, 4, 3, 1, 4, 3, - 1, 5, 1, 1, 5, 1, 1, 5, - 1, 1, 5, 1, 1, 10, 5, 10, - 5, 10, 5, 10, 5, 1, 5, 3, - 1, 4, 3, 1, 4, 3, 1, 4, - 3, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 10, - 4, 1, 19, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 6, 6, - 6, 1, 1, 1, 6, 8, 6, 8, - 7, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 7, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 6, 6, 6, 1, - 1, 1, 6, 8, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 6, 8, 7, - 7, 15, 15, 16, 16, 16, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 5, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 6, 6, 6, 1, 1, 1, 6, - 8, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 7, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 10, 15, 5, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 6, 6, 6, 1, 1, 1, 6, 8, - 6, 8, 7, 6, 8, 7, 6, 8, - 7, 6, 8, 7, 7, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 16, 16, 16, 15, 15, 16, 16, - 16, 15, 17, 15, 17, 10, 6, 1, - 1, 1, 6, 16, 8, 6, 6, 1, - 1, 1, 6, 16 +static const char _indic_syllable_machine_char_class[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 8, 13, 14, + 15, 16, 17, 0 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 8, 12, 14, 19, 23, 25, - 30, 34, 36, 41, 45, 47, 53, 55, - 57, 63, 65, 67, 73, 75, 77, 83, - 85, 87, 98, 104, 115, 121, 132, 138, - 149, 155, 166, 168, 174, 178, 180, 185, - 189, 191, 196, 200, 202, 207, 211, 213, - 219, 221, 223, 229, 231, 233, 239, 241, - 243, 249, 251, 253, 264, 270, 281, 287, - 298, 304, 315, 321, 332, 334, 340, 344, - 346, 351, 355, 357, 362, 366, 368, 373, - 377, 379, 385, 387, 389, 395, 397, 399, - 405, 407, 409, 415, 417, 419, 430, 436, - 447, 453, 464, 470, 481, 487, 489, 495, - 499, 501, 506, 510, 512, 517, 521, 523, - 528, 532, 534, 540, 542, 544, 550, 552, - 554, 560, 562, 564, 570, 572, 574, 585, - 591, 602, 608, 619, 625, 636, 642, 653, - 664, 669, 671, 691, 707, 723, 738, 755, - 771, 787, 802, 819, 835, 851, 866, 883, - 899, 915, 930, 947, 963, 979, 994, 1001, - 1008, 1015, 1017, 1019, 1021, 1028, 1037, 1044, - 1053, 1061, 1068, 1077, 1085, 1092, 1101, 1109, - 1116, 1125, 1133, 1141, 1157, 1173, 1190, 1207, - 1224, 1240, 1256, 1273, 1290, 1307, 1323, 1339, - 1356, 1373, 1390, 1406, 1422, 1439, 1456, 1473, - 1489, 1505, 1521, 1537, 1552, 1569, 1585, 1601, - 1616, 1633, 1649, 1665, 1680, 1697, 1713, 1729, - 1744, 1761, 1777, 1793, 1808, 1815, 1822, 1829, - 1831, 1833, 1835, 1842, 1851, 1858, 1867, 1875, - 1882, 1891, 1899, 1906, 1915, 1923, 1930, 1939, - 1947, 1955, 1971, 1987, 2004, 2021, 2038, 2054, - 2070, 2087, 2104, 2121, 2137, 2153, 2170, 2187, - 2204, 2220, 2236, 2253, 2270, 2287, 2293, 2309, - 2325, 2340, 2357, 2373, 2389, 2404, 2421, 2437, - 2453, 2468, 2485, 2501, 2517, 2532, 2549, 2565, - 2581, 2596, 2603, 2610, 2617, 2619, 2621, 2623, - 2630, 2639, 2646, 2655, 2663, 2670, 2679, 2687, - 2694, 2703, 2711, 2718, 2727, 2735, 2743, 2759, - 2775, 2792, 2809, 2826, 2842, 2858, 2875, 2892, - 2909, 2925, 2941, 2958, 2975, 2992, 3008, 3024, - 3041, 3058, 3075, 3086, 3102, 3108, 3124, 3140, - 3155, 3172, 3188, 3204, 3219, 3236, 3252, 3268, - 3283, 3300, 3316, 3332, 3347, 3364, 3380, 3396, - 3411, 3418, 3425, 3432, 3434, 3436, 3438, 3445, - 3454, 3461, 3470, 3478, 3485, 3494, 3502, 3509, - 3518, 3526, 3533, 3542, 3550, 3558, 3574, 3590, - 3607, 3624, 3641, 3657, 3673, 3690, 3707, 3724, - 3740, 3756, 3773, 3790, 3807, 3823, 3839, 3856, - 3873, 3890, 3906, 3924, 3940, 3958, 3969, 3976, - 3978, 3980, 3982, 3989, 4006, 4015, 4022, 4029, - 4031, 4033, 4035, 4042 + 0, 1, 6, 9, 10, 14, 17, 18, + 22, 25, 26, 30, 33, 34, 39, 40, + 41, 46, 47, 48, 53, 54, 55, 60, + 61, 62, 72, 77, 87, 92, 102, 107, + 117, 122, 132, 133, 138, 141, 142, 146, + 149, 150, 154, 157, 158, 162, 165, 166, + 171, 172, 173, 178, 179, 180, 185, 186, + 187, 192, 193, 194, 204, 209, 219, 224, + 234, 239, 249, 254, 264, 265, 270, 273, + 274, 278, 281, 282, 286, 289, 290, 294, + 297, 298, 303, 304, 305, 310, 311, 312, + 317, 318, 319, 324, 325, 326, 336, 341, + 351, 356, 366, 371, 381, 386, 387, 392, + 395, 396, 400, 403, 404, 408, 411, 412, + 416, 419, 420, 425, 426, 427, 432, 433, + 434, 439, 440, 441, 446, 447, 448, 458, + 463, 473, 478, 488, 493, 503, 508, 518, + 528, 532, 533, 551, 565, 579, 592, 607, + 621, 635, 648, 663, 677, 691, 704, 719, + 733, 747, 760, 775, 789, 803, 816, 822, + 828, 834, 835, 836, 837, 843, 851, 857, + 865, 872, 878, 886, 893, 899, 907, 914, + 920, 928, 935, 942, 956, 970, 985, 1000, + 1015, 1029, 1043, 1058, 1073, 1088, 1102, 1116, + 1131, 1146, 1161, 1175, 1189, 1204, 1219, 1234, + 1248, 1262, 1276, 1290, 1303, 1318, 1332, 1346, + 1359, 1374, 1388, 1402, 1415, 1430, 1444, 1458, + 1471, 1486, 1500, 1514, 1527, 1533, 1539, 1545, + 1546, 1547, 1548, 1554, 1562, 1568, 1576, 1583, + 1589, 1597, 1604, 1610, 1618, 1625, 1631, 1639, + 1646, 1653, 1667, 1681, 1696, 1711, 1726, 1740, + 1754, 1769, 1784, 1799, 1813, 1827, 1842, 1857, + 1872, 1886, 1900, 1915, 1930, 1945, 1950, 1964, + 1978, 1991, 2006, 2020, 2034, 2047, 2062, 2076, + 2090, 2103, 2118, 2132, 2146, 2159, 2174, 2188, + 2202, 2215, 2221, 2227, 2233, 2234, 2235, 2236, + 2242, 2250, 2256, 2264, 2271, 2277, 2285, 2292, + 2298, 2306, 2313, 2319, 2327, 2334, 2341, 2355, + 2369, 2384, 2399, 2414, 2428, 2442, 2457, 2472, + 2487, 2501, 2515, 2530, 2545, 2560, 2574, 2588, + 2603, 2618, 2633, 2643, 2657, 2662, 2676, 2690, + 2703, 2718, 2732, 2746, 2759, 2774, 2788, 2802, + 2815, 2830, 2844, 2858, 2871, 2886, 2900, 2914, + 2927, 2933, 2939, 2945, 2946, 2947, 2948, 2954, + 2962, 2968, 2976, 2983, 2989, 2997, 3004, 3010, + 3018, 3025, 3031, 3039, 3046, 3053, 3067, 3081, + 3096, 3111, 3126, 3140, 3154, 3169, 3184, 3199, + 3213, 3227, 3242, 3257, 3272, 3286, 3300, 3315, + 3330, 3345, 3359, 3375, 3389, 3405, 3415, 3421, + 3422, 3423, 3424, 3430, 3445, 3453, 3459, 3465, + 3466, 3467, 3468, 3474, 0 }; static const short _indic_syllable_machine_indicies[] = { - 1, 0, 2, 3, 3, 4, 1, 0, - 5, 5, 4, 0, 4, 0, 6, 6, - 7, 1, 0, 8, 8, 7, 0, 7, - 0, 9, 9, 10, 1, 0, 11, 11, - 10, 0, 10, 0, 12, 12, 13, 1, - 0, 14, 14, 13, 0, 13, 0, 15, - 0, 0, 0, 1, 0, 16, 0, 17, - 0, 18, 12, 12, 13, 1, 0, 19, - 0, 20, 0, 21, 9, 9, 10, 1, - 0, 22, 0, 23, 0, 24, 6, 6, - 7, 1, 0, 25, 0, 26, 0, 2, - 3, 3, 4, 1, 0, 0, 0, 0, - 27, 0, 28, 3, 3, 4, 1, 0, - 28, 3, 3, 4, 1, 0, 0, 0, - 0, 29, 0, 30, 3, 3, 4, 1, - 0, 30, 3, 3, 4, 1, 0, 0, - 0, 0, 31, 0, 32, 3, 3, 4, - 1, 0, 32, 3, 3, 4, 1, 0, - 0, 0, 0, 33, 0, 34, 3, 3, - 4, 1, 0, 34, 3, 3, 4, 1, - 0, 0, 0, 0, 35, 0, 37, 36, - 38, 39, 39, 40, 37, 36, 41, 41, - 40, 36, 40, 36, 42, 42, 43, 37, - 36, 44, 44, 43, 36, 43, 36, 45, - 45, 46, 37, 36, 47, 47, 46, 36, - 46, 36, 48, 48, 49, 37, 36, 50, - 50, 49, 36, 49, 36, 51, 36, 36, - 36, 37, 36, 52, 36, 53, 36, 54, - 48, 48, 49, 37, 36, 55, 36, 56, - 36, 57, 45, 45, 46, 37, 36, 58, - 36, 59, 36, 60, 42, 42, 43, 37, - 36, 61, 36, 62, 36, 38, 39, 39, - 40, 37, 36, 36, 36, 36, 63, 36, - 64, 39, 39, 40, 37, 36, 64, 39, - 39, 40, 37, 36, 36, 36, 36, 65, - 36, 66, 39, 39, 40, 37, 36, 66, - 39, 39, 40, 37, 36, 36, 36, 36, - 67, 36, 68, 39, 39, 40, 37, 36, - 68, 39, 39, 40, 37, 36, 36, 36, - 36, 69, 36, 70, 39, 39, 40, 37, - 36, 70, 39, 39, 40, 37, 36, 36, - 36, 36, 71, 36, 73, 72, 74, 75, - 75, 76, 73, 72, 78, 78, 76, 77, - 76, 77, 79, 79, 80, 73, 72, 81, - 81, 80, 72, 80, 72, 82, 82, 83, - 73, 72, 84, 84, 83, 72, 83, 72, - 85, 85, 86, 73, 72, 87, 87, 86, - 72, 86, 72, 88, 72, 72, 72, 73, - 72, 89, 72, 90, 72, 91, 85, 85, - 86, 73, 72, 92, 72, 93, 72, 94, - 82, 82, 83, 73, 72, 95, 72, 96, - 72, 97, 79, 79, 80, 73, 72, 98, - 72, 99, 72, 74, 75, 75, 76, 73, - 72, 72, 72, 72, 100, 72, 101, 75, - 75, 76, 73, 72, 101, 75, 75, 76, - 73, 72, 72, 72, 72, 102, 72, 103, - 75, 75, 76, 73, 72, 103, 75, 75, - 76, 73, 72, 72, 72, 72, 104, 72, - 105, 75, 75, 76, 73, 72, 105, 75, - 75, 76, 73, 72, 72, 72, 72, 106, - 72, 107, 75, 75, 76, 73, 72, 109, - 108, 110, 111, 111, 112, 109, 108, 113, - 113, 112, 108, 112, 108, 114, 114, 115, - 109, 108, 116, 116, 115, 108, 115, 108, - 117, 117, 118, 109, 108, 119, 119, 118, - 108, 118, 108, 120, 120, 121, 109, 108, - 122, 122, 121, 108, 121, 108, 123, 108, - 108, 108, 109, 108, 124, 108, 125, 108, - 126, 120, 120, 121, 109, 108, 127, 108, - 128, 108, 129, 117, 117, 118, 109, 108, - 130, 108, 131, 108, 132, 114, 114, 115, - 109, 108, 133, 108, 134, 108, 110, 111, - 111, 112, 109, 108, 108, 108, 108, 135, - 108, 136, 111, 111, 112, 109, 108, 136, - 111, 111, 112, 109, 108, 108, 108, 108, - 137, 108, 138, 111, 111, 112, 109, 108, - 138, 111, 111, 112, 109, 108, 108, 108, - 108, 139, 108, 140, 111, 111, 112, 109, - 108, 140, 111, 111, 112, 109, 108, 108, - 108, 108, 141, 108, 142, 111, 111, 112, - 109, 108, 142, 111, 111, 112, 109, 108, - 108, 108, 108, 143, 108, 107, 75, 75, - 76, 73, 72, 72, 72, 72, 144, 72, - 78, 78, 76, 1, 0, 146, 145, 148, - 149, 150, 151, 152, 153, 76, 73, 147, - 154, 155, 155, 144, 147, 156, 157, 158, - 159, 160, 147, 162, 163, 164, 165, 4, - 1, 161, 166, 161, 161, 35, 161, 161, - 161, 167, 161, 168, 163, 169, 169, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 170, 161, 161, 161, 17, 171, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 170, 161, 172, 173, 174, 175, 4, - 1, 161, 166, 161, 161, 33, 161, 161, - 161, 167, 161, 176, 173, 177, 177, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 173, 177, 177, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 178, 161, 161, 161, 17, 179, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 178, 161, 180, 181, 182, 183, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 184, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 181, 185, 185, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 186, 161, 161, 161, 17, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 188, 189, 190, 191, 4, - 1, 161, 166, 161, 161, 29, 161, 161, - 161, 167, 161, 192, 189, 193, 193, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 189, 193, 193, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 194, 161, 161, 161, 17, 195, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 194, 161, 196, 197, 198, 199, 4, - 1, 161, 166, 161, 161, 27, 161, 161, - 161, 167, 161, 200, 197, 201, 201, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 197, 201, 201, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 17, 202, 161, 1, 161, 166, - 161, 203, 203, 161, 1, 161, 166, 161, - 204, 161, 161, 205, 161, 166, 161, 166, - 161, 206, 161, 207, 161, 204, 161, 161, - 161, 161, 166, 161, 17, 161, 203, 203, - 161, 1, 161, 166, 161, 203, 202, 161, - 1, 161, 166, 161, 208, 26, 209, 210, - 7, 1, 161, 166, 161, 26, 209, 210, - 7, 1, 161, 166, 161, 209, 209, 7, - 1, 161, 166, 161, 211, 23, 212, 213, - 10, 1, 161, 166, 161, 23, 212, 213, - 10, 1, 161, 166, 161, 212, 212, 10, - 1, 161, 166, 161, 214, 20, 215, 216, - 13, 1, 161, 166, 161, 20, 215, 216, - 13, 1, 161, 166, 161, 215, 215, 13, - 1, 161, 166, 161, 217, 17, 203, 218, - 161, 1, 161, 166, 161, 17, 203, 218, - 161, 1, 161, 166, 161, 197, 201, 201, - 4, 1, 161, 166, 161, 196, 197, 201, - 201, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 161, 167, 161, 196, 197, 198, - 201, 4, 1, 161, 166, 161, 161, 27, - 161, 161, 161, 167, 161, 194, 161, 219, - 161, 203, 203, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 194, 161, 194, 161, - 161, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 194, 161, 194, - 161, 161, 161, 203, 195, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 194, 161, - 188, 189, 193, 193, 4, 1, 161, 166, - 161, 161, 161, 161, 161, 161, 167, 161, - 188, 189, 190, 193, 4, 1, 161, 166, - 161, 161, 29, 161, 161, 161, 167, 161, - 186, 161, 220, 161, 203, 203, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 186, - 161, 186, 161, 161, 161, 203, 203, 161, - 1, 161, 166, 161, 161, 161, 161, 161, - 186, 161, 186, 161, 161, 161, 203, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 180, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 180, 181, 182, 185, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 178, 161, 221, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 161, 178, 161, 178, 161, 161, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 161, 178, 161, 178, 161, 161, - 161, 203, 179, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 178, 161, 172, 173, - 177, 177, 4, 1, 161, 166, 161, 161, - 161, 161, 161, 161, 167, 161, 172, 173, - 174, 177, 4, 1, 161, 166, 161, 161, - 33, 161, 161, 161, 167, 161, 170, 161, - 222, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 170, 161, 170, - 161, 161, 161, 203, 203, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 170, 161, - 170, 161, 161, 161, 203, 171, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 170, - 161, 162, 163, 169, 169, 4, 1, 161, - 166, 161, 161, 161, 161, 161, 161, 167, - 161, 162, 163, 164, 169, 4, 1, 161, - 166, 161, 161, 35, 161, 161, 161, 167, - 161, 224, 225, 226, 227, 40, 37, 223, - 228, 223, 223, 71, 223, 223, 223, 229, - 223, 230, 225, 231, 227, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 225, 231, 227, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 232, 223, 223, 223, 53, 233, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 232, - 223, 234, 235, 236, 237, 40, 37, 223, - 228, 223, 223, 69, 223, 223, 223, 229, - 223, 238, 235, 239, 239, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 235, 239, 239, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 240, 223, 223, 223, 53, 241, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 240, - 223, 242, 243, 244, 245, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 246, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 243, 247, 247, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 248, 223, 223, 223, 53, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 250, 251, 252, 253, 40, 37, 223, - 228, 223, 223, 65, 223, 223, 223, 229, - 223, 254, 251, 255, 255, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 251, 255, 255, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 256, 223, 223, 223, 53, 257, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 256, - 223, 258, 259, 260, 261, 40, 37, 223, - 228, 223, 223, 63, 223, 223, 223, 229, - 223, 262, 259, 263, 263, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 259, 263, 263, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 53, 264, 223, 37, 223, 228, 223, 265, - 265, 223, 37, 223, 228, 223, 266, 223, - 223, 267, 223, 228, 223, 228, 223, 268, - 223, 269, 223, 266, 223, 223, 223, 223, - 228, 223, 53, 223, 265, 265, 223, 37, - 223, 228, 223, 265, 264, 223, 37, 223, - 228, 223, 270, 62, 271, 272, 43, 37, - 223, 228, 223, 62, 271, 272, 43, 37, - 223, 228, 223, 271, 271, 43, 37, 223, - 228, 223, 273, 59, 274, 275, 46, 37, - 223, 228, 223, 59, 274, 275, 46, 37, - 223, 228, 223, 274, 274, 46, 37, 223, - 228, 223, 276, 56, 277, 278, 49, 37, - 223, 228, 223, 56, 277, 278, 49, 37, - 223, 228, 223, 277, 277, 49, 37, 223, - 228, 223, 279, 53, 265, 280, 223, 37, - 223, 228, 223, 53, 265, 280, 223, 37, - 223, 228, 223, 259, 263, 263, 40, 37, - 223, 228, 223, 258, 259, 263, 263, 40, - 37, 223, 228, 223, 223, 223, 223, 223, - 223, 229, 223, 258, 259, 260, 263, 40, - 37, 223, 228, 223, 223, 63, 223, 223, - 223, 229, 223, 256, 223, 281, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 256, 223, 256, 223, 223, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 256, 223, 256, 223, 223, - 223, 265, 257, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 256, 223, 250, 251, - 255, 255, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 223, 229, 223, 250, 251, - 252, 255, 40, 37, 223, 228, 223, 223, - 65, 223, 223, 223, 229, 223, 248, 223, - 282, 223, 265, 265, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 248, 223, 248, - 223, 223, 223, 265, 265, 223, 37, 223, - 228, 223, 223, 223, 223, 223, 248, 223, - 248, 223, 223, 223, 265, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 242, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 242, 243, 244, 247, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 240, 223, 283, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 223, - 240, 223, 240, 223, 223, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 223, 240, 223, 240, 223, 223, 223, 265, - 241, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 240, 223, 234, 235, 239, 239, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 223, 229, 223, 234, 235, 236, 239, - 40, 37, 223, 228, 223, 223, 69, 223, - 223, 223, 229, 223, 232, 223, 284, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 232, 223, 232, 223, 223, - 223, 265, 265, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 232, 223, 232, 223, - 223, 223, 265, 233, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 232, 223, 70, - 39, 39, 40, 37, 223, 224, 225, 231, - 227, 40, 37, 223, 228, 223, 223, 223, - 223, 223, 223, 229, 223, 286, 151, 287, - 287, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 151, 287, 287, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 288, 285, 285, 285, - 90, 289, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 288, 285, 290, 291, 292, - 293, 76, 73, 285, 154, 285, 285, 106, - 285, 285, 285, 158, 285, 294, 291, 295, - 295, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 291, 295, 295, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 296, 285, 285, 285, - 90, 297, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 296, 285, 298, 299, 300, - 301, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 302, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 299, 303, 303, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 304, 285, 285, 285, - 90, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 306, 307, 308, - 309, 76, 73, 285, 154, 285, 285, 102, - 285, 285, 285, 158, 285, 310, 307, 311, - 311, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 307, 311, 311, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 312, 285, 285, 285, - 90, 313, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 312, 285, 314, 315, 316, - 317, 76, 73, 285, 154, 285, 285, 100, - 285, 285, 285, 158, 285, 318, 315, 319, - 319, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 315, 319, 319, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 90, 320, 285, 73, - 285, 154, 285, 321, 321, 285, 73, 285, - 154, 285, 322, 285, 285, 323, 285, 154, - 285, 154, 285, 324, 285, 325, 285, 322, - 285, 285, 285, 285, 154, 285, 90, 285, - 321, 321, 285, 73, 285, 154, 285, 321, - 320, 285, 73, 285, 154, 285, 326, 99, - 327, 328, 80, 73, 285, 154, 285, 99, - 327, 328, 80, 73, 285, 154, 285, 327, - 327, 80, 73, 285, 154, 285, 329, 96, - 330, 331, 83, 73, 285, 154, 285, 96, - 330, 331, 83, 73, 285, 154, 285, 330, - 330, 83, 73, 285, 154, 285, 332, 93, - 333, 334, 86, 73, 285, 154, 285, 93, - 333, 334, 86, 73, 285, 154, 285, 333, - 333, 86, 73, 285, 154, 285, 335, 90, - 321, 336, 285, 73, 285, 154, 285, 90, - 321, 336, 285, 73, 285, 154, 285, 315, - 319, 319, 76, 73, 285, 154, 285, 314, - 315, 319, 319, 76, 73, 285, 154, 285, - 285, 285, 285, 285, 285, 158, 285, 314, - 315, 316, 319, 76, 73, 285, 154, 285, - 285, 100, 285, 285, 285, 158, 285, 312, - 285, 337, 285, 321, 321, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 312, 285, - 312, 285, 285, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 312, - 285, 312, 285, 285, 285, 321, 313, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 312, 285, 306, 307, 311, 311, 76, 73, - 285, 154, 285, 285, 285, 285, 285, 285, - 158, 285, 306, 307, 308, 311, 76, 73, - 285, 154, 285, 285, 102, 285, 285, 285, - 158, 285, 304, 285, 338, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 304, 285, 304, 285, 285, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 285, 304, 285, 304, 285, 285, 285, - 321, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 298, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 298, 299, 300, - 303, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 296, 285, 339, - 285, 321, 321, 285, 73, 285, 154, 285, - 285, 285, 285, 285, 296, 285, 296, 285, - 285, 285, 321, 321, 285, 73, 285, 154, - 285, 285, 285, 285, 285, 296, 285, 296, - 285, 285, 285, 321, 297, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 296, 285, - 290, 291, 295, 295, 76, 73, 285, 154, - 285, 285, 285, 285, 285, 285, 158, 285, - 290, 291, 292, 295, 76, 73, 285, 154, - 285, 285, 106, 285, 285, 285, 158, 285, - 288, 285, 340, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 288, - 285, 288, 285, 285, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 288, 285, 288, 285, 285, 285, 321, 289, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 288, 285, 107, 75, 75, 76, 73, - 341, 341, 341, 341, 144, 341, 150, 151, - 287, 287, 76, 73, 285, 154, 285, 285, - 285, 285, 285, 285, 158, 285, 107, 75, - 75, 76, 73, 341, 343, 344, 345, 346, - 112, 109, 342, 347, 342, 342, 143, 342, - 342, 342, 348, 342, 349, 344, 346, 346, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 344, 346, 346, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 350, 342, 342, 342, 125, - 351, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 350, 342, 352, 353, 354, 355, - 112, 109, 342, 347, 342, 342, 141, 342, - 342, 342, 348, 342, 356, 353, 357, 357, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 353, 357, 357, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 358, 342, 342, 342, 125, - 359, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 358, 342, 360, 361, 362, 363, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 364, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 361, 365, 365, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 366, 342, 342, 342, 125, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 368, 369, 370, 371, - 112, 109, 342, 347, 342, 342, 137, 342, - 342, 342, 348, 342, 372, 369, 373, 373, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 369, 373, 373, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 374, 342, 342, 342, 125, - 375, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 374, 342, 376, 377, 378, 379, - 112, 109, 342, 347, 342, 342, 135, 342, - 342, 342, 348, 342, 380, 377, 381, 381, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 377, 381, 381, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 125, 382, 342, 109, 342, - 347, 342, 383, 383, 342, 109, 342, 347, - 342, 384, 342, 342, 385, 342, 347, 342, - 347, 342, 386, 342, 387, 342, 384, 342, - 342, 342, 342, 347, 342, 125, 342, 383, - 383, 342, 109, 342, 347, 342, 383, 382, - 342, 109, 342, 347, 342, 388, 134, 389, - 390, 115, 109, 342, 347, 342, 134, 389, - 390, 115, 109, 342, 347, 342, 389, 389, - 115, 109, 342, 347, 342, 391, 131, 392, - 393, 118, 109, 342, 347, 342, 131, 392, - 393, 118, 109, 342, 347, 342, 392, 392, - 118, 109, 342, 347, 342, 394, 128, 395, - 396, 121, 109, 342, 347, 342, 128, 395, - 396, 121, 109, 342, 347, 342, 395, 395, - 121, 109, 342, 347, 342, 397, 125, 383, - 398, 342, 109, 342, 347, 342, 125, 383, - 398, 342, 109, 342, 347, 342, 377, 381, - 381, 112, 109, 342, 347, 342, 376, 377, - 381, 381, 112, 109, 342, 347, 342, 342, - 342, 342, 342, 342, 348, 342, 376, 377, - 378, 381, 112, 109, 342, 347, 342, 342, - 135, 342, 342, 342, 348, 342, 374, 342, - 399, 342, 383, 383, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 374, 342, 374, - 342, 342, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 374, 342, - 374, 342, 342, 342, 383, 375, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 374, - 342, 368, 369, 373, 373, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 342, 348, - 342, 368, 369, 370, 373, 112, 109, 342, - 347, 342, 342, 137, 342, 342, 342, 348, - 342, 366, 342, 400, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 366, 342, 366, 342, 342, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 342, 366, 342, 366, 342, 342, 342, 383, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 360, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 360, 361, 362, 365, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 358, 342, 401, 342, - 383, 383, 342, 109, 342, 347, 342, 342, - 342, 342, 342, 358, 342, 358, 342, 342, - 342, 383, 383, 342, 109, 342, 347, 342, - 342, 342, 342, 342, 358, 342, 358, 342, - 342, 342, 383, 359, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 358, 342, 352, - 353, 357, 357, 112, 109, 342, 347, 342, - 342, 342, 342, 342, 342, 348, 342, 352, - 353, 354, 357, 112, 109, 342, 347, 342, - 342, 141, 342, 342, 342, 348, 342, 350, - 342, 402, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 350, 342, - 350, 342, 342, 342, 383, 383, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 350, - 342, 350, 342, 342, 342, 383, 351, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 350, 342, 343, 344, 346, 346, 112, 109, - 342, 347, 342, 342, 342, 342, 342, 342, - 348, 342, 148, 149, 150, 151, 403, 287, - 76, 73, 285, 154, 155, 155, 144, 285, - 285, 148, 158, 285, 162, 404, 164, 165, - 4, 1, 161, 166, 161, 161, 35, 161, - 161, 161, 167, 161, 170, 149, 150, 151, - 405, 406, 76, 407, 161, 408, 161, 155, - 144, 161, 161, 170, 158, 161, 107, 409, - 409, 76, 407, 161, 166, 161, 161, 144, - 161, 410, 161, 161, 411, 161, 408, 161, - 408, 161, 412, 161, 207, 161, 410, 161, - 161, 161, 161, 408, 161, 170, 161, 222, - 107, 409, 409, 76, 407, 161, 166, 161, - 161, 161, 161, 161, 170, 161, 414, 413, - 415, 415, 413, 146, 413, 416, 413, 415, - 415, 413, 146, 413, 416, 413, 417, 413, - 413, 418, 413, 416, 413, 416, 413, 419, - 413, 420, 413, 417, 413, 413, 413, 413, - 416, 413, 148, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 155, 341, 341, 341, - 341, 148, 341, 0 + 1, 2, 3, 3, 4, 1, 5, 5, + 4, 4, 6, 6, 7, 1, 8, 8, + 7, 7, 9, 9, 10, 1, 11, 11, + 10, 10, 12, 12, 13, 1, 14, 14, + 13, 13, 15, 0, 0, 0, 1, 16, + 17, 18, 12, 12, 13, 1, 19, 20, + 21, 9, 9, 10, 1, 22, 23, 24, + 6, 6, 7, 1, 25, 26, 2, 3, + 3, 4, 1, 0, 0, 0, 0, 27, + 28, 3, 3, 4, 1, 28, 3, 3, + 4, 1, 0, 0, 0, 0, 29, 30, + 3, 3, 4, 1, 30, 3, 3, 4, + 1, 0, 0, 0, 0, 31, 32, 3, + 3, 4, 1, 32, 3, 3, 4, 1, + 0, 0, 0, 0, 33, 34, 3, 3, + 4, 1, 34, 3, 3, 4, 1, 0, + 0, 0, 0, 35, 37, 38, 39, 39, + 40, 37, 41, 41, 40, 40, 42, 42, + 43, 37, 44, 44, 43, 43, 45, 45, + 46, 37, 47, 47, 46, 46, 48, 48, + 49, 37, 50, 50, 49, 49, 51, 36, + 36, 36, 37, 52, 53, 54, 48, 48, + 49, 37, 55, 56, 57, 45, 45, 46, + 37, 58, 59, 60, 42, 42, 43, 37, + 61, 62, 38, 39, 39, 40, 37, 36, + 36, 36, 36, 63, 64, 39, 39, 40, + 37, 64, 39, 39, 40, 37, 36, 36, + 36, 36, 65, 66, 39, 39, 40, 37, + 66, 39, 39, 40, 37, 36, 36, 36, + 36, 67, 68, 39, 39, 40, 37, 68, + 39, 39, 40, 37, 36, 36, 36, 36, + 69, 70, 39, 39, 40, 37, 70, 39, + 39, 40, 37, 36, 36, 36, 36, 71, + 73, 74, 75, 75, 76, 73, 78, 78, + 76, 76, 79, 79, 80, 73, 81, 81, + 80, 80, 82, 82, 83, 73, 84, 84, + 83, 83, 85, 85, 86, 73, 87, 87, + 86, 86, 88, 72, 72, 72, 73, 89, + 90, 91, 85, 85, 86, 73, 92, 93, + 94, 82, 82, 83, 73, 95, 96, 97, + 79, 79, 80, 73, 98, 99, 74, 75, + 75, 76, 73, 72, 72, 72, 72, 100, + 101, 75, 75, 76, 73, 101, 75, 75, + 76, 73, 72, 72, 72, 72, 102, 103, + 75, 75, 76, 73, 103, 75, 75, 76, + 73, 72, 72, 72, 72, 104, 105, 75, + 75, 76, 73, 105, 75, 75, 76, 73, + 72, 72, 72, 72, 106, 107, 75, 75, + 76, 73, 109, 110, 111, 111, 112, 109, + 113, 113, 112, 112, 114, 114, 115, 109, + 116, 116, 115, 115, 117, 117, 118, 109, + 119, 119, 118, 118, 120, 120, 121, 109, + 122, 122, 121, 121, 123, 108, 108, 108, + 109, 124, 125, 126, 120, 120, 121, 109, + 127, 128, 129, 117, 117, 118, 109, 130, + 131, 132, 114, 114, 115, 109, 133, 134, + 110, 111, 111, 112, 109, 108, 108, 108, + 108, 135, 136, 111, 111, 112, 109, 136, + 111, 111, 112, 109, 108, 108, 108, 108, + 137, 138, 111, 111, 112, 109, 138, 111, + 111, 112, 109, 108, 108, 108, 108, 139, + 140, 111, 111, 112, 109, 140, 111, 111, + 112, 109, 108, 108, 108, 108, 141, 142, + 111, 111, 112, 109, 142, 111, 111, 112, + 109, 108, 108, 108, 108, 143, 107, 75, + 75, 76, 73, 72, 72, 72, 72, 144, + 78, 78, 76, 1, 146, 148, 149, 150, + 151, 152, 153, 76, 73, 147, 154, 155, + 155, 144, 156, 157, 158, 159, 160, 162, + 163, 164, 165, 4, 1, 161, 166, 161, + 161, 35, 161, 161, 167, 168, 163, 169, + 169, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 163, 169, 169, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 170, 161, 161, 161, 17, 171, 161, 1, + 161, 166, 161, 161, 161, 161, 170, 172, + 173, 174, 175, 4, 1, 161, 166, 161, + 161, 33, 161, 161, 167, 176, 173, 177, + 177, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 173, 177, 177, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 178, 161, 161, 161, 17, 179, 161, 1, + 161, 166, 161, 161, 161, 161, 178, 180, + 181, 182, 183, 4, 1, 161, 166, 161, + 161, 31, 161, 161, 167, 184, 181, 185, + 185, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 181, 185, 185, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 186, 161, 161, 161, 17, 187, 161, 1, + 161, 166, 161, 161, 161, 161, 186, 188, + 189, 190, 191, 4, 1, 161, 166, 161, + 161, 29, 161, 161, 167, 192, 189, 193, + 193, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 189, 193, 193, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 194, 161, 161, 161, 17, 195, 161, 1, + 161, 166, 161, 161, 161, 161, 194, 196, + 197, 198, 199, 4, 1, 161, 166, 161, + 161, 27, 161, 161, 167, 200, 197, 201, + 201, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 197, 201, 201, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 17, 202, 161, 1, 161, 166, 203, 203, + 161, 1, 161, 166, 204, 161, 161, 205, + 161, 166, 166, 206, 207, 204, 161, 161, + 161, 161, 166, 17, 161, 203, 203, 161, + 1, 161, 166, 203, 202, 161, 1, 161, + 166, 208, 26, 209, 210, 7, 1, 161, + 166, 26, 209, 210, 7, 1, 161, 166, + 209, 209, 7, 1, 161, 166, 211, 23, + 212, 213, 10, 1, 161, 166, 23, 212, + 213, 10, 1, 161, 166, 212, 212, 10, + 1, 161, 166, 214, 20, 215, 216, 13, + 1, 161, 166, 20, 215, 216, 13, 1, + 161, 166, 215, 215, 13, 1, 161, 166, + 217, 17, 203, 218, 161, 1, 161, 166, + 17, 203, 218, 161, 1, 161, 166, 197, + 201, 201, 4, 1, 161, 166, 196, 197, + 201, 201, 4, 1, 161, 166, 161, 161, + 161, 161, 161, 167, 196, 197, 198, 201, + 4, 1, 161, 166, 161, 161, 27, 161, + 161, 167, 194, 161, 219, 161, 203, 203, + 161, 1, 161, 166, 161, 161, 161, 161, + 194, 194, 161, 161, 161, 203, 203, 161, + 1, 161, 166, 161, 161, 161, 161, 194, + 194, 161, 161, 161, 203, 195, 161, 1, + 161, 166, 161, 161, 161, 161, 194, 188, + 189, 193, 193, 4, 1, 161, 166, 161, + 161, 161, 161, 161, 167, 188, 189, 190, + 193, 4, 1, 161, 166, 161, 161, 29, + 161, 161, 167, 186, 161, 220, 161, 203, + 203, 161, 1, 161, 166, 161, 161, 161, + 161, 186, 186, 161, 161, 161, 203, 203, + 161, 1, 161, 166, 161, 161, 161, 161, + 186, 186, 161, 161, 161, 203, 187, 161, + 1, 161, 166, 161, 161, 161, 161, 186, + 180, 181, 185, 185, 4, 1, 161, 166, + 161, 161, 161, 161, 161, 167, 180, 181, + 182, 185, 4, 1, 161, 166, 161, 161, + 31, 161, 161, 167, 178, 161, 221, 161, + 203, 203, 161, 1, 161, 166, 161, 161, + 161, 161, 178, 178, 161, 161, 161, 203, + 203, 161, 1, 161, 166, 161, 161, 161, + 161, 178, 178, 161, 161, 161, 203, 179, + 161, 1, 161, 166, 161, 161, 161, 161, + 178, 172, 173, 177, 177, 4, 1, 161, + 166, 161, 161, 161, 161, 161, 167, 172, + 173, 174, 177, 4, 1, 161, 166, 161, + 161, 33, 161, 161, 167, 170, 161, 222, + 161, 203, 203, 161, 1, 161, 166, 161, + 161, 161, 161, 170, 170, 161, 161, 161, + 203, 203, 161, 1, 161, 166, 161, 161, + 161, 161, 170, 170, 161, 161, 161, 203, + 171, 161, 1, 161, 166, 161, 161, 161, + 161, 170, 162, 163, 169, 169, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 162, 163, 164, 169, 4, 1, 161, 166, + 161, 161, 35, 161, 161, 167, 224, 225, + 226, 227, 40, 37, 223, 228, 223, 223, + 71, 223, 223, 229, 230, 225, 231, 227, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 225, 231, 227, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 232, + 223, 223, 223, 53, 233, 223, 37, 223, + 228, 223, 223, 223, 223, 232, 234, 235, + 236, 237, 40, 37, 223, 228, 223, 223, + 69, 223, 223, 229, 238, 235, 239, 239, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 235, 239, 239, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 240, + 223, 223, 223, 53, 241, 223, 37, 223, + 228, 223, 223, 223, 223, 240, 242, 243, + 244, 245, 40, 37, 223, 228, 223, 223, + 67, 223, 223, 229, 246, 243, 247, 247, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 243, 247, 247, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 248, + 223, 223, 223, 53, 249, 223, 37, 223, + 228, 223, 223, 223, 223, 248, 250, 251, + 252, 253, 40, 37, 223, 228, 223, 223, + 65, 223, 223, 229, 254, 251, 255, 255, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 251, 255, 255, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 256, + 223, 223, 223, 53, 257, 223, 37, 223, + 228, 223, 223, 223, 223, 256, 258, 259, + 260, 261, 40, 37, 223, 228, 223, 223, + 63, 223, 223, 229, 262, 259, 263, 263, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 259, 263, 263, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 53, + 264, 223, 37, 223, 228, 265, 265, 223, + 37, 223, 228, 266, 223, 223, 267, 223, + 228, 228, 268, 269, 266, 223, 223, 223, + 223, 228, 53, 223, 265, 265, 223, 37, + 223, 228, 265, 264, 223, 37, 223, 228, + 270, 62, 271, 272, 43, 37, 223, 228, + 62, 271, 272, 43, 37, 223, 228, 271, + 271, 43, 37, 223, 228, 273, 59, 274, + 275, 46, 37, 223, 228, 59, 274, 275, + 46, 37, 223, 228, 274, 274, 46, 37, + 223, 228, 276, 56, 277, 278, 49, 37, + 223, 228, 56, 277, 278, 49, 37, 223, + 228, 277, 277, 49, 37, 223, 228, 279, + 53, 265, 280, 223, 37, 223, 228, 53, + 265, 280, 223, 37, 223, 228, 259, 263, + 263, 40, 37, 223, 228, 258, 259, 263, + 263, 40, 37, 223, 228, 223, 223, 223, + 223, 223, 229, 258, 259, 260, 263, 40, + 37, 223, 228, 223, 223, 63, 223, 223, + 229, 256, 223, 281, 223, 265, 265, 223, + 37, 223, 228, 223, 223, 223, 223, 256, + 256, 223, 223, 223, 265, 265, 223, 37, + 223, 228, 223, 223, 223, 223, 256, 256, + 223, 223, 223, 265, 257, 223, 37, 223, + 228, 223, 223, 223, 223, 256, 250, 251, + 255, 255, 40, 37, 223, 228, 223, 223, + 223, 223, 223, 229, 250, 251, 252, 255, + 40, 37, 223, 228, 223, 223, 65, 223, + 223, 229, 248, 223, 282, 223, 265, 265, + 223, 37, 223, 228, 223, 223, 223, 223, + 248, 248, 223, 223, 223, 265, 265, 223, + 37, 223, 228, 223, 223, 223, 223, 248, + 248, 223, 223, 223, 265, 249, 223, 37, + 223, 228, 223, 223, 223, 223, 248, 242, + 243, 247, 247, 40, 37, 223, 228, 223, + 223, 223, 223, 223, 229, 242, 243, 244, + 247, 40, 37, 223, 228, 223, 223, 67, + 223, 223, 229, 240, 223, 283, 223, 265, + 265, 223, 37, 223, 228, 223, 223, 223, + 223, 240, 240, 223, 223, 223, 265, 265, + 223, 37, 223, 228, 223, 223, 223, 223, + 240, 240, 223, 223, 223, 265, 241, 223, + 37, 223, 228, 223, 223, 223, 223, 240, + 234, 235, 239, 239, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 229, 234, 235, + 236, 239, 40, 37, 223, 228, 223, 223, + 69, 223, 223, 229, 232, 223, 284, 223, + 265, 265, 223, 37, 223, 228, 223, 223, + 223, 223, 232, 232, 223, 223, 223, 265, + 265, 223, 37, 223, 228, 223, 223, 223, + 223, 232, 232, 223, 223, 223, 265, 233, + 223, 37, 223, 228, 223, 223, 223, 223, + 232, 70, 39, 39, 40, 37, 224, 225, + 231, 227, 40, 37, 223, 228, 223, 223, + 223, 223, 223, 229, 286, 151, 287, 287, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 151, 287, 287, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 288, + 285, 285, 285, 90, 289, 285, 73, 285, + 154, 285, 285, 285, 285, 288, 290, 291, + 292, 293, 76, 73, 285, 154, 285, 285, + 106, 285, 285, 158, 294, 291, 295, 295, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 291, 295, 295, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 296, + 285, 285, 285, 90, 297, 285, 73, 285, + 154, 285, 285, 285, 285, 296, 298, 299, + 300, 301, 76, 73, 285, 154, 285, 285, + 104, 285, 285, 158, 302, 299, 303, 303, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 299, 303, 303, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 304, + 285, 285, 285, 90, 305, 285, 73, 285, + 154, 285, 285, 285, 285, 304, 306, 307, + 308, 309, 76, 73, 285, 154, 285, 285, + 102, 285, 285, 158, 310, 307, 311, 311, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 307, 311, 311, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 312, + 285, 285, 285, 90, 313, 285, 73, 285, + 154, 285, 285, 285, 285, 312, 314, 315, + 316, 317, 76, 73, 285, 154, 285, 285, + 100, 285, 285, 158, 318, 315, 319, 319, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 315, 319, 319, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 90, + 320, 285, 73, 285, 154, 321, 321, 285, + 73, 285, 154, 322, 285, 285, 323, 285, + 154, 154, 324, 325, 322, 285, 285, 285, + 285, 154, 90, 285, 321, 321, 285, 73, + 285, 154, 321, 320, 285, 73, 285, 154, + 326, 99, 327, 328, 80, 73, 285, 154, + 99, 327, 328, 80, 73, 285, 154, 327, + 327, 80, 73, 285, 154, 329, 96, 330, + 331, 83, 73, 285, 154, 96, 330, 331, + 83, 73, 285, 154, 330, 330, 83, 73, + 285, 154, 332, 93, 333, 334, 86, 73, + 285, 154, 93, 333, 334, 86, 73, 285, + 154, 333, 333, 86, 73, 285, 154, 335, + 90, 321, 336, 285, 73, 285, 154, 90, + 321, 336, 285, 73, 285, 154, 315, 319, + 319, 76, 73, 285, 154, 314, 315, 319, + 319, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 158, 314, 315, 316, 319, 76, + 73, 285, 154, 285, 285, 100, 285, 285, + 158, 312, 285, 337, 285, 321, 321, 285, + 73, 285, 154, 285, 285, 285, 285, 312, + 312, 285, 285, 285, 321, 321, 285, 73, + 285, 154, 285, 285, 285, 285, 312, 312, + 285, 285, 285, 321, 313, 285, 73, 285, + 154, 285, 285, 285, 285, 312, 306, 307, + 311, 311, 76, 73, 285, 154, 285, 285, + 285, 285, 285, 158, 306, 307, 308, 311, + 76, 73, 285, 154, 285, 285, 102, 285, + 285, 158, 304, 285, 338, 285, 321, 321, + 285, 73, 285, 154, 285, 285, 285, 285, + 304, 304, 285, 285, 285, 321, 321, 285, + 73, 285, 154, 285, 285, 285, 285, 304, + 304, 285, 285, 285, 321, 305, 285, 73, + 285, 154, 285, 285, 285, 285, 304, 298, + 299, 303, 303, 76, 73, 285, 154, 285, + 285, 285, 285, 285, 158, 298, 299, 300, + 303, 76, 73, 285, 154, 285, 285, 104, + 285, 285, 158, 296, 285, 339, 285, 321, + 321, 285, 73, 285, 154, 285, 285, 285, + 285, 296, 296, 285, 285, 285, 321, 321, + 285, 73, 285, 154, 285, 285, 285, 285, + 296, 296, 285, 285, 285, 321, 297, 285, + 73, 285, 154, 285, 285, 285, 285, 296, + 290, 291, 295, 295, 76, 73, 285, 154, + 285, 285, 285, 285, 285, 158, 290, 291, + 292, 295, 76, 73, 285, 154, 285, 285, + 106, 285, 285, 158, 288, 285, 340, 285, + 321, 321, 285, 73, 285, 154, 285, 285, + 285, 285, 288, 288, 285, 285, 285, 321, + 321, 285, 73, 285, 154, 285, 285, 285, + 285, 288, 288, 285, 285, 285, 321, 289, + 285, 73, 285, 154, 285, 285, 285, 285, + 288, 107, 75, 75, 76, 73, 341, 341, + 341, 341, 144, 150, 151, 287, 287, 76, + 73, 285, 154, 285, 285, 285, 285, 285, + 158, 107, 75, 75, 76, 73, 343, 344, + 345, 346, 112, 109, 342, 347, 342, 342, + 143, 342, 342, 348, 349, 344, 346, 346, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 344, 346, 346, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 350, + 342, 342, 342, 125, 351, 342, 109, 342, + 347, 342, 342, 342, 342, 350, 352, 353, + 354, 355, 112, 109, 342, 347, 342, 342, + 141, 342, 342, 348, 356, 353, 357, 357, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 353, 357, 357, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 358, + 342, 342, 342, 125, 359, 342, 109, 342, + 347, 342, 342, 342, 342, 358, 360, 361, + 362, 363, 112, 109, 342, 347, 342, 342, + 139, 342, 342, 348, 364, 361, 365, 365, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 361, 365, 365, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 366, + 342, 342, 342, 125, 367, 342, 109, 342, + 347, 342, 342, 342, 342, 366, 368, 369, + 370, 371, 112, 109, 342, 347, 342, 342, + 137, 342, 342, 348, 372, 369, 373, 373, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 369, 373, 373, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 374, + 342, 342, 342, 125, 375, 342, 109, 342, + 347, 342, 342, 342, 342, 374, 376, 377, + 378, 379, 112, 109, 342, 347, 342, 342, + 135, 342, 342, 348, 380, 377, 381, 381, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 377, 381, 381, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 125, + 382, 342, 109, 342, 347, 383, 383, 342, + 109, 342, 347, 384, 342, 342, 385, 342, + 347, 347, 386, 387, 384, 342, 342, 342, + 342, 347, 125, 342, 383, 383, 342, 109, + 342, 347, 383, 382, 342, 109, 342, 347, + 388, 134, 389, 390, 115, 109, 342, 347, + 134, 389, 390, 115, 109, 342, 347, 389, + 389, 115, 109, 342, 347, 391, 131, 392, + 393, 118, 109, 342, 347, 131, 392, 393, + 118, 109, 342, 347, 392, 392, 118, 109, + 342, 347, 394, 128, 395, 396, 121, 109, + 342, 347, 128, 395, 396, 121, 109, 342, + 347, 395, 395, 121, 109, 342, 347, 397, + 125, 383, 398, 342, 109, 342, 347, 125, + 383, 398, 342, 109, 342, 347, 377, 381, + 381, 112, 109, 342, 347, 376, 377, 381, + 381, 112, 109, 342, 347, 342, 342, 342, + 342, 342, 348, 376, 377, 378, 381, 112, + 109, 342, 347, 342, 342, 135, 342, 342, + 348, 374, 342, 399, 342, 383, 383, 342, + 109, 342, 347, 342, 342, 342, 342, 374, + 374, 342, 342, 342, 383, 383, 342, 109, + 342, 347, 342, 342, 342, 342, 374, 374, + 342, 342, 342, 383, 375, 342, 109, 342, + 347, 342, 342, 342, 342, 374, 368, 369, + 373, 373, 112, 109, 342, 347, 342, 342, + 342, 342, 342, 348, 368, 369, 370, 373, + 112, 109, 342, 347, 342, 342, 137, 342, + 342, 348, 366, 342, 400, 342, 383, 383, + 342, 109, 342, 347, 342, 342, 342, 342, + 366, 366, 342, 342, 342, 383, 383, 342, + 109, 342, 347, 342, 342, 342, 342, 366, + 366, 342, 342, 342, 383, 367, 342, 109, + 342, 347, 342, 342, 342, 342, 366, 360, + 361, 365, 365, 112, 109, 342, 347, 342, + 342, 342, 342, 342, 348, 360, 361, 362, + 365, 112, 109, 342, 347, 342, 342, 139, + 342, 342, 348, 358, 342, 401, 342, 383, + 383, 342, 109, 342, 347, 342, 342, 342, + 342, 358, 358, 342, 342, 342, 383, 383, + 342, 109, 342, 347, 342, 342, 342, 342, + 358, 358, 342, 342, 342, 383, 359, 342, + 109, 342, 347, 342, 342, 342, 342, 358, + 352, 353, 357, 357, 112, 109, 342, 347, + 342, 342, 342, 342, 342, 348, 352, 353, + 354, 357, 112, 109, 342, 347, 342, 342, + 141, 342, 342, 348, 350, 342, 402, 342, + 383, 383, 342, 109, 342, 347, 342, 342, + 342, 342, 350, 350, 342, 342, 342, 383, + 383, 342, 109, 342, 347, 342, 342, 342, + 342, 350, 350, 342, 342, 342, 383, 351, + 342, 109, 342, 347, 342, 342, 342, 342, + 350, 343, 344, 346, 346, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 148, + 149, 150, 151, 403, 287, 76, 73, 285, + 154, 155, 155, 144, 285, 148, 158, 162, + 404, 164, 165, 4, 1, 161, 166, 161, + 161, 35, 161, 161, 167, 170, 149, 150, + 151, 405, 406, 76, 407, 161, 408, 161, + 155, 144, 161, 170, 158, 107, 409, 409, + 76, 407, 161, 166, 161, 161, 144, 410, + 161, 161, 411, 161, 408, 408, 412, 207, + 410, 161, 161, 161, 161, 408, 170, 161, + 222, 107, 409, 409, 76, 407, 161, 166, + 161, 161, 161, 161, 170, 414, 413, 415, + 415, 413, 146, 413, 416, 415, 415, 413, + 146, 413, 416, 417, 413, 413, 418, 413, + 416, 416, 419, 420, 417, 413, 413, 413, + 413, 416, 148, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 155, 341, 341, 341, + 148, 0 }; -static const short _indic_syllable_machine_trans_targs[] = { - 138, 160, 166, 2, 167, 3, 5, 170, - 6, 8, 173, 9, 11, 176, 12, 14, - 15, 159, 17, 18, 175, 20, 21, 172, - 23, 24, 169, 179, 183, 184, 188, 189, - 193, 194, 198, 199, 138, 222, 228, 36, - 229, 37, 39, 232, 40, 42, 235, 43, - 45, 238, 46, 48, 49, 221, 51, 52, - 237, 54, 55, 234, 57, 58, 231, 241, - 245, 246, 250, 251, 255, 256, 260, 262, - 138, 283, 289, 70, 290, 138, 71, 73, - 293, 74, 76, 296, 77, 79, 299, 80, - 82, 83, 282, 85, 86, 298, 88, 89, - 295, 91, 92, 292, 302, 306, 307, 311, - 312, 316, 317, 321, 138, 346, 352, 103, - 353, 104, 106, 356, 107, 109, 359, 110, - 112, 362, 113, 115, 116, 345, 118, 119, - 361, 121, 122, 358, 124, 125, 355, 365, - 369, 370, 374, 375, 379, 380, 384, 385, - 323, 138, 398, 138, 139, 201, 263, 265, - 322, 324, 285, 325, 386, 387, 301, 396, - 403, 138, 140, 142, 33, 200, 162, 178, - 141, 32, 143, 196, 144, 146, 31, 195, - 145, 30, 147, 191, 148, 150, 29, 190, - 149, 28, 151, 186, 152, 154, 27, 185, - 153, 26, 155, 181, 156, 158, 25, 180, - 157, 1, 165, 0, 161, 164, 163, 138, - 168, 4, 22, 171, 7, 19, 174, 10, - 16, 177, 13, 182, 187, 192, 197, 138, - 202, 204, 67, 261, 224, 240, 203, 66, - 205, 258, 206, 208, 65, 257, 207, 64, - 209, 253, 210, 212, 63, 252, 211, 62, - 213, 248, 214, 216, 61, 247, 215, 60, - 217, 243, 218, 220, 59, 242, 219, 35, - 227, 34, 223, 226, 225, 138, 230, 38, - 56, 233, 41, 53, 236, 44, 50, 239, - 47, 244, 249, 254, 259, 138, 264, 100, - 266, 319, 267, 269, 99, 318, 268, 98, - 270, 314, 271, 273, 97, 313, 272, 96, - 274, 309, 275, 277, 95, 308, 276, 94, - 278, 304, 279, 281, 93, 303, 280, 69, - 288, 68, 284, 287, 286, 138, 291, 72, - 90, 294, 75, 87, 297, 78, 84, 300, - 81, 305, 310, 315, 320, 138, 138, 326, - 328, 134, 133, 348, 364, 327, 329, 382, - 330, 332, 132, 381, 331, 131, 333, 377, - 334, 336, 130, 376, 335, 129, 337, 372, - 338, 340, 128, 371, 339, 127, 341, 367, - 342, 344, 126, 366, 343, 102, 351, 101, - 347, 350, 349, 138, 354, 105, 123, 357, - 108, 120, 360, 111, 117, 363, 114, 368, - 373, 378, 383, 135, 388, 389, 395, 390, - 392, 136, 391, 394, 393, 138, 397, 137, - 400, 399, 402, 401, 138 +static const short _indic_syllable_machine_index_defaults[] = { + 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, 0, 0, 0, + 0, 0, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 72, 72, 77, 77, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 72, + 0, 145, 147, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 341, 285, 341, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 285, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 413, 413, 413, 413, + 413, 413, 413, 341, 0 }; -static const char _indic_syllable_machine_trans_actions[] = { - 1, 0, 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, 3, 0, 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, - 4, 0, 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, 6, 2, 6, 2, - 6, 2, 6, 2, 7, 0, 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, - 6, 8, 0, 11, 2, 2, 6, 0, - 12, 12, 0, 2, 6, 2, 6, 2, - 0, 13, 2, 0, 0, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 14, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 15, - 2, 0, 0, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 16, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 17, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 2, 0, 0, 0, 0, 18, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 19, 20, 2, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 21, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 0, 0, 22, 22, 0, - 0, 0, 0, 0, 0, 23, 2, 0, - 0, 0, 0, 0, 24 +static const char _indic_syllable_machine_trans_cond_spaces[] = { + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -1, 0 +}; + +static const short _indic_syllable_machine_cond_targs[] = { + 138, 160, 166, 2, 167, 3, 5, 170, + 6, 8, 173, 9, 11, 176, 12, 14, + 15, 159, 17, 18, 175, 20, 21, 172, + 23, 24, 169, 179, 183, 184, 188, 189, + 193, 194, 198, 199, 138, 222, 228, 36, + 229, 37, 39, 232, 40, 42, 235, 43, + 45, 238, 46, 48, 49, 221, 51, 52, + 237, 54, 55, 234, 57, 58, 231, 241, + 245, 246, 250, 251, 255, 256, 260, 262, + 138, 283, 289, 70, 290, 138, 71, 73, + 293, 74, 76, 296, 77, 79, 299, 80, + 82, 83, 282, 85, 86, 298, 88, 89, + 295, 91, 92, 292, 302, 306, 307, 311, + 312, 316, 317, 321, 138, 346, 352, 103, + 353, 104, 106, 356, 107, 109, 359, 110, + 112, 362, 113, 115, 116, 345, 118, 119, + 361, 121, 122, 358, 124, 125, 355, 365, + 369, 370, 374, 375, 379, 380, 384, 385, + 323, 138, 398, 138, 139, 201, 263, 265, + 322, 324, 285, 325, 386, 387, 301, 396, + 403, 138, 140, 142, 33, 200, 162, 178, + 141, 32, 143, 196, 144, 146, 31, 195, + 145, 30, 147, 191, 148, 150, 29, 190, + 149, 28, 151, 186, 152, 154, 27, 185, + 153, 26, 155, 181, 156, 158, 25, 180, + 157, 1, 165, 0, 161, 164, 163, 138, + 168, 4, 22, 171, 7, 19, 174, 10, + 16, 177, 13, 182, 187, 192, 197, 138, + 202, 204, 67, 261, 224, 240, 203, 66, + 205, 258, 206, 208, 65, 257, 207, 64, + 209, 253, 210, 212, 63, 252, 211, 62, + 213, 248, 214, 216, 61, 247, 215, 60, + 217, 243, 218, 220, 59, 242, 219, 35, + 227, 34, 223, 226, 225, 138, 230, 38, + 56, 233, 41, 53, 236, 44, 50, 239, + 47, 244, 249, 254, 259, 138, 264, 100, + 266, 319, 267, 269, 99, 318, 268, 98, + 270, 314, 271, 273, 97, 313, 272, 96, + 274, 309, 275, 277, 95, 308, 276, 94, + 278, 304, 279, 281, 93, 303, 280, 69, + 288, 68, 284, 287, 286, 138, 291, 72, + 90, 294, 75, 87, 297, 78, 84, 300, + 81, 305, 310, 315, 320, 138, 138, 326, + 328, 134, 133, 348, 364, 327, 329, 382, + 330, 332, 132, 381, 331, 131, 333, 377, + 334, 336, 130, 376, 335, 129, 337, 372, + 338, 340, 128, 371, 339, 127, 341, 367, + 342, 344, 126, 366, 343, 102, 351, 101, + 347, 350, 349, 138, 354, 105, 123, 357, + 108, 120, 360, 111, 117, 363, 114, 368, + 373, 378, 383, 135, 388, 389, 395, 390, + 392, 136, 391, 394, 393, 138, 397, 137, + 400, 399, 402, 401, 138, 0 +}; + +static const char _indic_syllable_machine_cond_actions[] = { + 1, 0, 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, 3, 0, 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, + 4, 0, 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, 6, 2, 6, 2, + 6, 2, 6, 2, 7, 0, 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, + 6, 8, 0, 11, 2, 2, 6, 0, + 12, 12, 0, 2, 6, 2, 6, 2, + 0, 13, 2, 0, 0, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 0, 0, 0, 0, 14, + 2, 0, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 2, 2, 2, 2, 15, + 2, 0, 0, 2, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 16, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 17, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 2, 0, 0, 0, 0, 18, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 19, 20, 2, + 0, 0, 0, 0, 2, 2, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 0, + 0, 0, 0, 21, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 2, + 2, 2, 2, 0, 0, 22, 22, 0, + 0, 0, 0, 0, 0, 23, 2, 0, + 0, 0, 0, 0, 24, 0 }; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 0, 0, 0, 0, 0 +}; + +static const char _indic_syllable_machine_eof_cond_spaces[] = { + -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 0 +}; + +static const char _indic_syllable_machine_eof_cond_key_offs[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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 +}; + +static const char _indic_syllable_machine_eof_cond_key_lens[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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 +}; + +static const char _indic_syllable_machine_eof_cond_keys[] = { + 0 }; 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, 1, 1, 1, 1, - 1, 1, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 73, 73, 78, 78, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 73, - 1, 146, 0, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 342, 286, 342, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 286, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 414, 414, 414, 414, - 414, 414, 414, 342 + 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, 1, 1, + 1, 1, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 73, 73, 78, 78, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 73, + 1, 146, 0, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 342, 286, 342, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 286, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 414, 414, 414, 414, + 414, 414, 414, 342, 0 +}; + +static const char _indic_syllable_machine_nfa_targs[] = { + 0, 0 +}; + +static const char _indic_syllable_machine_nfa_offsets[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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 +}; + +static const char _indic_syllable_machine_nfa_push_actions[] = { + 0, 0 +}; + +static const char _indic_syllable_machine_nfa_pop_trans[] = { + 0, 0 }; static const int indic_syllable_machine_start = 138; @@ -987,209 +1259,333 @@ static const int indic_syllable_machine_error = -1; static const int indic_syllable_machine_en_main = 138; -#line 36 "hb-ot-shape-complex-indic-machine.rl" -#line 93 "hb-ot-shape-complex-indic-machine.rl" - - #define found_syllable(syllable_type) \ - HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ - } HB_STMT_END +HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial=1; \ +} HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; - int cs; - hb_glyph_info_t *info = buffer->info; - -#line 1014 "hb-ot-shape-complex-indic-machine.hh" + unsigned int p, pe, eof, ts, te, act; + int cs; + hb_glyph_info_t *info = buffer->info; + { - cs = indic_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = (int)indic_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - -#line 113 "hb-ot-shape-complex-indic-machine.rl" - - - p = 0; - pe = eof = buffer->len; - - unsigned int syllable_serial = 1; - -#line 1030 "hb-ot-shape-complex-indic-machine.hh" + + + p=0; + pe = eof = buffer->len; + + unsigned int syllable_serial=1; + { - int _slen; - int _trans; - const unsigned char *_keys; - const short *_inds; - if ( p == pe ) - goto _test_eof; -_resume: - switch ( _indic_syllable_machine_from_state_actions[cs] ) { - case 10: -#line 1 "NONE" - {ts = p;} - break; -#line 1044 "hb-ot-shape-complex-indic-machine.hh" + int _cpc; + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const short * _inds; { + if ( p == pe ) + goto _test_eof; + _resume: { + switch ( _indic_syllable_machine_from_state_actions[cs] ) { + case 10: { + { + #line 1 "NONE" + {ts = p;}} + + break; } + } + + _keys = ( _indic_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _indic_syllable_machine_indicies + (_indic_syllable_machine_index_offsets[cs])); + + if ( (info[p].indic_category()) <= 19 && (info[p].indic_category()) >= 1 ) + { + int _ic = (int)_indic_syllable_machine_char_class[(int)(info[p].indic_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_indic_syllable_machine_cond_targs[_trans]; + + if ( _indic_syllable_machine_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _indic_syllable_machine_cond_actions[_trans] ) { + case 2: { + { + #line 1 "NONE" + {te = p+1;}} + + break; } + case 14: { + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 84 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 16: { + { + #line 85 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 85 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (vowel_syllable); }}} + + break; } + case 21: { + { + #line 86 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 86 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (standalone_cluster); }}} + + break; } + case 24: { + { + #line 87 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 87 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (symbol_cluster); }}} + + break; } + case 18: { + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 88 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 11: { + { + #line 89 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ + #line 89 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (non_indic_cluster); }}} + + break; } + case 13: { + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 84 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 15: { + { + #line 85 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 85 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (vowel_syllable); }}} + + break; } + case 20: { + { + #line 86 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 86 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (standalone_cluster); }}} + + break; } + case 23: { + { + #line 87 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 87 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (symbol_cluster); }}} + + break; } + case 17: { + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 88 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 19: { + { + #line 89 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p = p - 1;{ + #line 89 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (non_indic_cluster); }}} + + break; } + case 1: { + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + {p = ((te))-1; + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 3: { + { + #line 85 "hb-ot-shape-complex-indic-machine.rl" + {p = ((te))-1; + { + #line 85 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (vowel_syllable); }}} + + break; } + case 7: { + { + #line 86 "hb-ot-shape-complex-indic-machine.rl" + {p = ((te))-1; + { + #line 86 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (standalone_cluster); }}} + + break; } + case 8: { + { + #line 87 "hb-ot-shape-complex-indic-machine.rl" + {p = ((te))-1; + { + #line 87 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (symbol_cluster); }}} + + break; } + case 4: { + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + {p = ((te))-1; + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 5: { + { + #line 1 "NONE" + {switch( act ) { + case 1: { + p = ((te))-1; + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (consonant_syllable); } break; } + case 5: { + p = ((te))-1; + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (broken_cluster); } break; } + case 6: { + p = ((te))-1; + { + #line 89 "hb-ot-shape-complex-indic-machine.rl" + found_syllable (non_indic_cluster); } break; } + }} + } + + break; } + case 22: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 84 "hb-ot-shape-complex-indic-machine.rl" + {act = 1;}} + + break; } + case 6: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 88 "hb-ot-shape-complex-indic-machine.rl" + {act = 5;}} + + break; } + case 12: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 89 "hb-ot-shape-complex-indic-machine.rl" + {act = 6;}} + + break; } + } + + + } + _again: { + switch ( _indic_syllable_machine_to_state_actions[cs] ) { + case 9: { + { + #line 1 "NONE" + {ts = 0;}} + + break; } + } + + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + if ( p == eof ) + { + if ( _indic_syllable_machine_eof_cond_spaces[cs] != -1 ) { + _cekeys = ( _indic_syllable_machine_eof_cond_keys + (_indic_syllable_machine_eof_cond_key_offs[cs])); + _klen = (int)_indic_syllable_machine_eof_cond_key_lens[cs]; + _cpc = 0; + { + const char *_lower = _cekeys; + const char *_upper = _cekeys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + goto _ok; + } + } + cs = -1; + goto _out; + } + _ok: {} + } + if ( _indic_syllable_machine_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_indic_syllable_machine_eof_trans[cs] - 1; + goto _match_cond; + } + } + + } + _out: { {} + } + } } - - _keys = _indic_syllable_machine_trans_keys + (cs<<1); - _inds = _indic_syllable_machine_indicies + _indic_syllable_machine_index_offsets[cs]; - - _slen = _indic_syllable_machine_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].indic_category()) && - ( info[p].indic_category()) <= _keys[1] ? - ( info[p].indic_category()) - _keys[0] : _slen ]; - -_eof_trans: - cs = _indic_syllable_machine_trans_targs[_trans]; - - if ( _indic_syllable_machine_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _indic_syllable_machine_trans_actions[_trans] ) { - case 2: -#line 1 "NONE" - {te = p+1;} - break; - case 14: -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (consonant_syllable); }} - break; - case 16: -#line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (vowel_syllable); }} - break; - case 21: -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (standalone_cluster); }} - break; - case 24: -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (symbol_cluster); }} - break; - case 18: -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; - case 11: -#line 89 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (non_indic_cluster); }} - break; - case 13: -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (consonant_syllable); }} - break; - case 15: -#line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (vowel_syllable); }} - break; - case 20: -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (standalone_cluster); }} - break; - case 23: -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (symbol_cluster); }} - break; - case 17: -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (broken_cluster); }} - break; - case 19: -#line 89 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p--;{ found_syllable (non_indic_cluster); }} - break; - case 1: -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} - break; - case 3: -#line 85 "hb-ot-shape-complex-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} - break; - case 7: -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} - break; - case 8: -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} - break; - case 4: -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {{p = ((te))-1;}{ found_syllable (broken_cluster); }} - break; - case 5: -#line 1 "NONE" - { switch( act ) { - case 1: - {{p = ((te))-1;} found_syllable (consonant_syllable); } - break; - case 5: - {{p = ((te))-1;} found_syllable (broken_cluster); } - break; - case 6: - {{p = ((te))-1;} found_syllable (non_indic_cluster); } - break; - } - } - break; - case 22: -#line 1 "NONE" - {te = p+1;} -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {act = 1;} - break; - case 6: -#line 1 "NONE" - {te = p+1;} -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {act = 5;} - break; - case 12: -#line 1 "NONE" - {te = p+1;} -#line 89 "hb-ot-shape-complex-indic-machine.rl" - {act = 6;} - break; -#line 1167 "hb-ot-shape-complex-indic-machine.hh" - } - -_again: - switch ( _indic_syllable_machine_to_state_actions[cs] ) { - case 9: -#line 1 "NONE" - {ts = 0;} - break; -#line 1176 "hb-ot-shape-complex-indic-machine.hh" - } - - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _indic_syllable_machine_eof_trans[cs] > 0 ) { - _trans = _indic_syllable_machine_eof_trans[cs] - 1; - goto _eof_trans; - } - } - - } - -#line 121 "hb-ot-shape-complex-indic-machine.rl" - + } #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 65e0ffc85..034b65750 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -1,30 +1,28 @@ - -#line 1 "hb-ot-shape-complex-khmer-machine.rl" /* - * Copyright © 2011,2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2011,2012 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH @@ -32,180 +30,185 @@ #include "hb.hh" -#line 36 "hb-ot-shape-complex-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { - 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, - 5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, - 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u, - 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u, - 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u, - 0 + 2u, 8u, 2u, 6u, 2u, 8u, 2u, 6u, + 0u, 0u, 2u, 6u, 2u, 8u, 2u, 6u, + 2u, 8u, 2u, 6u, 2u, 6u, 2u, 8u, + 2u, 6u, 0u, 0u, 2u, 6u, 2u, 8u, + 2u, 6u, 2u, 8u, 2u, 6u, 2u, 8u, + 0u, 11u, 2u, 11u, 2u, 11u, 2u, 11u, + 7u, 7u, 2u, 7u, 2u, 11u, 2u, 11u, + 2u, 11u, 0u, 0u, 2u, 8u, 2u, 11u, + 2u, 11u, 7u, 7u, 2u, 7u, 2u, 11u, + 2u, 11u, 0u, 0u, 2u, 11u, 2u, 11u, + 0u }; -static const char _khmer_syllable_machine_key_spans[] = { - 22, 17, 22, 17, 16, 17, 22, 17, - 22, 17, 17, 22, 17, 16, 17, 22, - 17, 22, 17, 22, 29, 25, 25, 25, - 1, 18, 25, 25, 25, 16, 22, 25, - 25, 1, 18, 25, 25, 16, 25, 25 +static const char _khmer_syllable_machine_char_class[] = { + 0, 0, 1, 1, 2, 2, 1, 1, + 1, 1, 3, 3, 1, 4, 1, 0, + 1, 1, 1, 5, 6, 7, 1, 1, + 1, 8, 9, 10, 11, 0 }; static const short _khmer_syllable_machine_index_offsets[] = { - 0, 23, 41, 64, 82, 99, 117, 140, - 158, 181, 199, 217, 240, 258, 275, 293, - 316, 334, 357, 375, 398, 428, 454, 480, - 506, 508, 527, 553, 579, 605, 622, 645, - 671, 697, 699, 718, 744, 770, 787, 813 + 0, 7, 12, 19, 24, 25, 30, 37, + 42, 49, 54, 59, 66, 71, 72, 77, + 84, 89, 96, 101, 108, 120, 130, 140, + 150, 151, 157, 167, 177, 187, 188, 195, + 205, 215, 216, 222, 232, 242, 243, 253, + 0 }; static const char _khmer_syllable_machine_indicies[] = { - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 3, 0, 0, 0, 0, 4, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 0, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 4, 0, - 5, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 6, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 7, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 4, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 11, 11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 4, 0, 11, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 14, - 14, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 15, - 13, 14, 14, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 15, 16, 16, 16, 16, 17, 16, - 18, 18, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 17, 16, 19, 19, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 19, 16, 20, 20, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 21, 16, 22, 22, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 23, 16, 16, - 16, 16, 17, 16, 22, 22, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 23, 16, 24, 24, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 25, 16, - 16, 16, 16, 17, 16, 24, 24, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 25, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 26, 15, - 16, 16, 16, 16, 17, 16, 28, 28, - 27, 27, 29, 29, 27, 27, 27, 27, - 2, 2, 27, 30, 27, 28, 27, 27, - 27, 27, 15, 19, 27, 27, 27, 17, - 23, 25, 21, 27, 32, 32, 31, 31, - 31, 31, 31, 31, 31, 33, 31, 31, - 31, 31, 31, 2, 3, 6, 31, 31, - 31, 4, 10, 12, 8, 31, 34, 34, - 31, 31, 31, 31, 31, 31, 31, 35, - 31, 31, 31, 31, 31, 31, 3, 6, - 31, 31, 31, 4, 10, 12, 8, 31, - 5, 5, 31, 31, 31, 31, 31, 31, - 31, 35, 31, 31, 31, 31, 31, 31, - 4, 6, 31, 31, 31, 31, 31, 31, - 8, 31, 6, 31, 7, 7, 31, 31, - 31, 31, 31, 31, 31, 35, 31, 31, - 31, 31, 31, 31, 8, 6, 31, 36, - 36, 31, 31, 31, 31, 31, 31, 31, - 35, 31, 31, 31, 31, 31, 31, 10, - 6, 31, 31, 31, 4, 31, 31, 8, - 31, 37, 37, 31, 31, 31, 31, 31, - 31, 31, 35, 31, 31, 31, 31, 31, - 31, 12, 6, 31, 31, 31, 4, 10, - 31, 8, 31, 34, 34, 31, 31, 31, - 31, 31, 31, 31, 33, 31, 31, 31, - 31, 31, 31, 3, 6, 31, 31, 31, - 4, 10, 12, 8, 31, 28, 28, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 28, 31, 14, 14, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 15, 38, - 38, 38, 38, 17, 38, 40, 40, 39, - 39, 39, 39, 39, 39, 39, 41, 39, - 39, 39, 39, 39, 39, 15, 19, 39, - 39, 39, 17, 23, 25, 21, 39, 18, - 18, 39, 39, 39, 39, 39, 39, 39, - 41, 39, 39, 39, 39, 39, 39, 17, - 19, 39, 39, 39, 39, 39, 39, 21, - 39, 19, 39, 20, 20, 39, 39, 39, - 39, 39, 39, 39, 41, 39, 39, 39, - 39, 39, 39, 21, 19, 39, 42, 42, - 39, 39, 39, 39, 39, 39, 39, 41, - 39, 39, 39, 39, 39, 39, 23, 19, - 39, 39, 39, 17, 39, 39, 21, 39, - 43, 43, 39, 39, 39, 39, 39, 39, - 39, 41, 39, 39, 39, 39, 39, 39, - 25, 19, 39, 39, 39, 17, 23, 39, - 21, 39, 44, 44, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 39, 44, 39, 45, 45, 39, 39, 39, - 39, 39, 39, 39, 30, 39, 39, 39, - 39, 39, 26, 15, 19, 39, 39, 39, - 17, 23, 25, 21, 39, 40, 40, 39, - 39, 39, 39, 39, 39, 39, 30, 39, - 39, 39, 39, 39, 39, 15, 19, 39, - 39, 39, 17, 23, 25, 21, 39, 0 + 1, 0, 0, 2, 3, 0, 4, 1, + 0, 0, 0, 3, 1, 0, 0, 0, + 3, 0, 4, 5, 0, 0, 0, 4, + 6, 7, 0, 0, 0, 8, 9, 0, + 0, 0, 10, 0, 4, 9, 0, 0, + 0, 10, 11, 0, 0, 0, 12, 0, + 4, 11, 0, 0, 0, 12, 14, 13, + 13, 13, 15, 14, 16, 16, 16, 15, + 16, 17, 18, 16, 16, 16, 17, 19, + 20, 16, 16, 16, 21, 22, 16, 16, + 16, 23, 16, 17, 22, 16, 16, 16, + 23, 24, 16, 16, 16, 25, 16, 17, + 24, 16, 16, 16, 25, 14, 16, 16, + 26, 15, 16, 17, 28, 27, 29, 2, + 30, 27, 15, 19, 17, 23, 25, 21, + 32, 31, 33, 2, 3, 6, 4, 10, + 12, 8, 34, 31, 35, 31, 3, 6, + 4, 10, 12, 8, 5, 31, 35, 31, + 4, 6, 31, 31, 31, 8, 6, 7, + 31, 35, 31, 8, 6, 36, 31, 35, + 31, 10, 6, 4, 31, 31, 8, 37, + 31, 35, 31, 12, 6, 4, 10, 31, + 8, 34, 31, 33, 31, 3, 6, 4, + 10, 12, 8, 28, 14, 38, 38, 38, + 15, 38, 17, 40, 39, 41, 39, 15, + 19, 17, 23, 25, 21, 18, 39, 41, + 39, 17, 19, 39, 39, 39, 21, 19, + 20, 39, 41, 39, 21, 19, 42, 39, + 41, 39, 23, 19, 17, 39, 39, 21, + 43, 39, 41, 39, 25, 19, 17, 23, + 39, 21, 44, 45, 39, 30, 26, 15, + 19, 17, 23, 25, 21, 40, 39, 30, + 39, 15, 19, 17, 23, 25, 21, 0 }; -static const char _khmer_syllable_machine_trans_targs[] = { - 20, 1, 28, 22, 23, 3, 24, 5, - 25, 7, 26, 9, 27, 20, 10, 31, - 20, 32, 12, 33, 14, 34, 16, 35, - 18, 36, 39, 20, 21, 30, 37, 20, - 0, 29, 2, 4, 6, 8, 20, 20, - 11, 13, 15, 17, 38, 19 +static const char _khmer_syllable_machine_index_defaults[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 27, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 38, 39, + 39, 39, 39, 39, 39, 39, 39, 39, + 0 }; -static const char _khmer_syllable_machine_trans_actions[] = { - 1, 0, 2, 2, 2, 0, 0, 0, - 2, 0, 2, 0, 2, 3, 0, 4, - 5, 2, 0, 0, 0, 2, 0, 2, - 0, 2, 4, 8, 2, 9, 0, 10, - 0, 0, 0, 0, 0, 0, 11, 12, - 0, 0, 0, 0, 4, 0 +static const char _khmer_syllable_machine_trans_cond_spaces[] = { + -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, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0 +}; + +static const char _khmer_syllable_machine_cond_targs[] = { + 20, 1, 28, 22, 23, 3, 24, 5, + 25, 7, 26, 9, 27, 20, 10, 31, + 20, 32, 12, 33, 14, 34, 16, 35, + 18, 36, 39, 20, 21, 30, 37, 20, + 0, 29, 2, 4, 6, 8, 20, 20, + 11, 13, 15, 17, 38, 19, 0 +}; + +static const char _khmer_syllable_machine_cond_actions[] = { + 1, 0, 2, 2, 2, 0, 0, 0, + 2, 0, 2, 0, 2, 3, 0, 4, + 5, 2, 0, 0, 0, 2, 0, 2, + 0, 2, 4, 8, 2, 9, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, + 0, 0, 0, 0, 4, 0, 0 }; static const char _khmer_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, 6, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; static const char _khmer_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, 7, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -static const unsigned char _khmer_syllable_machine_eof_trans[] = { - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 14, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 39, 40, - 40, 40, 40, 40, 40, 40, 40, 40 +static const char _khmer_syllable_machine_eof_cond_spaces[] = { + -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0 +}; + +static const char _khmer_syllable_machine_eof_cond_key_offs[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const char _khmer_syllable_machine_eof_cond_key_lens[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const char _khmer_syllable_machine_eof_cond_keys[] = { + 0 +}; + +static const char _khmer_syllable_machine_eof_trans[] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 14, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 39, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 0 +}; + +static const char _khmer_syllable_machine_nfa_targs[] = { + 0, 0 +}; + +static const char _khmer_syllable_machine_nfa_offsets[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const char _khmer_syllable_machine_nfa_push_actions[] = { + 0, 0 +}; + +static const char _khmer_syllable_machine_nfa_pop_trans[] = { + 0, 0 }; static const int khmer_syllable_machine_start = 20; @@ -215,156 +218,228 @@ static const int khmer_syllable_machine_error = -1; static const int khmer_syllable_machine_en_main = 20; -#line 36 "hb-ot-shape-complex-khmer-machine.rl" -#line 80 "hb-ot-shape-complex-khmer-machine.rl" - - #define found_syllable(syllable_type) \ - HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ - } HB_STMT_END +HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial=1; \ +} HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act HB_UNUSED; - int cs; - hb_glyph_info_t *info = buffer->info; - -#line 242 "hb-ot-shape-complex-khmer-machine.hh" + unsigned int p, pe, eof, ts, te, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + { - cs = khmer_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = (int)khmer_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - -#line 100 "hb-ot-shape-complex-khmer-machine.rl" - - - p = 0; - pe = eof = buffer->len; - - unsigned int syllable_serial = 1; - -#line 258 "hb-ot-shape-complex-khmer-machine.hh" + + + p=0; + pe = eof = buffer->len; + + unsigned int syllable_serial=1; + { - int _slen; - int _trans; - const unsigned char *_keys; - const char *_inds; - if ( p == pe ) - goto _test_eof; -_resume: - switch ( _khmer_syllable_machine_from_state_actions[cs] ) { - case 7: -#line 1 "NONE" - {ts = p;} - break; -#line 272 "hb-ot-shape-complex-khmer-machine.hh" + int _cpc; + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + if ( p == pe ) + goto _test_eof; + _resume: { + switch ( _khmer_syllable_machine_from_state_actions[cs] ) { + case 7: { + { + #line 1 "NONE" + {ts = p;}} + + break; } + } + + _keys = ( _khmer_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _khmer_syllable_machine_indicies + (_khmer_syllable_machine_index_offsets[cs])); + + if ( (info[p].khmer_category()) <= 29 && (info[p].khmer_category()) >= 1 ) + { + int _ic = (int)_khmer_syllable_machine_char_class[(int)(info[p].khmer_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_khmer_syllable_machine_cond_targs[_trans]; + + if ( _khmer_syllable_machine_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _khmer_syllable_machine_cond_actions[_trans] ) { + case 2: { + { + #line 1 "NONE" + {te = p+1;}} + + break; } + case 8: { + { + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + {te = p+1;{ + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (non_khmer_cluster); }}} + + break; } + case 10: { + { + #line 74 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p = p - 1;{ + #line 74 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 12: { + { + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p = p - 1;{ + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 11: { + { + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p = p - 1;{ + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (non_khmer_cluster); }}} + + break; } + case 1: { + { + #line 74 "hb-ot-shape-complex-khmer-machine.rl" + {p = ((te))-1; + { + #line 74 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 5: { + { + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + {p = ((te))-1; + { + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 3: { + { + #line 1 "NONE" + {switch( act ) { + case 2: { + p = ((te))-1; + { + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (broken_cluster); } break; } + case 3: { + p = ((te))-1; + { + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + found_syllable (non_khmer_cluster); } break; } + }} + } + + break; } + case 4: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 75 "hb-ot-shape-complex-khmer-machine.rl" + {act = 2;}} + + break; } + case 9: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 76 "hb-ot-shape-complex-khmer-machine.rl" + {act = 3;}} + + break; } + } + + + } + _again: { + switch ( _khmer_syllable_machine_to_state_actions[cs] ) { + case 6: { + { + #line 1 "NONE" + {ts = 0;}} + + break; } + } + + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + if ( p == eof ) + { + if ( _khmer_syllable_machine_eof_cond_spaces[cs] != -1 ) { + _cekeys = ( _khmer_syllable_machine_eof_cond_keys + (_khmer_syllable_machine_eof_cond_key_offs[cs])); + _klen = (int)_khmer_syllable_machine_eof_cond_key_lens[cs]; + _cpc = 0; + { + const char *_lower = _cekeys; + const char *_upper = _cekeys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + goto _ok; + } + } + cs = -1; + goto _out; + } + _ok: {} + } + if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_khmer_syllable_machine_eof_trans[cs] - 1; + goto _match_cond; + } + } + + } + _out: { {} + } + } } - - _keys = _khmer_syllable_machine_trans_keys + (cs<<1); - _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs]; - - _slen = _khmer_syllable_machine_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) && - ( info[p].khmer_category()) <= _keys[1] ? - ( info[p].khmer_category()) - _keys[0] : _slen ]; - -_eof_trans: - cs = _khmer_syllable_machine_trans_targs[_trans]; - - if ( _khmer_syllable_machine_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _khmer_syllable_machine_trans_actions[_trans] ) { - case 2: -#line 1 "NONE" - {te = p+1;} - break; - case 8: -#line 76 "hb-ot-shape-complex-khmer-machine.rl" - {te = p+1;{ found_syllable (non_khmer_cluster); }} - break; - case 10: -#line 74 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p--;{ found_syllable (consonant_syllable); }} - break; - case 12: -#line 75 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p--;{ found_syllable (broken_cluster); }} - break; - case 11: -#line 76 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p--;{ found_syllable (non_khmer_cluster); }} - break; - case 1: -#line 74 "hb-ot-shape-complex-khmer-machine.rl" - {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} - break; - case 5: -#line 75 "hb-ot-shape-complex-khmer-machine.rl" - {{p = ((te))-1;}{ found_syllable (broken_cluster); }} - break; - case 3: -#line 1 "NONE" - { switch( act ) { - case 2: - {{p = ((te))-1;} found_syllable (broken_cluster); } - break; - case 3: - {{p = ((te))-1;} found_syllable (non_khmer_cluster); } - break; - } - } - break; - case 4: -#line 1 "NONE" - {te = p+1;} -#line 75 "hb-ot-shape-complex-khmer-machine.rl" - {act = 2;} - break; - case 9: -#line 1 "NONE" - {te = p+1;} -#line 76 "hb-ot-shape-complex-khmer-machine.rl" - {act = 3;} - break; -#line 342 "hb-ot-shape-complex-khmer-machine.hh" - } - -_again: - switch ( _khmer_syllable_machine_to_state_actions[cs] ) { - case 6: -#line 1 "NONE" - {ts = 0;} - break; -#line 351 "hb-ot-shape-complex-khmer-machine.hh" - } - - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) { - _trans = _khmer_syllable_machine_eof_trans[cs] - 1; - goto _eof_trans; - } - } - - } - -#line 108 "hb-ot-shape-complex-khmer-machine.rl" - + } #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index d03832fa7..f40a47999 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -1,30 +1,28 @@ - -#line 1 "hb-ot-shape-complex-myanmar-machine.rl" /* - * Copyright © 2011,2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2011,2012 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH @@ -32,251 +30,276 @@ #include "hb.hh" -#line 36 "hb-ot-shape-complex-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, - 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, - 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, - 1u, 32u, 8u, 8u, 0 + 0u, 21u, 1u, 20u, 3u, 19u, 3u, 5u, + 3u, 19u, 1u, 15u, 3u, 15u, 3u, 15u, + 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, + 0u, 8u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 20u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 19u, 3u, 19u, + 3u, 5u, 3u, 19u, 1u, 15u, 3u, 15u, + 3u, 15u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 0u, 8u, 1u, 20u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 20u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 1u, 20u, 1u, 19u, 0u, 20u, + 0u, 8u, 5u, 5u, 0u }; -static const char _myanmar_syllable_machine_key_spans[] = { - 32, 28, 25, 4, 25, 23, 21, 21, - 27, 27, 27, 27, 16, 27, 27, 27, - 27, 27, 28, 27, 27, 27, 27, 25, - 4, 25, 23, 21, 21, 27, 27, 27, - 27, 16, 28, 27, 27, 27, 27, 27, - 28, 27, 27, 27, 27, 28, 27, 32, - 32, 1 -}; - -static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 33, 62, 88, 93, 119, 143, 165, - 187, 215, 243, 271, 299, 316, 344, 372, - 400, 428, 456, 485, 513, 541, 569, 597, - 623, 628, 654, 678, 700, 722, 750, 778, - 806, 834, 851, 880, 908, 936, 964, 992, - 1020, 1049, 1077, 1105, 1133, 1161, 1190, 1218, - 1251, 1284 -}; - -static const char _myanmar_syllable_machine_indicies[] = { - 1, 1, 2, 3, 4, 4, 0, 5, - 0, 6, 1, 0, 0, 0, 0, 7, - 0, 8, 9, 0, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 1, - 0, 22, 23, 24, 24, 21, 25, 21, - 26, 21, 21, 21, 21, 21, 21, 21, - 27, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 21, 24, 24, - 21, 25, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 38, 21, 21, 21, 21, - 21, 21, 32, 21, 21, 21, 36, 21, - 24, 24, 21, 25, 21, 24, 24, 21, - 25, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 21, 21, 21, 36, 21, 39, - 21, 24, 24, 21, 25, 21, 32, 21, - 21, 21, 21, 21, 21, 21, 40, 21, - 21, 21, 21, 21, 21, 32, 21, 24, - 24, 21, 25, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 40, 21, 21, 21, - 21, 21, 21, 32, 21, 24, 24, 21, - 25, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 21, 22, 21, 24, 24, 21, - 25, 21, 26, 21, 21, 21, 21, 21, - 21, 21, 41, 21, 21, 41, 21, 21, - 21, 32, 42, 21, 21, 36, 21, 22, - 21, 24, 24, 21, 25, 21, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 32, 21, 21, - 21, 36, 21, 22, 21, 24, 24, 21, - 25, 21, 26, 21, 21, 21, 21, 21, - 21, 21, 41, 21, 21, 21, 21, 21, - 21, 32, 42, 21, 21, 36, 21, 22, - 21, 24, 24, 21, 25, 21, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 32, 42, 21, - 21, 36, 21, 1, 1, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 1, 21, 22, 21, 24, 24, - 21, 25, 21, 26, 21, 21, 21, 21, - 21, 21, 21, 27, 21, 21, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 21, - 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 43, - 21, 21, 21, 21, 21, 21, 32, 33, - 34, 35, 36, 21, 22, 21, 24, 24, - 21, 25, 21, 26, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 33, 34, 35, 36, 21, - 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 32, 33, - 34, 21, 36, 21, 22, 21, 24, 24, - 21, 25, 21, 26, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 21, 34, 21, 36, 21, - 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 32, 33, - 34, 35, 36, 43, 21, 22, 21, 24, - 24, 21, 25, 21, 26, 21, 21, 21, - 21, 21, 21, 21, 43, 21, 21, 28, - 21, 30, 21, 32, 33, 34, 35, 36, - 21, 22, 21, 24, 24, 21, 25, 21, - 26, 21, 21, 21, 21, 21, 21, 21, - 43, 21, 21, 28, 21, 21, 21, 32, - 33, 34, 35, 36, 21, 22, 21, 24, - 24, 21, 25, 21, 26, 21, 21, 21, - 21, 21, 21, 21, 43, 21, 21, 28, - 29, 30, 21, 32, 33, 34, 35, 36, - 21, 22, 23, 24, 24, 21, 25, 21, - 26, 21, 21, 21, 21, 21, 21, 21, - 27, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 21, 45, 45, 44, - 5, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 46, 44, 44, 44, 44, 44, - 44, 14, 44, 44, 44, 18, 44, 45, - 45, 44, 5, 44, 45, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 44, 47, 44, - 45, 45, 44, 5, 44, 14, 44, 44, - 44, 44, 44, 44, 44, 48, 44, 44, - 44, 44, 44, 44, 14, 44, 45, 45, - 44, 5, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 48, 44, 44, 44, 44, - 44, 44, 14, 44, 45, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 2, 44, 45, 45, 44, 5, - 44, 6, 44, 44, 44, 44, 44, 44, - 44, 49, 44, 44, 49, 44, 44, 44, - 14, 50, 44, 44, 18, 44, 2, 44, - 45, 45, 44, 5, 44, 6, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 44, 44, 44, - 18, 44, 2, 44, 45, 45, 44, 5, - 44, 6, 44, 44, 44, 44, 44, 44, - 44, 49, 44, 44, 44, 44, 44, 44, - 14, 50, 44, 44, 18, 44, 2, 44, - 45, 45, 44, 5, 44, 6, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 50, 44, 44, - 18, 44, 51, 51, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 51, 44, 2, 3, 45, 45, 44, - 5, 44, 6, 44, 44, 44, 44, 44, - 44, 44, 8, 44, 44, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 8, - 44, 44, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 52, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 17, 18, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 44, 18, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 44, - 16, 44, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 17, 18, 52, - 44, 2, 44, 45, 45, 44, 5, 44, - 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 44, 12, 44, 14, - 15, 16, 17, 18, 44, 2, 44, 45, - 45, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 52, 44, 44, 10, - 44, 44, 44, 14, 15, 16, 17, 18, - 44, 2, 44, 45, 45, 44, 5, 44, - 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 11, 12, 44, 14, - 15, 16, 17, 18, 44, 2, 3, 45, - 45, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 8, 44, 44, 10, - 11, 12, 13, 14, 15, 16, 17, 18, - 44, 22, 23, 24, 24, 21, 25, 21, - 26, 21, 21, 21, 21, 21, 21, 21, - 53, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 21, 22, 54, - 24, 24, 21, 25, 21, 26, 21, 21, - 21, 21, 21, 21, 21, 27, 21, 21, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 21, 1, 1, 2, 3, 45, 45, - 44, 5, 44, 6, 1, 44, 44, 44, - 44, 1, 44, 8, 44, 44, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, - 44, 1, 44, 1, 1, 55, 55, 55, - 55, 55, 55, 55, 55, 1, 55, 55, - 55, 55, 1, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 1, 55, 56, 55, 0 -}; - -static const char _myanmar_syllable_machine_trans_targs[] = { - 0, 1, 23, 33, 0, 24, 30, 45, - 35, 48, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 44, 49, 0, 2, 12, - 0, 3, 9, 13, 14, 19, 20, 21, - 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 0, 25, 27, - 28, 31, 32, 34, 37, 46, 47, 0, +static const char _myanmar_syllable_machine_char_class[] = { + 0, 0, 1, 2, 3, 3, 4, 5, + 4, 6, 7, 4, 4, 4, 4, 8, + 4, 9, 10, 4, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 7, 0 }; -static const char _myanmar_syllable_machine_trans_actions[] = { - 3, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 10 +static const short _myanmar_syllable_machine_index_offsets[] = { + 0, 22, 42, 59, 62, 79, 94, 107, + 120, 139, 158, 177, 196, 205, 224, 243, + 262, 281, 300, 320, 339, 358, 377, 396, + 413, 416, 433, 448, 461, 474, 493, 512, + 531, 550, 559, 579, 598, 617, 636, 655, + 674, 694, 713, 732, 751, 770, 790, 809, + 830, 839, 0 +}; + +static const char _myanmar_syllable_machine_indicies[] = { + 1, 2, 3, 4, 0, 5, 6, 1, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 22, 23, + 24, 21, 25, 26, 21, 21, 27, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 24, 21, 25, 21, 21, 21, + 38, 21, 21, 21, 21, 21, 32, 21, + 21, 21, 36, 24, 21, 25, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 21, 21, 21, 36, 39, + 21, 24, 21, 25, 32, 21, 21, 40, + 21, 21, 21, 21, 21, 32, 24, 21, + 25, 21, 21, 21, 40, 21, 21, 21, + 21, 21, 32, 24, 21, 25, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 22, 21, 24, 21, 25, 26, 21, 21, + 41, 21, 41, 21, 21, 21, 32, 42, + 21, 21, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 21, 21, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 41, 21, + 21, 21, 21, 21, 32, 42, 21, 21, + 36, 22, 21, 24, 21, 25, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 42, 21, 21, 36, 1, 21, 21, 21, + 21, 21, 21, 21, 1, 22, 21, 24, + 21, 25, 26, 21, 21, 27, 21, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 22, 21, 24, 21, 25, 26, 21, 21, + 43, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 33, 34, 35, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 32, 33, 34, 21, + 36, 22, 21, 24, 21, 25, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 21, 34, 21, 36, 22, 21, 24, 21, + 25, 26, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 33, 34, 35, 36, 43, + 22, 21, 24, 21, 25, 26, 21, 21, + 43, 21, 28, 21, 30, 21, 32, 33, + 34, 35, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 43, 21, 28, 21, 21, + 21, 32, 33, 34, 35, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 43, 21, + 28, 29, 30, 21, 32, 33, 34, 35, + 36, 22, 23, 24, 21, 25, 26, 21, + 21, 27, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 45, 44, 5, 44, + 44, 44, 46, 44, 44, 44, 44, 44, + 14, 44, 44, 44, 18, 45, 44, 5, + 45, 44, 5, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 44, 44, 44, + 18, 47, 44, 45, 44, 5, 14, 44, + 44, 48, 44, 44, 44, 44, 44, 14, + 45, 44, 5, 44, 44, 44, 48, 44, + 44, 44, 44, 44, 14, 45, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 14, 2, 44, 45, 44, 5, 6, + 44, 44, 49, 44, 49, 44, 44, 44, + 14, 50, 44, 44, 18, 2, 44, 45, + 44, 5, 6, 44, 44, 44, 44, 44, + 44, 44, 44, 14, 44, 44, 44, 18, + 2, 44, 45, 44, 5, 6, 44, 44, + 49, 44, 44, 44, 44, 44, 14, 50, + 44, 44, 18, 2, 44, 45, 44, 5, + 6, 44, 44, 44, 44, 44, 44, 44, + 44, 14, 50, 44, 44, 18, 51, 44, + 44, 44, 44, 44, 44, 44, 51, 2, + 3, 45, 44, 5, 6, 44, 44, 8, + 44, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 2, 44, 45, 44, 5, + 6, 44, 44, 8, 44, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 2, 44, + 45, 44, 5, 6, 44, 44, 52, 44, + 44, 44, 44, 44, 14, 15, 16, 17, + 18, 2, 44, 45, 44, 5, 6, 44, + 44, 44, 44, 44, 44, 44, 44, 14, + 15, 16, 17, 18, 2, 44, 45, 44, + 5, 6, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 44, 18, 2, + 44, 45, 44, 5, 6, 44, 44, 44, + 44, 44, 44, 44, 44, 14, 44, 16, + 44, 18, 2, 44, 45, 44, 5, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 15, 16, 17, 18, 52, 2, 44, + 45, 44, 5, 6, 44, 44, 52, 44, + 10, 44, 12, 44, 14, 15, 16, 17, + 18, 2, 44, 45, 44, 5, 6, 44, + 44, 52, 44, 10, 44, 44, 44, 14, + 15, 16, 17, 18, 2, 44, 45, 44, + 5, 6, 44, 44, 52, 44, 10, 11, + 12, 44, 14, 15, 16, 17, 18, 2, + 3, 45, 44, 5, 6, 44, 44, 8, + 44, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 22, 23, 24, 21, 25, 26, + 21, 21, 53, 21, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 22, 54, + 24, 21, 25, 26, 21, 21, 27, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 1, 2, 3, 45, 44, 5, 6, + 1, 1, 8, 44, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 1, 55, + 55, 55, 55, 55, 55, 1, 1, 56, + 0 +}; + +static const char _myanmar_syllable_machine_index_defaults[] = { + 0, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 21, 21, 44, + 55, 55, 0 +}; + +static const char _myanmar_syllable_machine_trans_cond_spaces[] = { + -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, -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 +}; + +static const char _myanmar_syllable_machine_cond_targs[] = { + 0, 1, 23, 33, 0, 24, 30, 45, + 35, 48, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 49, 0, 2, 12, + 0, 3, 9, 13, 14, 19, 20, 21, + 5, 16, 17, 18, 8, 22, 4, 6, + 7, 10, 11, 15, 0, 0, 25, 27, + 28, 31, 32, 34, 37, 46, 47, 0, + 0, 0 +}; + +static const char _myanmar_syllable_machine_cond_actions[] = { + 3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 10, 0 }; static const char _myanmar_syllable_machine_to_state_actions[] = { - 1, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 1, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { - 2, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 2, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _myanmar_syllable_machine_eof_cond_spaces[] = { + -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, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 0 +}; + +static const char _myanmar_syllable_machine_eof_cond_key_offs[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _myanmar_syllable_machine_eof_cond_key_lens[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _myanmar_syllable_machine_eof_cond_keys[] = { + 0 +}; + +static const char _myanmar_syllable_machine_eof_trans[] = { + 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 22, 22, 45, + 56, 56, 0 +}; + +static const char _myanmar_syllable_machine_nfa_targs[] = { 0, 0 }; -static const short _myanmar_syllable_machine_eof_trans[] = { - 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 22, 22, 45, - 56, 56 +static const char _myanmar_syllable_machine_nfa_offsets[] = { + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _myanmar_syllable_machine_nfa_push_actions[] = { + 0, 0 +}; + +static const char _myanmar_syllable_machine_nfa_pop_trans[] = { + 0, 0 }; static const int myanmar_syllable_machine_start = 0; @@ -286,136 +309,199 @@ static const int myanmar_syllable_machine_error = -1; static const int myanmar_syllable_machine_en_main = 0; -#line 36 "hb-ot-shape-complex-myanmar-machine.rl" -#line 94 "hb-ot-shape-complex-myanmar-machine.rl" - - #define found_syllable(syllable_type) \ - HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ - } HB_STMT_END +HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial=1; \ +} HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act HB_UNUSED; - int cs; - hb_glyph_info_t *info = buffer->info; - -#line 313 "hb-ot-shape-complex-myanmar-machine.hh" + unsigned int p, pe, eof, ts, te, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + { - cs = myanmar_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = (int)myanmar_syllable_machine_start; + ts = 0; + te = 0; } - -#line 114 "hb-ot-shape-complex-myanmar-machine.rl" - - - p = 0; - pe = eof = buffer->len; - - unsigned int syllable_serial = 1; - -#line 329 "hb-ot-shape-complex-myanmar-machine.hh" + + + p=0; + pe = eof = buffer->len; + + unsigned int syllable_serial=1; + { - int _slen; - int _trans; - const unsigned char *_keys; - const char *_inds; - if ( p == pe ) - goto _test_eof; -_resume: - switch ( _myanmar_syllable_machine_from_state_actions[cs] ) { - case 2: -#line 1 "NONE" - {ts = p;} - break; -#line 343 "hb-ot-shape-complex-myanmar-machine.hh" + int _cpc; + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + if ( p == pe ) + goto _test_eof; + _resume: { + switch ( _myanmar_syllable_machine_from_state_actions[cs] ) { + case 2: { + { + #line 1 "NONE" + {ts = p;}} + + break; } + } + + _keys = ( _myanmar_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _myanmar_syllable_machine_indicies + (_myanmar_syllable_machine_index_offsets[cs])); + + if ( (info[p].myanmar_category()) <= 32 && (info[p].myanmar_category()) >= 1 ) + { + int _ic = (int)_myanmar_syllable_machine_char_class[(int)(info[p].myanmar_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_myanmar_syllable_machine_cond_targs[_trans]; + + if ( _myanmar_syllable_machine_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _myanmar_syllable_machine_cond_actions[_trans] ) { + case 6: { + { + #line 86 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ + #line 86 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 4: { + { + #line 87 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ + #line 87 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (non_myanmar_cluster); }}} + + break; } + case 10: { + { + #line 88 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ + #line 88 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (punctuation_cluster); }}} + + break; } + case 8: { + { + #line 89 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ + #line 89 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 3: { + { + #line 90 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ + #line 90 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (non_myanmar_cluster); }}} + + break; } + case 5: { + { + #line 86 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p = p - 1;{ + #line 86 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (consonant_syllable); }}} + + break; } + case 7: { + { + #line 89 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p = p - 1;{ + #line 89 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 9: { + { + #line 90 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p = p - 1;{ + #line 90 "hb-ot-shape-complex-myanmar-machine.rl" + found_syllable (non_myanmar_cluster); }}} + + break; } + } + + + } + _again: { + switch ( _myanmar_syllable_machine_to_state_actions[cs] ) { + case 1: { + { + #line 1 "NONE" + {ts = 0;}} + + break; } + } + + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + if ( p == eof ) + { + if ( _myanmar_syllable_machine_eof_cond_spaces[cs] != -1 ) { + _cekeys = ( _myanmar_syllable_machine_eof_cond_keys + (_myanmar_syllable_machine_eof_cond_key_offs[cs])); + _klen = (int)_myanmar_syllable_machine_eof_cond_key_lens[cs]; + _cpc = 0; + { + const char *_lower = _cekeys; + const char *_upper = _cekeys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + goto _ok; + } + } + cs = -1; + goto _out; + } + _ok: {} + } + if ( _myanmar_syllable_machine_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_myanmar_syllable_machine_eof_trans[cs] - 1; + goto _match_cond; + } + } + + } + _out: { {} + } + } } - - _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); - _inds = _myanmar_syllable_machine_indicies + _myanmar_syllable_machine_index_offsets[cs]; - - _slen = _myanmar_syllable_machine_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].myanmar_category()) && - ( info[p].myanmar_category()) <= _keys[1] ? - ( info[p].myanmar_category()) - _keys[0] : _slen ]; - -_eof_trans: - cs = _myanmar_syllable_machine_trans_targs[_trans]; - - if ( _myanmar_syllable_machine_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { - case 6: -#line 86 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ found_syllable (consonant_syllable); }} - break; - case 4: -#line 87 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ found_syllable (non_myanmar_cluster); }} - break; - case 10: -#line 88 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ found_syllable (punctuation_cluster); }} - break; - case 8: -#line 89 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; - case 3: -#line 90 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ found_syllable (non_myanmar_cluster); }} - break; - case 5: -#line 86 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p--;{ found_syllable (consonant_syllable); }} - break; - case 7: -#line 89 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p--;{ found_syllable (broken_cluster); }} - break; - case 9: -#line 90 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p--;{ found_syllable (non_myanmar_cluster); }} - break; -#line 393 "hb-ot-shape-complex-myanmar-machine.hh" - } - -_again: - switch ( _myanmar_syllable_machine_to_state_actions[cs] ) { - case 1: -#line 1 "NONE" - {ts = 0;} - break; -#line 402 "hb-ot-shape-complex-myanmar-machine.hh" - } - - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _myanmar_syllable_machine_eof_trans[cs] > 0 ) { - _trans = _myanmar_syllable_machine_eof_trans[cs] - 1; - goto _eof_trans; - } - } - - } - -#line 122 "hb-ot-shape-complex-myanmar-machine.rl" - + } #undef found_syllable diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index f83e09fbc..e4b1884cf 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -1,32 +1,30 @@ - -#line 1 "hb-ot-shape-complex-use-machine.rl" /* - * Copyright © 2015 Mozilla Foundation. - * Copyright © 2015 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Mozilla Author(s): Jonathan Kew - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2015 Mozilla Foundation. +* Copyright © 2015 Google, Inc. +* +* This is part of HarfBuzz, a text shaping library. +* +* Permission is hereby granted, without written agreement and without +* license or royalty fees, to use, copy, modify, and distribute this +* software and its documentation for any purpose, provided that the +* above copyright notice and the following two paragraphs appear in +* all copies of this software. +* +* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +* +* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +* +* Mozilla Author(s): Jonathan Kew +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH @@ -34,332 +32,370 @@ #include "hb.hh" -#line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, - 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, - 8u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, - 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, - 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, 1u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, - 21u, 42u, 1u, 5u, 0 + 7u, 33u, 1u, 9u, 1u, 1u, 7u, 33u, + 0u, 33u, 12u, 12u, 5u, 33u, 5u, 33u, + 1u, 9u, 1u, 1u, 5u, 33u, 5u, 33u, + 5u, 29u, 5u, 17u, 5u, 17u, 5u, 17u, + 5u, 29u, 5u, 29u, 5u, 29u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 1u, 29u, + 5u, 33u, 8u, 12u, 3u, 3u, 8u, 8u, + 5u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 29u, + 5u, 17u, 5u, 17u, 5u, 17u, 5u, 29u, + 5u, 29u, 5u, 29u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 1u, 29u, 1u, 9u, + 3u, 3u, 8u, 12u, 8u, 8u, 7u, 33u, + 1u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, + 12u, 31u, 1u, 4u, 0u }; -static const char _use_syllable_machine_key_spans[] = { - 33, 15, 1, 33, 45, 1, 37, 37, - 15, 1, 37, 37, 32, 19, 19, 19, - 32, 32, 32, 37, 37, 37, 37, 37, - 37, 37, 37, 39, 37, 9, 1, 1, - 37, 37, 2, 1, 37, 37, 37, 32, - 19, 19, 19, 32, 32, 32, 37, 37, - 37, 37, 37, 37, 37, 37, 39, 15, - 1, 9, 1, 33, 44, 37, 2, 1, - 22, 5 +static const char _use_syllable_machine_char_class[] = { + 0, 1, 2, 0, 3, 4, 2, 2, + 5, 2, 2, 6, 7, 8, 2, 9, + 0, 0, 10, 11, 2, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 2, 27, 28, 29, + 2, 30, 31, 32, 33, 0 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 34, 50, 52, 86, 132, 134, 172, - 210, 226, 228, 266, 304, 337, 357, 377, - 397, 430, 463, 496, 534, 572, 610, 648, - 686, 724, 762, 800, 840, 878, 888, 890, - 892, 930, 968, 971, 973, 1011, 1049, 1087, - 1120, 1140, 1160, 1180, 1213, 1246, 1279, 1317, - 1355, 1393, 1431, 1469, 1507, 1545, 1583, 1623, - 1639, 1641, 1651, 1653, 1687, 1732, 1770, 1773, - 1775, 1798 + 0, 27, 36, 37, 64, 98, 99, 128, + 157, 166, 167, 196, 225, 250, 263, 276, + 289, 314, 339, 364, 393, 422, 451, 480, + 509, 538, 567, 596, 625, 654, 659, 660, + 661, 690, 719, 721, 722, 751, 780, 809, + 834, 847, 860, 873, 898, 923, 948, 977, + 1006, 1035, 1064, 1093, 1122, 1151, 1180, 1209, + 1218, 1219, 1224, 1225, 1252, 1285, 1314, 1316, + 1317, 1337, 0 }; static const char _use_syllable_machine_indicies[] = { - 1, 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, 0, 0, - 1, 0, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 3, 2, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 7, 8, - 9, 7, 10, 11, 9, 9, 12, 9, - 9, 3, 13, 14, 9, 15, 7, 7, - 16, 17, 9, 9, 18, 19, 20, 21, - 22, 23, 24, 18, 25, 26, 27, 28, - 29, 30, 9, 31, 32, 33, 9, 34, - 35, 36, 37, 9, 39, 38, 41, 40, - 40, 42, 1, 40, 40, 43, 40, 40, - 40, 40, 40, 44, 45, 46, 47, 48, - 49, 50, 51, 45, 52, 44, 53, 54, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 60, 40, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 61, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 53, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 60, 40, 42, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, - 63, 62, 42, 62, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 53, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 60, 40, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 40, 40, - 40, 40, 40, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 46, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 57, 58, 59, - 40, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 47, 48, 49, 40, 41, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 48, 49, - 40, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 49, 40, 41, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 47, 48, 49, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 57, 58, 59, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 58, 59, 40, 41, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 47, - 48, 49, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 59, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 46, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 40, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 46, 40, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 46, 47, 48, 49, 40, - 40, 40, 40, 40, 40, 40, 40, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 46, 40, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 51, 45, - 40, 40, 40, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 46, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 45, 46, - 47, 48, 49, 40, 64, 45, 40, 40, - 40, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 46, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 45, 46, 47, 48, - 49, 40, 40, 45, 40, 40, 40, 54, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 46, 40, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 40, 40, 40, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 46, 40, 41, 40, 40, 42, 1, 40, - 40, 43, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 40, 53, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 60, 40, - 42, 62, 62, 62, 62, 62, 62, 41, - 62, 62, 62, 62, 62, 62, 63, 62, - 62, 62, 62, 62, 62, 62, 46, 47, - 48, 49, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 57, 58, 59, 62, - 41, 40, 40, 42, 1, 40, 40, 43, - 40, 40, 40, 40, 40, 40, 45, 46, - 47, 48, 49, 50, 51, 45, 52, 44, - 53, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 60, 40, 66, 65, - 65, 65, 65, 65, 65, 65, 67, 65, - 10, 68, 66, 65, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 69, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 44, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 70, 71, 40, - 60, 40, 41, 40, 40, 42, 1, 40, - 40, 43, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 44, 53, 54, 55, 56, 40, 57, - 58, 59, 40, 70, 71, 40, 60, 40, - 70, 71, 72, 71, 72, 12, 73, 73, - 3, 6, 73, 73, 74, 73, 73, 73, - 73, 73, 75, 18, 19, 20, 21, 22, - 23, 24, 18, 25, 27, 27, 28, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 37, 73, 12, 73, 73, 3, 6, - 73, 73, 74, 73, 73, 73, 73, 73, - 73, 18, 19, 20, 21, 22, 23, 24, - 18, 25, 27, 27, 28, 29, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 37, - 73, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 73, 73, 73, 73, - 73, 73, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 19, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 19, 20, - 21, 22, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 31, 32, 33, 73, - 12, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 20, 21, 22, 73, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 21, 22, 73, - 12, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 22, 73, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 31, 32, 33, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 32, 33, 73, 12, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 33, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 19, 20, - 21, 22, 73, 73, 73, 73, 73, 73, - 28, 29, 30, 73, 31, 32, 33, 73, - 73, 73, 73, 19, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 19, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 19, 73, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 19, - 73, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 73, 24, 18, 73, - 73, 73, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 19, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 18, 19, 20, - 21, 22, 73, 76, 18, 73, 73, 73, - 28, 29, 30, 73, 31, 32, 33, 73, - 73, 73, 73, 19, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 18, 19, 20, 21, 22, - 73, 73, 18, 73, 73, 73, 28, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 19, 73, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 18, 19, 20, 21, 22, 23, 24, - 18, 73, 73, 73, 28, 29, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 19, - 73, 12, 73, 73, 3, 6, 73, 73, - 74, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 73, 27, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 37, 73, 3, - 73, 73, 73, 73, 73, 73, 12, 73, - 73, 73, 73, 73, 73, 4, 73, 73, - 73, 73, 73, 73, 73, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 31, 32, 33, 73, 3, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 4, 77, 78, - 73, 14, 73, 73, 73, 73, 73, 73, - 73, 79, 73, 14, 73, 6, 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, 77, 77, 77, 77, 6, 77, 8, - 73, 73, 73, 8, 73, 73, 12, 73, - 73, 3, 6, 14, 73, 74, 73, 73, - 73, 73, 73, 73, 18, 19, 20, 21, - 22, 23, 24, 18, 25, 26, 27, 28, - 29, 30, 73, 31, 32, 33, 73, 34, - 35, 73, 37, 73, 12, 73, 73, 3, - 6, 73, 73, 74, 73, 73, 73, 73, - 73, 73, 18, 19, 20, 21, 22, 23, - 24, 18, 25, 26, 27, 28, 29, 30, - 73, 31, 32, 33, 73, 73, 73, 73, - 37, 73, 34, 35, 73, 35, 73, 70, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 70, 71, 72, 8, 77, - 77, 77, 8, 77, 0 + 1, 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, 1, 3, 2, 2, 2, 2, + 2, 2, 2, 4, 3, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 6, + 7, 8, 9, 10, 11, 12, 3, 13, + 14, 15, 16, 17, 9, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 39, 41, 42, 1, 40, 43, + 40, 40, 44, 45, 46, 47, 48, 49, + 50, 51, 45, 52, 44, 53, 54, 55, + 56, 57, 58, 59, 40, 40, 40, 60, + 41, 42, 1, 40, 43, 40, 40, 61, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 53, 53, 54, 55, 56, 57, 58, + 59, 40, 40, 40, 60, 42, 62, 62, + 62, 62, 62, 62, 62, 63, 42, 41, + 42, 1, 40, 43, 40, 40, 40, 45, + 46, 47, 48, 49, 50, 51, 45, 52, + 53, 53, 54, 55, 56, 57, 58, 59, + 40, 40, 40, 60, 41, 40, 40, 40, + 40, 40, 40, 40, 45, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 54, + 55, 56, 57, 58, 59, 40, 40, 40, + 46, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 46, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 57, + 58, 59, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 47, 48, 49, 41, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 48, 49, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 49, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 57, + 58, 59, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 47, 48, 49, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 58, 59, 41, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 47, 48, 49, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 59, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 54, + 55, 56, 57, 58, 59, 40, 40, 40, + 46, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 46, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 55, 56, 57, + 58, 59, 40, 40, 40, 46, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 40, 40, 56, 57, 58, 59, 40, + 40, 40, 46, 41, 40, 40, 40, 40, + 40, 40, 40, 45, 46, 47, 48, 49, + 40, 51, 45, 40, 40, 40, 54, 55, + 56, 57, 58, 59, 40, 40, 40, 46, + 41, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 64, 45, + 40, 40, 40, 54, 55, 56, 57, 58, + 59, 40, 40, 40, 46, 41, 40, 40, + 40, 40, 40, 40, 40, 45, 46, 47, + 48, 49, 40, 40, 45, 40, 40, 40, + 54, 55, 56, 57, 58, 59, 40, 40, + 40, 46, 41, 40, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 40, 40, 40, 54, 55, 56, + 57, 58, 59, 40, 40, 40, 46, 41, + 42, 1, 40, 43, 40, 40, 40, 45, + 46, 47, 48, 49, 50, 51, 45, 52, + 40, 53, 54, 55, 56, 57, 58, 59, + 40, 40, 40, 60, 42, 62, 62, 62, + 41, 62, 62, 62, 63, 62, 62, 62, + 62, 46, 47, 48, 49, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 57, 58, + 59, 41, 42, 1, 40, 43, 40, 40, + 40, 45, 46, 47, 48, 49, 50, 51, + 45, 52, 44, 53, 54, 55, 56, 57, + 58, 59, 40, 40, 40, 60, 66, 65, + 65, 65, 67, 10, 66, 41, 42, 1, + 40, 43, 40, 40, 69, 45, 46, 47, + 48, 49, 50, 51, 45, 52, 44, 53, + 54, 55, 56, 57, 58, 59, 70, 71, + 40, 60, 41, 42, 1, 40, 43, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 44, 53, 54, 55, 56, + 57, 58, 59, 70, 71, 40, 60, 70, + 71, 71, 12, 3, 6, 73, 74, 73, + 73, 75, 18, 19, 20, 21, 22, 23, + 24, 18, 25, 27, 27, 28, 29, 30, + 31, 32, 33, 73, 73, 73, 37, 12, + 3, 6, 73, 74, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 27, 27, 28, 29, 30, 31, 32, 33, + 73, 73, 73, 37, 12, 73, 73, 73, + 73, 73, 73, 73, 18, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 28, + 29, 30, 31, 32, 33, 73, 73, 73, + 19, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 31, + 32, 33, 12, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 21, 22, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 22, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 31, + 32, 33, 12, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 32, 33, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 33, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 28, + 29, 30, 31, 32, 33, 73, 73, 73, + 19, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 29, 30, 31, + 32, 33, 73, 73, 73, 19, 12, 73, + 73, 73, 73, 73, 73, 73, 73, 19, + 20, 21, 22, 73, 73, 73, 73, 73, + 73, 73, 73, 30, 31, 32, 33, 73, + 73, 73, 19, 12, 73, 73, 73, 73, + 73, 73, 73, 18, 19, 20, 21, 22, + 73, 24, 18, 73, 73, 73, 28, 29, + 30, 31, 32, 33, 73, 73, 73, 19, + 12, 73, 73, 73, 73, 73, 73, 73, + 18, 19, 20, 21, 22, 73, 76, 18, + 73, 73, 73, 28, 29, 30, 31, 32, + 33, 73, 73, 73, 19, 12, 73, 73, + 73, 73, 73, 73, 73, 18, 19, 20, + 21, 22, 73, 73, 18, 73, 73, 73, + 28, 29, 30, 31, 32, 33, 73, 73, + 73, 19, 12, 73, 73, 73, 73, 73, + 73, 73, 18, 19, 20, 21, 22, 23, + 24, 18, 73, 73, 73, 28, 29, 30, + 31, 32, 33, 73, 73, 73, 19, 12, + 3, 6, 73, 74, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 73, 27, 28, 29, 30, 31, 32, 33, + 73, 73, 73, 37, 3, 73, 73, 73, + 12, 73, 73, 73, 4, 73, 73, 73, + 73, 19, 20, 21, 22, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 31, 32, + 33, 3, 77, 77, 77, 77, 77, 77, + 77, 4, 78, 14, 73, 73, 73, 79, + 14, 6, 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, 6, 8, 73, 73, 8, + 12, 3, 6, 14, 74, 73, 73, 73, + 18, 19, 20, 21, 22, 23, 24, 18, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 73, 37, 12, 3, 6, + 73, 74, 73, 73, 73, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 73, 73, + 73, 37, 34, 35, 35, 70, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 70, + 71, 8, 77, 77, 8, 0 }; -static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 36, 2, 4, 1, 5, - 6, 4, 29, 32, 4, 55, 56, 59, - 60, 64, 38, 39, 40, 41, 42, 49, - 50, 52, 61, 53, 46, 47, 48, 43, - 44, 45, 62, 63, 65, 54, 4, 4, - 4, 4, 7, 0, 28, 11, 12, 13, - 14, 15, 22, 23, 25, 26, 19, 20, - 21, 16, 17, 18, 27, 10, 4, 9, - 24, 4, 30, 31, 4, 33, 34, 35, - 4, 4, 3, 37, 51, 4, 57, 58 +static const char _use_syllable_machine_index_defaults[] = { + 0, 2, 2, 5, 9, 38, 40, 40, + 62, 62, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 62, 40, 65, 68, 65, + 40, 40, 72, 72, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 77, + 73, 73, 73, 77, 73, 73, 73, 73, + 72, 77, 0 }; -static const char _use_syllable_machine_trans_actions[] = { - 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 7, 9, 10, 0, 10, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 11, 12, - 13, 14, 7, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, 15, 0, - 0, 16, 0, 0, 17, 7, 0, 0, - 18, 19, 0, 3, 0, 20, 0, 0 +static const char _use_syllable_machine_trans_cond_spaces[] = { + -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, -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0 +}; + +static const char _use_syllable_machine_cond_targs[] = { + 4, 8, 4, 36, 2, 4, 1, 5, + 6, 4, 29, 32, 4, 55, 56, 59, + 60, 64, 38, 39, 40, 41, 42, 49, + 50, 52, 61, 53, 46, 47, 48, 43, + 44, 45, 62, 63, 65, 54, 4, 4, + 4, 4, 7, 0, 28, 11, 12, 13, + 14, 15, 22, 23, 25, 26, 19, 20, + 21, 16, 17, 18, 27, 10, 4, 9, + 24, 4, 30, 31, 4, 33, 34, 35, + 4, 4, 3, 37, 51, 4, 57, 58, + 0 +}; + +static const char _use_syllable_machine_cond_actions[] = { + 1, 0, 2, 3, 0, 4, 0, 0, + 7, 8, 0, 7, 9, 10, 0, 10, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 11, 12, + 13, 14, 7, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, 15, 0, + 0, 16, 0, 0, 17, 7, 0, 0, + 18, 19, 0, 3, 0, 20, 0, 0, + 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 0, 0, 0, 5, 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, 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, 0, - 0, 0 + 0, 0, 0, 0, 5, 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, 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, 0, + 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 0, 0, 0, 6, 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, 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, 0, + 0, 0, 0, 0, 6, 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, 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, 0, + 0, 0, 0 +}; + +static const char _use_syllable_machine_eof_cond_spaces[] = { + -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, -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, -1, -1, -1, -1, + -1, -1, 0 +}; + +static const char _use_syllable_machine_eof_cond_key_offs[] = { + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _use_syllable_machine_eof_cond_key_lens[] = { + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _use_syllable_machine_eof_cond_keys[] = { + 0 +}; + +static const char _use_syllable_machine_eof_trans[] = { + 1, 3, 3, 6, 0, 39, 41, 41, + 63, 63, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 63, 41, 66, 69, 66, + 41, 41, 73, 73, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 78, + 74, 74, 74, 78, 74, 74, 74, 74, + 73, 78, 0 +}; + +static const char _use_syllable_machine_nfa_targs[] = { 0, 0 }; -static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 39, 41, 41, - 63, 63, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 63, 41, 66, 69, 66, - 41, 41, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 78, - 74, 74, 74, 78, 74, 74, 74, 74, - 73, 78 +static const char _use_syllable_machine_nfa_offsets[] = { + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +static const char _use_syllable_machine_nfa_push_actions[] = { + 0, 0 +}; + +static const char _use_syllable_machine_nfa_pop_trans[] = { + 0, 0 }; static const int use_syllable_machine_start = 4; @@ -369,188 +405,292 @@ static const int use_syllable_machine_error = -1; static const int use_syllable_machine_en_main = 4; -#line 38 "hb-ot-shape-complex-use-machine.rl" -#line 146 "hb-ot-shape-complex-use-machine.rl" - - #define found_syllable(syllable_type) \ - HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ - } HB_STMT_END +HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial=1; \ +} HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; - int cs; - hb_glyph_info_t *info = buffer->info; - -#line 396 "hb-ot-shape-complex-use-machine.hh" + unsigned int p, pe, eof, ts, te, act; + int cs; + hb_glyph_info_t *info = buffer->info; + { - cs = use_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = (int)use_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - -#line 166 "hb-ot-shape-complex-use-machine.rl" - - - p = 0; - pe = eof = buffer->len; - - unsigned int syllable_serial = 1; - -#line 412 "hb-ot-shape-complex-use-machine.hh" + + + p=0; + pe = eof = buffer->len; + + unsigned int syllable_serial=1; + { - int _slen; - int _trans; - const unsigned char *_keys; - const char *_inds; - if ( p == pe ) - goto _test_eof; -_resume: - switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 6: -#line 1 "NONE" - {ts = p;} - break; -#line 426 "hb-ot-shape-complex-use-machine.hh" + int _cpc; + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + if ( p == pe ) + goto _test_eof; + _resume: { + switch ( _use_syllable_machine_from_state_actions[cs] ) { + case 6: { + { + #line 1 "NONE" + {ts = p;}} + + break; } + } + + _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); + + if ( (info[p].use_category()) <= 44 ) + { + int _ic = (int)_use_syllable_machine_char_class[(int)(info[p].use_category()) - 0]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + } + + goto _match_cond; + } + _match_cond: { + cs = (int)_use_syllable_machine_cond_targs[_trans]; + + if ( _use_syllable_machine_cond_actions[_trans] == 0 ) + goto _again; + + switch ( _use_syllable_machine_cond_actions[_trans] ) { + case 7: { + { + #line 1 "NONE" + {te = p+1;}} + + break; } + case 12: { + { + #line 135 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ + #line 135 "hb-ot-shape-complex-use-machine.rl" + found_syllable (independent_cluster); }}} + + break; } + case 14: { + { + #line 137 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ + #line 137 "hb-ot-shape-complex-use-machine.rl" + found_syllable (standard_cluster); }}} + + break; } + case 9: { + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ + #line 141 "hb-ot-shape-complex-use-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 8: { + { + #line 142 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ + #line 142 "hb-ot-shape-complex-use-machine.rl" + found_syllable (non_cluster); }}} + + break; } + case 11: { + { + #line 135 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 135 "hb-ot-shape-complex-use-machine.rl" + found_syllable (independent_cluster); }}} + + break; } + case 15: { + { + #line 136 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 136 "hb-ot-shape-complex-use-machine.rl" + found_syllable (virama_terminated_cluster); }}} + + break; } + case 13: { + { + #line 137 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 137 "hb-ot-shape-complex-use-machine.rl" + found_syllable (standard_cluster); }}} + + break; } + case 17: { + { + #line 138 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 138 "hb-ot-shape-complex-use-machine.rl" + found_syllable (number_joiner_terminated_cluster); }}} + + break; } + case 16: { + { + #line 139 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 139 "hb-ot-shape-complex-use-machine.rl" + found_syllable (numeral_cluster); }}} + + break; } + case 18: { + { + #line 140 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 140 "hb-ot-shape-complex-use-machine.rl" + found_syllable (symbol_cluster); }}} + + break; } + case 19: { + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 141 "hb-ot-shape-complex-use-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 20: { + { + #line 142 "hb-ot-shape-complex-use-machine.rl" + {te = p;p = p - 1;{ + #line 142 "hb-ot-shape-complex-use-machine.rl" + found_syllable (non_cluster); }}} + + break; } + case 1: { + { + #line 137 "hb-ot-shape-complex-use-machine.rl" + {p = ((te))-1; + { + #line 137 "hb-ot-shape-complex-use-machine.rl" + found_syllable (standard_cluster); }}} + + break; } + case 4: { + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + {p = ((te))-1; + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + found_syllable (broken_cluster); }}} + + break; } + case 2: { + { + #line 1 "NONE" + {switch( act ) { + case 7: { + p = ((te))-1; + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + found_syllable (broken_cluster); } break; } + case 8: { + p = ((te))-1; + { + #line 142 "hb-ot-shape-complex-use-machine.rl" + found_syllable (non_cluster); } break; } + }} + } + + break; } + case 3: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 141 "hb-ot-shape-complex-use-machine.rl" + {act = 7;}} + + break; } + case 10: { + { + #line 1 "NONE" + {te = p+1;}} + { + #line 142 "hb-ot-shape-complex-use-machine.rl" + {act = 8;}} + + break; } + } + + + } + _again: { + switch ( _use_syllable_machine_to_state_actions[cs] ) { + case 5: { + { + #line 1 "NONE" + {ts = 0;}} + + break; } + } + + p += 1; + if ( p != pe ) + goto _resume; + } + _test_eof: { {} + if ( p == eof ) + { + if ( _use_syllable_machine_eof_cond_spaces[cs] != -1 ) { + _cekeys = ( _use_syllable_machine_eof_cond_keys + (_use_syllable_machine_eof_cond_key_offs[cs])); + _klen = (int)_use_syllable_machine_eof_cond_key_lens[cs]; + _cpc = 0; + { + const char *_lower = _cekeys; + const char *_upper = _cekeys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + goto _ok; + } + } + cs = -1; + goto _out; + } + _ok: {} + } + if ( _use_syllable_machine_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_use_syllable_machine_eof_trans[cs] - 1; + goto _match_cond; + } + } + + } + _out: { {} + } + } } - - _keys = _use_syllable_machine_trans_keys + (cs<<1); - _inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs]; - - _slen = _use_syllable_machine_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].use_category()) && - ( info[p].use_category()) <= _keys[1] ? - ( info[p].use_category()) - _keys[0] : _slen ]; - -_eof_trans: - cs = _use_syllable_machine_trans_targs[_trans]; - - if ( _use_syllable_machine_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 7: -#line 1 "NONE" - {te = p+1;} - break; - case 12: -#line 135 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (independent_cluster); }} - break; - case 14: -#line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (standard_cluster); }} - break; - case 9: -#line 141 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; - case 8: -#line 142 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (non_cluster); }} - break; - case 11: -#line 135 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (independent_cluster); }} - break; - case 15: -#line 136 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (virama_terminated_cluster); }} - break; - case 13: -#line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (standard_cluster); }} - break; - case 17: -#line 138 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} - break; - case 16: -#line 139 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (numeral_cluster); }} - break; - case 18: -#line 140 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (symbol_cluster); }} - break; - case 19: -#line 141 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (broken_cluster); }} - break; - case 20: -#line 142 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (non_cluster); }} - break; - case 1: -#line 137 "hb-ot-shape-complex-use-machine.rl" - {{p = ((te))-1;}{ found_syllable (standard_cluster); }} - break; - case 4: -#line 141 "hb-ot-shape-complex-use-machine.rl" - {{p = ((te))-1;}{ found_syllable (broken_cluster); }} - break; - case 2: -#line 1 "NONE" - { switch( act ) { - case 7: - {{p = ((te))-1;} found_syllable (broken_cluster); } - break; - case 8: - {{p = ((te))-1;} found_syllable (non_cluster); } - break; - } - } - break; - case 3: -#line 1 "NONE" - {te = p+1;} -#line 141 "hb-ot-shape-complex-use-machine.rl" - {act = 7;} - break; - case 10: -#line 1 "NONE" - {te = p+1;} -#line 142 "hb-ot-shape-complex-use-machine.rl" - {act = 8;} - break; -#line 528 "hb-ot-shape-complex-use-machine.hh" - } - -_again: - switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 5: -#line 1 "NONE" - {ts = 0;} - break; -#line 537 "hb-ot-shape-complex-use-machine.hh" - } - - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _use_syllable_machine_eof_trans[cs] > 0 ) { - _trans = _use_syllable_machine_eof_trans[cs] - 1; - goto _eof_trans; - } - } - - } - -#line 174 "hb-ot-shape-complex-use-machine.rl" - + } #undef found_syllable From 159fe962e90dd3b758ad10046b9d75cf87c1d4f3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:46:11 -0700 Subject: [PATCH 059/617] [doc] Make header search more resilient How stupid to scan all files... Sigh. --- docs/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile.am b/docs/Makefile.am index 9b54b40e1..a034912ca 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -33,7 +33,7 @@ SCAN_OPTIONS=--rebuild-types --deprecated-guards="HB_DISABLE_DEPRECATED" \ # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code -IGNORE_HFILES=`cd $(top_srcdir)/src; find . -path './hb-*/*.h' | sed 's@^.*/@@'` +IGNORE_HFILES=`cd $(top_srcdir)/src; find . -path './*/*.h' | sed 's@^.*/@@'` if HAVE_GOBJECT else IGNORE_HFILES+=hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h From 938de315756e08bd2b5fa816c7951640e5835b2e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:47:02 -0700 Subject: [PATCH 060/617] Comment --- src/hb-subset-glyf.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc index 9095e9f76..d40233187 100644 --- a/src/hb-subset-glyf.cc +++ b/src/hb-subset-glyf.cc @@ -60,7 +60,7 @@ struct loca_data_t } }; -/** +/* * If hints are being dropped find the range which in glyf at which * the hinting instructions are located. Add them to the instruction_ranges * vector. From 1c81cff2d3f9df2c18ffbdfff02ed418560480c1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 11:51:10 -0700 Subject: [PATCH 061/617] Fix signed-comparison error on 32bit --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 4e270ce8c..27c8c1778 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -292,7 +292,7 @@ struct hb_serialize_context_t for (const object_t::link_t &link : parent->links) { const object_t &child = *packed[link.objidx]; - assert (link.bias <= parent->tail - parent->head); + assert (link.bias <= (size_t) (parent->tail - parent->head)); unsigned offset = (child.head - parent->head) - link.bias; if (link.is_wide) From 2eb7e0e0e923d096d2598133cacd6e5ee04a6a04 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 12:45:38 -0700 Subject: [PATCH 062/617] [serialize] Minor --- src/hb-serialize.hh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 27c8c1778..7e46df265 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -165,7 +165,7 @@ struct hb_serialize_context_t /* Only "pack" if there exist other objects... Otherwise, don't bother. * Saves a move. */ - if (packed.length == 1) + if (packed.length <= 1) return; pop_pack (); @@ -285,7 +285,10 @@ struct hb_serialize_context_t void resolve_links () { + if (unlikely (in_error ())) return; + assert (!current); + assert (packed.length > 1); for (const object_t *parent : ++hb_iter (packed)) { From 59ee61fddc76cd18f19f351bca7dd293eb610333 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 13:26:15 -0700 Subject: [PATCH 063/617] [name] Use iterators more --- src/hb-ot-name-table.hh | 46 ++++++++++++++--------------------------- src/hb-subset-plan.cc | 3 +++ 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 07c3f28e6..e4601ff25 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -169,44 +169,34 @@ struct name unsigned int get_size () const { return min_size + count * nameRecordZ.item_size; } - void get_subsetted_ids (const name *source_name, - const hb_subset_plan_t *plan, - hb_vector_t& name_record_idx_to_retain) const - { - for(unsigned int i = 0; i < count; i++) - { - if (format == 0 && (unsigned int) source_name->nameRecordZ[i].nameID > 25) - continue; - if (!hb_set_is_empty (plan->name_ids) && - !hb_set_has (plan->name_ids, source_name->nameRecordZ[i].nameID)) - continue; - name_record_idx_to_retain.push (i); - } - } - bool serialize (hb_serialize_context_t *c, const name *source_name, - const hb_subset_plan_t *plan, - const hb_sorted_vector_t& name_record_idx_to_retain) + const hb_subset_plan_t *plan) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); + auto src_array = source_name->nameRecordZ.as_array (source_name->count); + + auto it = + + src_array + | hb_filter (plan->name_ids, &NameRecord::nameID) + ; + this->format = 0; - this->count = name_record_idx_to_retain.length; + this->count = it.len (); auto snap = c->snapshot (); this->nameRecordZ.serialize (c, this->count); this->stringOffset = c->length (); c->revert (snap); - auto src_array = source_name->nameRecordZ.as_array (source_name->count); const void *src_base = &(source_name + source_name->stringOffset); const void *dst_base = &(this + this->stringOffset); - + hb_iter (name_record_idx_to_retain) - | hb_apply ([&] (unsigned _) { c->copy (src_array[_], src_base, dst_base); }) + + it + | hb_apply ([&] (const NameRecord& _) { c->copy (_, src_base, dst_base); }) ; if (unlikely (c->ran_out_of_room)) return_trace (false); @@ -218,20 +208,14 @@ struct name bool subset (hb_subset_context_t *c) const { + TRACE_SUBSET (this); hb_subset_plan_t *plan = c->plan; - hb_sorted_vector_t name_record_idx_to_retain; - - get_subsetted_ids (this, plan, name_record_idx_to_retain); hb_serialize_context_t *serializer = c->serializer; name *name_prime = serializer->start_embed (); - if (!name_prime || !name_prime->serialize (serializer, this, plan, name_record_idx_to_retain)) - { - DEBUG_MSG (SUBSET, nullptr, "Failed to serialize write new name."); - return false; - } - - return true; + if (unlikely (!name_prime)) return_trace (false); + name_prime->serialize (serializer, this, plan); + return_trace (name_prime->count); } bool sanitize_records (hb_sanitize_context_t *c) const diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index fe636b190..901347b9f 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -207,6 +207,9 @@ hb_subset_plan_create (hb_face_t *face, plan->retain_gids = input->retain_gids; plan->unicodes = hb_set_create (); plan->name_ids = hb_set_reference (input->name_ids); + /* TODO Clean this up... */ + if (hb_set_is_empty (plan->name_ids)) + hb_set_add_range (plan->name_ids, 0, 0x7FFF); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); plan->codepoint_to_glyph = hb_map_create (); From f982b9d9f8d6b61efd2a3e89cc3d34923c1914b0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 13:29:01 -0700 Subject: [PATCH 064/617] [name] Clean up serialize() API --- src/hb-ot-name-table.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index e4601ff25..6a4ac093b 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -170,8 +170,8 @@ struct name { return min_size + count * nameRecordZ.item_size; } bool serialize (hb_serialize_context_t *c, - const name *source_name, - const hb_subset_plan_t *plan) + const name *source_name, + const hb_set_t *name_ids) { TRACE_SERIALIZE (this); @@ -181,7 +181,7 @@ struct name auto it = + src_array - | hb_filter (plan->name_ids, &NameRecord::nameID) + | hb_filter (name_ids, &NameRecord::nameID) ; this->format = 0; @@ -214,7 +214,7 @@ struct name hb_serialize_context_t *serializer = c->serializer; name *name_prime = serializer->start_embed (); if (unlikely (!name_prime)) return_trace (false); - name_prime->serialize (serializer, this, plan); + name_prime->serialize (serializer, this, plan->name_ids); return_trace (name_prime->count); } From 7c037bd2be2e794dfd882b806f684ad74c56dbb8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 13:37:43 -0700 Subject: [PATCH 065/617] [name] Clean up some more --- src/hb-meta.hh | 2 ++ src/hb-ot-name-table.hh | 30 ++++++++++++++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index e8002f253..f2134d6d8 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -163,6 +163,8 @@ struct hb_reference_wrapper template struct hb_enable_if {}; template struct hb_enable_if { typedef T type; }; #define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr +/* Concepts/Requires alias: */ +#define hb_requires(Cond) hb_enable_if((Cond)) template struct hb_is_same : hb_false_t {}; template struct hb_is_same : hb_true_t {}; diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 6a4ac093b..4e4da74bc 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -169,21 +169,16 @@ struct name unsigned int get_size () const { return min_size + count * nameRecordZ.item_size; } + template bool serialize (hb_serialize_context_t *c, - const name *source_name, - const hb_set_t *name_ids) + Iterator it, + const void *src_string_pool) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); - auto src_array = source_name->nameRecordZ.as_array (source_name->count); - - auto it = - + src_array - | hb_filter (name_ids, &NameRecord::nameID) - ; - this->format = 0; this->count = it.len (); @@ -192,11 +187,10 @@ struct name this->stringOffset = c->length (); c->revert (snap); - const void *src_base = &(source_name + source_name->stringOffset); - const void *dst_base = &(this + this->stringOffset); + const void *dst_string_pool = &(this + this->stringOffset); + it - | hb_apply ([&] (const NameRecord& _) { c->copy (_, src_base, dst_base); }) + | hb_apply ([&] (const NameRecord& _) { c->copy (_, src_string_pool, dst_string_pool); }) ; if (unlikely (c->ran_out_of_room)) return_trace (false); @@ -209,12 +203,16 @@ struct name bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - hb_subset_plan_t *plan = c->plan; - hb_serialize_context_t *serializer = c->serializer; - name *name_prime = serializer->start_embed (); + name *name_prime = c->serializer->start_embed (); if (unlikely (!name_prime)) return_trace (false); - name_prime->serialize (serializer, this, plan->name_ids); + + auto it = + + nameRecordZ.as_array (count) + | hb_filter (c->plan->name_ids, &NameRecord::nameID) + ; + + name_prime->serialize (c->serializer, it, hb_addressof (this + stringOffset)); return_trace (name_prime->count); } From 52f6c04c1e0eab2aaa0c7d817b212c01ba993fe9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 13:45:48 -0700 Subject: [PATCH 066/617] Minor --- src/hb-serialize.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 7e46df265..dc9cc8226 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -290,13 +290,13 @@ struct hb_serialize_context_t assert (!current); assert (packed.length > 1); - for (const object_t *parent : ++hb_iter (packed)) + for (const object_t* parent : ++hb_iter (packed)) { for (const object_t::link_t &link : parent->links) { - const object_t &child = *packed[link.objidx]; + const object_t* child = packed[link.objidx]; assert (link.bias <= (size_t) (parent->tail - parent->head)); - unsigned offset = (child.head - parent->head) - link.bias; + unsigned offset = (child->head - parent->head) - link.bias; if (link.is_wide) { From c09d6c58e99dba50f29a569e4c53916b5b507ef1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 14:09:00 -0700 Subject: [PATCH 067/617] [iter] Require lvalue in operators that return reference --- src/hb-iter.hh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 63a178ae3..dc57e2be7 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -97,21 +97,21 @@ struct hb_iter_t item_t operator * () { return thiz()->__item__ (); } item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); } item_t operator [] (unsigned i) { return thiz()->__item_at__ (i); } - iter_t& operator += (unsigned count) { thiz()->__forward__ (count); return *thiz(); } - iter_t& operator ++ () { thiz()->__next__ (); return *thiz(); } - iter_t& operator -= (unsigned count) { thiz()->__rewind__ (count); return *thiz(); } - iter_t& operator -- () { thiz()->__prev__ (); return *thiz(); } + iter_t& operator += (unsigned count) & { thiz()->__forward__ (count); return *thiz(); } + iter_t& operator ++ () & { thiz()->__next__ (); return *thiz(); } + iter_t operator ++ () && { thiz()->__next__ (); return *thiz(); } + iter_t& operator -= (unsigned count) & { thiz()->__rewind__ (count); return *thiz(); } + iter_t& operator -- () & { thiz()->__prev__ (); return *thiz(); } + iter_t operator -- () && { thiz()->__prev__ (); return *thiz(); } iter_t operator + (unsigned count) const { auto c = thiz()->iter (); c += count; return c; } friend iter_t operator + (unsigned count, const iter_t &it) { return it + count; } iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; } iter_t operator - (unsigned count) const { auto c = thiz()->iter (); c -= count; return c; } iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; } template - iter_t& operator >> (T &v) { v = **thiz(); ++*thiz(); return *thiz(); } + iter_t& operator >> (T &v) & { v = **thiz(); ++*thiz(); return *thiz(); } template - iter_t& operator >> (T &v) const { v = **thiz(); ++*thiz(); return *thiz(); } - template - iter_t& operator << (const T v) { **thiz() = v; ++*thiz(); return *thiz(); } + iter_t& operator << (const T v) & { **thiz() = v; ++*thiz(); return *thiz(); } protected: hb_iter_t () {} From fa8c4ba81175f671c3f39f1586d0a1d9067d9f89 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 14:26:03 -0700 Subject: [PATCH 068/617] Minor --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index dc9cc8226..ccb7af988 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -393,7 +393,7 @@ struct hb_serialize_context_t { return _copy (src, hb_prioritize, hb_forward (ds)...); } template - hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; } + hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; } template Type *extend_size (Type &obj, unsigned int size) From e33ad252222481a6078a8bb423505e713b081313 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 15:46:24 -0700 Subject: [PATCH 069/617] [serialize] FeatureVariations subset->copy --- src/hb-ot-layout-common.hh | 6 +++--- src/hb-ot-layout-gsubgpos.hh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index a527b3966..153ee83e5 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1984,10 +1984,10 @@ struct FeatureVariations return (this+record.substitutions).find_substitute (feature_index); } - bool subset (hb_subset_context_t *c) const + FeatureVariations* copy (hb_serialize_context_t *c) const { - TRACE_SUBSET (this); - return_trace (c->serializer->embed (*this)); + TRACE_SERIALIZE (this); + return_trace (c->embed (*this)); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 0b4031499..5837e76d9 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2680,7 +2680,7 @@ struct GSUBGPOS out); if (version.to_int () >= 0x00010001u) - out->featureVars.serialize_subset (c, this+featureVars, out); + out->featureVars.serialize_copy (c->serializer, this+featureVars, out); return_trace (true); } From 95426ea983bde01fadf4681926cb77e3b3c0d40a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 15:56:51 -0700 Subject: [PATCH 070/617] Add comment --- src/hb-open-type.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 2990b0d58..2bfbee525 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -305,6 +305,7 @@ struct OffsetTo : Offset return ret; } + /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */ template bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts &&...ds) { From 7654ebe3a51c98b4d3bf6fb11779024f1c770962 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 16:53:03 -0700 Subject: [PATCH 071/617] Whitespace --- src/hb-algs.hh | 30 ++++++++++++++++++++---------- src/hb-iter.hh | 39 ++++++++++++++++++++++++++------------- src/hb-meta.hh | 11 ++++++----- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index ee604e88c..2d2fe31f0 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -38,13 +38,15 @@ struct { template T operator () (const T& v) const { return v; } -} HB_FUNCOBJ (hb_identity); +} +HB_FUNCOBJ (hb_identity); struct { template bool operator () (const T& v) const { return bool (v); } -} HB_FUNCOBJ (hb_bool); +} +HB_FUNCOBJ (hb_bool); struct { @@ -64,7 +66,8 @@ struct template auto operator () (const T& v) const HB_RETURN (uint32_t, impl (v, hb_prioritize)) -} HB_FUNCOBJ (hb_hash); +} +HB_FUNCOBJ (hb_hash); struct { @@ -94,7 +97,8 @@ struct hb_prioritize, hb_forward (vs)...) ) -} HB_FUNCOBJ (hb_invoke); +} +HB_FUNCOBJ (hb_invoke); struct { @@ -119,7 +123,8 @@ struct hb_forward (v), hb_prioritize) ) -} HB_FUNCOBJ (hb_has); +} +HB_FUNCOBJ (hb_has); struct { @@ -145,7 +150,8 @@ struct hb_forward (v), hb_prioritize) ) -} HB_FUNCOBJ (hb_get); +} +HB_FUNCOBJ (hb_get); template @@ -170,24 +176,28 @@ struct { template auto operator () (const Pair& pair) const HB_AUTO_RETURN (pair.first) -} HB_FUNCOBJ (hb_first); +} +HB_FUNCOBJ (hb_first); struct { template auto operator () (const Pair& pair) const HB_AUTO_RETURN (pair.second) -} HB_FUNCOBJ (hb_second); +} +HB_FUNCOBJ (hb_second); struct { template auto operator () (const T& a, const T2& b) const HB_AUTO_RETURN (a <= b ? a : b) -} HB_FUNCOBJ (hb_min); +} +HB_FUNCOBJ (hb_min); struct { template auto operator () (const T& a, const T2& b) const HB_AUTO_RETURN (a >= b ? a : b) -} HB_FUNCOBJ (hb_max); +} +HB_FUNCOBJ (hb_max); /* diff --git a/src/hb-iter.hh b/src/hb-iter.hh index dc57e2be7..418ae9576 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -164,7 +164,8 @@ struct operator () (Type (&array)[length]) const { return hb_array_t (array, length); } -} HB_FUNCOBJ (hb_iter); +} +HB_FUNCOBJ (hb_iter); /* Mixin to fill in what the subclass doesn't provide. */ template @@ -360,7 +361,8 @@ struct hb_map_iter_factory_t operator () (Proj&& f) const { return hb_map_iter_factory_t (f); } -} HB_FUNCOBJ (hb_map); +} +HB_FUNCOBJ (hb_map); template @@ -408,7 +410,8 @@ struct hb_filter_iter_factory_t operator () (Pred&& p = hb_bool, Proj&& f = hb_identity) const { return hb_filter_iter_factory_t (p, f); } -} HB_FUNCOBJ (hb_filter); +} +HB_FUNCOBJ (hb_filter); template struct hb_reduce_t @@ -437,7 +440,8 @@ struct hb_reduce_t operator () (Redu&& r, InitT init_value) const { return hb_reduce_t (r, init_value); } -} HB_FUNCOBJ (hb_reduce); +} +HB_FUNCOBJ (hb_reduce); /* hb_zip() */ @@ -480,7 +484,8 @@ struct hb_zip_iter_t operator () (A& a, B &b) const { return hb_zip_iter_t (hb_iter (a), hb_iter (b)); } -} HB_FUNCOBJ (hb_zip); +} +HB_FUNCOBJ (hb_zip); /* hb_enumerate */ @@ -526,7 +531,8 @@ struct hb_enumerate_iter_t operator () (Iterable& it) const { return hb_enumerate_iter_t (hb_iter (it)); } -} HB_FUNCOBJ (hb_enumerate); +} +HB_FUNCOBJ (hb_enumerate); /* hb_apply() */ @@ -556,7 +562,8 @@ struct template hb_apply_t operator () (Appl *a) const { return hb_apply_t (*a); } -} HB_FUNCOBJ (hb_apply); +} +HB_FUNCOBJ (hb_apply); /* hb_sink() */ @@ -586,7 +593,8 @@ struct template hb_sink_t operator () (Sink *s) const { return hb_sink_t (*s); } -} HB_FUNCOBJ (hb_sink); +} +HB_FUNCOBJ (hb_sink); /* hb-drain: hb_sink to void / blackhole / /dev/null. */ @@ -600,7 +608,8 @@ struct for (; it; ++it) (void) *it; } -} HB_FUNCOBJ (hb_drain); +} +HB_FUNCOBJ (hb_drain); /* hb_unzip(): unzip and sink to two sinks. */ @@ -635,7 +644,8 @@ struct template hb_unzip_t operator () (Sink1 *s1, Sink2 *s2) const { return hb_unzip_t (*s1, *s2); } -} HB_FUNCOBJ (hb_unzip); +} +HB_FUNCOBJ (hb_unzip); /* hb-all, hb-any, hb-none. */ @@ -652,7 +662,8 @@ struct return false; return true; } -} HB_FUNCOBJ (hb_all); +} +HB_FUNCOBJ (hb_all); struct { template (arg))); #pragma GCC diagnostic pop } -} HB_FUNCOBJ (hb_addressof); +} +HB_FUNCOBJ (hb_addressof); template static inline T hb_declval (); #define hb_declval(T) (hb_declval ()) @@ -125,8 +126,8 @@ struct template auto operator () (T *v) const HB_AUTO_RETURN (*v) - -} HB_FUNCOBJ (hb_deref); +} +HB_FUNCOBJ (hb_deref); struct { @@ -135,8 +136,8 @@ struct template auto operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v)) - -} HB_FUNCOBJ (hb_ref); +} +HB_FUNCOBJ (hb_ref); template struct hb_reference_wrapper From 035b818e34bbd2d5c1f65328c9847c845d74d919 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 17:21:18 -0700 Subject: [PATCH 072/617] [meta] Fix addressof() --- src/hb-meta.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 132e644d5..6eb13155d 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -71,7 +71,7 @@ template using hb_type_identity = typename hb_match_identity::ty struct { template - T* operator () (const T& arg) const + T* operator () (T& arg) const { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" From 839618de3b3da285e8753b6ca6d767e9a483bfde Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 17:21:27 -0700 Subject: [PATCH 073/617] [serializer] Minor --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index ccb7af988..bb2637114 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -371,7 +371,7 @@ struct hb_serialize_context_t } template Type *embed (const Type &obj) - { return embed (&obj); } + { return embed (hb_addressof (obj)); } template auto _copy (const Type &src, hb_priority<1>, Ts &&...ds) HB_RETURN From 5c0f62adc969696b46c1ceb57cd3c2fa408eb94f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 17:23:46 -0700 Subject: [PATCH 074/617] [serializer] Accept pointer & reference in more methods --- src/hb-serialize.hh | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index bb2637114..21545a802 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -324,14 +324,11 @@ struct hb_serialize_context_t } template - Type *start_embed (const Type &_ HB_UNUSED) const - { return start_embed (); } + Type *start_embed (const Type *obj HB_UNUSED = nullptr) const + { return reinterpret_cast (this->head); } template - Type *start_embed (const Type *_ HB_UNUSED = nullptr) const - { - Type *ret = reinterpret_cast (this->head); - return ret; - } + Type *start_embed (const Type &obj) const + { return start_embed (hb_addressof (obj)); } /* Following two functions exist to allow setting breakpoint on. */ void err_ran_out_of_room () { this->ran_out_of_room = true; } @@ -391,25 +388,37 @@ struct hb_serialize_context_t template Type *copy (const Type &src, Ts &&...ds) { return _copy (src, hb_prioritize, hb_forward (ds)...); } + template + Type *copy (const Type *src, Ts &&...ds) + { return copy (*src, hb_forward (ds)...); } template hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; } template - Type *extend_size (Type &obj, unsigned int size) + Type *extend_size (Type *obj, unsigned int size) { - assert (this->start <= (char *) &obj); - assert ((char *) &obj <= this->head); - assert ((char *) &obj + size >= this->head); - if (unlikely (!this->allocate_size (((char *) &obj) + size - this->head))) return nullptr; - return reinterpret_cast (&obj); + assert (this->start <= (char *) obj); + assert ((char *) obj <= this->head); + assert ((char *) obj + size >= this->head); + if (unlikely (!this->allocate_size (((char *) obj) + size - this->head))) return nullptr; + return reinterpret_cast (obj); } + template + Type *extend_size (Type &obj, unsigned int size) + { return extend_size (hb_addressof (obj), size); } template - Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); } + Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); } + template + Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); } template - Type *extend (Type &obj, Ts &&...ds) { return extend_size (obj, obj.get_size (hb_forward (ds)...)); } + Type *extend (Type *obj, Ts &&...ds) + { return extend_size (obj, obj->get_size (hb_forward (ds)...)); } + template + Type *extend (Type &obj, Ts &&...ds) + { return extend (hb_addressof (obj), hb_forward (ds)...); } /* Output routines. */ hb_bytes_t copy_bytes () const From 41248cce0e32653227a83eb4e42ccf793f040fc2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 20:54:31 -0700 Subject: [PATCH 075/617] Remove MIN/MAX in favor of hb_min/hb_max --- src/hb-aat-layout-common.hh | 8 ++++---- src/hb-aat-layout-feat-table.hh | 2 +- src/hb-aat-layout-kerx-table.hh | 2 +- src/hb-aat-layout-morx-table.hh | 18 +++++++++--------- src/hb-algs.hh | 14 +++++--------- src/hb-array.hh | 4 ++-- src/hb-blob.cc | 2 +- src/hb-buffer-serialize.cc | 32 ++++++++++++++++---------------- src/hb-buffer.cc | 4 ++-- src/hb-buffer.hh | 2 +- src/hb-common.cc | 20 ++++++++++---------- src/hb-coretext.cc | 6 +++--- src/hb-debug.hh | 2 +- src/hb-directwrite.cc | 2 +- src/hb-ft.cc | 2 +- src/hb-iter.hh | 2 +- src/hb-open-file.hh | 2 +- src/hb-open-type.hh | 2 +- src/hb-ot-cmap-table.hh | 8 ++++---- src/hb-ot-color-cbdt-table.hh | 6 +++--- src/hb-ot-color-cpal-table.hh | 2 +- src/hb-ot-color-sbix-table.hh | 2 +- src/hb-ot-glyf-table.hh | 14 +++++++------- src/hb-ot-hmtx-table.hh | 2 +- src/hb-ot-layout-gpos-table.hh | 2 +- src/hb-ot-layout-gsub-table.hh | 4 ++-- src/hb-ot-layout-gsubgpos.hh | 6 +++--- src/hb-ot-layout.cc | 2 +- src/hb-ot-map.cc | 8 ++++---- src/hb-ot-post-table.hh | 2 +- src/hb-ot-shape-complex-indic.cc | 8 ++++---- src/hb-ot-shape-complex-use.cc | 2 +- src/hb-ot-shape.cc | 4 ++-- src/hb-ot-tag.cc | 2 +- src/hb-ot-var-avar-table.hh | 2 +- src/hb-ot-var-fvar-table.hh | 18 +++++++++--------- src/hb-sanitize.hh | 4 ++-- src/hb-uniscribe.cc | 2 +- 38 files changed, 111 insertions(+), 115 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 95ac27128..ea24c9f0c 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -576,7 +576,7 @@ struct StateTable if (unlikely (stop > states)) return_trace (false); for (const HBUSHORT *p = states; stop < p; p--) - num_entries = MAX (num_entries, *(p - 1) + 1); + num_entries = hb_max (num_entries, *(p - 1) + 1); state_neg = min_state; } } @@ -597,7 +597,7 @@ struct StateTable if (unlikely (stop < states)) return_trace (false); for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++) - num_entries = MAX (num_entries, *p + 1); + num_entries = hb_max (num_entries, *p + 1); state_pos = max_state + 1; } } @@ -611,8 +611,8 @@ struct StateTable for (const Entry *p = &entries[entry]; p < stop; p++) { int newState = new_state (p->newState); - min_state = MIN (min_state, newState); - max_state = MAX (max_state, newState); + min_state = hb_min (min_state, newState); + max_state = hb_max (max_state, newState); } entry = num_entries; } diff --git a/src/hb-aat-layout-feat-table.hh b/src/hb-aat-layout-feat-table.hh index ab23ee056..a20ef8640 100644 --- a/src/hb-aat-layout-feat-table.hh +++ b/src/hb-aat-layout-feat-table.hh @@ -165,7 +165,7 @@ struct feat unsigned int feature_count = featureNameCount; if (count && *count) { - unsigned int len = MIN (feature_count - start_offset, *count); + unsigned int len = hb_min (feature_count - start_offset, *count); for (unsigned int i = 0; i < len; i++) features[i] = namesZ[i + start_offset].get_feature_type (); *count = len; diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index bb41fea9d..1b3f1f942 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -251,7 +251,7 @@ struct KerxSubTableFormat1 if (Format1EntryT::performAction (entry) && depth) { - unsigned int tuple_count = MAX (1u, table->header.tuple_count ()); + unsigned int tuple_count = hb_max (1u, table->header.tuple_count ()); unsigned int kern_idx = Format1EntryT::kernActionIndex (entry); kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ); diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 4c4ea6206..7aa830d64 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -88,7 +88,7 @@ struct RearrangementSubtable start = buffer->idx; if (flags & MarkLast) - end = MIN (buffer->idx + 1, buffer->len); + end = hb_min (buffer->idx + 1, buffer->len); if ((flags & Verb) && start < end) { @@ -117,14 +117,14 @@ struct RearrangementSubtable }; unsigned int m = map[flags & Verb]; - unsigned int l = MIN (2, m >> 4); - unsigned int r = MIN (2, m & 0x0F); + unsigned int l = hb_min (2u, m >> 4); + unsigned int r = hb_min (2u, m & 0x0F); bool reverse_l = 3 == (m >> 4); bool reverse_r = 3 == (m & 0x0F); if (end - start >= l + r) { - buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len)); + buffer->merge_clusters (start, hb_min (buffer->idx + 1, buffer->len)); buffer->merge_clusters (start, end); hb_glyph_info_t *info = buffer->info; @@ -261,13 +261,13 @@ struct ContextualSubtable } if (replacement) { - buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len)); + buffer->unsafe_to_break (mark, hb_min (buffer->idx + 1, buffer->len)); buffer->info[mark].codepoint = *replacement; ret = true; } replacement = nullptr; - unsigned int idx = MIN (buffer->idx, buffer->len - 1); + unsigned int idx = hb_min (buffer->idx, buffer->len - 1); if (Types::extended) { if (entry.data.currentIndex != 0xFFFF) @@ -337,9 +337,9 @@ struct ContextualSubtable const EntryData &data = entries[i].data; if (data.markIndex != 0xFFFF) - num_lookups = MAX (num_lookups, 1 + data.markIndex); + num_lookups = hb_max (num_lookups, 1 + data.markIndex); if (data.currentIndex != 0xFFFF) - num_lookups = MAX (num_lookups, 1 + data.currentIndex); + num_lookups = hb_max (num_lookups, 1 + data.currentIndex); } return_trace (substitutionTables.sanitize (c, this, num_lookups)); @@ -744,7 +744,7 @@ struct InsertionSubtable buffer->move_to (end + count); - buffer->unsafe_to_break_from_outbuffer (mark, MIN (buffer->idx + 1, buffer->len)); + buffer->unsafe_to_break_from_outbuffer (mark, hb_min (buffer->idx + 1, buffer->len)); } if (flags & SetMark) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 2d2fe31f0..eeac4b956 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -186,6 +186,10 @@ struct } HB_FUNCOBJ (hb_second); +/* Note. In min/max, we can use hb_type_identity for second argument. + * However, that would silently convert between different-signedness integers. + * Instead we accept two different types, such that compiler can err if + * comparing integers of different signedness. */ struct { template auto @@ -409,14 +413,6 @@ static inline unsigned char TOUPPER (unsigned char c) static inline unsigned char TOLOWER (unsigned char c) { return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; } -#undef MIN -template -static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; } - -#undef MAX -template -static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; } - static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b) { return (a + (b - 1)) / b; } @@ -668,7 +664,7 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o { /* Pain because we don't know whether s is nul-terminated. */ char buf[64]; - len = MIN (ARRAY_LENGTH (buf) - 1, len); + len = hb_min (ARRAY_LENGTH (buf) - 1, len); strncpy (buf, s, len); buf[len] = '\0'; diff --git a/src/hb-array.hh b/src/hb-array.hh index 37ca63d35..2da8df0bb 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -143,7 +143,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> } void qsort (unsigned int start, unsigned int end) { - end = MIN (end, length); + end = hb_min (end, length); assert (start <= end); if (likely (start < end)) ::qsort (arrayZ + start, end - start, this->item_size, Type::cmp); @@ -166,7 +166,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> else count -= start_offset; if (seg_count) - count = *seg_count = MIN (count, *seg_count); + count = *seg_count = hb_min (count, *seg_count); return hb_array_t (arrayZ + start_offset, count); } hb_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 54637c727..699f66b1a 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -155,7 +155,7 @@ hb_blob_create_sub_blob (hb_blob_t *parent, hb_blob_make_immutable (parent); blob = hb_blob_create (parent->data + offset, - MIN (length, parent->length - offset), + hb_min (length, parent->length - offset), HB_MEMORY_MODE_READONLY, hb_blob_reference (parent), _hb_blob_destroy); diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc index 6e265e84c..dcbdcea45 100644 --- a/src/hb-buffer-serialize.cc +++ b/src/hb-buffer-serialize.cc @@ -138,34 +138,34 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, *p++ = '"'; } else - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster)); } if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", x+pos[i].x_offset, y+pos[i].y_offset)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", pos[i].x_advance, pos[i].y_advance)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) { if (info[i].mask & HB_GLYPH_FLAG_DEFINED) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS) { hb_glyph_extents_t extents; hb_font_get_glyph_extents(font, info[i].codepoint, &extents); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d", extents.x_bearing, extents.y_bearing)); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d", extents.width, extents.height)); } @@ -224,37 +224,37 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, p += strlen (p); } else - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster)); } if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { if (x+pos[i].x_offset || y+pos[i].y_offset) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) { *p++ = '+'; - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); if (pos[i].y_advance) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); } } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) { if (info[i].mask & HB_GLYPH_FLAG_DEFINED) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS) { hb_glyph_extents_t extents; hb_font_get_glyph_extents(font, info[i].codepoint, &extents); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height)); } unsigned int l = p - b; @@ -380,7 +380,7 @@ static hb_bool_t parse_uint (const char *pp, const char *end, uint32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); strncpy (buf, pp, len); buf[len] = '\0'; @@ -401,7 +401,7 @@ static hb_bool_t parse_int (const char *pp, const char *end, int32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); strncpy (buf, pp, len); buf[len] = '\0'; diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 2dc02e9d6..d95404f5c 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -524,7 +524,7 @@ hb_buffer_t::merge_clusters_impl (unsigned int start, unsigned int cluster = info[start].cluster; for (unsigned int i = start + 1; i < end; i++) - cluster = MIN (cluster, info[i].cluster); + cluster = hb_min (cluster, info[i].cluster); /* Extend end */ while (end < len && info[end - 1].cluster == info[end].cluster) @@ -555,7 +555,7 @@ hb_buffer_t::merge_out_clusters (unsigned int start, unsigned int cluster = out_info[start].cluster; for (unsigned int i = start + 1; i < end; i++) - cluster = MIN (cluster, out_info[i].cluster); + cluster = hb_min (cluster, out_info[i].cluster); /* Extend start */ while (start && out_info[start - 1].cluster == out_info[start].cluster) diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index 330f88bac..b2b190ace 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -379,7 +379,7 @@ struct hb_buffer_t unsigned int cluster) const { for (unsigned int i = start; i < end; i++) - cluster = MIN (cluster, infos[i].cluster); + cluster = hb_min (cluster, infos[i].cluster); return cluster; } void diff --git a/src/hb-common.cc b/src/hb-common.cc index 6db801cdd..70be6939b 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -356,7 +356,7 @@ hb_language_from_string (const char *str, int len) { /* NUL-terminate it. */ char strbuf[64]; - len = MIN (len, (int) sizeof (strbuf) - 1); + len = hb_min (len, (int) sizeof (strbuf) - 1); memcpy (strbuf, str, len); strbuf[len] = '\0'; item = lang_find_or_insert (strbuf); @@ -720,7 +720,7 @@ static bool parse_uint (const char **pp, const char *end, unsigned int *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -744,7 +744,7 @@ static bool parse_uint32 (const char **pp, const char *end, uint32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -825,7 +825,7 @@ static bool parse_float (const char **pp, const char *end, float *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -1071,21 +1071,21 @@ hb_feature_to_string (hb_feature_t *feature, { s[len++] = '['; if (feature->start) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start)); + len += hb_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, "%u", feature->end)); + len += hb_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, "%u", feature->value)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value)); } assert (len < ARRAY_LENGTH (s)); - len = MIN (len, size - 1); + len = hb_min (len, size - 1); memcpy (buf, s, len); buf[len] = '\0'; } @@ -1152,10 +1152,10 @@ hb_variation_to_string (hb_variation_t *variation, while (len && s[len - 1] == ' ') len--; s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); assert (len < ARRAY_LENGTH (s)); - len = MIN (len, size - 1); + len = hb_min (len, size - 1); memcpy (buf, s, len); buf[len] = '\0'; } diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 66f0fce1a..e0579bed8 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -771,7 +771,7 @@ resize_and_retry: feature.start < chars_len && feature.start < feature.end) { CFRange feature_range = CFRangeMake (feature.start, - MIN (feature.end, chars_len) - feature.start); + hb_min (feature.end, chars_len) - feature.start); if (feature.value) CFAttributedStringRemoveAttribute (attr_string, feature_range, kCTKernAttributeName); else @@ -1116,7 +1116,7 @@ resize_and_retry: unsigned int cluster = info[count - 1].cluster; for (unsigned int i = count - 1; i > 0; i--) { - cluster = MIN (cluster, info[i - 1].cluster); + cluster = hb_min (cluster, info[i - 1].cluster); info[i - 1].cluster = cluster; } } @@ -1125,7 +1125,7 @@ resize_and_retry: unsigned int cluster = info[0].cluster; for (unsigned int i = 1; i < count; i++) { - cluster = MIN (cluster, info[i].cluster); + cluster = hb_min (cluster, info[i].cluster); info[i].cluster = cluster; } } diff --git a/src/hb-debug.hh b/src/hb-debug.hh index e5328e916..57b3f1b04 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -161,7 +161,7 @@ _hb_debug_msg_va (const char *what, VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR; fprintf (stderr, "%2u %s" VRBAR "%s", level, - bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level), + bars + sizeof (bars) - 1 - hb_min ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level), level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR); } else fprintf (stderr, " " VRBAR LBAR); diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 8f2e66025..6b2761e83 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -778,7 +778,7 @@ retry_getglyphs: { uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index ()]]; - *p = MIN (*p, buffer->info[i].cluster); + *p = hb_min (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphCount; i++) if (vis_clusters[i] == (uint32_t) -1) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index f8dab8bc1..d70c38a7a 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -439,7 +439,7 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED, else { /* Make a nul-terminated version. */ char buf[128]; - len = MIN (len, (int) sizeof (buf) - 1); + len = hb_min (len, (int) sizeof (buf) - 1); strncpy (buf, name, len); buf[len] = '\0'; *glyph = FT_Get_Name_Index (ft_face, buf); diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 418ae9576..7358256c8 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -464,7 +464,7 @@ struct hb_zip_iter_t : __item_t__ __item__ () const { return __item_t__ (*a, *b); } __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } bool __more__ () const { return a && b; } - unsigned __len__ () const { return MIN (a.len (), b.len ()); } + unsigned __len__ () const { return hb_min (a.len (), b.len ()); } void __next__ () { ++a; ++b; } void __forward__ (unsigned n) { a += n; b += n; } void __prev__ () { --a; --b; } diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh index 0689facd0..5318c7fca 100644 --- a/src/hb-open-file.hh +++ b/src/hb-open-file.hh @@ -94,7 +94,7 @@ typedef struct OffsetTable if (start_offset >= tables.len) *table_count = 0; else - *table_count = MIN (*table_count, tables.len - start_offset); + *table_count = hb_min (*table_count, tables.len - start_offset); const TableRecord *sub_tables = tables.arrayZ + start_offset; unsigned int count = *table_count; diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 2bfbee525..9458ceea7 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -921,7 +921,7 @@ struct BinSearchHeader { len = v; assert (len == v); - entrySelector = MAX (1u, hb_bit_storage (v)) - 1; + entrySelector = hb_max (1u, hb_bit_storage (v)) - 1; searchRange = 16 * (1u << entrySelector); rangeShift = v * 16 > searchRange ? 16 * v - searchRange diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 0a7d1ef67..b4c8c608b 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -93,7 +93,7 @@ struct CmapSubtableFormat4 this->length = get_sub_table_size (segments); this->segCountX2 = segments.length * 2; - this->entrySelector = MAX (1u, hb_bit_storage (segments.length)) - 1; + this->entrySelector = hb_max (1u, hb_bit_storage (segments.length)) - 1; this->searchRange = 2 * (1u << this->entrySelector); this->rangeShift = segments.length * 2 > this->searchRange ? 2 * segments.length - this->searchRange @@ -348,7 +348,7 @@ struct CmapSubtableFormat4 /* Some broken fonts have too long of a "length" value. * If that is the case, just change the value to truncate * the subtable at the end of the blob. */ - uint16_t new_length = (uint16_t) MIN ((uintptr_t) 65535, + uint16_t new_length = (uint16_t) hb_min ((uintptr_t) 65535, (uintptr_t) (c->end - (char *) this)); if (!c->try_set (&length, new_length)) @@ -478,7 +478,7 @@ struct CmapSubtableLongSegmented { for (unsigned int i = 0; i < this->groups.len; i++) { out->add_range (this->groups[i].startCharCode, - MIN ((hb_codepoint_t) this->groups[i].endCharCode, + hb_min ((hb_codepoint_t) this->groups[i].endCharCode, (hb_codepoint_t) HB_UNICODE_MAX)); } } @@ -623,7 +623,7 @@ struct DefaultUVS : SortedArrayOf for (unsigned int i = 0; i < count; i++) { hb_codepoint_t first = arrayZ[i].startUnicodeValue; - hb_codepoint_t last = MIN ((hb_codepoint_t) (first + arrayZ[i].additionalCount), + hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount), (hb_codepoint_t) HB_UNICODE_MAX); out->add_range (first, last); } diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index b6dc364a1..96b14bd68 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -349,15 +349,15 @@ struct CBLC if (unlikely (!count)) return Null(BitmapSizeTable); - unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem); if (!requested_ppem) requested_ppem = 1<<30; /* Choose largest strike. */ unsigned int best_i = 0; - unsigned int best_ppem = MAX (sizeTables[0].ppemX, sizeTables[0].ppemY); + unsigned int best_ppem = hb_max (sizeTables[0].ppemX, sizeTables[0].ppemY); for (unsigned int i = 1; i < count; i++) { - unsigned int ppem = MAX (sizeTables[i].ppemX, sizeTables[i].ppemY); + unsigned int ppem = hb_max (sizeTables[i].ppemX, sizeTables[i].ppemY); if ((requested_ppem <= ppem && ppem < best_ppem) || (requested_ppem > best_ppem && ppem > best_ppem)) { diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index 7df7059a8..9ec2957ea 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -144,7 +144,7 @@ struct CPAL { hb_array_t segment_colors = palette_colors.sub_array (start_offset, *color_count); /* Always return numColors colors per palette even if it has out-of-bounds start index. */ - unsigned int count = MIN (MAX (numColors - start_offset, 0), *color_count); + unsigned int count = hb_min ((unsigned) hb_max ((int) (numColors - start_offset), 0), *color_count); *color_count = count; for (unsigned int i = 0; i < count; i++) colors[i] = segment_colors[i]; /* Bound-checked read. */ diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index 670c05504..f9739f9ef 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -175,7 +175,7 @@ struct sbix if (unlikely (!count)) return Null(SBIXStrike); - unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem); if (!requested_ppem) requested_ppem = 1<<30; /* Choose largest strike. */ /* TODO Add DPI sensitivity as well? */ diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index b595e5efe..2a96c2e35 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -58,7 +58,7 @@ struct loca public: DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always * check the size externally, allow Null() object of it by - * defining it MIN() instead. */ + * defining it _MIN instead. */ }; @@ -241,7 +241,7 @@ struct glyf loca_table = hb_sanitize_context_t ().reference_table (face); glyf_table = hb_sanitize_context_t ().reference_table (face); - num_glyphs = MAX (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1; + num_glyphs = hb_max (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1; } void fini () @@ -451,10 +451,10 @@ struct glyf const GlyphHeader &glyph_header = StructAtOffset (glyf_table, start_offset); - extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax); - extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax); - extents->width = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing; - extents->height = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing; + extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); + extents->y_bearing = hb_max (glyph_header.yMin, glyph_header.yMax); + extents->width = hb_max (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing; + extents->height = hb_min (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing; return true; } @@ -471,7 +471,7 @@ struct glyf public: DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always * check the size externally, allow Null() object of it by - * defining it MIN() instead. */ + * defining it _MIN instead. */ }; struct glyf_accelerator_t : glyf::accelerator_t {}; diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index 5dff981ef..b3a97109b 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -240,7 +240,7 @@ struct hmtxvmtx return default_advance; } - return table->longMetricZ[MIN (glyph, (uint32_t) num_advances - 1)].advance; + return table->longMetricZ[hb_min (glyph, (uint32_t) num_advances - 1)].advance; } unsigned int get_advance (hb_codepoint_t glyph, diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 556e4316d..4693f3818 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1287,7 +1287,7 @@ struct MarkLigPosFormat1 unsigned int mark_id = _hb_glyph_info_get_lig_id (&buffer->cur()); unsigned int mark_comp = _hb_glyph_info_get_lig_comp (&buffer->cur()); if (lig_id && lig_id == mark_id && mark_comp > 0) - comp_index = MIN (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1; + comp_index = hb_min (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1; else comp_index = comp_count - 1; diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index c5ebe44ec..5b25137c8 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -484,7 +484,7 @@ struct AlternateSet unsigned int shift = hb_ctz (lookup_mask); unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift); - /* If alt_index is MAX, randomize feature if it is the rand feature. */ + /* If alt_index is MAX_VALUE, randomize feature if it is the rand feature. */ if (alt_index == HB_OT_MAP_MAX_VALUE && c->random) alt_index = c->random_number () % count + 1; @@ -792,7 +792,7 @@ struct LigatureSet if (unlikely (!ligature.serialize (c, ligatures.length))) return_trace (false); for (unsigned int i = 0; i < ligatures.length; i++) { - unsigned int component_count = MAX (component_count_list[i] - 1, 0); + unsigned int component_count = (unsigned) hb_max ((int) component_count_list[i] - 1, 0); if (unlikely (!ligature[i].serialize (c, this) .serialize (c, ligatures[i], diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 5837e76d9..3c4bfa2c3 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -973,7 +973,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c, if (this_comp == 0) this_comp = last_num_components; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (this_comp, last_num_components); + hb_min (this_comp, last_num_components); _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp); } buffer->next_glyph (); @@ -995,7 +995,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c, if (!this_comp) break; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (this_comp, last_num_components); + hb_min (this_comp, last_num_components); _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp); } else break; @@ -1173,7 +1173,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c, else { /* NOTE: delta is negative. */ - delta = MAX (delta, (int) next - (int) count); + delta = hb_max (delta, (int) next - (int) count); next -= delta; } diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 1e2d159b5..817b28e68 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1735,7 +1735,7 @@ hb_ot_layout_feature_get_characters (hb_face_t *face, unsigned int len = 0; if (char_count && characters && start_offset < cv_params.characters.len) { - len = MIN (cv_params.characters.len - start_offset, *char_count); + len = hb_min (cv_params.characters.len - start_offset, *char_count); for (unsigned int i = 0; i < len; ++i) characters[i] = cv_params.characters[start_offset + i]; } diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 846414c9b..92d70bb41 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -188,12 +188,12 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, feature_infos[j].default_value = feature_infos[i].default_value; } else { feature_infos[j].flags &= ~F_GLOBAL; - feature_infos[j].max_value = MAX (feature_infos[j].max_value, feature_infos[i].max_value); + feature_infos[j].max_value = hb_max (feature_infos[j].max_value, feature_infos[i].max_value); /* Inherit default_value from j */ } feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK); - feature_infos[j].stage[0] = MIN (feature_infos[j].stage[0], feature_infos[i].stage[0]); - feature_infos[j].stage[1] = MIN (feature_infos[j].stage[1], feature_infos[i].stage[1]); + feature_infos[j].stage[0] = hb_min (feature_infos[j].stage[0], feature_infos[i].stage[0]); + feature_infos[j].stage[1] = hb_min (feature_infos[j].stage[1], feature_infos[i].stage[1]); } feature_infos.shrink (j + 1); } @@ -213,7 +213,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, bits_needed = 0; else /* Limit bits per feature. */ - bits_needed = MIN(HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value)); + bits_needed = hb_min (HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value)); if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t)) continue; /* Feature disabled, or not enough bits. */ diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 21aa94dad..12e08316a 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -131,7 +131,7 @@ struct post hb_bytes_t s = find_glyph_name (glyph); if (!s.length) return false; if (!buf_len) return true; - unsigned int len = MIN (buf_len - 1, s.length); + unsigned int len = hb_min (buf_len - 1, s.length); strncpy (buf, s.arrayZ, len); buf[len] = '\0'; return true; diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 6d46fe33c..7befbf630 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -645,7 +645,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Reorder characters */ for (unsigned int i = start; i < base; i++) - info[i].indic_position() = MIN (POS_PRE_C, (indic_position_t) info[i].indic_position()); + info[i].indic_position() = hb_min (POS_PRE_C, (indic_position_t) info[i].indic_position()); if (base < end) info[base].indic_position() = POS_BASE_C; @@ -801,7 +801,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, unsigned int j = start + info[i].syllable(); while (j != i) { - max = MAX (max, j); + max = hb_max (max, j); unsigned int next = start + info[j].syllable(); info[j].syllable() = 255; /* So we don't process j later again. */ j = next; @@ -1231,14 +1231,14 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* Note: this merge_clusters() is intentionally *after* the reordering. * Indic matra reordering is special and tricky... */ - buffer->merge_clusters (new_pos, MIN (end, base + 1)); + buffer->merge_clusters (new_pos, hb_min (end, base + 1)); new_pos--; } } else { for (unsigned int i = start; i < base; i++) if (info[i].indic_position () == POS_PRE_M) { - buffer->merge_clusters (i, MIN (end, base + 1)); + buffer->merge_clusters (i, hb_min (end, base + 1)); break; } } diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index ec4d4aa7e..cbaa519c4 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -294,7 +294,7 @@ setup_rphf_mask (const hb_ot_shape_plan_t *plan, foreach_syllable (buffer, start, end) { - unsigned int limit = info[start].use_category() == USE_R ? 1 : MIN (3u, end - start); + unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start); for (unsigned int i = start; i < start + limit; i++) info[i].mask |= mask; } diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 7fff3059e..03d9a68ae 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -962,12 +962,12 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c) c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT; if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR))) { - c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR, + c->buffer->max_len = hb_max (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR, (unsigned) HB_BUFFER_MAX_LEN_MIN); } if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR))) { - c->buffer->max_ops = MAX (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR, + c->buffer->max_ops = hb_max (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR, (unsigned) HB_BUFFER_MAX_OPS_MIN); } diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index c57c688d4..4b42da42d 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -212,7 +212,7 @@ struct LangTag p = strchr (b, '-'); db = p ? (unsigned int) (p - b) : strlen (b); - return strncmp (a, b, MAX (da, db)); + return strncmp (a, b, hb_max (da, db)); } int cmp (const LangTag *that) const { return cmp (that->language); } diff --git a/src/hb-ot-var-avar-table.hh b/src/hb-ot-var-avar-table.hh index c4a192dc9..57a3a6d16 100644 --- a/src/hb-ot-var-avar-table.hh +++ b/src/hb-ot-var-avar-table.hh @@ -123,7 +123,7 @@ struct avar void map_coords (int *coords, unsigned int coords_length) const { - unsigned int count = MIN (coords_length, axisCount); + unsigned int count = hb_min (coords_length, axisCount); const SegmentMaps *map = &firstAxisSegmentMaps; for (unsigned int i = 0; i < count; i++) diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 78cb3c867..3565185fd 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -122,8 +122,8 @@ struct fvar info->name_id = axis.axisNameID; info->default_value = axis.defaultValue / 65536.; /* Ensure order, to simplify client math. */ - info->min_value = MIN (info->default_value, axis.minValue / 65536.); - info->max_value = MAX (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.); } void get_axis_info (unsigned int axis_index, @@ -136,8 +136,8 @@ struct fvar info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags; info->default_value = axis.defaultValue / 65536.; /* Ensure order, to simplify client math. */ - info->min_value = MIN (info->default_value, axis.minValue / 65536.); - info->max_value = MAX (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.); info->reserved = 0; } @@ -149,12 +149,12 @@ struct fvar { /* TODO Rewrite as hb_array_t<>::sub-array() */ unsigned int count = axisCount; - start_offset = MIN (start_offset, count); + start_offset = hb_min (start_offset, count); count -= start_offset; axes_array += start_offset; - count = MIN (count, *axes_count); + count = hb_min (count, *axes_count); *axes_count = count; for (unsigned int i = 0; i < count; i++) @@ -171,12 +171,12 @@ struct fvar { /* TODO Rewrite as hb_array_t<>::sub-array() */ unsigned int count = axisCount; - start_offset = MIN (start_offset, count); + start_offset = hb_min (start_offset, count); count -= start_offset; axes_array += start_offset; - count = MIN (count, *axes_count); + count = hb_min (count, *axes_count); *axes_count = count; for (unsigned int i = 0; i < count; i++) @@ -223,7 +223,7 @@ struct fvar hb_ot_var_axis_info_t axis; get_axis_info (axis_index, &axis); - v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */ + v = hb_max (hb_min (v, axis.max_value), axis.min_value); /* Clamp. */ if (v == axis.default_value) return 0; diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 6799b7862..982723362 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -175,7 +175,7 @@ struct hb_sanitize_context_t : else { this->start = obj_start; - this->end = obj_start + MIN (this->end - obj_start, obj->get_size ()); + this->end = obj_start + hb_min (this->end - obj_start, obj->get_size ()); } } @@ -189,7 +189,7 @@ struct hb_sanitize_context_t : void start_processing () { reset_object (); - this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, + this->max_ops = hb_max ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, (unsigned) HB_SANITIZE_MAX_OPS_MIN); this->edit_count = 0; this->debug_depth = 0; diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 4bbbf6122..ac4ff6366 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -967,7 +967,7 @@ retry: vis_clusters[i] = (uint32_t) -1; for (unsigned int i = 0; i < buffer->len; i++) { uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]]; - *p = MIN (*p, buffer->info[i].cluster); + *p = hb_min (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphs_len; i++) if (vis_clusters[i] == (uint32_t) -1) From 2b9402a86a4e37e6386f8028bdf3789ae262a4c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 20:55:33 -0700 Subject: [PATCH 076/617] Use universal references in hb_min/max --- src/hb-algs.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index eeac4b956..fe41702cf 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -193,13 +193,13 @@ HB_FUNCOBJ (hb_second); struct { template auto - operator () (const T& a, const T2& b) const HB_AUTO_RETURN (a <= b ? a : b) + operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b) } HB_FUNCOBJ (hb_min); struct { template auto - operator () (const T& a, const T2& b) const HB_AUTO_RETURN (a >= b ? a : b) + operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b) } HB_FUNCOBJ (hb_max); From 83e3eabd84e2b53c696768d1357a6a259bcd3576 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 20:58:43 -0700 Subject: [PATCH 077/617] Whitespace --- src/hb-aat-layout-common.hh | 2 +- src/hb-aat-layout-kerx-table.hh | 2 +- src/hb-aat-layout-morx-table.hh | 2 +- src/hb-algs.hh | 6 +++--- src/hb-dispatch.hh | 2 +- src/hb-open-type.hh | 18 +++++++++--------- src/hb-ot-kern-table.hh | 4 ++-- src/hb-ot-layout-common.hh | 2 +- src/hb-ot-layout-gpos-table.hh | 16 ++++++++-------- src/hb-ot-layout-gsub-table.hh | 14 +++++++------- src/hb-ot-layout-gsubgpos.hh | 8 ++++---- src/hb-sanitize.hh | 6 +++--- src/hb-serialize.hh | 12 ++++++------ src/hb-subset.hh | 6 +++--- 14 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index ea24c9f0c..a8c4b7637 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -154,7 +154,7 @@ struct LookupSegmentArray valuesZ.sanitize (c, base, last - first + 1)); } template - bool sanitize (hb_sanitize_context_t *c, const void *base, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 1b3f1f942..cec63ac6d 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -772,7 +772,7 @@ struct KerxSubTable unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 7aa830d64..81d78972a 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -884,7 +884,7 @@ struct ChainSubtable }; template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); diff --git a/src/hb-algs.hh b/src/hb-algs.hh index fe41702cf..23cb9b061 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -75,7 +75,7 @@ struct /* Pointer-to-member-function. */ template auto - impl (Appl&& a, hb_priority<2>, Val1 &&v1, Vals &&...vs) const HB_AUTO_RETURN + impl (Appl&& a, hb_priority<2>, Val1 &&v1, Vals&&... vs) const HB_AUTO_RETURN ((hb_deref (hb_forward (v1)).*hb_forward (a)) (hb_forward (vs)...)) /* Pointer-to-member. */ @@ -85,13 +85,13 @@ struct /* Operator(). */ template auto - impl (Appl&& a, hb_priority<0>, Vals &&...vs) const HB_AUTO_RETURN + impl (Appl&& a, hb_priority<0>, Vals&&... vs) const HB_AUTO_RETURN (hb_deref (hb_forward (a)) (hb_forward (vs)...)) public: template auto - operator () (Appl&& a, Vals &&...vs) const HB_AUTO_RETURN + operator () (Appl&& a, Vals&&... vs) const HB_AUTO_RETURN ( impl (hb_forward (a), hb_prioritize, diff --git a/src/hb-dispatch.hh b/src/hb-dispatch.hh index 6b497823d..be4a90f4f 100644 --- a/src/hb-dispatch.hh +++ b/src/hb-dispatch.hh @@ -48,7 +48,7 @@ struct hb_dispatch_context_t template bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } template - return_t dispatch (const T &obj, Ts &&...ds) + return_t dispatch (const T &obj, Ts&&... ds) { return obj.dispatch (thiz (), hb_forward (ds)...); } static return_t no_dispatch_return_value () { return Context::default_return_value (); } static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 9458ceea7..e2e562300 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -285,7 +285,7 @@ struct OffsetTo : Offset } template - bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts &&...ds) + bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts&&... ds) { *this = 0; if (has_null && &src == _hb_has_null::get_null ()) @@ -307,7 +307,7 @@ struct OffsetTo : Offset /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */ template - bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts &&...ds) + bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts&&... ds) { *this = 0; if (has_null && &src == _hb_has_null::get_null ()) @@ -332,7 +332,7 @@ struct OffsetTo : Offset } template - bool sanitize (hb_sanitize_context_t *c, const void *base, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace (sanitize_shallow (c, base) && @@ -465,7 +465,7 @@ struct UnsizedArrayOf return_trace (true); } template - bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); @@ -511,7 +511,7 @@ struct UnsizedOffsetListOf : UnsizedOffsetArrayOf } template - bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace ((UnsizedOffsetArrayOf @@ -647,7 +647,7 @@ struct ArrayOf return_trace (true); } template - bool sanitize (hb_sanitize_context_t *c, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); @@ -721,7 +721,7 @@ struct OffsetListOf : OffsetArrayOf } template - bool sanitize (hb_sanitize_context_t *c, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace (OffsetArrayOf::sanitize (c, this, hb_forward (ds)...)); @@ -823,7 +823,7 @@ struct ArrayOfM1 { return lenM1.static_size + (lenM1 + 1) * Type::static_size; } template - bool sanitize (hb_sanitize_context_t *c, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); @@ -1028,7 +1028,7 @@ struct VarSizedBinSearchArrayOf return_trace (true); } template - bool sanitize (hb_sanitize_context_t *c, Ts &&...ds) const + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 1310b843c..436dad45d 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -122,7 +122,7 @@ struct KernSubTable } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); @@ -305,7 +305,7 @@ struct kern { return dispatch (c); } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 153ee83e5..17a03c85f 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -683,7 +683,7 @@ struct Lookup } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int lookup_type = get_type (); TRACE_DISPATCH (this, lookup_type); diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 4693f3818..228820a17 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -577,7 +577,7 @@ struct SinglePosFormat2 struct SinglePos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -908,7 +908,7 @@ struct PairPosFormat2 struct PairPos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1093,7 +1093,7 @@ struct CursivePosFormat1 struct CursivePos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1209,7 +1209,7 @@ struct MarkBasePosFormat1 struct MarkBasePos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1334,7 +1334,7 @@ struct MarkLigPosFormat1 struct MarkLigPos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1456,7 +1456,7 @@ struct MarkMarkPosFormat1 struct MarkMarkPos { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1508,7 +1508,7 @@ struct PosLookupSubTable }; template - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { @@ -1582,7 +1582,7 @@ struct PosLookup : Lookup static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { return Lookup::dispatch (c, hb_forward (ds)...); } bool subset (hb_subset_context_t *c) const diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 5b25137c8..364ef189e 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -252,7 +252,7 @@ struct SingleSubst } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -441,7 +441,7 @@ struct MultipleSubst } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -615,7 +615,7 @@ struct AlternateSubst } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -946,7 +946,7 @@ struct LigatureSubst } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1114,7 +1114,7 @@ struct ReverseChainSingleSubstFormat1 struct ReverseChainSingleSubst { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -1154,7 +1154,7 @@ struct SubstLookupSubTable }; template - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { @@ -1332,7 +1332,7 @@ struct SubstLookup : Lookup } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { return Lookup::dispatch (c, hb_forward (ds)...); } bool subset (hb_subset_context_t *c) const diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 3c4bfa2c3..3d4a1bca8 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1764,7 +1764,7 @@ struct ContextFormat3 struct Context { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -2475,7 +2475,7 @@ struct ChainContextFormat3 struct ChainContext { template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); @@ -2511,7 +2511,7 @@ struct ExtensionFormat1 } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, format); if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ()); @@ -2558,7 +2558,7 @@ struct Extension } template - typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 982723362..ac424c1d9 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -136,14 +136,14 @@ struct hb_sanitize_context_t : private: template auto - _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN ( obj.sanitize (this, hb_forward (ds)...) ) template auto - _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN ( obj.dispatch (this, hb_forward (ds)...) ) public: template auto - dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 21545a802..e0f79809f 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -134,7 +134,7 @@ struct hb_serialize_context_t template bool propagate_error (T &&obj) { return check_success (!hb_deref (obj).in_error ()); } - template bool propagate_error (T1 &&o1, Ts &&...os) + template bool propagate_error (T1 &&o1, Ts&&... os) { return propagate_error (hb_forward (o1)) && propagate_error (hb_forward (os)...); } @@ -371,7 +371,7 @@ struct hb_serialize_context_t { return embed (hb_addressof (obj)); } template auto - _copy (const Type &src, hb_priority<1>, Ts &&...ds) HB_RETURN + _copy (const Type &src, hb_priority<1>, Ts&&... ds) HB_RETURN (Type *, src.copy (this, hb_forward (ds)...)) template auto @@ -386,10 +386,10 @@ struct hb_serialize_context_t /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data * instead of memcpy(). */ template - Type *copy (const Type &src, Ts &&...ds) + Type *copy (const Type &src, Ts&&... ds) { return _copy (src, hb_prioritize, hb_forward (ds)...); } template - Type *copy (const Type *src, Ts &&...ds) + Type *copy (const Type *src, Ts&&... ds) { return copy (*src, hb_forward (ds)...); } template @@ -414,10 +414,10 @@ struct hb_serialize_context_t Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); } template - Type *extend (Type *obj, Ts &&...ds) + Type *extend (Type *obj, Ts&&... ds) { return extend_size (obj, obj->get_size (hb_forward (ds)...)); } template - Type *extend (Type &obj, Ts &&...ds) + Type *extend (Type &obj, Ts&&... ds) { return extend (hb_addressof (obj), hb_forward (ds)...); } /* Output routines. */ diff --git a/src/hb-subset.hh b/src/hb-subset.hh index 1c3f41fdd..b8dd07ab2 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -44,14 +44,14 @@ struct hb_subset_context_t : private: template auto - _dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN + _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN ( obj.subset (this, hb_forward (ds)...) ) template auto - _dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN + _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN ( obj.dispatch (this, hb_forward (ds)...) ) public: template auto - dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN + dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN ( _dispatch (obj, hb_prioritize, hb_forward (ds)...) ) hb_subset_plan_t *plan; From 1ad07080c3ea7f6a1b3cb247529ec0c78575a6d3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 21:00:23 -0700 Subject: [PATCH 078/617] Rename --- src/hb-algs.hh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 23cb9b061..7ed42d65f 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -74,28 +74,28 @@ struct private: /* Pointer-to-member-function. */ - template auto - impl (Appl&& a, hb_priority<2>, Val1 &&v1, Vals&&... vs) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v1)).*hb_forward (a)) (hb_forward (vs)...)) + template auto + impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v)).*hb_forward (a)) (hb_forward (ds)...)) /* Pointer-to-member. */ - template auto - impl (Appl&& a, hb_priority<1>, Val &&v) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v))).*hb_forward (a)) + template auto + impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v))).*hb_forward (a)) /* Operator(). */ - template auto - impl (Appl&& a, hb_priority<0>, Vals&&... vs) const HB_AUTO_RETURN - (hb_deref (hb_forward (a)) (hb_forward (vs)...)) + template auto + impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN + (hb_deref (hb_forward (a)) (hb_forward (ds)...)) public: - template auto - operator () (Appl&& a, Vals&&... vs) const HB_AUTO_RETURN + template auto + operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN ( impl (hb_forward (a), hb_prioritize, - hb_forward (vs)...) + hb_forward (ds)...) ) } HB_FUNCOBJ (hb_invoke); From 6fa1f38070e710b2f80a836bd633b6ab33e1bc80 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 21:33:26 -0700 Subject: [PATCH 079/617] [algs] Accept varargs in hb_min/max --- src/hb-algs.hh | 24 +++++++++++++++++++++--- src/test-algs.cc | 8 ++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 7ed42d65f..3b5e45f93 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -186,20 +186,38 @@ struct } HB_FUNCOBJ (hb_second); -/* Note. In min/max, we can use hb_type_identity for second argument. +/* Note. In min/max impl, we can use hb_type_identity for second argument. * However, that would silently convert between different-signedness integers. * Instead we accept two different types, such that compiler can err if * comparing integers of different signedness. */ struct { + private: template auto - operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b) + impl (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b) + + public: + template auto + operator () (T&& a) const HB_AUTO_RETURN (a) + + template auto + operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN + (impl (hb_forward (a), (*this) (hb_forward (ds)...))) } HB_FUNCOBJ (hb_min); struct { + private: template auto - operator () (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b) + impl (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b) + + public: + template auto + operator () (T&& a) const HB_AUTO_RETURN (a) + + template auto + operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN + (impl (hb_forward (a), (*this) (hb_forward (ds)...))) } HB_FUNCOBJ (hb_max); diff --git a/src/test-algs.cc b/src/test-algs.cc index 163a79ad3..0a8fcbff7 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -62,5 +62,13 @@ main (int argc, char **argv) A a; hb_invoke (&A::a, a); + assert (1 == hb_min (3, 8, 1, 2)); + assert (8 == hb_max (3, 8, 1, 2)); + + int x = 1, y = 2; + int &z = hb_min (x, y); + z = 3; + assert (x == 3); + return 0; } From af571dbffc12e6bb7a3146762d12bb4ac3f19bdc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 21:39:20 -0700 Subject: [PATCH 080/617] [meta] Replace most hb_enable_if with hb_requires They do absolutely same thing. hb_requires is to encode constraints, whereas hb_enable_if is for more conditional enabling. --- src/hb-iter.hh | 63 +++++++++++++++++--------------------- src/hb-open-type.hh | 6 ++-- src/hb-ot-layout-common.hh | 6 ++-- src/test-iter.cc | 6 ++-- 4 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 7358256c8..5ad839e2a 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -281,11 +281,11 @@ struct hb_is_iterator_of { enum { /* Range-based 'for' for iterables. */ template + hb_requires (hb_is_iterable (Iterable))> static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) template + hb_requires (hb_is_iterable (Iterable))> static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) /* begin()/end() are NOT looked up non-ADL. So each namespace must declare them. @@ -293,11 +293,11 @@ static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable). namespace OT { template + hb_requires (hb_is_iterable (Iterable))> static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) template + hb_requires (hb_is_iterable (Iterable))> static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) } @@ -308,14 +308,14 @@ static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable). */ template + hb_requires (hb_is_iterator (Lhs))> static inline auto operator | (Lhs lhs, const Rhs &rhs) HB_AUTO_RETURN (rhs (lhs)) /* hb_map(), hb_filter(), hb_reduce() */ template + hb_requires (hb_is_iterator (Iter))> struct hb_map_iter_t : hb_iter_t, decltype (hb_declval (Proj) (hb_declval (typename Iter::item_t)))> @@ -347,7 +347,7 @@ struct hb_map_iter_factory_t hb_map_iter_factory_t (Proj f) : f (f) {} template + hb_requires (hb_is_iterator (Iter))> hb_map_iter_t operator () (Iter it) const { return hb_map_iter_t (it, f); } @@ -365,7 +365,7 @@ struct HB_FUNCOBJ (hb_map); template + hb_requires (hb_is_iterator (Iter))> struct hb_filter_iter_t : hb_iter_with_fallback_t, typename Iter::item_t> @@ -394,7 +394,7 @@ struct hb_filter_iter_factory_t hb_filter_iter_factory_t (Pred p, Proj f) : p (p), f (f) {} template + hb_requires (hb_is_iterator (Iter))> hb_filter_iter_t operator () (Iter it) const { return hb_filter_iter_t (it, p, f); } @@ -419,7 +419,7 @@ struct hb_reduce_t hb_reduce_t (Redu r, InitT init_value) : r (r), init_value (init_value) {} template AccuT operator () (Iter it) const @@ -480,7 +480,7 @@ struct hb_zip_iter_t : struct { template + hb_requires (hb_is_iterable (A) && hb_is_iterable (B))> hb_zip_iter_t operator () (A& a, B &b) const { return hb_zip_iter_t (hb_iter (a), hb_iter (b)); } @@ -490,7 +490,7 @@ HB_FUNCOBJ (hb_zip); /* hb_enumerate */ template + hb_requires (hb_is_iterator (Iter))> struct hb_enumerate_iter_t : hb_iter_t, hb_pair_t> @@ -527,7 +527,7 @@ struct hb_enumerate_iter_t : struct { template + hb_requires (hb_is_iterable (Iterable))> hb_enumerate_iter_t operator () (Iterable& it) const { return hb_enumerate_iter_t (hb_iter (it)); } @@ -542,9 +542,8 @@ struct hb_apply_t hb_apply_t (Appl a) : a (a) {} template - void - operator () (Iter it) const + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) const { for (; it; ++it) (void) hb_invoke (a, *it); @@ -573,9 +572,8 @@ struct hb_sink_t hb_sink_t (Sink&& s) : s (s) {} template - void - operator () (Iter it) const + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) const { for (; it; ++it) s << *it; @@ -601,9 +599,8 @@ HB_FUNCOBJ (hb_sink); struct { template - void - operator () (Iter it) const + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) const { for (; it; ++it) (void) *it; @@ -619,9 +616,8 @@ struct hb_unzip_t hb_unzip_t (Sink1&& s1, Sink2&& s2) : s1 (s1), s2 (s2) {} template - void - operator () (Iter it) const + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) const { for (; it; ++it) { @@ -653,9 +649,8 @@ HB_FUNCOBJ (hb_unzip); struct { template - bool - operator () (Iterable&& c) const + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c) const { for (auto it = hb_iter (c); it; ++it) if (!*it) @@ -667,9 +662,8 @@ HB_FUNCOBJ (hb_all); struct { template - bool - operator () (Iterable&& c) const + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c) const { for (auto it = hb_iter (c); it; ++it) if (*it) @@ -681,9 +675,8 @@ HB_FUNCOBJ (hb_any); struct { template - bool - operator () (Iterable&& c) const + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c) const { for (auto it = hb_iter (c); it; ++it) if (*it) @@ -698,7 +691,7 @@ HB_FUNCOBJ (hb_none); */ template + hb_requires (hb_is_iterable (C))> inline void hb_fill (C& c, const V &v) { diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index e2e562300..5c015af3e 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -419,7 +419,7 @@ struct UnsizedArrayOf return_trace (true); } template + hb_requires (hb_is_iterator_of (Iterator, const Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); @@ -600,7 +600,7 @@ struct ArrayOf return_trace (true); } template + hb_requires (hb_is_iterator_of (Iterator, const Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); @@ -880,7 +880,7 @@ struct SortedArrayOf : ArrayOf return_trace (ret); } template + hb_requires (hb_is_sorted_iterator_of (Iterator, const Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 17a03c85f..05f84d254 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -797,7 +797,7 @@ struct CoverageFormat1 } template + hb_requires (hb_is_sorted_iterator_of (Iterator, const GlyphID))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -866,7 +866,7 @@ struct CoverageFormat2 } template + hb_requires (hb_is_sorted_iterator_of (Iterator, const GlyphID))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -1030,7 +1030,7 @@ struct Coverage } template + hb_requires (hb_is_sorted_iterator_of (Iterator, const GlyphID))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); diff --git a/src/test-iter.cc b/src/test-iter.cc index afbcbe9b5..e8c6bda6b 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -65,7 +65,7 @@ struct some_array_t template + hb_requires (hb_is_iterator (Iter))> static void test_iterator_non_default_constructable (Iter it) { @@ -92,7 +92,7 @@ test_iterator_non_default_constructable (Iter it) } template + hb_requires (hb_is_iterator (Iter))> static void test_iterator (Iter it) { @@ -103,7 +103,7 @@ test_iterator (Iter it) } template + hb_requires (hb_is_iterable (Iterable))> static void test_iterable (const Iterable &lst = Null(Iterable)) { From e8bd5fc3fa2cc5c5f8f254629553902aed3496ba Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 22:29:40 -0700 Subject: [PATCH 081/617] [meta] Move hb_invoke from algs to meta --- src/hb-algs.hh | 31 ------------------------------- src/hb-meta.hh | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 3b5e45f93..77382458d 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -69,37 +69,6 @@ struct } HB_FUNCOBJ (hb_hash); -struct -{ - private: - - /* Pointer-to-member-function. */ - template auto - impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v)).*hb_forward (a)) (hb_forward (ds)...)) - - /* Pointer-to-member. */ - template auto - impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v))).*hb_forward (a)) - - /* Operator(). */ - template auto - impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN - (hb_deref (hb_forward (a)) (hb_forward (ds)...)) - - public: - - template auto - operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN - ( - impl (hb_forward (a), - hb_prioritize, - hb_forward (ds)...) - ) -} -HB_FUNCOBJ (hb_invoke); - struct { private: diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 6eb13155d..a47c8cabd 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -211,4 +211,36 @@ template <> struct hb_is_integer { enum { value = true }; }; #define hb_is_integer(T) hb_is_integer::value +struct +{ + private: + + /* Pointer-to-member-function. */ + template auto + impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v)).*hb_forward (a)) (hb_forward (ds)...)) + + /* Pointer-to-member. */ + template auto + impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v))).*hb_forward (a)) + + /* Operator(). */ + template auto + impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN + (hb_deref (hb_forward (a)) (hb_forward (ds)...)) + + public: + + template auto + operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN + ( + impl (hb_forward (a), + hb_prioritize, + hb_forward (ds)...) + ) +} +HB_FUNCOBJ (hb_invoke); + + #endif /* HB_META_HH */ From cf61acb9eaa2bb3fe479a9050116b4b96934e3ed Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 22:45:01 -0700 Subject: [PATCH 082/617] [iter] Accept rvalues to hb_enumerate() --- src/hb-iter.hh | 2 +- src/test-iter.cc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 5ad839e2a..74cfbc862 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -529,7 +529,7 @@ struct template hb_enumerate_iter_t - operator () (Iterable& it) const + operator () (Iterable&& it) const { return hb_enumerate_iter_t (hb_iter (it)); } } HB_FUNCOBJ (hb_enumerate); diff --git a/src/test-iter.cc b/src/test-iter.cc index e8c6bda6b..bd99f83e6 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -157,6 +157,8 @@ main (int argc, char **argv) test_iterator (hb_zip (st, v)); test_iterator_non_default_constructable (hb_enumerate (st)); + test_iterator_non_default_constructable (hb_enumerate (hb_iter (st))); + test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1)); test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); From bdbfdc92b58d5c9f8654e430075dab543d1ba394 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 22:52:43 -0700 Subject: [PATCH 083/617] [iter] Add value and projection to hb_all/any/none Allows for eg, checking all values equal 2: hb_all (it, 2). --- src/hb-iter.hh | 24 ++++++++++++++++++------ src/test-iter.cc | 10 +++++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 74cfbc862..192347dc0 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -649,11 +649,15 @@ HB_FUNCOBJ (hb_unzip); struct { template - bool operator () (Iterable&& c) const + bool operator () (Iterable&& c, + Val v = true, + Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (!*it) + if (!((Val) hb_get (hb_forward (f), *it) == v)) return false; return true; } @@ -662,11 +666,15 @@ HB_FUNCOBJ (hb_all); struct { template - bool operator () (Iterable&& c) const + bool operator () (Iterable&& c, + Val v = true, + Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (*it) + if (((Val) hb_get (hb_forward (f), *it) == v)) return true; return false; } @@ -675,11 +683,15 @@ HB_FUNCOBJ (hb_any); struct { template - bool operator () (Iterable&& c) const + bool operator () (Iterable&& c, + Val v = true, + Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (*it) + if (((Val) hb_get (hb_forward (f), *it) == v)) return false; return true; } diff --git a/src/test-iter.cc b/src/test-iter.cc index bd99f83e6..70952f3e2 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -140,6 +140,7 @@ main (int argc, char **argv) test_iterable (v); hb_set_t st; + st << 1 << 15 << 43; test_iterable (st); hb_sorted_array_t sa; (void) static_cast, hb_sorted_array_t::item_t>&> (sa); @@ -162,7 +163,14 @@ main (int argc, char **argv) test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); - hb_any (st); + assert (true == hb_all (st)); + assert (false == hb_all (st, 42u)); + assert (true == hb_any (st)); + assert (false == hb_any (st, 14)); + assert (true == hb_any (st, 15)); + assert (false == hb_none (st)); + assert (false == hb_none (st, 15)); + assert (true == hb_none (st, 17)); hb_array_t> pa; pa->as_array (); From 56d2d0294b836ea1e2dea9e242ae72c99387d00a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 23:08:49 -0700 Subject: [PATCH 084/617] [algs] Sprinkle hb_min/max with hb-forward salad Let's see if fixes MSVC fail. Though, the error doesn't make sense to me. hb-blob.cc c:\projects\harfbuzz\src\hb-algs.hh(166): error C2440: 'return': cannot convert from 'unsigned int' to 'unsigned int &&' [C:\projects\harfbuzz\build\harfbuzz.vcxproj] c:\projects\harfbuzz\src\hb-algs.hh(166): note: You cannot bind an lvalue to an rvalue reference c:\projects\harfbuzz\src\hb-algs.hh(174): note: see reference to function template instantiation 'T &&::impl(T &&,T2) const' being compiled with [ T=unsigned int, T2=unsigned int & ] --- src/hb-algs.hh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 77382458d..9e8a4aeba 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -163,11 +163,12 @@ struct { private: template auto - impl (T&& a, T2&& b) const HB_AUTO_RETURN (a <= b ? a : b) + impl (T&& a, T2&& b) const HB_AUTO_RETURN + (hb_forward (a) <= hb_forward (b) ? hb_forward (a) : hb_forward (b)) public: template auto - operator () (T&& a) const HB_AUTO_RETURN (a) + operator () (T&& a) const HB_AUTO_RETURN (hb_forward (a)) template auto operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN @@ -178,11 +179,12 @@ struct { private: template auto - impl (T&& a, T2&& b) const HB_AUTO_RETURN (a >= b ? a : b) + impl (T&& a, T2&& b) const HB_AUTO_RETURN + (hb_forward (a) >= hb_forward (b) ? hb_forward (a) : hb_forward (b)) public: template auto - operator () (T&& a) const HB_AUTO_RETURN (a) + operator () (T&& a) const HB_AUTO_RETURN (hb_forward (a)) template auto operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN From 2c7093ed01f417828d5521d983eae63042363197 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 23:10:59 -0700 Subject: [PATCH 085/617] More tests --- src/test-algs.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test-algs.cc b/src/test-algs.cc index 0a8fcbff7..d6f34d707 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -66,6 +66,9 @@ main (int argc, char **argv) assert (8 == hb_max (3, 8, 1, 2)); int x = 1, y = 2; + hb_min (x, 3); + hb_min (3, x, 4); + hb_min (3, x, 4 + 3); int &z = hb_min (x, y); z = 3; assert (x == 3); From c2c9d204fa5c2189e369726276a1c0e92e09a9ce Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 23:13:38 -0700 Subject: [PATCH 086/617] Fix double-promotion warnings Make it an error. --- src/hb-ot-var-fvar-table.hh | 12 ++++++------ src/hb.hh | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 3565185fd..c73348ef4 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -120,10 +120,10 @@ struct fvar const AxisRecord &axis = get_axes ()[axis_index]; info->tag = axis.axisTag; info->name_id = axis.axisNameID; - info->default_value = axis.defaultValue / 65536.; + info->default_value = axis.defaultValue / 65536.f; /* Ensure order, to simplify client math. */ - info->min_value = hb_min (info->default_value, axis.minValue / 65536.); - info->max_value = hb_max (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.f); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f); } void get_axis_info (unsigned int axis_index, @@ -134,10 +134,10 @@ struct fvar info->tag = axis.axisTag; info->name_id = axis.axisNameID; info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags; - info->default_value = axis.defaultValue / 65536.; + info->default_value = axis.defaultValue / 65536.f; /* Ensure order, to simplify client math. */ - info->min_value = hb_min (info->default_value, axis.minValue / 65536.); - info->max_value = hb_max (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.f); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f); info->reserved = 0; } diff --git a/src/hb.hh b/src/hb.hh index 96db1f9d4..3d4b18033 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -65,6 +65,7 @@ #pragma GCC diagnostic error "-Wcast-align" #pragma GCC diagnostic error "-Wcast-function-type" #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" +#pragma GCC diagnostic error "-Wdouble-promotion" #pragma GCC diagnostic error "-Wformat-security" #pragma GCC diagnostic error "-Wimplicit-function-declaration" #pragma GCC diagnostic error "-Winit-self" From dfc57802450360f06026668b7b61495aaa2d1943 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 23:26:09 -0700 Subject: [PATCH 087/617] Fix more double-promotion errors WHy do only some of the clang bots catch this I have no idea :(. --- src/hb-aat-layout-trak-table.hh | 4 ++-- src/hb-font.hh | 2 +- src/hb-open-type.hh | 4 ++-- src/hb-ot-color-cbdt-table.hh | 12 ++++++------ src/hb-ot-color-sbix-table.hh | 10 +++++----- src/hb-ot-layout-gpos-table.hh | 20 ++++++++++---------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 2688270aa..2eace2aa0 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -133,8 +133,8 @@ struct TrackData if (size_table[size_index].to_float () >= csspx) break; - return round (interpolate_at (size_index ? size_index - 1 : 0, csspx, - *trackTableEntry, base)); + return roundf (interpolate_at (size_index ? size_index - 1 : 0, csspx, + *trackTableEntry, base)); } bool sanitize (hb_sanitize_context_t *c, const void *base) const diff --git a/src/hb-font.hh b/src/hb-font.hh index aaa0fd91c..4f5aa8a60 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -607,7 +607,7 @@ struct hb_font_t return (hb_position_t) (scaled / upem); } hb_position_t em_scalef (float v, int scale) - { return (hb_position_t) round (v * scale / face->get_upem ()); } + { return (hb_position_t) roundf (v * scale / face->get_upem ()); } float em_fscale (int16_t v, int scale) { return (float) v * scale / face->get_upem (); } }; diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 5c015af3e..1129bd006 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -110,7 +110,7 @@ struct F2DOT14 : HBINT16 F2DOT14& operator = (uint16_t i ) { HBINT16::operator= (i); return *this; } // 16384 means 1<<14 float to_float () const { return ((int32_t) v) / 16384.f; } - void set_float (float f) { v = round (f * 16384.f); } + void set_float (float f) { v = roundf (f * 16384.f); } public: DEFINE_SIZE_STATIC (2); }; @@ -121,7 +121,7 @@ struct Fixed : HBINT32 Fixed& operator = (uint32_t i) { HBINT32::operator= (i); return *this; } // 65536 means 1<<16 float to_float () const { return ((int32_t) v) / 65536.f; } - void set_float (float f) { v = round (f * 65536.f); } + void set_float (float f) { v = roundf (f * 65536.f); } public: DEFINE_SIZE_STATIC (4); }; diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index 96b14bd68..7955cf651 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -442,12 +442,12 @@ struct CBDT } /* Convert to font units. */ - double x_scale = upem / (double) strike.ppemX; - double y_scale = upem / (double) strike.ppemY; - extents->x_bearing = round (extents->x_bearing * x_scale); - extents->y_bearing = round (extents->y_bearing * y_scale); - extents->width = round (extents->width * x_scale); - extents->height = round (extents->height * y_scale); + float x_scale = upem / (float) strike.ppemX; + float y_scale = upem / (float) strike.ppemY; + extents->x_bearing = roundf (extents->x_bearing * x_scale); + extents->y_bearing = roundf (extents->y_bearing * y_scale); + extents->width = roundf (extents->width * x_scale); + extents->height = roundf (extents->height * y_scale); return true; } diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index f9739f9ef..9b725c46e 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -242,11 +242,11 @@ struct sbix /* Convert to font units. */ if (strike_ppem) { - double scale = font->face->get_upem () / (double) strike_ppem; - extents->x_bearing = round (extents->x_bearing * scale); - extents->y_bearing = round (extents->y_bearing * scale); - extents->width = round (extents->width * scale); - extents->height = round (extents->height * scale); + float scale = font->face->get_upem () / (float) strike_ppem; + extents->x_bearing = roundf (extents->x_bearing * scale); + extents->y_bearing = roundf (extents->y_bearing * scale); + extents->width = roundf (extents->width * scale); + extents->height = roundf (extents->height * scale); } hb_blob_destroy (blob); diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 228820a17..45de78138 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -446,8 +446,8 @@ struct MarkArray : ArrayOf /* Array of MarkRecords--in Coverage orde glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y); hb_glyph_position_t &o = buffer->cur_pos(); - o.x_offset = round (base_x - mark_x); - o.y_offset = round (base_y - mark_y); + o.x_offset = roundf (base_x - mark_x); + o.y_offset = roundf (base_y - mark_y); o.attach_type() = ATTACH_TYPE_MARK; o.attach_chain() = (int) glyph_pos - (int) buffer->idx; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; @@ -993,32 +993,32 @@ struct CursivePosFormat1 /* Main-direction adjustment */ switch (c->direction) { case HB_DIRECTION_LTR: - pos[i].x_advance = round (exit_x) + pos[i].x_offset; + pos[i].x_advance = roundf (exit_x) + pos[i].x_offset; - d = round (entry_x) + pos[j].x_offset; + d = roundf (entry_x) + pos[j].x_offset; pos[j].x_advance -= d; pos[j].x_offset -= d; break; case HB_DIRECTION_RTL: - d = round (exit_x) + pos[i].x_offset; + d = roundf (exit_x) + pos[i].x_offset; pos[i].x_advance -= d; pos[i].x_offset -= d; - pos[j].x_advance = round (entry_x) + pos[j].x_offset; + pos[j].x_advance = roundf (entry_x) + pos[j].x_offset; break; case HB_DIRECTION_TTB: - pos[i].y_advance = round (exit_y) + pos[i].y_offset; + pos[i].y_advance = roundf (exit_y) + pos[i].y_offset; - d = round (entry_y) + pos[j].y_offset; + d = roundf (entry_y) + pos[j].y_offset; pos[j].y_advance -= d; pos[j].y_offset -= d; break; case HB_DIRECTION_BTT: - d = round (exit_y) + pos[i].y_offset; + d = roundf (exit_y) + pos[i].y_offset; pos[i].y_advance -= d; pos[i].y_offset -= d; - pos[j].y_advance = round (entry_y); + pos[j].y_advance = roundf (entry_y); break; case HB_DIRECTION_INVALID: default: From 2ba984fcbbef4561d35c3a2c502610c38b26f4fb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 7 May 2019 23:28:22 -0700 Subject: [PATCH 088/617] Fix signed comparison on 32bit --- src/hb-sanitize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index ac424c1d9..5ecd2d2bc 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -175,7 +175,7 @@ struct hb_sanitize_context_t : else { this->start = obj_start; - this->end = obj_start + hb_min (this->end - obj_start, obj->get_size ()); + this->end = obj_start + hb_min (size_t (this->end - obj_start), obj->get_size ()); } } From 0601a19d38b2b0fc5dd36fd821af634a49322ebf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 07:47:36 -0700 Subject: [PATCH 089/617] Fix a few more double-pomotion errors --- src/hb-coretext.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index e0579bed8..bf8e96c7b 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -55,13 +55,13 @@ coretext_font_size_from_ptem (float ptem) * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html */ ptem *= 96.f / 72.f; - return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem; + return (CGFloat) (ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem); } static float coretext_font_size_to_ptem (CGFloat size) { - size *= 72.f / 96.f; - return size <= 0.f ? 0 : size; + size *= 72. / 96.; + return size <= 0 ? 0 : size; } static void From 26adefd9eaf4bc1d80b1ffececf0d86f3308f9ee Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:14:44 -0700 Subject: [PATCH 090/617] [algs] Try f[v] in hb_get() as last resort --- src/hb-algs.hh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 9e8a4aeba..b83ee6a78 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -100,14 +100,20 @@ struct private: template auto - impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + impl (Proj&& f, Val &&v, hb_priority<2>) const HB_AUTO_RETURN (hb_deref (hb_forward (f)).get (hb_forward (v))) + template auto + impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + ( + hb_invoke (hb_forward (f), + hb_forward (v)) + ) + template auto impl (Proj&& f, Val &&v, hb_priority<0>) const HB_AUTO_RETURN ( - hb_invoke (hb_forward (f), - hb_forward (v)) + hb_forward (f)[hb_forward (v)] ) public: From 4a101d8ffccd6f907f16ef190125ded5e27e0d8b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:16:33 -0700 Subject: [PATCH 091/617] Add hb_match --- src/hb-algs.hh | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index b83ee6a78..52d40923e 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -75,7 +75,7 @@ struct template auto impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN - (hb_deref (hb_forward (p)).has (v)) + (hb_deref (hb_forward (p)).has (hb_forward (v))) template auto impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN @@ -95,6 +95,34 @@ struct } HB_FUNCOBJ (hb_has); +struct +{ + private: + + template auto + impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + ( + hb_has (hb_forward (p), + hb_forward (v)) + ) + + template auto + impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN + ( + hb_forward (p) == hb_forward (v) + ) + + public: + + template auto + operator () (Pred&& p, Val &&v) const HB_RETURN (bool, + impl (hb_forward (p), + hb_forward (v), + hb_prioritize) + ) +} +HB_FUNCOBJ (hb_match); + struct { private: From fe14a4000a58528878bcc75fde0972de2b779316 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:32:19 -0700 Subject: [PATCH 092/617] Adjust hb_all/any/none --- src/hb-iter.hh | 18 +++++++++--------- src/test-iter.cc | 10 ++++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 192347dc0..6954d431b 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -649,15 +649,15 @@ HB_FUNCOBJ (hb_unzip); struct { template bool operator () (Iterable&& c, - Val v = true, + Pred&& p = hb_bool, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (!((Val) hb_get (hb_forward (f), *it) == v)) + if (!hb_match (hb_forward (p), hb_get (hb_forward (f), *it))) return false; return true; } @@ -666,15 +666,15 @@ HB_FUNCOBJ (hb_all); struct { template bool operator () (Iterable&& c, - Val v = true, + Pred&& p = hb_bool, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (((Val) hb_get (hb_forward (f), *it) == v)) + if (hb_match (hb_forward (p), hb_get (hb_forward (f), *it))) return true; return false; } @@ -683,15 +683,15 @@ HB_FUNCOBJ (hb_any); struct { template bool operator () (Iterable&& c, - Val v = true, + Pred&& p = hb_bool, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) - if (((Val) hb_get (hb_forward (f), *it) == v)) + if (hb_match (hb_forward (p), hb_get (hb_forward (f), *it))) return false; return true; } diff --git a/src/test-iter.cc b/src/test-iter.cc index 70952f3e2..17a1972b3 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -166,11 +166,13 @@ main (int argc, char **argv) assert (true == hb_all (st)); assert (false == hb_all (st, 42u)); assert (true == hb_any (st)); - assert (false == hb_any (st, 14)); - assert (true == hb_any (st, 15)); + assert (false == hb_any (st, 14u)); + assert (true == hb_any (st, 14u, [] (unsigned _) { return _ - 1u; })); + assert (true == hb_any (st, [] (unsigned _) { return _ == 15u; })); + assert (true == hb_any (st, 15u)); assert (false == hb_none (st)); - assert (false == hb_none (st, 15)); - assert (true == hb_none (st, 17)); + assert (false == hb_none (st, 15u)); + assert (true == hb_none (st, 17u)); hb_array_t> pa; pa->as_array (); From 710d459acac88fd784d4ead0ba75b9aa623c48d4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:33:09 -0700 Subject: [PATCH 093/617] [iter] Default predicates to hb_identity instead of hb_bool The bool conversion happens after predicate is called automatically. --- src/hb-iter.hh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 6954d431b..aa5eb9cba 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -405,10 +405,10 @@ struct hb_filter_iter_factory_t }; struct { - template hb_filter_iter_factory_t - operator () (Pred&& p = hb_bool, Proj&& f = hb_identity) const + operator () (Pred&& p = hb_identity, Proj&& f = hb_identity) const { return hb_filter_iter_factory_t (p, f); } } HB_FUNCOBJ (hb_filter); @@ -649,11 +649,11 @@ HB_FUNCOBJ (hb_unzip); struct { template bool operator () (Iterable&& c, - Pred&& p = hb_bool, + Pred&& p = hb_identity, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) @@ -666,11 +666,11 @@ HB_FUNCOBJ (hb_all); struct { template bool operator () (Iterable&& c, - Pred&& p = hb_bool, + Pred&& p = hb_identity, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) @@ -683,11 +683,11 @@ HB_FUNCOBJ (hb_any); struct { template bool operator () (Iterable&& c, - Pred&& p = hb_bool, + Pred&& p = hb_identity, Proj&& f = hb_identity) const { for (auto it = hb_iter (c); it; ++it) From 8479eb5955c93cbc8951d0319b2fe43ff19cc403 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:48:55 -0700 Subject: [PATCH 094/617] [iter] Fix hb_sink() to accept rvalue --- src/hb-iter.hh | 2 +- src/test-iter.cc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index aa5eb9cba..a3390136c 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -569,7 +569,7 @@ HB_FUNCOBJ (hb_apply); template struct hb_sink_t { - hb_sink_t (Sink&& s) : s (s) {} + hb_sink_t (Sink s) : s (s) {} template diff --git a/src/test-iter.cc b/src/test-iter.cc index 17a1972b3..fe3c8f331 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -185,6 +185,10 @@ main (int argc, char **argv) | hb_sink (st) ; + + hb_iter (src) + | hb_sink (hb_array (dst)) + ; + + hb_iter (src) | hb_apply (&st) ; From 00946ca3aa45f109c455871ce89c5872fd243624 Mon Sep 17 00:00:00 2001 From: Roderick Sheeter Date: Wed, 8 May 2019 09:42:35 -0700 Subject: [PATCH 095/617] [docs] add sample commands for test exec --- README.md | 4 ++++ TESTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 TESTING.md diff --git a/README.md b/README.md index fd93be84f..b2eab567b 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,8 @@ For bug reports, mailing list, and other information please visit: For license information, see the file COPYING. +For build information, see the file BUILD.md. + +For test execution, see the file TESTING.md. + Documentation: https://harfbuzz.github.io diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 000000000..91b6abd8b --- /dev/null +++ b/TESTING.md @@ -0,0 +1,47 @@ +## Build & Run + +Depending on what area you are working in change or add `HB_DEBUG_`. +Values defined in `hb-debug.hh`. + +```shell +# quick sanity check +time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && make -C test/api check || cat test/api/test-suite.log) + +# slower santiy check +time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && make -C src check \ + && make -C test/api check \ + && make -C test/subset check) + +# confirm you didn't break anything else +time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && make check) + +# often catches files you didn't add, e.g. test fonts to EXTRA_DIST +make distcheck +``` + +### Debug with GDB + +``` +cd ./util +../libtool --mode=execute gdb --args ./hb-subset ... +``` + +### Enable Debug Logging + +```shell +# make clean if you previously build w/o debug logging +make CPPFLAGS=-DHB_DEBUG_SUBSET=100 +``` + +## Build and Test via CMake + +Note: You'll need to first install ninja-build via apt-get. + +```shell +cd harfbuzz +mkdir buid +cmake -DHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test +``` From 4063181791d6b3efb35e7c748dee12273e64ebd4 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 09:47:34 -0700 Subject: [PATCH 096/617] [docs] add fuzzer instructions (courtesy of Garret) --- TESTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/TESTING.md b/TESTING.md index 91b6abd8b..6bbf7bc5b 100644 --- a/TESTING.md +++ b/TESTING.md @@ -45,3 +45,13 @@ cd harfbuzz mkdir buid cmake -DHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test ``` +## Test with the Fuzzer + +```shell +# push your changs to a branch on googlefonts/harfbuzz +# In a local copy of oss-fuzz, edit projects/harfbuzz/Dockerfile +# Change the git clone to pull your branch +sudo python infra/helper.py build_image harfbuzz +sudo python infra/helper.py build_fuzzers --sanitizer address harfbuzz +sudo python infra/helper.py run_fuzzer harfbuzz hb-subset-fuzzer +``` From d109c9e767ff3198d51e23a7ac8931d0bc4d5d72 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 09:53:29 -0700 Subject: [PATCH 097/617] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b2eab567b..c5f98404a 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ For bug reports, mailing list, and other information please visit: http://harfbuzz.org/ -For license information, see the file COPYING. +For license information, see the [COPYING](COPYING). -For build information, see the file BUILD.md. +For build information, see [BUILD](BUILD.md). -For test execution, see the file TESTING.md. +For test execution, see [TESTING](TESTING.md). Documentation: https://harfbuzz.github.io From fa576ce1874fd886688bf3f16b714d86aebb07ec Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 09:53:58 -0700 Subject: [PATCH 098/617] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c5f98404a..ce0a04d1f 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ For bug reports, mailing list, and other information please visit: http://harfbuzz.org/ -For license information, see the [COPYING](COPYING). +For license information, see [COPYING](COPYING). -For build information, see [BUILD](BUILD.md). +For build information, see [BUILD.md](BUILD.md). -For test execution, see [TESTING](TESTING.md). +For test execution, see [TESTING.md](TESTING.md). Documentation: https://harfbuzz.github.io From a66598e0306fe80063c5d6a678bbca4a931bc4d4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 09:56:29 -0700 Subject: [PATCH 099/617] [iter] For ref-qualified variants --- src/hb-iter.hh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index a3390136c..dc4738928 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -97,10 +97,12 @@ struct hb_iter_t item_t operator * () { return thiz()->__item__ (); } item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); } item_t operator [] (unsigned i) { return thiz()->__item_at__ (i); } - iter_t& operator += (unsigned count) & { thiz()->__forward__ (count); return *thiz(); } + iter_t& operator += (unsigned count) & { thiz()->__forward__ (count); return *thiz(); } + iter_t operator += (unsigned count) && { thiz()->__forward__ (count); return *thiz(); } iter_t& operator ++ () & { thiz()->__next__ (); return *thiz(); } iter_t operator ++ () && { thiz()->__next__ (); return *thiz(); } - iter_t& operator -= (unsigned count) & { thiz()->__rewind__ (count); return *thiz(); } + iter_t& operator -= (unsigned count) & { thiz()->__rewind__ (count); return *thiz(); } + iter_t operator -= (unsigned count) && { thiz()->__rewind__ (count); return *thiz(); } iter_t& operator -- () & { thiz()->__prev__ (); return *thiz(); } iter_t operator -- () && { thiz()->__prev__ (); return *thiz(); } iter_t operator + (unsigned count) const { auto c = thiz()->iter (); c += count; return c; } @@ -109,9 +111,13 @@ struct hb_iter_t iter_t operator - (unsigned count) const { auto c = thiz()->iter (); c -= count; return c; } iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; } template - iter_t& operator >> (T &v) & { v = **thiz(); ++*thiz(); return *thiz(); } + iter_t& operator >> (T &v) & { v = **thiz(); ++*thiz(); return *thiz(); } template - iter_t& operator << (const T v) & { **thiz() = v; ++*thiz(); return *thiz(); } + iter_t operator >> (T &v) && { v = **thiz(); ++*thiz(); return *thiz(); } + template + iter_t& operator << (const T v) & { **thiz() = v; ++*thiz(); return *thiz(); } + template + iter_t operator << (const T v) && { **thiz() = v; ++*thiz(); return *thiz(); } protected: hb_iter_t () {} From aa4ac13f0be34bba66b00d04fd7806c474ff59c0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 10:02:30 -0700 Subject: [PATCH 100/617] [iter] Actually fix previous commit The iter objects shouldn't not be const. D'oh. --- src/hb-iter.hh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index dc4738928..23d2c271f 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -316,7 +316,7 @@ static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable). template static inline auto -operator | (Lhs lhs, const Rhs &rhs) HB_AUTO_RETURN (rhs (lhs)) +operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward (rhs) (hb_forward (lhs))) /* hb_map(), hb_filter(), hb_reduce() */ @@ -355,7 +355,7 @@ struct hb_map_iter_factory_t template hb_map_iter_t - operator () (Iter it) const + operator () (Iter it) { return hb_map_iter_t (it, f); } private: @@ -402,7 +402,7 @@ struct hb_filter_iter_factory_t template hb_filter_iter_t - operator () (Iter it) const + operator () (Iter it) { return hb_filter_iter_t (it, p, f); } private: @@ -428,7 +428,7 @@ struct hb_reduce_t hb_requires (hb_is_iterator (Iter)), typename AccuT = decltype (hb_declval (Redu) (hb_declval (InitT), hb_declval (typename Iter::item_t)))> AccuT - operator () (Iter it) const + operator () (Iter it) { AccuT value = init_value; for (; it; ++it) @@ -549,7 +549,7 @@ struct hb_apply_t template - void operator () (Iter it) const + void operator () (Iter it) { for (; it; ++it) (void) hb_invoke (a, *it); @@ -579,7 +579,7 @@ struct hb_sink_t template - void operator () (Iter it) const + void operator () (Iter it) { for (; it; ++it) s << *it; @@ -619,11 +619,11 @@ HB_FUNCOBJ (hb_drain); template struct hb_unzip_t { - hb_unzip_t (Sink1&& s1, Sink2&& s2) : s1 (s1), s2 (s2) {} + hb_unzip_t (Sink1 s1, Sink2 s2) : s1 (s1), s2 (s2) {} template - void operator () (Iter it) const + void operator () (Iter it) { for (; it; ++it) { From 50dc3e7d9f4f290c7353313c5e5f888cb7c4846d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 10:35:02 -0700 Subject: [PATCH 101/617] Add hb_iota() --- src/hb-iter.hh | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ src/test-iter.cc | 10 ++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 23d2c271f..1a3e2ab3e 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -570,6 +570,57 @@ struct } HB_FUNCOBJ (hb_apply); +/* hb_iota() */ + +template +struct hb_iota_iter_t : + hb_iter_t, T> +{ + hb_iota_iter_t (T start, T end, S step) : v (start), end (end_for (start, end, step)), step (step) {} + + typedef T __item_t__; + static constexpr bool is_random_access_iterator = true; + static constexpr bool is_sorted_iterator = true; + __item_t__ __item__ () const { return v; } + __item_t__ __item_at__ (unsigned j) const { return v + j * step; } + bool __more__ () const { return v != end; } + unsigned __len__ () const { return (end - v) / step; } + void __next__ () { v += step; } + void __forward__ (unsigned n) { v += n * step; } + void __prev__ () { v -= step; } + void __rewind__ (unsigned n) { v -= n * step; } + hb_iota_iter_t __end__ () const { hb_iota_iter_t (end, end, step); } + bool operator != (const hb_iota_iter_t& o) const + { return v != o.v || end != o.end || step != o.step; } + + private: + static inline T end_for (T start, T end, S step) + { + auto res = (end - start) % step; + if (!res) + return end; + end += step - res; + return end; + } + + private: + T v; + T end; + S step; +}; +struct +{ + template hb_iota_iter_t + operator () (T end = (unsigned) -1) const + { return hb_iota_iter_t (0, end, 1u); } + + template hb_iota_iter_t + operator () (T start, T end, S&& step = 1u) const + { return hb_iota_iter_t (start, end, step); } +} +HB_FUNCOBJ (hb_iota); + + /* hb_sink() */ template diff --git a/src/test-iter.cc b/src/test-iter.cc index fe3c8f331..f29166fe8 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -236,5 +236,15 @@ main (int argc, char **argv) long vl; s >> vl; + hb_iota (); + assert (hb_iota (9).len () == 9); + assert (hb_iota (2, 9).len () == 7); + assert (hb_iota (2, 9, 3).len () == 3); + assert (hb_iota (2, 8, 3).len () == 2); + assert (hb_iota (2, 7, 3).len () == 2); + assert (hb_iota (-2, -9, -3).len () == 3); + assert (hb_iota (-2, -8, -3).len () == 2); + assert (hb_iota (-2, -7, -3).len () == 2); + return 0; } From 4c9e0c37a34e8355d752af39507b310f473bffa5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 10:40:39 -0700 Subject: [PATCH 102/617] [serialize] LangSys subset->copy --- src/hb-ot-layout-common.hh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 05f84d254..04b211ddb 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -229,10 +229,10 @@ struct LangSys return reqFeatureIndex;; } - bool subset (hb_subset_context_t *c) const + LangSys* copy (hb_serialize_context_t *c) const { - TRACE_SUBSET (this); - return_trace (c->serializer->embed (*this)); + TRACE_SERIALIZE (this); + return_trace (c->embed (*this)); } bool sanitize (hb_sanitize_context_t *c, @@ -279,10 +279,10 @@ struct Script TRACE_SUBSET (this); struct Script *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->defaultLangSys.serialize_subset (c, this+defaultLangSys, out); + out->defaultLangSys.serialize_copy (c->serializer, this+defaultLangSys, out); unsigned int count = langSys.len; for (unsigned int i = 0; i < count; i++) - out->langSys.arrayZ[i].offset.serialize_subset (c, this+langSys[i].offset, out); + out->langSys.arrayZ[i].offset.serialize_copy (c->serializer, this+langSys[i].offset, out); return_trace (true); } From c93eeba9b21cb8f8ba64ebaf284bf9c8a8544886 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 10:56:09 -0700 Subject: [PATCH 103/617] [iter] Accept pointer in hb_map() --- src/hb-iter.hh | 4 ++-- src/test-iter.cc | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 1a3e2ab3e..5a76c9541 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -324,11 +324,11 @@ template struct hb_map_iter_t : hb_iter_t, - decltype (hb_declval (Proj) (hb_declval (typename Iter::item_t)))> + decltype (hb_get (hb_declval (Proj), *hb_declval (Iter)))> { hb_map_iter_t (const Iter& it, Proj f_) : it (it), f (f_) {} - typedef decltype (hb_declval (Proj) (hb_declval (typename Iter::item_t))) __item_t__; + typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; __item_t__ __item__ () const { return hb_get (f.get (), *it); } __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } diff --git a/src/test-iter.cc b/src/test-iter.cc index f29166fe8..1e721aecb 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -177,9 +177,14 @@ main (int argc, char **argv) hb_array_t> pa; pa->as_array (); + hb_map_t m; + + hb_iter (src) - | hb_map (hb_identity) + | hb_map (m) + | hb_map (&m) | hb_filter () + | hb_filter (st) + | hb_filter (&st) | hb_filter (hb_bool) | hb_filter (hb_bool, hb_identity) | hb_sink (st) From cdb61eb0431d426f7152f975e89ee3ba4431083f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 11:00:18 -0700 Subject: [PATCH 104/617] [iter] Accept pointer in hb_iter() and hb_iter_t() --- src/hb-iter.hh | 4 ++-- src/test-iter.cc | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 5a76c9541..141165028 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -148,7 +148,7 @@ struct hb_iter_t static_assert (true, "") /* Returns iterator type of a type. */ -#define hb_iter_t(Iterable) decltype (hb_declval (Iterable).iter ()) +#define hb_iter_t(Iterable) decltype (hb_deref (hb_declval (Iterable)).iter ()) template struct hb_array_t; @@ -158,7 +158,7 @@ struct template hb_iter_t (T) operator () (T&& c) const - { return c.iter (); } + { return hb_deref (hb_forward (c)).iter (); } /* Specialization for C arrays. */ diff --git a/src/test-iter.cc b/src/test-iter.cc index 1e721aecb..ac2c30e09 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -179,6 +179,9 @@ main (int argc, char **argv) hb_map_t m; + hb_iter (st); + hb_iter (&st); + + hb_iter (src) | hb_map (m) | hb_map (&m) From 750d5af48e38627c3c84a2f3857a7ee602221e24 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 12:01:55 -0700 Subject: [PATCH 105/617] Make compiler happy with -Og --- src/hb-cff-interp-cs-common.hh | 2 +- src/hb-ot-cmap-table.hh | 6 +++--- src/hb-ot-glyf-table.hh | 2 +- src/hb-subset-glyf.cc | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 71bc29282..2f892f84c 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -160,7 +160,7 @@ struct cs_interp_env_t : interp_env_t void callSubr (const biased_subrs_t& biasedSubrs, cs_type_t type) { - unsigned int subr_num; + unsigned int subr_num = 0; if (unlikely (!popSubrNum (biasedSubrs, subr_num) || callStack.get_count () >= kMaxCallLimit)) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index b4c8c608b..cec78d77c 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -142,7 +142,7 @@ struct CmapSubtableFormat4 for (unsigned int j = 0; j < num_codepoints; j++) { hb_codepoint_t cp = segments[i].start_code + j; - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) return_trace (false); glyph_id_array[j] = new_gid; @@ -183,7 +183,7 @@ struct CmapSubtableFormat4 hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (plan->unicodes->next (&cp)) { - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) { DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); @@ -542,7 +542,7 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (plan->unicodes->next (&cp)) { - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) { DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 2a96c2e35..f7629eca3 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -283,7 +283,7 @@ struct glyf /* based on FontTools _g_l_y_f.py::trim */ bool remove_padding (unsigned int start_offset, - unsigned int *end_offset) const + unsigned int *end_offset) const { if (*end_offset - start_offset < GlyphHeader::static_size) return true; diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc index d40233187..0647ee4e7 100644 --- a/src/hb-subset-glyf.cc +++ b/src/hb-subset-glyf.cc @@ -108,7 +108,7 @@ _calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf, hb_codepoint_t next_glyph = HB_SET_VALUE_INVALID; while (plan->glyphset ()->next (&next_glyph)) { - unsigned int start_offset, end_offset; + unsigned int start_offset = 0, end_offset = 0; if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { @@ -211,7 +211,7 @@ _write_glyf_and_loca_prime (const hb_subset_plan_t *plan, } - unsigned int start_offset, end_offset; + unsigned int start_offset = 0, end_offset = 0; if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) end_offset = start_offset = 0; From bad16066392e4dbdd8490a4b1c70d1dcddcc8ec8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 12:11:52 -0700 Subject: [PATCH 106/617] [map] Make .has() optionally return value --- src/hb-map.hh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index f27ca9cae..13099afc4 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -181,7 +181,12 @@ struct hb_hashmap_t static constexpr V SENTINEL = vINVALID; typedef V value_t; value_t operator [] (K k) const { return get (k); } - bool has (K k) const { return (*this)[k] != SENTINEL; } + bool has (K k, V *vp = nullptr) const + { + V v = (*this)[k]; + if (vp) *vp = v; + return v != SENTINEL; + } /* Projection. */ V operator () (K k) const { return get (k); } From 5875d775e1253c0e14b900539c28c2de881da7aa Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 12:25:34 -0700 Subject: [PATCH 107/617] [iter] Rename hb_iter_t() to hb_iter_type<> and add hb_item_type<> --- src/hb-iter.hh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 141165028..5aa138fbc 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -147,16 +147,18 @@ struct hb_iter_t using Name::operator <<; \ static_assert (true, "") -/* Returns iterator type of a type. */ -#define hb_iter_t(Iterable) decltype (hb_deref (hb_declval (Iterable)).iter ()) +/* Returns iterator / item type of a type. */ +template +using hb_iter_type = decltype (hb_deref (hb_declval (Iterable)).iter ()); +template +using hb_item_type = decltype (*hb_deref (hb_declval (Iterable)).iter ()); template struct hb_array_t; struct { - template - hb_iter_t (T) + template hb_iter_type operator () (T&& c) const { return hb_deref (hb_forward (c)).iter (); } @@ -487,9 +489,9 @@ struct { template - hb_zip_iter_t + hb_zip_iter_t, hb_iter_type> operator () (A& a, B &b) const - { return hb_zip_iter_t (hb_iter (a), hb_iter (b)); } + { return hb_zip_iter_t, hb_iter_type> (hb_iter (a), hb_iter (b)); } } HB_FUNCOBJ (hb_zip); @@ -534,9 +536,9 @@ struct { template - hb_enumerate_iter_t + hb_enumerate_iter_t> operator () (Iterable&& it) const - { return hb_enumerate_iter_t (hb_iter (it)); } + { return hb_enumerate_iter_t> (hb_iter (it)); } } HB_FUNCOBJ (hb_enumerate); From 503748d8a80dd5db450c8c4dc109f2b97049d989 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 12:45:02 -0700 Subject: [PATCH 108/617] [name] Sanitize records for reals Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14641 --- src/hb-ot-name-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 4e4da74bc..1c8f54406 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -220,7 +220,6 @@ struct name { TRACE_SANITIZE (this); const void *string_pool = (this+stringOffset).arrayZ; - /* TODO: Move to run-time?! */ return_trace (nameRecordZ.sanitize (c, count, string_pool)); } @@ -230,7 +229,8 @@ struct name return_trace (c->check_struct (this) && likely (format == 0 || format == 1) && c->check_array (nameRecordZ.arrayZ, count) && - c->check_range (this, stringOffset)); + c->check_range (this, stringOffset) && + sanitize_records (c)); } struct accelerator_t From 02ae2591d930563cec8c3c63086afb0a3a12c4aa Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Wed, 8 May 2019 13:44:03 -0700 Subject: [PATCH 109/617] initialize return param subr_num in popSubrNum also snake_cased popSubrtNum and other surrounding function names --- src/hb-cff-interp-cs-common.hh | 15 ++++++++------- src/hb-subset-cff1.cc | 4 ++-- src/hb-subset-cff2.cc | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 2f892f84c..61bdba5f5 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -147,8 +147,9 @@ struct cs_interp_env_t : interp_env_t return callStack.in_error () || SUPER::in_error (); } - bool popSubrNum (const biased_subrs_t& biasedSubrs, unsigned int &subr_num) + bool pop_subr_num (const biased_subrs_t& biasedSubrs, unsigned int &subr_num) { + subr_num = 0; int n = SUPER::argStack.pop_int (); n += biasedSubrs.get_bias (); if (unlikely ((n < 0) || ((unsigned int)n >= biasedSubrs.get_count ()))) @@ -158,11 +159,11 @@ struct cs_interp_env_t : interp_env_t return true; } - void callSubr (const biased_subrs_t& biasedSubrs, cs_type_t type) + void call_subr (const biased_subrs_t& biasedSubrs, cs_type_t type) { unsigned int subr_num = 0; - if (unlikely (!popSubrNum (biasedSubrs, subr_num) + if (unlikely (!pop_subr_num (biasedSubrs, subr_num) || callStack.get_count () >= kMaxCallLimit)) { SUPER::set_error (); @@ -175,7 +176,7 @@ struct cs_interp_env_t : interp_env_t SUPER::str_ref = context.str_ref; } - void returnFromSubr () + void return_from_subr () { if (unlikely (SUPER::str_ref.in_error ())) SUPER::set_error (); @@ -254,7 +255,7 @@ struct cs_opset_t : opset_t switch (op) { case OpCode_return: - env.returnFromSubr (); + env.return_from_subr (); break; case OpCode_endchar: OPSET::check_width (op, env, param); @@ -267,11 +268,11 @@ struct cs_opset_t : opset_t break; case OpCode_callsubr: - env.callSubr (env.localSubrs, CSType_LocalSubr); + env.call_subr (env.localSubrs, CSType_LocalSubr); break; case OpCode_callgsubr: - env.callSubr (env.globalSubrs, CSType_GlobalSubr); + env.call_subr (env.globalSubrs, CSType_GlobalSubr); break; case OpCode_hstem: diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index 39bf5acdd..a69dd93ae 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -351,7 +351,7 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_tadd_op (op, env.str_ref); param.current_parsed_str->set_parsed (); - env.returnFromSubr (); + env.return_from_subr (); param.set_current_str (env, false); break; @@ -382,7 +382,7 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_tadd_call_op (op, str_ref, env.context.subr_num); hb_set_add (closure, env.context.subr_num); param.set_current_str (env, true); diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index f033fbde1..caee17550 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -183,7 +183,7 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_tset_parsed (); - env.returnFromSubr (); + env.return_from_subr (); param.set_current_str (env, false); break; @@ -213,7 +213,7 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_tadd_call_op (op, str_ref, env.context.subr_num); hb_set_add (closure, env.context.subr_num); param.set_current_str (env, true); From df237d2fe78086ad16bdbd2cc60639ae9ce909d6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 8 May 2019 14:17:14 -0700 Subject: [PATCH 110/617] [test] Add https://crbug.com/oss-fuzz/14641 testcase As 503748d fix --- ...e-minimized-hb-subset-fuzzer-5676773460672512 | Bin 0 -> 2172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5676773460672512 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5676773460672512 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5676773460672512 new file mode 100644 index 0000000000000000000000000000000000000000..4fc920bf52021ee6fe169c056bed6c5e089d326a GIT binary patch literal 2172 zcmeHHF=!J}82&DaN!o;_YN$(t2g#BK<24aMs356L?37~D=%6%5O?yMmMyV1(G*E0u z7o8j&+?+ZH3OWetCgSGepdezW3W5a>di~x@Okzn%ZHqei!@Ya&fB*ge_ul_~2L-?) zpcTZ#f&Q294`jy=CrmC!H`>TXM{~_^+I~!lJhUEDFYmQ!m&IV)(m7#VFe~xI#Been zAFTPeJ%0WQS9QSDD`h~|e9aQ>i#maS`B|^FfrG%CS{)S_16+u8UkAKLW=hwlxp9nN zF7O=++^o?c5v$kPv6~sKhPC@+u;M?|RVXoUvm^DN-Xx}|(EmPmQs++kxZ^H1w6qR Date: Wed, 8 May 2019 11:40:31 -0700 Subject: [PATCH 111/617] [map] add iteration --- src/hb-map.hh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/hb-map.hh b/src/hb-map.hh index 13099afc4..2b25c2e61 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -62,6 +62,7 @@ struct hb_hashmap_t bool is_unused () const { return key == kINVALID; } bool is_tombstone () const { return key != kINVALID && value == vINVALID; } bool is_real () const { return key != kINVALID && value != vINVALID; } + hb_pair_t get_pair() const { return hb_pair (key, value); } }; hb_object_header_t header; @@ -206,6 +207,16 @@ struct hb_hashmap_t unsigned int get_population () const { return population; } + /* + * Iterator + */ + auto iter() const HB_AUTO_RETURN + ( + + hb_array_t (items, mask + 1) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::get_pair) + ) + protected: unsigned int bucket_for (K key) const From ba60512813caafc2006b26214e95bbfe1c0e460a Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 12:09:10 -0700 Subject: [PATCH 112/617] [map] add a test for iteration --- src/hb-map.hh | 2 +- src/test-iter.cc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 2b25c2e61..5a4f5c371 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -62,7 +62,7 @@ struct hb_hashmap_t bool is_unused () const { return key == kINVALID; } bool is_tombstone () const { return key != kINVALID && value == vINVALID; } bool is_real () const { return key != kINVALID && value != vINVALID; } - hb_pair_t get_pair() const { return hb_pair (key, value); } + hb_pair_t get_pair() const { return hb_pair_t (key, value); } }; hb_object_header_t header; diff --git a/src/test-iter.cc b/src/test-iter.cc index ac2c30e09..7e7732018 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -206,6 +206,10 @@ main (int argc, char **argv) | hb_reduce ([&] (int acc, int value) -> int { return acc; }, 2) ; + using map_pair_t = decltype (*hb_iter (m)); + + hb_iter (m) + | hb_map ([] (map_pair_t p) { return p.first * p.second; }); + unsigned int temp1 = 10; unsigned int temp2 = 0; hb_map_t *result = From 492af0f1bf1d7198b474fda2faca451908af267f Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 12:47:18 -0700 Subject: [PATCH 113/617] [map] add keys() --- src/hb-map.hh | 9 ++++++++- src/test-iter.cc | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 5a4f5c371..4a1f75e65 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -212,11 +212,18 @@ struct hb_hashmap_t */ auto iter() const HB_AUTO_RETURN ( - + hb_array_t (items, mask + 1) + + hb_array (items, mask + 1) | hb_filter (&item_t::is_real) | hb_map (&item_t::get_pair) ) + auto keys() const HB_AUTO_RETURN + ( + + iter() + | hb_map (&hb_pair_t::first) + ) + // | hb_map ([&] (item_t i) { return i.key; }) + protected: unsigned int bucket_for (K key) const diff --git a/src/test-iter.cc b/src/test-iter.cc index 7e7732018..63851a34e 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -210,6 +210,10 @@ main (int argc, char **argv) + hb_iter (m) | hb_map ([] (map_pair_t p) { return p.first * p.second; }); + using map_key_t = decltype (*m.keys()); + + hb_iter (m.keys ()) + | hb_filter ([] (map_key_t k) { return k < 42; }); + unsigned int temp1 = 10; unsigned int temp2 = 0; hb_map_t *result = From b827181ba1f539c990e1bd8fdd3559f1589c8d28 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 13:51:11 -0700 Subject: [PATCH 114/617] [map] tweak test-iter.cc --- src/hb-map.hh | 1 - src/test-iter.cc | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 4a1f75e65..36dfc3e5c 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -222,7 +222,6 @@ struct hb_hashmap_t + iter() | hb_map (&hb_pair_t::first) ) - // | hb_map ([&] (item_t i) { return i.key; }) protected: diff --git a/src/test-iter.cc b/src/test-iter.cc index 63851a34e..273ba6c4f 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -206,7 +206,7 @@ main (int argc, char **argv) | hb_reduce ([&] (int acc, int value) -> int { return acc; }, 2) ; - using map_pair_t = decltype (*hb_iter (m)); + using map_pair_t = hb_item_type; + hb_iter (m) | hb_map ([] (map_pair_t p) { return p.first * p.second; }); From 7166bd563447a64eda05c66668bd4a178292bd79 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 14:24:57 -0700 Subject: [PATCH 115/617] Minor --- src/hb-open-type.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 1129bd006..9d388ff3f 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -427,7 +427,7 @@ struct UnsizedArrayOf if (unlikely (!serialize (c, count))) return_trace (false); /* TODO Umm. Just exhaust the iterator instead? Being extra * cautious right now.. */ - for (unsigned i = 0; i < count; i++, items++) + for (unsigned i = 0; i < count; i++, ++items) arrayZ[i] = *items; return_trace (true); } @@ -608,7 +608,7 @@ struct ArrayOf if (unlikely (!serialize (c, count))) return_trace (false); /* TODO Umm. Just exhaust the iterator instead? Being extra * cautious right now.. */ - for (unsigned i = 0; i < count; i++, items++) + for (unsigned i = 0; i < count; i++, ++items) arrayZ[i] = *items; return_trace (true); } From a17f0fa3a10a25959561582ae63ef2e5208647e2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 14:44:11 -0700 Subject: [PATCH 116/617] [meta] Capture rvalue-references in is_reference / remove_reference --- src/hb-meta.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index a47c8cabd..421eb0638 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -93,6 +93,7 @@ template using hb_remove_const = typename hb_match_const::type; #define hb_is_const(T) hb_match_const::value template struct hb_match_reference { typedef T type; enum { value = false }; }; template struct hb_match_reference { typedef T type; enum { value = true }; }; +template struct hb_match_reference { typedef T type; enum { value = true }; }; template using hb_remove_reference = typename hb_match_reference::type; #define hb_is_reference(T) hb_match_reference::value template struct hb_match_pointer { typedef T type; enum { value = false }; }; From f5705d7656817cbfdbc4479b1cb0be3af6f4abdf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 14:46:55 -0700 Subject: [PATCH 117/617] Whitespace --- src/hb-map.hh | 10 +++++----- src/test-iter.cc | 11 +++++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 36dfc3e5c..0e57f9732 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -210,16 +210,16 @@ struct hb_hashmap_t /* * Iterator */ - auto iter() const HB_AUTO_RETURN + auto iter () const HB_AUTO_RETURN ( + hb_array (items, mask + 1) | hb_filter (&item_t::is_real) | hb_map (&item_t::get_pair) ) - auto keys() const HB_AUTO_RETURN + auto keys () const HB_AUTO_RETURN ( - + iter() + + iter() | hb_map (&hb_pair_t::first) ) @@ -233,9 +233,9 @@ struct hb_hashmap_t while (!items[i].is_unused ()) { if (items[i] == key) - return i; + return i; if (tombstone == (unsigned) -1 && items[i].is_tombstone ()) - tombstone = i; + tombstone = i; i = (i + ++step) & mask; } return tombstone == (unsigned) -1 ? i : tombstone; diff --git a/src/test-iter.cc b/src/test-iter.cc index 273ba6c4f..69f2de978 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -208,11 +208,14 @@ main (int argc, char **argv) using map_pair_t = hb_item_type; + hb_iter (m) - | hb_map ([] (map_pair_t p) { return p.first * p.second; }); + | hb_map ([] (map_pair_t p) { return p.first * p.second; }) + ; - using map_key_t = decltype (*m.keys()); - + hb_iter (m.keys ()) - | hb_filter ([] (map_key_t k) { return k < 42; }); + m.keys (); + using map_key_t = decltype (*m.keys()); + + hb_iter (m.keys ()) + | hb_filter ([] (map_key_t k) { return k < 42; }) + ; unsigned int temp1 = 10; unsigned int temp2 = 0; From 5ceaafa5de8dff51fe91f7008a12ec9c304a1376 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 14:59:25 -0700 Subject: [PATCH 118/617] [algs] Fix identity return type --- src/hb-algs.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 52d40923e..d377772e0 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -36,15 +36,15 @@ struct { - template T - operator () (const T& v) const { return v; } + template auto + operator () (T&& v) const HB_AUTO_RETURN ( hb_forward (v) ) } HB_FUNCOBJ (hb_identity); struct { template bool - operator () (const T& v) const { return bool (v); } + operator () (T&& v) const { return bool (hb_forward (v)); } } HB_FUNCOBJ (hb_bool); From 3c69505b3a7850b68a931849a2badb84b6b36d51 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:05:10 -0700 Subject: [PATCH 119/617] [map] Fix iter --- src/hb-map.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 0e57f9732..a5dedac57 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -212,7 +212,7 @@ struct hb_hashmap_t */ auto iter () const HB_AUTO_RETURN ( - + hb_array (items, mask + 1) + + hb_array (items, mask ? mask + 1 : 0) | hb_filter (&item_t::is_real) | hb_map (&item_t::get_pair) ) From a30482718491e3455365167e1c85981c8c0f542b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:08:10 -0700 Subject: [PATCH 120/617] [map] Add .values() iterator --- src/hb-map.hh | 6 +++++- src/test-iter.cc | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index a5dedac57..1c2fe145f 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -216,12 +216,16 @@ struct hb_hashmap_t | hb_filter (&item_t::is_real) | hb_map (&item_t::get_pair) ) - auto keys () const HB_AUTO_RETURN ( + iter() | hb_map (&hb_pair_t::first) ) + auto values () const HB_AUTO_RETURN + ( + + iter() + | hb_map (&hb_pair_t::second) + ) protected: diff --git a/src/test-iter.cc b/src/test-iter.cc index 69f2de978..0a0e4d102 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -215,6 +215,14 @@ main (int argc, char **argv) using map_key_t = decltype (*m.keys()); + hb_iter (m.keys ()) | hb_filter ([] (map_key_t k) { return k < 42; }) + | hb_drain + ; + + m.values (); + using map_value_t = decltype (*m.values()); + + hb_iter (m.values ()) + | hb_filter ([] (map_value_t k) { return k < 42; }) + | hb_drain ; unsigned int temp1 = 10; From 372c5b97bfa3b744de1d017cf662607eb8a2fa6e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:28:39 -0700 Subject: [PATCH 121/617] [map] Fix bots Older compilers don't like calling iter() from return-type decltype() ../src/hb-map.hh:226:12: error: cannot call member function 'decltype ((((+ hb_array(((const hb_hashmap_t*)this)->hb_hashmap_t::items, (((const hb_hashmap_t*)this)->hb_hashmap_t::mask ? (((const hb_hashmap_t*)this)->hb_hashmap_t::mask + 1) : 0))) | hb_filter((& hb_hashmap_t::item_t:: is_real))) | hb_map((& hb_hashmap_t::item_t:: get_pair)))) hb_hashmap_t::iter() const [with K = const hb_serialize_context_t::object_t*; V = unsigned int; K kINVALID = 0u; V vINVALID = 0u; decltype ((((+ hb_array(((const hb_hashmap_t*)this)->hb_hashmap_t::items, (((const hb_hashmap_t*)this)->hb_hashmap_t::mask ? (((const hb_hashmap_t*)this)->hb_hashmap_t::mask + 1) : 0))) | hb_filter((& hb_hashmap_t::item_t:: is_real))) | hb_map((& hb_hashmap_t::item_t:: get_pair)))) = hb_map_iter_t::item_t>, bool (hb_hashmap_t::item_t::*)() const, const&, 0u>, hb_pair_t (hb_hashmap_t::item_t::*)() const, 0u>]' without object + iter() ^ ../src/hb-meta.hh:58:41: note: in definition of macro 'HB_AUTO_RETURN' #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } ^ --- src/hb-map.hh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 1c2fe145f..6eac8c3d3 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -218,13 +218,15 @@ struct hb_hashmap_t ) auto keys () const HB_AUTO_RETURN ( - + iter() - | hb_map (&hb_pair_t::first) + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::key) ) auto values () const HB_AUTO_RETURN ( - + iter() - | hb_map (&hb_pair_t::second) + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::value) ) protected: From 27b2093009745b6c30663605f45ac95deb1562cc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:32:57 -0700 Subject: [PATCH 122/617] [map] Return rvalues from keys()/values() --- src/hb-algs.hh | 7 +++++++ src/hb-map.hh | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index d377772e0..0db2184cf 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -41,6 +41,13 @@ struct } HB_FUNCOBJ (hb_identity); +struct +{ + template hb_remove_reference + operator () (T&& v) const { return v; } +} +HB_FUNCOBJ (hb_rvalue); + struct { template bool diff --git a/src/hb-map.hh b/src/hb-map.hh index 6eac8c3d3..2f0659562 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -221,12 +221,14 @@ struct hb_hashmap_t + hb_array (items, mask ? mask + 1 : 0) | hb_filter (&item_t::is_real) | hb_map (&item_t::key) + | hb_map (hb_rvalue) ) auto values () const HB_AUTO_RETURN ( + hb_array (items, mask ? mask + 1 : 0) | hb_filter (&item_t::is_real) | hb_map (&item_t::value) + | hb_map (hb_rvalue) ) protected: From d5decf9bf77db914b67ffc446379df621516e362 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 7 May 2019 15:47:38 -0700 Subject: [PATCH 123/617] [subset] Move hdmx to subset2. --- src/hb-ot-hdmx-table.hh | 38 +++++++------------------------------- src/hb-subset.cc | 2 +- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index 847b32657..abf4440a6 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -157,40 +157,16 @@ struct hdmx return_trace (true); } - static size_t get_subsetted_size (const hdmx *source_hdmx, hb_subset_plan_t *plan) + + bool subset (hb_subset_context_t *c) const { - return min_size + source_hdmx->numRecords * DeviceRecord::get_size (plan->num_output_glyphs ()); - } + TRACE_SUBSET (this); - bool subset (hb_subset_plan_t *plan) const - { - size_t dest_size = get_subsetted_size (this, plan); - hdmx *dest = (hdmx *) malloc (dest_size); - if (unlikely (!dest)) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size); - return false; - } + hdmx *hdmx_prime = c->serializer->start_embed (); + if (unlikely (!hdmx_prime)) return_trace (false); - hb_serialize_context_t c (dest, dest_size); - hdmx *hdmx_prime = c.start_serialize (); - if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) - { - free (dest); - DEBUG_MSG(SUBSET, nullptr, "Failed to serialize write new hdmx."); - return false; - } - c.end_serialize (); - - hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest, - dest_size, - HB_MEMORY_MODE_READONLY, - dest, - free); - bool result = plan->add_table (HB_OT_TAG_hdmx, hdmx_prime_blob); - hb_blob_destroy (hdmx_prime_blob); - - return result; + hdmx_prime->serialize (c->serializer, this, c->plan); + return_trace (true); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 800bd35c8..f4fc77172 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -159,7 +159,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset (plan); break; case HB_OT_TAG_hdmx: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_name: result = _subset2 (plan); From e8ef0e627c493af700e254bdd2767f8955f2d03f Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 7 May 2019 17:23:02 -0700 Subject: [PATCH 124/617] [subset] WIP convert hdmx subsetting to use iterators. --- src/hb-ot-hdmx-table.hh | 117 +++++++++++++++--------------------- test/api/test-subset-hdmx.c | 23 ------- 2 files changed, 49 insertions(+), 91 deletions(-) diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index abf4440a6..560fb14d0 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -41,71 +41,30 @@ namespace OT { struct DeviceRecord { - struct SubsetView - { - const DeviceRecord *source_device_record; - unsigned int sizeDeviceRecord; - hb_subset_plan_t *subset_plan; - - void init (const DeviceRecord *source_device_record, - unsigned int sizeDeviceRecord, - hb_subset_plan_t *subset_plan) - { - this->source_device_record = source_device_record; - this->sizeDeviceRecord = sizeDeviceRecord; - this->subset_plan = subset_plan; - } - - unsigned int len () const - { return this->subset_plan->num_output_glyphs (); } - - const HBUINT8* operator [] (unsigned int new_gid) const - { - if (unlikely (new_gid >= len ())) return nullptr; - - hb_codepoint_t old_gid; - if (!this->subset_plan->old_gid_for_new_gid (new_gid, &old_gid)) - return &Null(HBUINT8); - - if (old_gid >= sizeDeviceRecord - DeviceRecord::min_size) - return nullptr; - return &(this->source_device_record->widthsZ[old_gid]); - } - }; - - static unsigned int get_size (unsigned int count) + static unsigned int get_size (unsigned count) { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); } - bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view) + template + bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it) { TRACE_SERIALIZE (this); - unsigned int size = get_size (subset_view.len ()); - if (unlikely (!c->allocate_size (size))) - { - DEBUG_MSG(SUBSET, nullptr, "Couldn't allocate enough space for DeviceRecord: %d.", - size); - return_trace (false); - } + unsigned length = it.len (); - this->pixelSize = subset_view.source_device_record->pixelSize; - this->maxWidth = subset_view.source_device_record->maxWidth; + if (unlikely (!c->extend (*this, length))) return_trace (false); - for (unsigned int i = 0; i < subset_view.len (); i++) - { - const HBUINT8 *width = subset_view[i]; - if (!width) - { - DEBUG_MSG(SUBSET, nullptr, "HDMX width for new gid %d is missing.", i); - return_trace (false); - } - widthsZ[i] = *width; - } + this->pixelSize = pixelSize; + this->maxWidth = + + it + | hb_reduce (hb_max, 0u); + + + it + | hb_sink (widthsZ.as_array (length)); return_trace (true); } - bool sanitize (hb_sanitize_context_t *c, unsigned int sizeDeviceRecord) const + bool sanitize (hb_sanitize_context_t *c, unsigned sizeDeviceRecord) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && @@ -135,26 +94,25 @@ struct hdmx return StructAtOffset (&this->firstDeviceRecord, i * sizeDeviceRecord); } - bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan) + template + bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); - this->version = source_hdmx->version; - this->numRecords = source_hdmx->numRecords; - this->sizeDeviceRecord = DeviceRecord::get_size (plan->num_output_glyphs ()); + this->version = version; + this->numRecords = it.len (); + this->sizeDeviceRecord = + it ? DeviceRecord::get_size ((*it).second.len ()) : DeviceRecord::get_size (0); - for (unsigned int i = 0; i < source_hdmx->numRecords; i++) - { - DeviceRecord::SubsetView subset_view; - subset_view.init (&(*source_hdmx)[i], source_hdmx->sizeDeviceRecord, plan); + using pair_t = decltype (*it); + + it + | hb_apply ([&] (const pair_t& _) { + c->start_embed ()->serialize (c, _.first, _.second); + }); - if (!c->start_embed ()->serialize (c, subset_view)) - return_trace (false); - } - - return_trace (true); + return_trace (c->successful); } @@ -165,10 +123,33 @@ struct hdmx hdmx *hdmx_prime = c->serializer->start_embed (); if (unlikely (!hdmx_prime)) return_trace (false); - hdmx_prime->serialize (c->serializer, this, c->plan); + auto it = + + hb_iota ((unsigned) numRecords) + | hb_map ([&] (unsigned _) { + const DeviceRecord *device_record = + &StructAtOffset (&firstDeviceRecord, + _ * sizeDeviceRecord); + auto row = + + hb_iota (c->plan->num_output_glyphs ()) + | hb_map (c->plan->reverse_glyph_map) + | hb_map ([=] (hb_codepoint_t _) { + if (c->plan->is_empty_glyph (_)) + return Null(HBUINT8); + return device_record->widthsZ.as_array (get_num_glyphs ()) [_]; + }) + ; + return hb_pair ((unsigned) device_record->pixelSize, +row); + }); + + hdmx_prime->serialize (c->serializer, version, it); return_trace (true); } + unsigned get_num_glyphs () const + { + return sizeDeviceRecord - DeviceRecord::min_size; + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/test/api/test-subset-hdmx.c b/test/api/test-subset-hdmx.c index 44e579ace..7178833bc 100644 --- a/test/api/test-subset-hdmx.c +++ b/test/api/test-subset-hdmx.c @@ -91,28 +91,6 @@ test_subset_hdmx_invalid (void) hb_face_destroy (face); } -static void -test_subset_hdmx_fails_sanitize (void) -{ - hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016"); - - hb_subset_input_t *input = hb_subset_input_create_or_fail (); - hb_set_t *codepoints = hb_subset_input_unicode_set (input); - hb_face_t *subset; - - hb_set_add (codepoints, 'a'); - hb_set_add (codepoints, 'b'); - hb_set_add (codepoints, 'c'); - - subset = hb_subset (face, input); - g_assert (subset); - g_assert (subset == hb_face_get_empty ()); - - hb_subset_input_destroy (input); - hb_face_destroy (subset); - hb_face_destroy (face); -} - static void test_subset_hdmx_noop (void) { @@ -140,7 +118,6 @@ main (int argc, char **argv) hb_test_add (test_subset_hdmx_simple_subset); hb_test_add (test_subset_hdmx_multiple_device_records); hb_test_add (test_subset_hdmx_invalid); - hb_test_add (test_subset_hdmx_fails_sanitize); hb_test_add (test_subset_hdmx_noop); return hb_test_run(); From b710176ce28e863a01797987d7ce37d19aaf2fd3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:46:51 -0700 Subject: [PATCH 125/617] [hdmx] Touch up --- src/hb-ot-hdmx-table.hh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index 560fb14d0..35d27f7fa 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -44,7 +44,8 @@ struct DeviceRecord static unsigned int get_size (unsigned count) { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); } - template + template bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it) { TRACE_SERIALIZE (this); @@ -94,7 +95,8 @@ struct hdmx return StructAtOffset (&this->firstDeviceRecord, i * sizeDeviceRecord); } - template + template bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it) { TRACE_SERIALIZE (this); @@ -103,14 +105,13 @@ struct hdmx this->version = version; this->numRecords = it.len (); - this->sizeDeviceRecord = - it ? DeviceRecord::get_size ((*it).second.len ()) : DeviceRecord::get_size (0); + this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0); - using pair_t = decltype (*it); + it - | hb_apply ([&] (const pair_t& _) { + | hb_apply ([&] (const hb_item_type& _) { c->start_embed ()->serialize (c, _.first, _.second); - }); + }) + ; return_trace (c->successful); } @@ -125,21 +126,24 @@ struct hdmx auto it = + hb_iota ((unsigned) numRecords) - | hb_map ([&] (unsigned _) { + | hb_map ([&] (unsigned _) + { const DeviceRecord *device_record = &StructAtOffset (&firstDeviceRecord, _ * sizeDeviceRecord); auto row = + hb_iota (c->plan->num_output_glyphs ()) | hb_map (c->plan->reverse_glyph_map) - | hb_map ([=] (hb_codepoint_t _) { + | hb_map ([=] (hb_codepoint_t _) + { if (c->plan->is_empty_glyph (_)) return Null(HBUINT8); return device_record->widthsZ.as_array (get_num_glyphs ()) [_]; }) ; return hb_pair ((unsigned) device_record->pixelSize, +row); - }); + }) + ; hdmx_prime->serialize (c->serializer, version, it); return_trace (true); From 4c94bc63d914fac7e11940eb165b6cf1039ba5a1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 15:57:33 -0700 Subject: [PATCH 126/617] Move hb_invoke() back to hb-algs.hh --- src/hb-algs.hh | 32 ++++++++++++++++++++++++++++++++ src/hb-meta.hh | 32 -------------------------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 0db2184cf..6adbade15 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -76,6 +76,38 @@ struct } HB_FUNCOBJ (hb_hash); + +struct +{ + private: + + /* Pointer-to-member-function. */ + template auto + impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v)).*hb_forward (a)) (hb_forward (ds)...)) + + /* Pointer-to-member. */ + template auto + impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN + ((hb_deref (hb_forward (v))).*hb_forward (a)) + + /* Operator(). */ + template auto + impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN + (hb_deref (hb_forward (a)) (hb_forward (ds)...)) + + public: + + template auto + operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN + ( + impl (hb_forward (a), + hb_prioritize, + hb_forward (ds)...) + ) +} +HB_FUNCOBJ (hb_invoke); + struct { private: diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 421eb0638..4e5e5d94f 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -212,36 +212,4 @@ template <> struct hb_is_integer { enum { value = true }; }; #define hb_is_integer(T) hb_is_integer::value -struct -{ - private: - - /* Pointer-to-member-function. */ - template auto - impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v)).*hb_forward (a)) (hb_forward (ds)...)) - - /* Pointer-to-member. */ - template auto - impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN - ((hb_deref (hb_forward (v))).*hb_forward (a)) - - /* Operator(). */ - template auto - impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN - (hb_deref (hb_forward (a)) (hb_forward (ds)...)) - - public: - - template auto - operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN - ( - impl (hb_forward (a), - hb_prioritize, - hb_forward (ds)...) - ) -} -HB_FUNCOBJ (hb_invoke); - - #endif /* HB_META_HH */ From afb013f350b0022ae6c05f140aeba23d5de34101 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 16:16:43 -0700 Subject: [PATCH 127/617] Fix msan issue hb_identity returns rvalue-reference if input is rvalue. That, can leak the reference and cause in bad access to temporaries after they are destructed. This is unfortunately unfixable given the desired transparency of hb_identity :(. Just don't use it with hb_map(). --- src/test-iter.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test-iter.cc b/src/test-iter.cc index 0a0e4d102..944c234f5 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -161,7 +161,7 @@ main (int argc, char **argv) test_iterator_non_default_constructable (hb_enumerate (hb_iter (st))); test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1)); test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); - test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_identity)); + test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_rvalue)); assert (true == hb_all (st)); assert (false == hb_all (st, 42u)); From e8b45c19330d8718cd6d7aef0ca2db0539a53294 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 16:37:38 -0700 Subject: [PATCH 128/617] [array] Add .copy() --- src/hb-array.hh | 11 +++++++++++ src/hb-open-type.hh | 10 ++++------ src/hb-serialize.hh | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 2da8df0bb..8902e7aaf 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -176,6 +176,17 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> void free () { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; } + template + hb_array_t copy (hb_serialize_context_t *c) const + { + TRACE_SERIALIZE (this); + auto* out = c->template start_embed (arrayZ); + if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ()); + for (unsigned i = 0; i < length; i++) + out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + return_trace (hb_array_t (out, length)); + } + template bool sanitize (hb_sanitize_context_t *c) const { return c->check_array (arrayZ, length); } diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 9d388ff3f..cacb1a7b8 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -436,9 +436,7 @@ struct UnsizedArrayOf { TRACE_SERIALIZE (this); auto *out = c->start_embed (this); - if (unlikely (!out->serialize (c, count))) return_trace (nullptr); - for (unsigned i = 0; i < count; i++) - out->arrayZ[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + if (unlikely (!as_array (count).copy (c))) return_trace (nullptr); return_trace (out); } @@ -618,9 +616,9 @@ struct ArrayOf TRACE_SERIALIZE (this); auto *out = c->start_embed (this); unsigned count = len; - if (unlikely (!out->serialize (c, count))) return_trace (nullptr); - for (unsigned i = 0; i < count; i++) - out->arrayZ[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + if (unlikely (!c->extend_min (out))) return_trace (nullptr); + c->check_assign (out->len, len); + if (unlikely (!as_array ().copy (c))) return_trace (nullptr); return_trace (out); } diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index e0f79809f..76f701608 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -323,7 +323,7 @@ struct hb_serialize_context_t allocate_size (alignment - l); } - template + template Type *start_embed (const Type *obj HB_UNUSED = nullptr) const { return reinterpret_cast (this->head); } template From e2a51ff7264940312197184318f5ad4ec971492f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 16:41:39 -0700 Subject: [PATCH 129/617] Remove unused var --- src/hb-open-type.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index cacb1a7b8..5fa1164db 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -615,7 +615,6 @@ struct ArrayOf { TRACE_SERIALIZE (this); auto *out = c->start_embed (this); - unsigned count = len; if (unlikely (!c->extend_min (out))) return_trace (nullptr); c->check_assign (out->len, len); if (unlikely (!as_array ().copy (c))) return_trace (nullptr); From 3476445420d0e6432c09710b6667205453799129 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 8 May 2019 21:14:01 -0700 Subject: [PATCH 130/617] Remove unnecessary template keyword Should fix MSVC. --- src/hb-array.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 8902e7aaf..a320685e2 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -180,7 +180,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> hb_array_t copy (hb_serialize_context_t *c) const { TRACE_SERIALIZE (this); - auto* out = c->template start_embed (arrayZ); + auto* out = c->start_embed (arrayZ); if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ()); for (unsigned i = 0; i < length; i++) out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ From 71537f93e0ce27121012bf1e81270b6b03b22224 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 10:46:49 -0700 Subject: [PATCH 131/617] [iota] end -> end_ to not shadow --- src/hb-iter.hh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 5aa138fbc..974855467 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -578,36 +578,36 @@ template struct hb_iota_iter_t : hb_iter_t, T> { - hb_iota_iter_t (T start, T end, S step) : v (start), end (end_for (start, end, step)), step (step) {} + hb_iota_iter_t (T start, T end_, S step) : v (start), end_ (end__for (start, end_, step)), step (step) {} typedef T __item_t__; static constexpr bool is_random_access_iterator = true; static constexpr bool is_sorted_iterator = true; __item_t__ __item__ () const { return v; } __item_t__ __item_at__ (unsigned j) const { return v + j * step; } - bool __more__ () const { return v != end; } - unsigned __len__ () const { return (end - v) / step; } + bool __more__ () const { return v != end_; } + unsigned __len__ () const { return (end_ - v) / step; } void __next__ () { v += step; } void __forward__ (unsigned n) { v += n * step; } void __prev__ () { v -= step; } void __rewind__ (unsigned n) { v -= n * step; } - hb_iota_iter_t __end__ () const { hb_iota_iter_t (end, end, step); } + hb_iota_iter_t __end___ () const { hb_iota_iter_t (end_, end_, step); } bool operator != (const hb_iota_iter_t& o) const - { return v != o.v || end != o.end || step != o.step; } + { return v != o.v || end_ != o.end_ || step != o.step; } private: - static inline T end_for (T start, T end, S step) + static inline T end__for (T start, T end_, S step) { - auto res = (end - start) % step; + auto res = (end_ - start) % step; if (!res) - return end; - end += step - res; - return end; + return end_; + end_ += step - res; + return end_; } private: T v; - T end; + T end_; S step; }; struct From 05867d9f5315c7e4f49e5873a5aba6bba7121f04 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:00:43 -0700 Subject: [PATCH 132/617] [meta] Add hb_int_max() --- src/hb-meta.hh | 91 +++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 4e5e5d94f..74a4457c3 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -47,7 +47,7 @@ template using hb_head_tt = typename _hb_head_tt::type; /* Bool! For when we need to evaluate type-dependent expressions * in a template argument. */ -template struct hb_bool_tt { enum { value = b }; }; +template struct hb_bool_tt { static constexpr bool value = b; }; typedef hb_bool_tt hb_true_t; typedef hb_bool_tt hb_false_t; @@ -87,17 +87,17 @@ HB_FUNCOBJ (hb_addressof); template static inline T hb_declval (); #define hb_declval(T) (hb_declval ()) -template struct hb_match_const { typedef T type; enum { value = false }; }; -template struct hb_match_const { typedef T type; enum { value = true }; }; +template struct hb_match_const { typedef T type; static constexpr bool value = false; }; +template struct hb_match_const { typedef T type; static constexpr bool value = true; }; template using hb_remove_const = typename hb_match_const::type; #define hb_is_const(T) hb_match_const::value -template struct hb_match_reference { typedef T type; enum { value = false }; }; -template struct hb_match_reference { typedef T type; enum { value = true }; }; -template struct hb_match_reference { typedef T type; enum { value = true }; }; +template struct hb_match_reference { typedef T type; static constexpr bool value = false; }; +template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; +template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; template using hb_remove_reference = typename hb_match_reference::type; #define hb_is_reference(T) hb_match_reference::value -template struct hb_match_pointer { typedef T type; enum { value = false }; }; -template struct hb_match_pointer { typedef T type; enum { value = true }; }; +template struct hb_match_pointer { typedef T type; static constexpr bool value = false; }; +template struct hb_match_pointer { typedef T type; static constexpr bool value = true; }; template using hb_remove_pointer = typename hb_match_pointer::type; #define hb_is_pointer(T) hb_match_pointer::value @@ -173,42 +173,63 @@ template struct hb_is_same : hb_true_t {}; #define hb_is_same(T, T2) hb_is_same::value template struct hb_is_signed; -template <> struct hb_is_signed { enum { value = CHAR_MIN < 0 }; }; -template <> struct hb_is_signed { enum { value = true }; }; -template <> struct hb_is_signed { enum { value = false }; }; -template <> struct hb_is_signed { enum { value = true }; }; -template <> struct hb_is_signed { enum { value = false }; }; -template <> struct hb_is_signed { enum { value = true }; }; -template <> struct hb_is_signed { enum { value = false }; }; -template <> struct hb_is_signed { enum { value = true }; }; -template <> struct hb_is_signed { enum { value = false }; }; -template <> struct hb_is_signed { enum { value = true }; }; -template <> struct hb_is_signed { enum { value = false }; }; +template <> struct hb_is_signed { static constexpr bool value = CHAR_MIN < 0; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = false; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = false; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = false; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = false; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = false; }; #define hb_is_signed(T) hb_is_signed::value -template struct hb_int_min { static constexpr T value = 0; }; -template <> struct hb_int_min { static constexpr char value = CHAR_MIN; }; -template <> struct hb_int_min { static constexpr int value = INT_MIN; }; -template <> struct hb_int_min { static constexpr long value = LONG_MIN; }; +template struct hb_int_min; +template <> struct hb_int_min { static constexpr char value = CHAR_MIN; }; +template <> struct hb_int_min { static constexpr signed char value = SCHAR_MIN; }; +template <> struct hb_int_min { static constexpr unsigned char value = 0; }; +template <> struct hb_int_min { static constexpr signed short value = SHRT_MIN; }; +template <> struct hb_int_min { static constexpr unsigned short value = 0; }; +template <> struct hb_int_min { static constexpr signed int value = INT_MIN; }; +template <> struct hb_int_min { static constexpr unsigned int value = 0; }; +template <> struct hb_int_min { static constexpr signed long value = LONG_MIN; }; +template <> struct hb_int_min { static constexpr unsigned long value = 0; }; +template <> struct hb_int_min { static constexpr signed long long value = LLONG_MIN; }; +template <> struct hb_int_min { static constexpr unsigned long long value = 0; }; #define hb_int_min(T) hb_int_min::value +template struct hb_int_max; +template <> struct hb_int_max { static constexpr char value = CHAR_MAX; }; +template <> struct hb_int_max { static constexpr signed char value = SCHAR_MAX; }; +template <> struct hb_int_max { static constexpr unsigned char value = UCHAR_MAX; }; +template <> struct hb_int_max { static constexpr signed short value = SHRT_MAX; }; +template <> struct hb_int_max { static constexpr unsigned short value = USHRT_MAX; }; +template <> struct hb_int_max { static constexpr signed int value = INT_MAX; }; +template <> struct hb_int_max { static constexpr unsigned int value = UINT_MAX; }; +template <> struct hb_int_max { static constexpr signed long value = LONG_MAX; }; +template <> struct hb_int_max { static constexpr unsigned long value = ULONG_MAX; }; +template <> struct hb_int_max { static constexpr signed long long value = LLONG_MAX; }; +template <> struct hb_int_max { static constexpr unsigned long long value = ULLONG_MAX; }; +#define hb_int_max(T) hb_int_max::value template struct hb_signedness_int; template <> struct hb_signedness_int { typedef unsigned int value; }; template <> struct hb_signedness_int { typedef signed int value; }; #define hb_signedness_int(T) hb_signedness_int::value -template struct hb_is_integer { enum { value = false }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; -template <> struct hb_is_integer { enum { value = true }; }; +template struct hb_is_integer { static constexpr bool value = false;}; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; +template <> struct hb_is_integer { static constexpr bool value = true; }; #define hb_is_integer(T) hb_is_integer::value From 7675d0d3a6cc13ade1a2047019ef7fac8c373a3c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:02:56 -0700 Subject: [PATCH 133/617] [iter] Add hb_range() hb_range() is like Python range. hb_iota() has slightly different API. Ie. it takes a start, instead of end. --- src/hb-iter.hh | 33 ++++++++++++++++++++------------- src/test-iter.cc | 19 +++++++++++-------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 974855467..2557d3abc 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -572,13 +572,13 @@ struct } HB_FUNCOBJ (hb_apply); -/* hb_iota() */ +/* hb_iota()/hb_range() */ template -struct hb_iota_iter_t : - hb_iter_t, T> +struct hb_counter_iter_t : + hb_iter_t, T> { - hb_iota_iter_t (T start, T end_, S step) : v (start), end_ (end__for (start, end_, step)), step (step) {} + hb_counter_iter_t (T start, T end_, S step) : v (start), end_ (end__for (start, end_, step)), step (step) {} typedef T __item_t__; static constexpr bool is_random_access_iterator = true; @@ -591,8 +591,8 @@ struct hb_iota_iter_t : void __forward__ (unsigned n) { v += n * step; } void __prev__ () { v -= step; } void __rewind__ (unsigned n) { v -= n * step; } - hb_iota_iter_t __end___ () const { hb_iota_iter_t (end_, end_, step); } - bool operator != (const hb_iota_iter_t& o) const + hb_counter_iter_t __end___ () const { hb_counter_iter_t (end_, end_, step); } + bool operator != (const hb_counter_iter_t& o) const { return v != o.v || end_ != o.end_ || step != o.step; } private: @@ -612,15 +612,22 @@ struct hb_iota_iter_t : }; struct { - template hb_iota_iter_t - operator () (T end = (unsigned) -1) const - { return hb_iota_iter_t (0, end, 1u); } - - template hb_iota_iter_t - operator () (T start, T end, S&& step = 1u) const - { return hb_iota_iter_t (start, end, step); } + template hb_counter_iter_t + operator () (T start = 0u, S&& step = 1u) const + { return hb_counter_iter_t (start, hb_int_max (T), step); } } HB_FUNCOBJ (hb_iota); +struct +{ + template hb_counter_iter_t + operator () (T end = (unsigned) -1) const + { return hb_counter_iter_t (0, end, 1u); } + + template hb_counter_iter_t + operator () (T start, T end, S&& step = 1u) const + { return hb_counter_iter_t (start, end, step); } +} +HB_FUNCOBJ (hb_range); /* hb_sink() */ diff --git a/src/test-iter.cc b/src/test-iter.cc index 944c234f5..8f197898e 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -264,14 +264,17 @@ main (int argc, char **argv) s >> vl; hb_iota (); - assert (hb_iota (9).len () == 9); - assert (hb_iota (2, 9).len () == 7); - assert (hb_iota (2, 9, 3).len () == 3); - assert (hb_iota (2, 8, 3).len () == 2); - assert (hb_iota (2, 7, 3).len () == 2); - assert (hb_iota (-2, -9, -3).len () == 3); - assert (hb_iota (-2, -8, -3).len () == 2); - assert (hb_iota (-2, -7, -3).len () == 2); + hb_iota (3); + hb_iota (3, 2); + hb_range (); + assert (hb_range (9).len () == 9); + assert (hb_range (2, 9).len () == 7); + assert (hb_range (2, 9, 3).len () == 3); + assert (hb_range (2, 8, 3).len () == 2); + assert (hb_range (2, 7, 3).len () == 2); + assert (hb_range (-2, -9, -3).len () == 3); + assert (hb_range (-2, -8, -3).len () == 2); + assert (hb_range (-2, -7, -3).len () == 2); return 0; } From 2c24ea37b1ef63f79fcc24752dd180ce53540eda Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:07:38 -0700 Subject: [PATCH 134/617] [iter] Take start value in hb_enumerate() Also rewrite it via composition. --- src/hb-iter.hh | 61 +++++++++++------------------------------------- src/test-iter.cc | 1 + 2 files changed, 14 insertions(+), 48 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 2557d3abc..885c122e2 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -490,58 +490,11 @@ struct template hb_zip_iter_t, hb_iter_type> - operator () (A& a, B &b) const + operator () (A&& a, B&& b) const { return hb_zip_iter_t, hb_iter_type> (hb_iter (a), hb_iter (b)); } } HB_FUNCOBJ (hb_zip); -/* hb_enumerate */ - -template -struct hb_enumerate_iter_t : - hb_iter_t, - hb_pair_t> -{ - hb_enumerate_iter_t (const Iter& it) : i (0), it (it) {} - - typedef hb_pair_t __item_t__; - static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - static constexpr bool is_sorted_iterator = true; - __item_t__ __item__ () const { return __item_t__ (+i, *it); } - __item_t__ __item_at__ (unsigned j) const { return __item_t__ (i + j, it[j]); } - bool __more__ () const { return bool (it); } - unsigned __len__ () const { return it.len (); } - void __next__ () { ++i; ++it; } - void __forward__ (unsigned n) { i += n; it += n; } - void __prev__ () { --i; --it; } - void __rewind__ (unsigned n) { i -= n; it -= n; } - hb_enumerate_iter_t __end__ () const - { - if (is_random_access_iterator) - return *this + this->len (); - /* Above expression loops twice. Following loops once. */ - auto it = *this; - while (it) ++it; - return it; - } - bool operator != (const hb_enumerate_iter_t& o) const - { return i != o.i || it != o.it; } - - private: - unsigned i; - Iter it; -}; -struct -{ - template - hb_enumerate_iter_t> - operator () (Iterable&& it) const - { return hb_enumerate_iter_t> (hb_iter (it)); } -} -HB_FUNCOBJ (hb_enumerate); - /* hb_apply() */ template @@ -629,6 +582,18 @@ struct } HB_FUNCOBJ (hb_range); +/* hb_enumerate */ + +struct +{ + template + auto operator () (Iterable&& it, Index start = 0u) const HB_AUTO_RETURN + ( hb_zip (hb_iota (start), it) ) +} +HB_FUNCOBJ (hb_enumerate); + /* hb_sink() */ diff --git a/src/test-iter.cc b/src/test-iter.cc index 8f197898e..e6c5d45c0 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -158,6 +158,7 @@ main (int argc, char **argv) test_iterator (hb_zip (st, v)); test_iterator_non_default_constructable (hb_enumerate (st)); + test_iterator_non_default_constructable (hb_enumerate (st, -5)); test_iterator_non_default_constructable (hb_enumerate (hb_iter (st))); test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1)); test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); From 5d263556b95047bced88e4a6252178d2fc0f9a19 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:08:25 -0700 Subject: [PATCH 135/617] [iter] Fix --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 885c122e2..b74a395f5 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -544,7 +544,7 @@ struct hb_counter_iter_t : void __forward__ (unsigned n) { v += n * step; } void __prev__ () { v -= step; } void __rewind__ (unsigned n) { v -= n * step; } - hb_counter_iter_t __end___ () const { hb_counter_iter_t (end_, end_, step); } + hb_counter_iter_t __end__ () const { hb_counter_iter_t (end_, end_, step); } bool operator != (const hb_counter_iter_t& o) const { return v != o.v || end_ != o.end_ || step != o.step; } From 64f0899a9f5e5aff65c5a78fa796ceae6f35c008 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:10:31 -0700 Subject: [PATCH 136/617] [iter] Bug fix --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index b74a395f5..ff30b170b 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -544,7 +544,7 @@ struct hb_counter_iter_t : void __forward__ (unsigned n) { v += n * step; } void __prev__ () { v -= step; } void __rewind__ (unsigned n) { v -= n * step; } - hb_counter_iter_t __end__ () const { hb_counter_iter_t (end_, end_, step); } + hb_counter_iter_t __end__ () const { return hb_counter_iter_t (end_, end_, step); } bool operator != (const hb_counter_iter_t& o) const { return v != o.v || end_ != o.end_ || step != o.step; } From 087327af1eac8c3a16115904557cbf3ab0f28072 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:14:06 -0700 Subject: [PATCH 137/617] [iter] Minor --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index ff30b170b..1f3c81976 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -536,7 +536,7 @@ struct hb_counter_iter_t : typedef T __item_t__; static constexpr bool is_random_access_iterator = true; static constexpr bool is_sorted_iterator = true; - __item_t__ __item__ () const { return v; } + __item_t__ __item__ () const { return +v; } __item_t__ __item_at__ (unsigned j) const { return v + j * step; } bool __more__ () const { return v != end_; } unsigned __len__ () const { return (end_ - v) / step; } From 46837910e628248edc09e45e212532a3493905da Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:20:41 -0700 Subject: [PATCH 138/617] [iter] Allow negative step in hb_iota() --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 1f3c81976..a9981258e 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -567,7 +567,7 @@ struct { template hb_counter_iter_t operator () (T start = 0u, S&& step = 1u) const - { return hb_counter_iter_t (start, hb_int_max (T), step); } + { return hb_counter_iter_t (start, step >= 0 ? hb_int_max (T) : hb_int_min (T), step); } } HB_FUNCOBJ (hb_iota); struct From 57d545932f539d06c52862310ecdfe79c143bb6b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:23:41 -0700 Subject: [PATCH 139/617] [test-iter] Don't walk past end That's not legal. --- src/test-iter.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test-iter.cc b/src/test-iter.cc index e6c5d45c0..2f6ed7471 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -82,8 +82,10 @@ test_iterator_non_default_constructable (Iter it) (void) _; it += it.len (); - it = it + 10; - it = 10 + it; + if (0) + it = it + 10; + if (0) + it = 10 + it; assert (*it == it[0]); From 12dd56f8573cb86169580d5ac31b986208805c03 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:25:02 -0700 Subject: [PATCH 140/617] [iter] Minor --- src/hb-iter.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index a9981258e..30181564b 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -531,7 +531,7 @@ template struct hb_counter_iter_t : hb_iter_t, T> { - hb_counter_iter_t (T start, T end_, S step) : v (start), end_ (end__for (start, end_, step)), step (step) {} + hb_counter_iter_t (T start, T end_, S step) : v (start), end_ (end_for (start, end_, step)), step (step) {} typedef T __item_t__; static constexpr bool is_random_access_iterator = true; @@ -549,8 +549,10 @@ struct hb_counter_iter_t : { return v != o.v || end_ != o.end_ || step != o.step; } private: - static inline T end__for (T start, T end_, S step) + static inline T end_for (T start, T end_, S step) { + if (!step) + return end_; auto res = (end_ - start) % step; if (!res) return end_; From 57a5256fbcef6e5d29fc40cf019cc4b2c29c9dcf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:30:27 -0700 Subject: [PATCH 141/617] [iter] Minor --- src/hb-iter.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 30181564b..d5933986d 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -190,7 +190,7 @@ struct hb_iter_fallback_mixin_t item_t __item_at__ (unsigned i) const { return *(*thiz() + i); } /* Termination: Implement __more__(), or __len__() if random-access. */ - bool __more__ () const { return thiz()->len (); } + bool __more__ () const { return bool (thiz()->len ()); } unsigned __len__ () const { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; } @@ -471,7 +471,7 @@ struct hb_zip_iter_t : B::is_sorted_iterator; __item_t__ __item__ () const { return __item_t__ (*a, *b); } __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } - bool __more__ () const { return a && b; } + bool __more__ () const { return bool (a) && bool (b); } unsigned __len__ () const { return hb_min (a.len (), b.len ()); } void __next__ () { ++a; ++b; } void __forward__ (unsigned n) { a += n; b += n; } From 5da3c9c33f02010a3fc57cf0e1d07955af681e7c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 11:30:31 -0700 Subject: [PATCH 142/617] [iter] Fix hb_zip() end condition We should compare-equal to end if either iterator's end reaches, not if both reach at the same time. Fixes infinite-loop in test which was happening after hb_enumerate() switched to using hb_zip(). --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index d5933986d..750331265 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -479,7 +479,7 @@ struct hb_zip_iter_t : void __rewind__ (unsigned n) { a -= n; b -= n; } hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); } bool operator != (const hb_zip_iter_t& o) const - { return a != o.a || b != o.b; } + { return a != o.a && b != o.b; } private: A a; From 4f2ad75a839708de71e7341f23c2d4b72059fc58 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 12:07:45 -0700 Subject: [PATCH 143/617] [enumerate] Fix hb_enumerate() len for step=0 --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 750331265..13b82604a 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -539,7 +539,7 @@ struct hb_counter_iter_t : __item_t__ __item__ () const { return +v; } __item_t__ __item_at__ (unsigned j) const { return v + j * step; } bool __more__ () const { return v != end_; } - unsigned __len__ () const { return (end_ - v) / step; } + unsigned __len__ () const { return !step ? UINT_MAX : (end_ - v) / step; } void __next__ () { v += step; } void __forward__ (unsigned n) { v += n * step; } void __prev__ () { v -= step; } From 00195a22ce5198345cb39825a45863cef7d8f7fc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 12:14:36 -0700 Subject: [PATCH 144/617] [hdmx] Adjust to hb_iota() behavior change Use hb_range() instead. --- src/hb-ot-hdmx-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index 35d27f7fa..dc36d0ab5 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -125,14 +125,14 @@ struct hdmx if (unlikely (!hdmx_prime)) return_trace (false); auto it = - + hb_iota ((unsigned) numRecords) + + hb_range ((unsigned) numRecords) | hb_map ([&] (unsigned _) { const DeviceRecord *device_record = &StructAtOffset (&firstDeviceRecord, _ * sizeDeviceRecord); auto row = - + hb_iota (c->plan->num_output_glyphs ()) + + hb_range (c->plan->num_output_glyphs ()) | hb_map (c->plan->reverse_glyph_map) | hb_map ([=] (hb_codepoint_t _) { From c9b287a867d6130a0cc745d7fd3ccfa4dcb4c32e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 12:43:57 -0700 Subject: [PATCH 145/617] Add hb_lidentity(), and rename hb_rvalue() to hb_ridentity() --- src/hb-algs.hh | 15 +++++++++++++-- src/hb-map.hh | 4 ++-- src/test-iter.cc | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 6adbade15..53bfa1fc5 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -36,17 +36,28 @@ struct { + /* Note. This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */ template auto operator () (T&& v) const HB_AUTO_RETURN ( hb_forward (v) ) } HB_FUNCOBJ (hb_identity); - struct { + /* Like identity(), but only retains lvalue-references. Rvalues are returned as rvalues. */ + template T& + operator () (T& v) const { return v; } + template hb_remove_reference operator () (T&& v) const { return v; } } -HB_FUNCOBJ (hb_rvalue); +HB_FUNCOBJ (hb_lidentity); +struct +{ + /* Like identity(), but always returns rvalue. */ + template hb_remove_reference + operator () (T&& v) const { return v; } +} +HB_FUNCOBJ (hb_ridentity); struct { diff --git a/src/hb-map.hh b/src/hb-map.hh index 2f0659562..9dc178880 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -221,14 +221,14 @@ struct hb_hashmap_t + hb_array (items, mask ? mask + 1 : 0) | hb_filter (&item_t::is_real) | hb_map (&item_t::key) - | hb_map (hb_rvalue) + | hb_map (hb_ridentity) ) auto values () const HB_AUTO_RETURN ( + hb_array (items, mask ? mask + 1 : 0) | hb_filter (&item_t::is_real) | hb_map (&item_t::value) - | hb_map (hb_rvalue) + | hb_map (hb_ridentity) ) protected: diff --git a/src/test-iter.cc b/src/test-iter.cc index 2f6ed7471..0d41e76f3 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -164,7 +164,7 @@ main (int argc, char **argv) test_iterator_non_default_constructable (hb_enumerate (hb_iter (st))); test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1)); test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); - test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_rvalue)); + test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_lidentity)); assert (true == hb_all (st)); assert (false == hb_all (st, 42u)); From 98eec3dd5f527cc562d98784429db0c7269e82a8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 13:15:36 -0700 Subject: [PATCH 146/617] Add hb_pair_t(,) macro as alternative to hb_pair_t<,> Just so it's easier to use it in other macros. --- src/hb-algs.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 53bfa1fc5..f211242db 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -222,6 +222,7 @@ struct hb_pair_t T1 first; T2 second; }; +#define hb_pair_t(T1,T2) hb_pair_t template static inline hb_pair_t hb_pair (T1&& a, T2&& b) { return hb_pair_t (a, b); } From 971020eca7c5d576816b93431607f1e63e9584a4 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 8 May 2019 16:31:52 -0700 Subject: [PATCH 147/617] Add sink support for hb_hashmap_t and a reverse call to hb_pair_t. --- src/hb-algs.hh | 5 +++++ src/hb-map.hh | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index f211242db..ca7075538 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -217,6 +217,11 @@ struct hb_pair_t hb_pair_t (T1 a, T2 b) : first (a), second (b) {} hb_pair_t (const pair_t& o) : first (o.first), second (o.second) {} + hb_pair_t reverse () const + { + return hb_pair_t (second, first); + } + bool operator == (const pair_t& o) const { return first == o.first && second == o.second; } T1 first; diff --git a/src/hb-map.hh b/src/hb-map.hh index 9dc178880..942a301e4 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -231,6 +231,10 @@ struct hb_hashmap_t | hb_map (hb_ridentity) ) + /* Sink interface. */ + hb_hashmap_t& operator << (const hb_pair_t& v) + { set (v.first, v.second); return *this; } + protected: unsigned int bucket_for (K key) const From 5e3cbed048b19ee579277ab4c56167a15d13104e Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 8 May 2019 16:33:03 -0700 Subject: [PATCH 148/617] [subset] Switch building of glyph maps in subset plan to use iterators. --- src/hb-algs.hh | 4 +--- src/hb-subset-plan.cc | 52 +++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index ca7075538..dbb0805fc 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -218,9 +218,7 @@ struct hb_pair_t hb_pair_t (const pair_t& o) : first (o.first), second (o.second) {} hb_pair_t reverse () const - { - return hb_pair_t (second, first); - } + { return hb_pair_t (second, first); } bool operator == (const pair_t& o) const { return first == o.first && second == o.second; } diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 901347b9f..66976fa95 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -153,36 +153,36 @@ _populate_gids_to_retain (hb_face_t *face, } static void -_create_old_gid_to_new_gid_map (const hb_face_t *face, - bool retain_gids, - hb_set_t *all_gids_to_retain, - hb_map_t *glyph_map, /* OUT */ - hb_map_t *reverse_glyph_map, /* OUT */ - unsigned int *num_glyphs /* OUT */) +_create_old_gid_to_new_gid_map (const hb_face_t *face, + bool retain_gids, + const hb_set_t *all_gids_to_retain, + hb_map_t *glyph_map, /* OUT */ + hb_map_t *reverse_glyph_map, /* OUT */ + unsigned int *num_glyphs /* OUT */) { - hb_codepoint_t gid = HB_SET_VALUE_INVALID; - unsigned int length = 0; - for (unsigned int i = 0; all_gids_to_retain->next (&gid); i++) { - if (!retain_gids) - { - glyph_map->set (gid, i); - reverse_glyph_map->set (i, gid); - } - else - { - glyph_map->set (gid, gid); - reverse_glyph_map->set (gid, gid); - } - ++length; - } - if (!retain_gids || length == 0) - { - *num_glyphs = length; - } - else + if (!retain_gids) { + + hb_enumerate (hb_iter (all_gids_to_retain), (hb_codepoint_t) 0) + | hb_sink (reverse_glyph_map) + ; + *num_glyphs = reverse_glyph_map->get_population (); + } else { + + hb_iter (all_gids_to_retain) + | hb_map ([=] (hb_codepoint_t _) { + return hb_pair_t (_, _); + }) + | hb_sink (reverse_glyph_map); + ; + + // TODO(grieger): Should we discard glyphs past the max glyph to keep? + // *num_glyphs = + hb_iter (all_gids_to_retain) | hb_reduce (hb_max, 0); *num_glyphs = face->get_num_glyphs (); } + + + reverse_glyph_map->iter () + | hb_map (&hb_pair_t::reverse) + | hb_sink (glyph_map) + ; } /** From 70a49f2e4a9ab05fe04d1949bbf7a128d14a1284 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 14:35:15 -0700 Subject: [PATCH 149/617] [meta] Add hb_conditional<> and hb_is_convertible() --- src/Makefile.am | 6 ++++- src/hb-meta.hh | 56 +++++++++++++++++++++++++++++++------- src/test-meta.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 src/test-meta.cc diff --git a/src/Makefile.am b/src/Makefile.am index 9b5512f20..fc772e0ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -384,7 +384,7 @@ dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc dump_use_data_CPPFLAGS = $(HBCFLAGS) dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) -COMPILED_TESTS = test-algs test-iter test-ot-tag test-unicode-ranges +COMPILED_TESTS = test-algs test-iter test-meta test-ot-tag test-unicode-ranges COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) check_PROGRAMS += $(COMPILED_TESTS) @@ -398,6 +398,10 @@ test_iter_SOURCES = test-iter.cc hb-static.cc test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_iter_LDADD = $(COMPILED_TESTS_LDADD) +test_meta_SOURCES = test-meta.cc hb-static.cc +test_meta_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_meta_LDADD = $(COMPILED_TESTS_LDADD) + test_ot_tag_SOURCES = hb-ot-tag.cc test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 74a4457c3..b2344f78c 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -52,6 +52,18 @@ typedef hb_bool_tt hb_true_t; typedef hb_bool_tt hb_false_t; +/* Basic type SFINAE. */ + +template struct hb_enable_if {}; +template struct hb_enable_if { typedef T type; }; +#define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr +/* Concepts/Requires alias: */ +#define hb_requires(Cond) hb_enable_if((Cond)) + +template struct hb_is_same : hb_false_t {}; +template struct hb_is_same : hb_true_t {}; +#define hb_is_same(T, T2) hb_is_same::value + /* Function overloading SFINAE and priority. */ #define HB_RETURN(Ret, E) -> hb_head_tt { return (E); } @@ -110,6 +122,40 @@ template using hb_decay = hb_remove_const>; hb_is_reference (A) >= hb_is_reference (B)) + +template +struct _hb_conditional { typedef T type; }; +template +struct _hb_conditional { typedef F type; }; +template +using hb_conditional = typename _hb_conditional::type; + + +template +struct hb_is_convertible +{ + private: + static constexpr bool from_void = hb_is_same (void, hb_decay); + static constexpr bool to_void = hb_is_same (void, hb_decay ); + static constexpr bool either_void = from_void || to_void; + static constexpr bool both_void = from_void && to_void; + + static hb_true_t impl2 (hb_conditional); + + template + static auto impl (hb_priority<1>) HB_AUTO_RETURN ( impl2 (hb_declval (T)) ) + template + static hb_false_t impl (hb_priority<0>); + public: + static constexpr bool value = both_void || + (!either_void && + decltype (impl> (hb_prioritize))::value); +}; + + +#define hb_is_convertible(From,To) hb_is_convertible::value + + /* std::move and std::forward */ template @@ -162,16 +208,6 @@ struct hb_reference_wrapper }; -template struct hb_enable_if {}; -template struct hb_enable_if { typedef T type; }; -#define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr -/* Concepts/Requires alias: */ -#define hb_requires(Cond) hb_enable_if((Cond)) - -template struct hb_is_same : hb_false_t {}; -template struct hb_is_same : hb_true_t {}; -#define hb_is_same(T, T2) hb_is_same::value - template struct hb_is_signed; template <> struct hb_is_signed { static constexpr bool value = CHAR_MIN < 0; }; template <> struct hb_is_signed { static constexpr bool value = true; }; diff --git a/src/test-meta.cc b/src/test-meta.cc new file mode 100644 index 000000000..a7cfef5a4 --- /dev/null +++ b/src/test-meta.cc @@ -0,0 +1,70 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#include "hb.hh" +#include "hb-meta.hh" + + +int +main (int argc, char **argv) +{ + + static_assert (hb_is_convertible (void, void)); + static_assert (hb_is_convertible (void, const void)); + static_assert (hb_is_convertible (const void, void)); + + static_assert (hb_is_convertible (int, int)); + static_assert (hb_is_convertible (char, int)); + static_assert (hb_is_convertible (long, int)); + + static_assert (hb_is_convertible (int, int)); + + static_assert (hb_is_convertible (const int, int)); + static_assert (hb_is_convertible (int, const int)); + static_assert (hb_is_convertible (const int, const int)); + + static_assert (hb_is_convertible (int&, int)); + static_assert (!hb_is_convertible (int, int&)); + + static_assert (hb_is_convertible (int, const int&)); + static_assert (!hb_is_convertible (const int, int&)); + static_assert (hb_is_convertible (const int, const int&)); + static_assert (hb_is_convertible (int&, const int)); + static_assert (hb_is_convertible (const int&, int)); + static_assert (hb_is_convertible (const int&, const int)); + + static_assert (hb_is_convertible (int&, long)); + static_assert (!hb_is_convertible (int&, long&)); + + static_assert (hb_is_convertible (int *, int *)); + static_assert (hb_is_convertible (int *, const int *)); + static_assert (!hb_is_convertible (const int *, int *)); + static_assert (!hb_is_convertible (int *, long *)); + static_assert (hb_is_convertible (int *, void *)); + static_assert (!hb_is_convertible (void *, int *)); + + return 0; +} From 726002a6a615e2d213186d402cca4e8d7e7a7f58 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 14:53:02 -0700 Subject: [PATCH 150/617] [iter] Make hb_is_iterator_of() check is_convertible Instead of is_cr_convertible. --- src/hb-array.hh | 8 ++++---- src/hb-iter.hh | 2 +- src/hb-meta.hh | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index a320685e2..1fc07eb69 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -47,12 +47,12 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> template hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} template + hb_enable_if (hb_is_cr_convertible(U, Type))> hb_array_t (const hb_array_t &o) : hb_iter_with_fallback_t, Type&> (), arrayZ (o.arrayZ), length (o.length) {} template + hb_enable_if (hb_is_cr_convertible(U, Type))> hb_array_t& operator = (const hb_array_t &o) { arrayZ = o.arrayZ; length = o.length; return *this; } @@ -228,12 +228,12 @@ struct hb_sorted_array_t : template hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t (array_) {} template + hb_enable_if (hb_is_cr_convertible(U, Type))> hb_sorted_array_t (const hb_array_t &o) : hb_iter_t, Type&> (), hb_array_t (o) {} template + hb_enable_if (hb_is_cr_convertible(U, Type))> hb_sorted_array_t& operator = (const hb_array_t &o) { hb_array_t (*this) = o; return *this; } diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 13b82604a..2c1e31b64 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -266,7 +266,7 @@ static inline char _hb_is_iterator_of (hb_priority<0>, const void *) { return 0; template + hb_enable_if (hb_is_convertible (Item2, Item))> static inline int _hb_is_iterator_of (hb_priority<2>, hb_iter_t *) { return 0; } template diff --git a/src/hb-meta.hh b/src/hb-meta.hh index b2344f78c..9c8dfedc9 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -116,10 +116,10 @@ template using hb_remove_pointer = typename hb_match_pointer::ty /* TODO Add feature-parity to std::decay. */ template using hb_decay = hb_remove_const>; -#define hb_is_cr_convertible_to(A, B) ( \ - hb_is_same (hb_decay, hb_decay) && \ - hb_is_const (A) <= hb_is_const (B) && \ - hb_is_reference (A) >= hb_is_reference (B)) +#define hb_is_cr_convertible(From, To) ( \ + hb_is_same (hb_decay, hb_decay) && \ + hb_is_const (From) <= hb_is_const (To) && \ + hb_is_reference (From) >= hb_is_reference (To)) From 3686c3b65c017cf8689b67db440b4cddd399538b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 15:09:07 -0700 Subject: [PATCH 151/617] Adjust is_cr_convertible If To is const& then From doesn't need to be &. --- src/hb-meta.hh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 9c8dfedc9..bcd541e7a 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -116,10 +116,16 @@ template using hb_remove_pointer = typename hb_match_pointer::ty /* TODO Add feature-parity to std::decay. */ template using hb_decay = hb_remove_const>; -#define hb_is_cr_convertible(From, To) ( \ - hb_is_same (hb_decay, hb_decay) && \ - hb_is_const (From) <= hb_is_const (To) && \ - hb_is_reference (From) >= hb_is_reference (To)) +#define hb_is_cr_convertible(From, To) \ + ( \ + hb_is_same (hb_decay, hb_decay) && \ + ( \ + hb_is_const (From) <= hb_is_const (To) && \ + hb_is_reference (From) >= hb_is_reference (To) \ + ) || ( \ + hb_is_const (To) && hb_is_reference (To) \ + ) \ + ) From ceda1f03b7b06248ffd056eb7b2400088bb4a121 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 15:19:42 -0700 Subject: [PATCH 152/617] Fix compile NameRecord is not copy-constructible, so should be iterator of const-reference. --- src/hb-meta.hh | 2 -- src/hb-ot-name-table.hh | 2 +- src/test-meta.cc | 12 ++++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index bcd541e7a..b906c5539 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -157,8 +157,6 @@ struct hb_is_convertible (!either_void && decltype (impl> (hb_prioritize))::value); }; - - #define hb_is_convertible(From,To) hb_is_convertible::value diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 1c8f54406..04995c441 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -170,7 +170,7 @@ struct name { return min_size + count * nameRecordZ.item_size; } template + hb_requires (hb_is_iterator_of (Iterator, const NameRecord &))> bool serialize (hb_serialize_context_t *c, Iterator it, const void *src_string_pool) diff --git a/src/test-meta.cc b/src/test-meta.cc index a7cfef5a4..d2976b614 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -55,6 +55,18 @@ main (int argc, char **argv) static_assert (hb_is_convertible (int&, const int)); static_assert (hb_is_convertible (const int&, int)); static_assert (hb_is_convertible (const int&, const int)); + static_assert (hb_is_convertible (const int&, const int)); + + struct X {}; + + static_assert (hb_is_convertible (const X &, const X)); + static_assert (hb_is_convertible (X &, const X)); + static_assert (hb_is_convertible (X &, const X &)); + static_assert (hb_is_convertible (X, const X &)); + static_assert (hb_is_convertible (const X, const X &)); + static_assert (!hb_is_convertible (const X, X &)); + static_assert (!hb_is_convertible (X, X &)); + static_assert (hb_is_convertible (X &, X &)); static_assert (hb_is_convertible (int&, long)); static_assert (!hb_is_convertible (int&, long&)); From 69d9114b5372c1fcea5f20e75a187158c31c52f8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 15:24:14 -0700 Subject: [PATCH 153/617] [meta] Rewrite hb_is_cr_converitble --- src/hb-meta.hh | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index b906c5539..58852091f 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -116,18 +116,6 @@ template using hb_remove_pointer = typename hb_match_pointer::ty /* TODO Add feature-parity to std::decay. */ template using hb_decay = hb_remove_const>; -#define hb_is_cr_convertible(From, To) \ - ( \ - hb_is_same (hb_decay, hb_decay) && \ - ( \ - hb_is_const (From) <= hb_is_const (To) && \ - hb_is_reference (From) >= hb_is_reference (To) \ - ) || ( \ - hb_is_const (To) && hb_is_reference (To) \ - ) \ - ) - - template struct _hb_conditional { typedef T type; }; @@ -159,6 +147,16 @@ struct hb_is_convertible }; #define hb_is_convertible(From,To) hb_is_convertible::value +template +struct hb_is_cr_convertible +{ + public: + static constexpr bool value = + hb_is_same (hb_decay, hb_decay) && + (!hb_is_const (From) || hb_is_const (To)) && + (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To)); +}; +#define hb_is_cr_convertible(From,To) hb_is_cr_convertible::value /* std::move and std::forward */ From 790315e0dbc0ce796f0081a60953f74bd3fbdb63 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 15:31:24 -0700 Subject: [PATCH 154/617] [algs] Implement implicit casting between compatible pair types --- src/hb-algs.hh | 5 +++++ src/test-algs.cc | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index dbb0805fc..bbf748e3b 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -217,6 +217,11 @@ struct hb_pair_t hb_pair_t (T1 a, T2 b) : first (a), second (b) {} hb_pair_t (const pair_t& o) : first (o.first), second (o.second) {} + template + operator hb_pair_t () { return hb_pair_t (first, second); } + hb_pair_t reverse () const { return hb_pair_t (second, first); } diff --git a/src/test-algs.cc b/src/test-algs.cc index d6f34d707..774414ad1 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -73,5 +73,8 @@ main (int argc, char **argv) z = 3; assert (x == 3); + hb_pair_t xp = hb_pair_t (nullptr, 0); + xp = hb_pair_t (nullptr, 1); + return 0; } From 489f3c35bddb22cfe40c45d3a5c1cb6d88ccaf1f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 15:39:32 -0700 Subject: [PATCH 155/617] Fix bot --- src/test-meta.cc | 70 ++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/test-meta.cc b/src/test-meta.cc index d2976b614..9037e9ce4 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -32,51 +32,51 @@ int main (int argc, char **argv) { - static_assert (hb_is_convertible (void, void)); - static_assert (hb_is_convertible (void, const void)); - static_assert (hb_is_convertible (const void, void)); + static_assert (hb_is_convertible (void, void), ""); + static_assert (hb_is_convertible (void, const void), ""); + static_assert (hb_is_convertible (const void, void), ""); - static_assert (hb_is_convertible (int, int)); - static_assert (hb_is_convertible (char, int)); - static_assert (hb_is_convertible (long, int)); + static_assert (hb_is_convertible (int, int), ""); + static_assert (hb_is_convertible (char, int), ""); + static_assert (hb_is_convertible (long, int), ""); - static_assert (hb_is_convertible (int, int)); + static_assert (hb_is_convertible (int, int), ""); - static_assert (hb_is_convertible (const int, int)); - static_assert (hb_is_convertible (int, const int)); - static_assert (hb_is_convertible (const int, const int)); + static_assert (hb_is_convertible (const int, int), ""); + static_assert (hb_is_convertible (int, const int), ""); + static_assert (hb_is_convertible (const int, const int), ""); - static_assert (hb_is_convertible (int&, int)); - static_assert (!hb_is_convertible (int, int&)); + static_assert (hb_is_convertible (int&, int), ""); + static_assert (!hb_is_convertible (int, int&), ""); - static_assert (hb_is_convertible (int, const int&)); - static_assert (!hb_is_convertible (const int, int&)); - static_assert (hb_is_convertible (const int, const int&)); - static_assert (hb_is_convertible (int&, const int)); - static_assert (hb_is_convertible (const int&, int)); - static_assert (hb_is_convertible (const int&, const int)); - static_assert (hb_is_convertible (const int&, const int)); + static_assert (hb_is_convertible (int, const int&), ""); + static_assert (!hb_is_convertible (const int, int&), ""); + static_assert (hb_is_convertible (const int, const int&), ""); + static_assert (hb_is_convertible (int&, const int), ""); + static_assert (hb_is_convertible (const int&, int), ""); + static_assert (hb_is_convertible (const int&, const int), ""); + static_assert (hb_is_convertible (const int&, const int), ""); struct X {}; - static_assert (hb_is_convertible (const X &, const X)); - static_assert (hb_is_convertible (X &, const X)); - static_assert (hb_is_convertible (X &, const X &)); - static_assert (hb_is_convertible (X, const X &)); - static_assert (hb_is_convertible (const X, const X &)); - static_assert (!hb_is_convertible (const X, X &)); - static_assert (!hb_is_convertible (X, X &)); - static_assert (hb_is_convertible (X &, X &)); + static_assert (hb_is_convertible (const X &, const X), ""); + static_assert (hb_is_convertible (X &, const X), ""); + static_assert (hb_is_convertible (X &, const X &), ""); + static_assert (hb_is_convertible (X, const X &), ""); + static_assert (hb_is_convertible (const X, const X &), ""); + static_assert (!hb_is_convertible (const X, X &), ""); + static_assert (!hb_is_convertible (X, X &), ""); + static_assert (hb_is_convertible (X &, X &), ""); - static_assert (hb_is_convertible (int&, long)); - static_assert (!hb_is_convertible (int&, long&)); + static_assert (hb_is_convertible (int&, long), ""); + static_assert (!hb_is_convertible (int&, long&), ""); - static_assert (hb_is_convertible (int *, int *)); - static_assert (hb_is_convertible (int *, const int *)); - static_assert (!hb_is_convertible (const int *, int *)); - static_assert (!hb_is_convertible (int *, long *)); - static_assert (hb_is_convertible (int *, void *)); - static_assert (!hb_is_convertible (void *, int *)); + static_assert (hb_is_convertible (int *, int *), ""); + static_assert (hb_is_convertible (int *, const int *), ""); + static_assert (!hb_is_convertible (const int *, int *), ""); + static_assert (!hb_is_convertible (int *, long *), ""); + static_assert (hb_is_convertible (int *, void *), ""); + static_assert (!hb_is_convertible (void *, int *), ""); return 0; } From 322627ae1daa16f62f7a91c3c3ed02eb5b708ca5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 16:08:10 -0700 Subject: [PATCH 156/617] Whitespace --- src/hb-array.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 1fc07eb69..003fc5bed 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -44,7 +44,8 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> */ hb_array_t () : arrayZ (nullptr), length (0) {} hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} - template hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} + template + hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} template @@ -225,7 +226,8 @@ struct hb_sorted_array_t : hb_sorted_array_t () : hb_array_t () {} hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t (array_, length_) {} - template hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t (array_) {} + template + hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t (array_) {} template From 42901d7af91b4c5cffee9752f653447e4f4bd4f7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 16:22:08 -0700 Subject: [PATCH 157/617] Minor --- src/hb-meta.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 58852091f..88b7f2fc1 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -137,7 +137,7 @@ struct hb_is_convertible static hb_true_t impl2 (hb_conditional); template - static auto impl (hb_priority<1>) HB_AUTO_RETURN ( impl2 (hb_declval (T)) ) + static auto impl (hb_priority<1>) -> decltype (impl2 (hb_declval (T))); template static hb_false_t impl (hb_priority<0>); public: From ed972d5d73ba0592e1ba92426adf2a8f67acf9c9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 May 2019 16:58:28 -0700 Subject: [PATCH 158/617] [iter] Rewrite test functions Notably, add hb_is_source_of(,) and hb_is_sink_of(,) to replace most uses of hb_is_iterator_of(,). --- src/hb-iter.hh | 69 ++++++++++++++++++++++++-------------- src/hb-open-type.hh | 7 ++-- src/hb-ot-layout-common.hh | 6 ++-- src/hb-ot-name-table.hh | 2 +- src/test-iter.cc | 2 +- 5 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 2c1e31b64..131ffb9e7 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -237,6 +237,21 @@ struct hb_iter_with_fallback_t : * Meta-programming predicates. */ +/* hb_is_iterator() / hb_is_iterator_of() */ + +template +struct hb_is_iterator_of +{ + template + static hb_true_t impl (hb_priority<2>, hb_iter_t> *); + static hb_false_t impl (hb_priority<0>, const void *); + + public: + static constexpr bool value = decltype (impl (hb_prioritize, hb_declval (Iter*)))::value; +}; +#define hb_is_iterator_of(Iter, Item) hb_is_iterator_of::value +#define hb_is_iterator(Iter) hb_is_iterator_of (Iter, typename Iter::item_t) + /* hb_is_iterable() */ template @@ -251,39 +266,41 @@ struct hb_is_iterable static hb_false_t impl (hb_priority<0>); public: - - enum { value = decltype (impl (hb_prioritize))::value }; + static constexpr bool value = decltype (impl (hb_prioritize))::value; }; #define hb_is_iterable(Iterable) hb_is_iterable::value -/* TODO Add hb_is_iterable_of(). - * TODO Add random_access / sorted variants. */ - -/* hb_is_iterator() / hb_is_random_access_iterator() / hb_is_sorted_iterator() */ - -template -static inline char _hb_is_iterator_of (hb_priority<0>, const void *) { return 0; } -template -static inline int _hb_is_iterator_of (hb_priority<2>, hb_iter_t *) { return 0; } +/* hb_is_source_of() / hb_is_sink_of() */ template -struct hb_is_iterator_of { enum { - value = sizeof (int) == sizeof (_hb_is_iterator_of (hb_prioritize, hb_declval (Iter*))) }; }; -#define hb_is_iterator_of(Iter, Item) hb_is_iterator_of::value -#define hb_is_iterator(Iter) hb_is_iterator_of (Iter, typename Iter::item_t) +struct hb_is_source_of +{ + private: + template + static hb_true_t impl (hb_priority<2>); + static hb_false_t impl (hb_priority<0>); -#define hb_is_random_access_iterator_of(Iter, Item) \ - hb_is_iterator_of (Iter, Item) && Iter::is_random_access_iterator -#define hb_is_random_access_iterator(Iter) \ - hb_is_random_access_iterator_of (Iter, typename Iter::item_t) + public: + static constexpr bool value = decltype (impl (hb_prioritize))::value; +}; +#define hb_is_source_of(Iter, Item) hb_is_source_of::value -#define hb_is_sorted_iterator_of(Iter, Item) \ - hb_is_iterator_of (Iter, Item) && Iter::is_sorted_iterator -#define hb_is_sorted_iterator(Iter) \ - hb_is_sorted_iterator_of (Iter, typename Iter::item_t) +template +struct hb_is_sink_of +{ + private: + static auto impl (hb_priority<2>) -> decltype (hb_declval (Iter) << hb_declval (Item), hb_true_t ()); + static hb_false_t impl (hb_priority<0>); + + public: + static constexpr bool value = decltype (impl (hb_prioritize))::value; +}; +#define hb_is_sink_of(Iter, Item) hb_is_sink_of::value + +/* This is commonly used, so define: */ +#define hb_is_sorted_source_of(Iter, Item) \ + (hb_is_source_of(Iter, Item) && Iter::is_sorted_iterator) /* Range-based 'for' for iterables. */ diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 5fa1164db..a7e10ed74 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -419,7 +419,7 @@ struct UnsizedArrayOf return_trace (true); } template + hb_requires (hb_is_source_of (Iterator, Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); @@ -598,7 +598,7 @@ struct ArrayOf return_trace (true); } template + hb_requires (hb_is_source_of (Iterator, Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); @@ -877,7 +877,7 @@ struct SortedArrayOf : ArrayOf return_trace (ret); } template + hb_requires (hb_is_sorted_source_of (Iterator, Type))> bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); @@ -885,7 +885,6 @@ struct SortedArrayOf : ArrayOf return_trace (ret); } - template Type &bsearch (const T &x, Type ¬_found = Crap (Type)) { return *as_array ().bsearch (x, ¬_found); } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 04b211ddb..d4f0c77fb 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -797,7 +797,7 @@ struct CoverageFormat1 } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -866,7 +866,7 @@ struct CoverageFormat2 } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -1030,7 +1030,7 @@ struct Coverage } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 04995c441..f2f5a1a53 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -170,7 +170,7 @@ struct name { return min_size + count * nameRecordZ.item_size; } template + hb_requires (hb_is_source_of (Iterator, const NameRecord &))> bool serialize (hb_serialize_context_t *c, Iterator it, const void *src_string_pool) diff --git a/src/test-iter.cc b/src/test-iter.cc index 0d41e76f3..d9e2a97f1 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -127,7 +127,7 @@ main (int argc, char **argv) array_iter_t s2 (v); /* Implicit conversion from vector. */ array_iter_t t (dst); - static_assert (hb_is_random_access_iterator (array_iter_t), ""); + static_assert (array_iter_t::is_random_access_iterator, ""); some_array_t a (src); From 1b58bf22ca70908bb578910757795ee32d48b65a Mon Sep 17 00:00:00 2001 From: rsheeter Date: Thu, 9 May 2019 20:06:29 -0700 Subject: [PATCH 159/617] Update TESTING.md --- TESTING.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/TESTING.md b/TESTING.md index 6bbf7bc5b..a690afe92 100644 --- a/TESTING.md +++ b/TESTING.md @@ -5,18 +5,18 @@ Values defined in `hb-debug.hh`. ```shell # quick sanity check -time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ - && make -C test/api check || cat test/api/test-suite.log) +time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && {make -j4 -C test/api check || cat test/api/test-suite.log}) -# slower santiy check -time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ - && make -C src check \ - && make -C test/api check \ - && make -C test/subset check) +# slower sanity check +time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && make -j4 -C src check \ + && make -j4 -C test/api check \ + && make -j4 -C test/subset check) # confirm you didn't break anything else -time (make CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ - && make check) +time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ + && make -j4 check) # often catches files you didn't add, e.g. test fonts to EXTRA_DIST make distcheck From 98974ac16f5caf282c9c7cf0c417b494efd6af1d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 11:18:52 -0700 Subject: [PATCH 160/617] [iter] Adjust is_source_of / is_sink_of There are two cases that we accept. Encode both. --- src/hb-iter.hh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 131ffb9e7..cdc4fdceb 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -279,6 +279,8 @@ struct hb_is_source_of template static hb_true_t impl (hb_priority<2>); + template + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_t ()); static hb_false_t impl (hb_priority<0>); public: @@ -290,7 +292,11 @@ template struct hb_is_sink_of { private: - static auto impl (hb_priority<2>) -> decltype (hb_declval (Iter) << hb_declval (Item), hb_true_t ()); + template + static hb_true_t impl (hb_priority<2>); + template + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_t ()); static hb_false_t impl (hb_priority<0>); public: From 30e4ae6bd19bf297b029205b5f86c1a0ae14943d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 11:26:39 -0700 Subject: [PATCH 161/617] [meta] Add hb_is_base_of --- src/hb-meta.hh | 7 +++++++ src/test-meta.cc | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 88b7f2fc1..645eb5439 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -147,6 +147,13 @@ struct hb_is_convertible }; #define hb_is_convertible(From,To) hb_is_convertible::value +template +struct hb_is_base_of +{ + static constexpr bool value = hb_is_convertible (hb_decay *, hb_decay *); +}; +#define hb_is_base_of(Base,Derived) hb_is_base_of::value + template struct hb_is_cr_convertible { diff --git a/src/test-meta.cc b/src/test-meta.cc index 9037e9ce4..716e99cd7 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -78,5 +78,21 @@ main (int argc, char **argv) static_assert (hb_is_convertible (int *, void *), ""); static_assert (!hb_is_convertible (void *, int *), ""); + struct Y : X {}; + + static_assert (hb_is_base_of (void, void)); + static_assert (hb_is_base_of (void, int)); + static_assert (!hb_is_base_of (int, void)); + + static_assert (hb_is_base_of (int, int)); + static_assert (hb_is_base_of (const int, int)); + static_assert (hb_is_base_of (int, const int)); + + static_assert (hb_is_base_of (X, X)); + static_assert (hb_is_base_of (X, Y)); + static_assert (hb_is_base_of (const X, Y)); + static_assert (hb_is_base_of (X, const Y)); + static_assert (!hb_is_base_of (Y, X)); + return 0; } From 1d870cce68f7033f6d3967ce4e9ba622a6fafe79 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 11:32:59 -0700 Subject: [PATCH 162/617] Fix bot Any way to catch these? --- src/test-meta.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test-meta.cc b/src/test-meta.cc index 716e99cd7..6fb8e4f19 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -80,19 +80,19 @@ main (int argc, char **argv) struct Y : X {}; - static_assert (hb_is_base_of (void, void)); - static_assert (hb_is_base_of (void, int)); - static_assert (!hb_is_base_of (int, void)); + static_assert (hb_is_base_of (void, void), ""); + static_assert (hb_is_base_of (void, int), ""); + static_assert (!hb_is_base_of (int, void), ""); - static_assert (hb_is_base_of (int, int)); - static_assert (hb_is_base_of (const int, int)); - static_assert (hb_is_base_of (int, const int)); + static_assert (hb_is_base_of (int, int), ""); + static_assert (hb_is_base_of (const int, int), ""); + static_assert (hb_is_base_of (int, const int), ""); - static_assert (hb_is_base_of (X, X)); - static_assert (hb_is_base_of (X, Y)); - static_assert (hb_is_base_of (const X, Y)); - static_assert (hb_is_base_of (X, const Y)); - static_assert (!hb_is_base_of (Y, X)); + static_assert (hb_is_base_of (X, X), ""); + static_assert (hb_is_base_of (X, Y), ""); + static_assert (hb_is_base_of (const X, Y), ""); + static_assert (hb_is_base_of (X, const Y), ""); + static_assert (!hb_is_base_of (Y, X), ""); return 0; } From 6d63e27ca41b12ba2e8fb22fd6bc44417651c518 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 11:53:02 -0700 Subject: [PATCH 163/617] Generate tarball in .xz instead of .bz2 Fixes https://github.com/harfbuzz/harfbuzz/issues/1662 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 98e9c32d8..8444e3bf2 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/harfbuzz.pc.in]) AC_CONFIG_HEADERS([config.h]) -AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability]) +AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-xz no-dist-gzip -Wall no-define color-tests -Wno-portability]) AM_SILENT_RULES([yes]) AX_CODE_COVERAGE From cd9bc732a75c716121a86e39ab588d2e0af58eba Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 13:17:41 -0700 Subject: [PATCH 164/617] [gsubgpos] Minor --- src/hb-ot-layout-gsubgpos.hh | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 3d4a1bca8..3fb6829b3 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2504,11 +2504,7 @@ struct ExtensionFormat1 template const X& get_subtable () const - { - unsigned int offset = extensionOffset; - if (unlikely (!offset)) return Null(typename T::SubTable); - return StructAtOffset (this, offset); - } + { return this + (LOffsetTo&) extensionOffset; } template typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const @@ -2523,7 +2519,6 @@ struct ExtensionFormat1 { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - extensionOffset != 0 && extensionLookupType != T::SubTable::Extension); } @@ -2532,7 +2527,7 @@ struct ExtensionFormat1 HBUINT16 extensionLookupType; /* Lookup type of subtable referenced * by ExtensionOffset (i.e. the * extension subtable). */ - HBUINT32 extensionOffset; /* Offset to the extension subtable, + Offset32 extensionOffset; /* Offset to the extension subtable, * of lookup type subtable. */ public: DEFINE_SIZE_STATIC (8); From 5d4437fad0f99508ebd5c026a3d927f5d649615e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 13:43:29 -0700 Subject: [PATCH 165/617] Minor --- src/hb-ot-layout-common.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index d4f0c77fb..eca70ad62 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -762,7 +762,6 @@ struct Lookup return_trace (false); } return_trace (true); - return_trace (true); } private: From ac737f8c9e7cbc81cdb5a0542a2494671f236895 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 13:51:12 -0700 Subject: [PATCH 166/617] Minor again --- src/hb-ot-layout-gsubgpos.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 3fb6829b3..93f8f6ea1 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2504,7 +2504,7 @@ struct ExtensionFormat1 template const X& get_subtable () const - { return this + (LOffsetTo&) extensionOffset; } + { return this + CastR> (extensionOffset); } template typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const From 5d773ec60029e1a6edec45c27ea918d9be4ea806 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 13:53:15 -0700 Subject: [PATCH 167/617] Minor --- src/hb-ot-layout-gsubgpos.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 93f8f6ea1..9d7481b5f 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2671,7 +2671,7 @@ struct GSUBGPOS /* TODO Use intersects() to count how many subtables survive? */ CastR> (out->lookupList) .serialize_subset (c, - this+CastR> (lookupList), + this+CastR> (lookupList), out); if (version.to_int () >= 0x00010001u) From 9c0c3589f31106d1898f8922cc9a2e18cb054989 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 13:56:50 -0700 Subject: [PATCH 168/617] Minor --- src/hb-ot-layout-common.hh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index eca70ad62..ac9145151 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -647,10 +647,6 @@ struct Lookup { unsigned int get_subtable_count () const { return subTable.len; } - template - const TSubTable& get_subtable (unsigned int i) const - { return this+CastR> (subTable)[i]; } - template const OffsetArrayOf& get_subtables () const { return CastR> (subTable); } @@ -658,6 +654,13 @@ struct Lookup OffsetArrayOf& get_subtables () { return CastR> (subTable); } + template + const TSubTable& get_subtable (unsigned int i) const + { return this+get_subtables ()[i]; } + template + TSubTable& get_subtable (unsigned int i) + { return this+get_subtables ()[i]; } + unsigned int get_size () const { const HBUINT16 &markFilteringSet = StructAfter (subTable); @@ -745,8 +748,7 @@ struct Lookup if (!markFilteringSet.sanitize (c)) return_trace (false); } - if (unlikely (!CastR> (subTable) - .sanitize (c, this, get_type ()))) + if (unlikely (!get_subtables ().sanitize (c, this, get_type ()))) return_trace (false); if (unlikely (get_type () == TSubTable::Extension)) From 25a5b287f220802728cd3312692f368c45d22862 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 16:01:39 -0700 Subject: [PATCH 169/617] Fix sanitize fail of extension sublookups Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=960331 --- src/hb-ot-layout-common.hh | 10 ++++++++-- src/hb-sanitize.hh | 2 ++ ...case-minimized-harfbuzz_fuzzer-5702671124791296 | Bin 0 -> 94 bytes 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index ac9145151..478e66c02 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -751,12 +751,18 @@ struct Lookup if (unlikely (!get_subtables ().sanitize (c, this, get_type ()))) return_trace (false); - if (unlikely (get_type () == TSubTable::Extension)) + if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ())) { /* The spec says all subtables of an Extension lookup should * have the same type, which shall not be the Extension type * itself (but we already checked for that). - * This is specially important if one has a reverse type! */ + * This is specially important if one has a reverse type! + * + * We only do this if sanitizer edit_count is zero. Otherwise, + * some of the subtables might have become insane after they + * were sanity-checked by the edits of subsequent subtables. + * https://bugs.chromium.org/p/chromium/issues/detail?id=960331 + */ unsigned int type = get_subtable (0).u.extension.get_type (); unsigned int count = get_subtable_count (); for (unsigned int i = 1; i < count; i++) diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 5ecd2d2bc..5f5b4bdc9 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -211,6 +211,8 @@ struct hb_sanitize_context_t : this->start = this->end = nullptr; } + unsigned get_edit_count () { return edit_count; } + bool check_range (const void *base, unsigned int len) const { diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 new file mode 100644 index 0000000000000000000000000000000000000000..9ecc7f16be2128be18d43f5b2173514ec21ce879 GIT binary patch literal 94 zcmZQzWME)m24bxfyaDbEj0`SXZW4cif>sR1?!lo>(sw1R2 Date: Fri, 10 May 2019 16:52:43 -0700 Subject: [PATCH 170/617] Update TESTING.md --- TESTING.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/TESTING.md b/TESTING.md index a690afe92..ba9e32f2c 100644 --- a/TESTING.md +++ b/TESTING.md @@ -6,7 +6,7 @@ Values defined in `hb-debug.hh`. ```shell # quick sanity check time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ - && {make -j4 -C test/api check || cat test/api/test-suite.log}) + && (make -j4 -C test/api check || cat test/api/test-suite.log)) # slower sanity check time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ @@ -22,6 +22,13 @@ time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \ make distcheck ``` +### Run tests with asan + +```shell +./configure CC=clang CXX=clang++ CPPFLAGS=-fsanitize=address LDFLAGS=-fsanitize=address +# make/run tests as usual +``` + ### Debug with GDB ``` From 99ed6e29d86bbf391c12ee1f980b8af9dc35615e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 16:07:51 -0700 Subject: [PATCH 171/617] [serialize] Fix a TODO --- src/hb-ot-layout-common.hh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 478e66c02..2fd97cf4e 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1043,12 +1043,16 @@ struct Coverage TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - /* TODO(iter) Port to non-random-access iterator interface. */ - unsigned int count = glyphs.len (); - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < count; i++) - if (glyphs[i - 1] + 1 != glyphs[i]) - num_ranges++; + unsigned count = 0; + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + num_ranges++; + last = g; + count++; + } u.format = count * 2 < num_ranges * 3 ? 1 : 2; switch (u.format) From 2ade0086286963ae2c65d44b94e63cb3836ce36b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 16:21:03 -0700 Subject: [PATCH 172/617] [serialize] More rewrite --- src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 2fd97cf4e..06062ea1b 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -884,30 +884,36 @@ struct CoverageFormat2 rangeRecord.len = 0; return_trace (true); } - /* TODO(iter) Port to non-random-access iterator interface. */ - unsigned int count = glyphs.len (); - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < count; i++) - if (glyphs[i - 1] + 1 != glyphs[i]) - num_ranges++; - rangeRecord.len = num_ranges; - if (unlikely (!c->extend (rangeRecord))) return_trace (false); + /* TODO(iter) Write more efficiently? */ - unsigned int range = 0; - rangeRecord[range].start = glyphs[0]; - rangeRecord[range].value = 0; - for (unsigned int i = 1; i < count; i++) + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) { - if (glyphs[i - 1] + 1 != glyphs[i]) - { - rangeRecord[range].end = glyphs[i - 1]; - range++; - rangeRecord[range].start = glyphs[i]; - rangeRecord[range].value = i; - } + if (last + 1 != g) + num_ranges++; + last = g; } - rangeRecord[range].end = glyphs[count - 1]; + + if (unlikely (!rangeRecord.serialize (c, num_ranges))) return_trace (false); + + unsigned count = 0; + unsigned range = (unsigned) -1; + last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + { + range++; + rangeRecord[range].start = g; + rangeRecord[range].value = count; + } + rangeRecord[range].end = g; + last = g; + count++; + } + return_trace (true); } From a27a31b9ee2601a05575cb581dc227caa73742c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 16:26:19 -0700 Subject: [PATCH 173/617] Minor --- src/hb-ot-layout-common.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 06062ea1b..40349a01d 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1224,7 +1224,7 @@ struct ClassDefFormat1 hb_codepoint_t glyph_max = +glyphs | hb_reduce (hb_max, 0u); startGlyph = glyph_min; - classValue.len = glyph_max - glyph_min + 1; + c->check_assign (classValue.len, glyph_max - glyph_min + 1); if (unlikely (!c->extend (classValue))) return_trace (false); for (unsigned int i = 0; i < glyphs.length; i++) From 4d67743ffd99ed9f2278ab21adfac7eb314c0df0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 16:35:31 -0700 Subject: [PATCH 174/617] [subset] Use more auto typing --- src/hb-ot-layout-common.hh | 8 ++++---- src/hb-ot-layout-gdef-table.hh | 2 +- src/hb-ot-layout-gsubgpos.hh | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 40349a01d..017895891 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -138,7 +138,7 @@ struct RecordListOf : RecordArrayOf bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct RecordListOf *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) @@ -277,7 +277,7 @@ struct Script bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Script *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->defaultLangSys.serialize_copy (c->serializer, this+defaultLangSys, out); unsigned int count = langSys.len; @@ -559,7 +559,7 @@ struct Feature bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Feature *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->featureParams = 0; /* TODO(subset) FeatureParams. */ return_trace (true); @@ -722,7 +722,7 @@ struct Lookup bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Lookup *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); /* Subset the actual subtables. */ diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 5d9a3ec78..ac1bddb2e 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -439,7 +439,7 @@ struct GDEF bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct GDEF *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->glyphClassDef.serialize_subset (c, this+glyphClassDef, out); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9d7481b5f..182f9a06b 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -849,7 +849,7 @@ static inline bool match_input (hb_ot_apply_context_t *c, if (ligbase == LIGBASE_NOT_CHECKED) { bool found = false; - const hb_glyph_info_t *out = buffer->out_info; + const auto *out = buffer->out_info; unsigned int j = buffer->out_len; while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id) { @@ -2661,7 +2661,7 @@ struct GSUBGPOS bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct GSUBGPOS *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->scriptList.serialize_subset (c, this+scriptList, out); From 2fb3a8327ab35248a0c7877c48422718cfbe375d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 18:40:29 -0700 Subject: [PATCH 175/617] [vector] Simplify arrayZ Was turned into function when we had static ones and wanted to be move-safe... Not the case anymore. --- src/hb-coretext.cc | 2 +- src/hb-ot-cff-common.hh | 2 +- src/hb-uniscribe.cc | 10 +++--- src/hb-vector.hh | 71 +++++++++++++++++++---------------------- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index bf8e96c7b..383428570 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -598,7 +598,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } else { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ ()); + active_features.remove (feature - active_features.arrayZ); } } } diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index e7ac0bac2..5d80943b7 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -167,7 +167,7 @@ struct CFFIndex byteArray.resize (buffArray.length); for (unsigned int i = 0; i < byteArray.length; i++) { - byteArray[i] = byte_str_t (buffArray[i].arrayZ (), buffArray[i].length); + byteArray[i] = byte_str_t (buffArray[i].arrayZ, buffArray[i].length); } bool result = this->serialize (c, offSize_, byteArray); byteArray.fini (); diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index ac4ff6366..4e004416b 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -698,7 +698,7 @@ _hb_uniscribe_shape (hb_shape_plan_t *shape_plan, { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ ()); + active_features.remove (feature - active_features.arrayZ); } } @@ -889,8 +889,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts.arrayZ (), - range_properties.arrayZ (), + range_char_counts.arrayZ, + range_properties.arrayZ, range_properties.length, pchars + chars_offset, item_chars_len, @@ -930,8 +930,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts.arrayZ (), - range_properties.arrayZ (), + range_char_counts.arrayZ, + range_properties.arrayZ, range_properties.length, pchars + chars_offset, log_clusters + chars_offset, diff --git a/src/hb-vector.hh b/src/hb-vector.hh index e0b7fb0cb..3c6347b3f 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -49,35 +49,34 @@ struct hb_vector_t { allocated = o.allocated; length = o.length; - arrayZ_ = o.arrayZ_; + arrayZ = o.arrayZ; o.init (); } ~hb_vector_t () { fini (); } - unsigned int length; private: int allocated; /* == -1 means allocation failed. */ - Type *arrayZ_; public: + unsigned int length; + public: + Type *arrayZ; void init () { allocated = length = 0; - arrayZ_ = nullptr; + arrayZ = nullptr; } void fini () { - if (arrayZ_) - free (arrayZ_); + free (arrayZ); init (); } void fini_deep () { - Type *array = arrayZ(); unsigned int count = length; for (unsigned int i = 0; i < count; i++) - array[i].fini (); + arrayZ[i].fini (); fini (); } @@ -95,33 +94,30 @@ struct hb_vector_t fini (); allocated = o.allocated; length = o.length; - arrayZ_ = o.arrayZ_; + arrayZ = o.arrayZ; o.init (); return *this; } hb_bytes_t as_bytes () const - { return hb_bytes_t ((const char *) arrayZ(), length * item_size); } + { return hb_bytes_t ((const char *) arrayZ, length * item_size); } bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); } uint32_t hash () const { return as_array ().hash (); } - const Type * arrayZ () const { return arrayZ_; } - Type * arrayZ () { return arrayZ_; } - Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= length)) return Crap (Type); - return arrayZ()[i]; + return arrayZ[i]; } const Type& operator [] (int i_) const { unsigned int i = (unsigned int) i_; if (unlikely (i >= length)) return Null(Type); - return arrayZ()[i]; + return arrayZ[i]; } Type& tail () { return (*this)[length - 1]; } @@ -134,8 +130,8 @@ struct hb_vector_t template hb_vector_t& operator << (T&& v) { push (hb_forward (v)); return *this; } - hb_array_t< Type> as_array () { return hb_array (arrayZ(), length); } - hb_array_t as_array () const { return hb_array (arrayZ(), length); } + hb_array_t< Type> as_array () { return hb_array (arrayZ, length); } + hb_array_t as_array () const { return hb_array (arrayZ, length); } /* Iterator. */ typedef hb_array_t iter_t; @@ -155,21 +151,21 @@ struct hb_vector_t { return as_array ().sub_array (start_offset, count);} hb_sorted_array_t as_sorted_array () - { return hb_sorted_array (arrayZ(), length); } + { return hb_sorted_array (arrayZ, length); } hb_sorted_array_t as_sorted_array () const - { return hb_sorted_array (arrayZ(), length); } + { return hb_sorted_array (arrayZ, length); } - template explicit operator T * () { return arrayZ(); } - template explicit operator const T * () const { return arrayZ(); } + template explicit operator T * () { return arrayZ; } + template explicit operator const T * () const { return arrayZ; } - Type * operator + (unsigned int i) { return arrayZ() + i; } - const Type * operator + (unsigned int i) const { return arrayZ() + i; } + Type * operator + (unsigned int i) { return arrayZ + i; } + const Type * operator + (unsigned int i) const { return arrayZ + i; } Type *push () { if (unlikely (!resize (length + 1))) return &Crap(Type); - return &arrayZ()[length - 1]; + return &arrayZ[length - 1]; } template Type *push (T&& v) @@ -202,7 +198,7 @@ struct hb_vector_t (new_allocated < (unsigned) allocated) || hb_unsigned_mul_overflows (new_allocated, sizeof (Type)); if (likely (!overflows)) - new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type)); + new_array = (Type *) realloc (arrayZ, new_allocated * sizeof (Type)); if (unlikely (!new_array)) { @@ -210,7 +206,7 @@ struct hb_vector_t return false; } - arrayZ_ = new_array; + arrayZ = new_array; allocated = new_allocated; return true; @@ -223,7 +219,7 @@ struct hb_vector_t return false; if (size > length) - memset (arrayZ() + length, 0, (size - length) * sizeof (*arrayZ())); + memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); length = size; return true; @@ -232,16 +228,15 @@ struct hb_vector_t Type pop () { if (!length) return Null(Type); - return hb_move (arrayZ()[--length]); /* Does this move actually work? */ + return hb_move (arrayZ[--length]); /* Does this move actually work? */ } void remove (unsigned int i) { if (unlikely (i >= length)) return; - Type *array = arrayZ(); - memmove (static_cast (&array[i]), - static_cast (&array[i + 1]), + memmove (static_cast (&arrayZ[i]), + static_cast (&arrayZ[i + 1]), (length - i - 1) * sizeof (Type)); length--; } @@ -256,19 +251,17 @@ struct hb_vector_t template Type *find (T v) { - Type *array = arrayZ(); for (unsigned int i = 0; i < length; i++) - if (array[i] == v) - return &array[i]; + if (arrayZ[i] == v) + return &arrayZ[i]; return nullptr; } template const Type *find (T v) const { - const Type *array = arrayZ(); for (unsigned int i = 0; i < length; i++) - if (array[i] == v) - return &array[i]; + if (arrayZ[i] == v) + return &arrayZ[i]; return nullptr; } @@ -288,8 +281,8 @@ struct hb_vector_t template struct hb_sorted_vector_t : hb_vector_t { - hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ(), this->length); } - hb_sorted_array_t as_array () const { return hb_sorted_array (this->arrayZ(), this->length); } + hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ, this->length); } + hb_sorted_array_t as_array () const { return hb_sorted_array (this->arrayZ, this->length); } /* Iterator. */ typedef hb_sorted_array_t const_iter_t; From 9574de7a3e763b9c5eacf65b4b8c148724c00b82 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 19:29:32 -0700 Subject: [PATCH 176/617] [meta] Add add_const, add_pointer, add_lvalue_reference, add_rvalue_reference --- src/hb-meta.hh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 645eb5439..4cf846653 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -102,17 +102,28 @@ template static inline T hb_declval (); template struct hb_match_const { typedef T type; static constexpr bool value = false; }; template struct hb_match_const { typedef T type; static constexpr bool value = true; }; template using hb_remove_const = typename hb_match_const::type; +template using hb_add_const = const T; #define hb_is_const(T) hb_match_const::value template struct hb_match_reference { typedef T type; static constexpr bool value = false; }; template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; template using hb_remove_reference = typename hb_match_reference::type; +template auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity; +template auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity; +template using hb_add_lvalue_reference = decltype (_hb_try_add_lvalue_reference (hb_prioritize)); +template auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_type_identity; +template auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity; +template using hb_add_rvalue_reference = decltype (_hb_try_add_rvalue_reference (hb_prioritize)); #define hb_is_reference(T) hb_match_reference::value template struct hb_match_pointer { typedef T type; static constexpr bool value = false; }; template struct hb_match_pointer { typedef T type; static constexpr bool value = true; }; template using hb_remove_pointer = typename hb_match_pointer::type; +template auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity*>; +template auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity; +template using hb_add_pointer = decltype (_hb_try_add_pointer (hb_prioritize)); #define hb_is_pointer(T) hb_match_pointer::value + /* TODO Add feature-parity to std::decay. */ template using hb_decay = hb_remove_const>; From e0315b4aadb3fbc6b618de56d643471e8d1f7859 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 19:48:02 -0700 Subject: [PATCH 177/617] [meta] is_integer -> is_integral --- src/hb-algs.hh | 2 +- src/hb-map.hh | 4 ++-- src/hb-meta.hh | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index bbf748e3b..24bdeb190 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -73,7 +73,7 @@ struct impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) template auto + hb_enable_if (hb_is_integral (T))> auto impl (const T& v, hb_priority<0>) const HB_AUTO_RETURN ( /* Knuth's multiplicative method: */ diff --git a/src/hb-map.hh b/src/hb-map.hh index 942a301e4..26e4930a5 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -43,8 +43,8 @@ struct hb_hashmap_t hb_hashmap_t () { init (); } ~hb_hashmap_t () { fini (); } - static_assert (hb_is_integer (K) || hb_is_pointer (K), ""); - static_assert (hb_is_integer (V) || hb_is_pointer (V), ""); + static_assert (hb_is_integral (K) || hb_is_pointer (K), ""); + static_assert (hb_is_integral (V) || hb_is_pointer (V), ""); /* TODO If key type is a pointer, keep hash in item_t and use to: * 1. avoid rehashing when resizing table, and diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 4cf846653..290b41cc2 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -274,19 +274,19 @@ template <> struct hb_signedness_int { typedef unsigned int value; }; template <> struct hb_signedness_int { typedef signed int value; }; #define hb_signedness_int(T) hb_signedness_int::value -template struct hb_is_integer { static constexpr bool value = false;}; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -template <> struct hb_is_integer { static constexpr bool value = true; }; -#define hb_is_integer(T) hb_is_integer::value +template struct hb_is_integral { static constexpr bool value = false;}; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +#define hb_is_integral(T) hb_is_integral::value #endif /* HB_META_HH */ From 25bb7e005d96c367731fd8d129d764d101b1200f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 19:49:26 -0700 Subject: [PATCH 178/617] [meta] Add is_signed for floating point types --- src/hb-meta.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 290b41cc2..f13b256ee 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -240,6 +240,9 @@ template <> struct hb_is_signed { static constexpr bool value = tr template <> struct hb_is_signed { static constexpr bool value = false; }; template <> struct hb_is_signed { static constexpr bool value = true; }; template <> struct hb_is_signed { static constexpr bool value = false; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; +template <> struct hb_is_signed { static constexpr bool value = true; }; #define hb_is_signed(T) hb_is_signed::value template struct hb_int_min; From 3919ca41b5e657764c7f75dfdc21cf8ca20bd66f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 19:56:36 -0700 Subject: [PATCH 179/617] [meta] Add is_floating_point --- src/hb-meta.hh | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index f13b256ee..d995607f4 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -228,6 +228,25 @@ struct hb_reference_wrapper }; +template struct hb_is_integral { static constexpr bool value = false;}; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; +template <> struct hb_is_integral { static constexpr bool value = true; }; + +template struct hb_is_floating_point { static constexpr bool value = false;}; +template <> struct hb_is_floating_point { static constexpr bool value = true; }; +template <> struct hb_is_floating_point { static constexpr bool value = true; }; +template <> struct hb_is_floating_point { static constexpr bool value = true; }; + +#define hb_is_integral(T) hb_is_integral::value template struct hb_is_signed; template <> struct hb_is_signed { static constexpr bool value = CHAR_MIN < 0; }; template <> struct hb_is_signed { static constexpr bool value = true; }; @@ -277,19 +296,5 @@ template <> struct hb_signedness_int { typedef unsigned int value; }; template <> struct hb_signedness_int { typedef signed int value; }; #define hb_signedness_int(T) hb_signedness_int::value -template struct hb_is_integral { static constexpr bool value = false;}; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -#define hb_is_integral(T) hb_is_integral::value - #endif /* HB_META_HH */ From 38e3a8bd531ef3d35ca0fbcfad09db3f83345038 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:03:14 -0700 Subject: [PATCH 180/617] [meta] bool_tt -> bool_constant --- src/hb-meta.hh | 6 +++--- src/hb-null.hh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index d995607f4..e5eae564d 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -47,9 +47,9 @@ template using hb_head_tt = typename _hb_head_tt::type; /* Bool! For when we need to evaluate type-dependent expressions * in a template argument. */ -template struct hb_bool_tt { static constexpr bool value = b; }; -typedef hb_bool_tt hb_true_t; -typedef hb_bool_tt hb_false_t; +template struct hb_bool_constant { static constexpr bool value = b; }; +typedef hb_bool_constant hb_true_t; +typedef hb_bool_constant hb_false_t; /* Basic type SFINAE. */ diff --git a/src/hb-null.hh b/src/hb-null.hh index 562c4abc0..fea881af6 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -50,7 +50,7 @@ template struct _hb_null_size { enum { value = sizeof (T) }; }; template -struct _hb_null_size> +struct _hb_null_size> { enum { value = T::null_size }; }; template @@ -67,7 +67,7 @@ template struct _hb_static_size { enum { value = sizeof (T) }; }; template -struct _hb_static_size> +struct _hb_static_size> { enum { value = T::static_size }; }; template From 61d150c916d181cc3f333d0378108e08210370ad Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:06:31 -0700 Subject: [PATCH 181/617] [meta] Add integral_constant, true_t -> true_type, false_t -> false_type --- src/hb-iter.hh | 20 ++++++++++---------- src/hb-meta.hh | 17 ++++++++--------- src/hb-null.hh | 4 ++-- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index cdc4fdceb..a0beb2cdd 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -243,8 +243,8 @@ template struct hb_is_iterator_of { template - static hb_true_t impl (hb_priority<2>, hb_iter_t> *); - static hb_false_t impl (hb_priority<0>, const void *); + static hb_true_type impl (hb_priority<2>, hb_iter_t> *); + static hb_false_type impl (hb_priority<0>, const void *); public: static constexpr bool value = decltype (impl (hb_prioritize, hb_declval (Iter*)))::value; @@ -260,10 +260,10 @@ struct hb_is_iterable private: template - static auto impl (hb_priority<1>) -> decltype (hb_declval (U).iter (), hb_true_t ()); + static auto impl (hb_priority<1>) -> decltype (hb_declval (U).iter (), hb_true_type ()); template - static hb_false_t impl (hb_priority<0>); + static hb_false_type impl (hb_priority<0>); public: static constexpr bool value = decltype (impl (hb_prioritize))::value; @@ -278,10 +278,10 @@ struct hb_is_source_of private: template - static hb_true_t impl (hb_priority<2>); + static hb_true_type impl (hb_priority<2>); template - static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_t ()); - static hb_false_t impl (hb_priority<0>); + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_type ()); + static hb_false_type impl (hb_priority<0>); public: static constexpr bool value = decltype (impl (hb_prioritize))::value; @@ -294,10 +294,10 @@ struct hb_is_sink_of private: template - static hb_true_t impl (hb_priority<2>); + static hb_true_type impl (hb_priority<2>); template - static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_t ()); - static hb_false_t impl (hb_priority<0>); + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_type ()); + static hb_false_type impl (hb_priority<0>); public: static constexpr bool value = decltype (impl (hb_prioritize))::value; diff --git a/src/hb-meta.hh b/src/hb-meta.hh index e5eae564d..f00924599 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -45,11 +45,10 @@ template using hb_void_tt = typename _hb_void_tt::type; template struct _hb_head_tt { typedef Head type; }; template using hb_head_tt = typename _hb_head_tt::type; -/* Bool! For when we need to evaluate type-dependent expressions - * in a template argument. */ -template struct hb_bool_constant { static constexpr bool value = b; }; -typedef hb_bool_constant hb_true_t; -typedef hb_bool_constant hb_false_t; +template struct hb_integral_constant { static constexpr T value = v; }; +template using hb_bool_constant = hb_integral_constant; +using hb_true_type = hb_bool_constant; +using hb_false_type = hb_bool_constant; /* Basic type SFINAE. */ @@ -60,8 +59,8 @@ template struct hb_enable_if { typedef T ty /* Concepts/Requires alias: */ #define hb_requires(Cond) hb_enable_if((Cond)) -template struct hb_is_same : hb_false_t {}; -template struct hb_is_same : hb_true_t {}; +template struct hb_is_same : hb_false_type {}; +template struct hb_is_same : hb_true_type {}; #define hb_is_same(T, T2) hb_is_same::value /* Function overloading SFINAE and priority. */ @@ -145,12 +144,12 @@ struct hb_is_convertible static constexpr bool either_void = from_void || to_void; static constexpr bool both_void = from_void && to_void; - static hb_true_t impl2 (hb_conditional); + static hb_true_type impl2 (hb_conditional); template static auto impl (hb_priority<1>) -> decltype (impl2 (hb_declval (T))); template - static hb_false_t impl (hb_priority<0>); + static hb_false_type impl (hb_priority<0>); public: static constexpr bool value = both_void || (!either_void && diff --git a/src/hb-null.hh b/src/hb-null.hh index fea881af6..79da71513 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -55,7 +55,7 @@ struct _hb_null_size> template struct hb_null_size -{ enum { value = _hb_null_size::value }; }; +{ enum { value = _hb_null_size::value }; }; #define hb_null_size(T) hb_null_size::value /* These doesn't belong here, but since is copy/paste from above, put it here. */ @@ -72,7 +72,7 @@ struct _hb_static_size> template struct hb_static_size -{ enum { value = _hb_static_size::value }; }; +{ enum { value = _hb_static_size::value }; }; #define hb_static_size(T) hb_static_size::value From 5a171ed3a69313e10df6e42a03affb5e8bfe8e95 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:11:29 -0700 Subject: [PATCH 182/617] [null] Modernize template work --- src/hb-null.hh | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/hb-null.hh b/src/hb-null.hh index 79da71513..725db5024 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -47,15 +47,12 @@ */ template -struct _hb_null_size -{ enum { value = sizeof (T) }; }; +struct _hb_null_size : hb_integral_constant {}; template -struct _hb_null_size> -{ enum { value = T::null_size }; }; +struct _hb_null_size> : hb_integral_constant {}; template -struct hb_null_size -{ enum { value = _hb_null_size::value }; }; +using hb_null_size = _hb_null_size; #define hb_null_size(T) hb_null_size::value /* These doesn't belong here, but since is copy/paste from above, put it here. */ @@ -64,15 +61,11 @@ struct hb_null_size * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */ template -struct _hb_static_size -{ enum { value = sizeof (T) }; }; +struct _hb_static_size : hb_integral_constant {}; template -struct _hb_static_size> -{ enum { value = T::static_size }; }; - +struct _hb_static_size> : hb_integral_constant {}; template -struct hb_static_size -{ enum { value = _hb_static_size::value }; }; +using hb_static_size = _hb_static_size; #define hb_static_size(T) hb_static_size::value From b4ad6af9c4ec30c462078bd93ae12653619c5fea Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:15:03 -0700 Subject: [PATCH 183/617] [meta] Rewrite is_base_of --- src/hb-meta.hh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index f00924599..ef6d98912 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -158,10 +158,7 @@ struct hb_is_convertible #define hb_is_convertible(From,To) hb_is_convertible::value template -struct hb_is_base_of -{ - static constexpr bool value = hb_is_convertible (hb_decay *, hb_decay *); -}; +using hb_is_base_of = hb_is_convertible *, hb_decay *>; #define hb_is_base_of(Base,Derived) hb_is_base_of::value template From c3a456a26e8e5f8bc483b326f1928e9c603a7216 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:17:30 -0700 Subject: [PATCH 184/617] [meta] Rewrite is_cr_convertible --- src/hb-meta.hh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index ef6d98912..334a44a2a 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -162,14 +162,11 @@ using hb_is_base_of = hb_is_convertible *, hb_decay *>; #define hb_is_base_of(Base,Derived) hb_is_base_of::value template -struct hb_is_cr_convertible -{ - public: - static constexpr bool value = - hb_is_same (hb_decay, hb_decay) && - (!hb_is_const (From) || hb_is_const (To)) && - (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To)); -}; +using hb_is_cr_convertible = hb_bool_constant< + hb_is_same (hb_decay, hb_decay) && + (!hb_is_const (From) || hb_is_const (To)) && + (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To)) +>; #define hb_is_cr_convertible(From,To) hb_is_cr_convertible::value /* std::move and std::forward */ From e939d88bd72e0db0ebe357649b7a0fa3447c0bf4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:20:51 -0700 Subject: [PATCH 185/617] [meta] Rewrite is_integral / is_floating_point, add is_arithmetic --- src/hb-meta.hh | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 334a44a2a..6f141e02e 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -221,25 +221,38 @@ struct hb_reference_wrapper }; -template struct hb_is_integral { static constexpr bool value = false;}; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; -template <> struct hb_is_integral { static constexpr bool value = true; }; - -template struct hb_is_floating_point { static constexpr bool value = false;}; -template <> struct hb_is_floating_point { static constexpr bool value = true; }; -template <> struct hb_is_floating_point { static constexpr bool value = true; }; -template <> struct hb_is_floating_point { static constexpr bool value = true; }; - +template +using hb_is_integral = hb_bool_constant< + hb_is_same (hb_decay, char) || + hb_is_same (hb_decay, signed char) || + hb_is_same (hb_decay, unsigned char) || + hb_is_same (hb_decay, signed int) || + hb_is_same (hb_decay, unsigned int) || + hb_is_same (hb_decay, signed short) || + hb_is_same (hb_decay, unsigned short) || + hb_is_same (hb_decay, signed long) || + hb_is_same (hb_decay, unsigned long) || + hb_is_same (hb_decay, signed long long) || + hb_is_same (hb_decay, unsigned long long) || + false +>; #define hb_is_integral(T) hb_is_integral::value +template +using hb_is_floating_point = hb_bool_constant< + hb_is_same (hb_decay, float) || + hb_is_same (hb_decay, double) || + hb_is_same (hb_decay, long double) || + false +>; +#define hb_is_floating_point(T) hb_is_floating_point::value +template +using hb_is_arithmetic = hb_bool_constant< + hb_is_integral (T) || + hb_is_floating_point (T) || + false +>; +#define hb_is_arighmetic(T) hb_is_arighmetic::value + template struct hb_is_signed; template <> struct hb_is_signed { static constexpr bool value = CHAR_MIN < 0; }; template <> struct hb_is_signed { static constexpr bool value = true; }; From ce300f4fb68a25d46d165e8b0a4825482c83a966 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:26:29 -0700 Subject: [PATCH 186/617] [meta] Rewrite is_signed, add is_unsigned --- src/hb-meta.hh | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 6f141e02e..7b4d0263a 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -251,24 +251,19 @@ using hb_is_arithmetic = hb_bool_constant< hb_is_floating_point (T) || false >; -#define hb_is_arighmetic(T) hb_is_arighmetic::value +#define hb_is_arithmetic(T) hb_is_arithmetic::value -template struct hb_is_signed; -template <> struct hb_is_signed { static constexpr bool value = CHAR_MIN < 0; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = false; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = false; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = false; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = false; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = false; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; -template <> struct hb_is_signed { static constexpr bool value = true; }; + +template +using hb_is_signed = hb_conditional, + hb_false_type>; #define hb_is_signed(T) hb_is_signed::value +template +using hb_is_unsigned = hb_conditional, + hb_false_type>; +#define hb_is_unsigned(T) hb_is_unsigned::value template struct hb_int_min; template <> struct hb_int_min { static constexpr char value = CHAR_MIN; }; From 707ff5b59d3903b60312a028f2ba5d74c18db101 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:31:20 -0700 Subject: [PATCH 187/617] Minor --- src/hb-meta.hh | 5 ----- src/hb-open-type.hh | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 7b4d0263a..71698f941 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -292,10 +292,5 @@ template <> struct hb_int_max { static constexpr signed long template <> struct hb_int_max { static constexpr unsigned long long value = ULLONG_MAX; }; #define hb_int_max(T) hb_int_max::value -template struct hb_signedness_int; -template <> struct hb_signedness_int { typedef unsigned int value; }; -template <> struct hb_signedness_int { typedef signed int value; }; -#define hb_signedness_int(T) hb_signedness_int::value - #endif /* HB_META_HH */ diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index a7e10ed74..9e17b5c88 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -57,7 +57,7 @@ template struct IntType { typedef Type type; - typedef typename hb_signedness_int (hb_is_signed (Type)) wide_type; + typedef hb_conditional wide_type; IntType& operator = (wide_type i) { v = i; return *this; } operator wide_type () const { return v; } From 149c3db8a2d41894b5d65f4c4b7c20757f6de6dd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:34:52 -0700 Subject: [PATCH 188/617] [meta] Minor --- src/hb-meta.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 71698f941..7ddfd13a4 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -35,7 +35,7 @@ */ /* Void! For when we need a expression-type of void. */ -struct hb_void_t { typedef void value; }; +struct hb_void_t {}; /* Void meta-function ala std::void_t * https://en.cppreference.com/w/cpp/types/void_t */ From 7df3ecfb4069d275cd277c71165962bb5769364a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:43:26 -0700 Subject: [PATCH 189/617] [meta] hb_void_t -> hb_empty_t --- src/hb-debug.hh | 6 +++--- src/hb-meta.hh | 2 +- src/hb-ot-layout-gsub-table.hh | 2 +- src/hb-ot-layout-gsubgpos.hh | 18 +++++++++--------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/hb-debug.hh b/src/hb-debug.hh index 57b3f1b04..a03170b08 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -249,8 +249,8 @@ struct hb_printer_t { }; template <> -struct hb_printer_t { - const char *print (hb_void_t) { return ""; } +struct hb_printer_t { + const char *print (hb_empty_t) { return ""; } }; @@ -266,7 +266,7 @@ static inline void _hb_warn_no_return (bool returned) } } template <> -/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) +/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) {} template diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 7ddfd13a4..b8964c047 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -35,7 +35,7 @@ */ /* Void! For when we need a expression-type of void. */ -struct hb_void_t {}; +struct hb_empty_t {}; /* Void meta-function ala std::void_t * https://en.cppreference.com/w/cpp/types/void_t */ diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 364ef189e..a6e9a7534 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1319,7 +1319,7 @@ struct SubstLookup : Lookup HB_INTERNAL static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) { if (!c->should_visit_lookup (lookup_index)) - return hb_void_t (); + return hb_empty_t (); hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 182f9a06b..5946db7c4 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -59,13 +59,13 @@ struct hb_intersects_context_t : }; struct hb_closure_context_t : - hb_dispatch_context_t + hb_dispatch_context_t { const char *get_name () { return "CLOSURE"; } typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); template - return_t dispatch (const T &obj) { obj.closure (this); return hb_void_t (); } - static return_t default_return_value () { return hb_void_t (); } + return_t dispatch (const T &obj) { obj.closure (this); return hb_empty_t (); } + static return_t default_return_value () { return hb_empty_t (); } void recurse (unsigned int lookup_index) { if (unlikely (nesting_level_left == 0 || !recurse_func)) @@ -151,13 +151,13 @@ struct hb_would_apply_context_t : struct hb_collect_glyphs_context_t : - hb_dispatch_context_t + hb_dispatch_context_t { const char *get_name () { return "COLLECT_GLYPHS"; } typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); template - return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); } - static return_t default_return_value () { return hb_void_t (); } + return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_empty_t (); } + static return_t default_return_value () { return hb_empty_t (); } void recurse (unsigned int lookup_index) { if (unlikely (nesting_level_left == 0 || !recurse_func)) @@ -610,7 +610,7 @@ struct hb_ot_apply_context_t : struct hb_get_subtables_context_t : - hb_dispatch_context_t + hb_dispatch_context_t { template HB_INTERNAL static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c) @@ -652,9 +652,9 @@ struct hb_get_subtables_context_t : { hb_applicable_t *entry = array.push(); entry->init (obj, apply_to); - return hb_void_t (); + return hb_empty_t (); } - static return_t default_return_value () { return hb_void_t (); } + static return_t default_return_value () { return hb_empty_t (); } hb_get_subtables_context_t (array_t &array_) : array (array_), From caa3f92e91062ff78b657aec23569b099de48640 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:43:51 -0700 Subject: [PATCH 190/617] [meta] void_tt -> void_t --- src/hb-meta.hh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index b8964c047..4cdb77d83 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -37,10 +37,9 @@ /* Void! For when we need a expression-type of void. */ struct hb_empty_t {}; -/* Void meta-function ala std::void_t - * https://en.cppreference.com/w/cpp/types/void_t */ -template struct _hb_void_tt { typedef void type; }; -template using hb_void_tt = typename _hb_void_tt::type; +/* https://en.cppreference.com/w/cpp/types/void_t */ +template struct _hb_void_t { typedef void type; }; +template using hb_void_t = typename _hb_void_t::type; template struct _hb_head_tt { typedef Head type; }; template using hb_head_tt = typename _hb_head_tt::type; @@ -67,7 +66,7 @@ template struct hb_is_same : hb_true_type {}; #define HB_RETURN(Ret, E) -> hb_head_tt { return (E); } #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } -#define HB_VOID_RETURN(E) -> hb_void_tt { (E); } +#define HB_VOID_RETURN(E) -> hb_void_t { (E); } template struct hb_priority : hb_priority {}; template <> struct hb_priority<0> {}; From 5252677e53ff4473701172bbbd4e953ac6b08e6f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:49:52 -0700 Subject: [PATCH 191/617] [meta] Rewrite hb_int_min/max --- src/hb-meta.hh | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 4cdb77d83..16f39ebcb 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -265,30 +265,30 @@ using hb_is_unsigned = hb_conditional::value template struct hb_int_min; -template <> struct hb_int_min { static constexpr char value = CHAR_MIN; }; -template <> struct hb_int_min { static constexpr signed char value = SCHAR_MIN; }; -template <> struct hb_int_min { static constexpr unsigned char value = 0; }; -template <> struct hb_int_min { static constexpr signed short value = SHRT_MIN; }; -template <> struct hb_int_min { static constexpr unsigned short value = 0; }; -template <> struct hb_int_min { static constexpr signed int value = INT_MIN; }; -template <> struct hb_int_min { static constexpr unsigned int value = 0; }; -template <> struct hb_int_min { static constexpr signed long value = LONG_MIN; }; -template <> struct hb_int_min { static constexpr unsigned long value = 0; }; -template <> struct hb_int_min { static constexpr signed long long value = LLONG_MIN; }; -template <> struct hb_int_min { static constexpr unsigned long long value = 0; }; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; +template <> struct hb_int_min : hb_integral_constant {}; #define hb_int_min(T) hb_int_min::value template struct hb_int_max; -template <> struct hb_int_max { static constexpr char value = CHAR_MAX; }; -template <> struct hb_int_max { static constexpr signed char value = SCHAR_MAX; }; -template <> struct hb_int_max { static constexpr unsigned char value = UCHAR_MAX; }; -template <> struct hb_int_max { static constexpr signed short value = SHRT_MAX; }; -template <> struct hb_int_max { static constexpr unsigned short value = USHRT_MAX; }; -template <> struct hb_int_max { static constexpr signed int value = INT_MAX; }; -template <> struct hb_int_max { static constexpr unsigned int value = UINT_MAX; }; -template <> struct hb_int_max { static constexpr signed long value = LONG_MAX; }; -template <> struct hb_int_max { static constexpr unsigned long value = ULONG_MAX; }; -template <> struct hb_int_max { static constexpr signed long long value = LLONG_MAX; }; -template <> struct hb_int_max { static constexpr unsigned long long value = ULLONG_MAX; }; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; +template <> struct hb_int_max : hb_integral_constant {}; #define hb_int_max(T) hb_int_max::value From f9a96a0a97f59a0b31ee0f901d1c21dde6b3cfaf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 20:56:16 -0700 Subject: [PATCH 192/617] [meta] More rewrites --- src/hb-meta.hh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 16f39ebcb..15c38bbc8 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -75,8 +75,8 @@ template <> struct hb_priority<0> {}; #define HB_FUNCOBJ(x) static_const x HB_UNUSED -template struct hb_match_identity { typedef T type; }; -template using hb_type_identity = typename hb_match_identity::type; +template struct hb_type_identity_t { typedef T type; }; +template using hb_type_identity = typename hb_type_identity_t::type; struct { @@ -97,14 +97,14 @@ HB_FUNCOBJ (hb_addressof); template static inline T hb_declval (); #define hb_declval(T) (hb_declval ()) -template struct hb_match_const { typedef T type; static constexpr bool value = false; }; -template struct hb_match_const { typedef T type; static constexpr bool value = true; }; +template struct hb_match_const : hb_type_identity_t, hb_bool_constant{}; +template struct hb_match_const : hb_type_identity_t, hb_bool_constant {}; template using hb_remove_const = typename hb_match_const::type; template using hb_add_const = const T; #define hb_is_const(T) hb_match_const::value -template struct hb_match_reference { typedef T type; static constexpr bool value = false; }; -template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; -template struct hb_match_reference { typedef T type; static constexpr bool value = true; }; +template struct hb_match_reference : hb_type_identity_t, hb_bool_constant{}; +template struct hb_match_reference : hb_type_identity_t, hb_bool_constant {}; +template struct hb_match_reference : hb_type_identity_t, hb_bool_constant {}; template using hb_remove_reference = typename hb_match_reference::type; template auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity; template auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity; @@ -113,8 +113,8 @@ template auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_t template auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity; template using hb_add_rvalue_reference = decltype (_hb_try_add_rvalue_reference (hb_prioritize)); #define hb_is_reference(T) hb_match_reference::value -template struct hb_match_pointer { typedef T type; static constexpr bool value = false; }; -template struct hb_match_pointer { typedef T type; static constexpr bool value = true; }; +template struct hb_match_pointer : hb_type_identity_t, hb_bool_constant{}; +template struct hb_match_pointer : hb_type_identity_t, hb_bool_constant {}; template using hb_remove_pointer = typename hb_match_pointer::type; template auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity*>; template auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity; From 40fb36a39de5dd3ee9a4c84f1f76205b6bb68660 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:01:19 -0700 Subject: [PATCH 193/617] [meta] Minor --- src/hb-meta.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 15c38bbc8..f67623136 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -41,8 +41,8 @@ struct hb_empty_t {}; template struct _hb_void_t { typedef void type; }; template using hb_void_t = typename _hb_void_t::type; -template struct _hb_head_tt { typedef Head type; }; -template using hb_head_tt = typename _hb_head_tt::type; +template struct _hb_head_t { typedef Head type; }; +template using hb_head_t = typename _hb_head_t::type; template struct hb_integral_constant { static constexpr T value = v; }; template using hb_bool_constant = hb_integral_constant; @@ -64,7 +64,7 @@ template struct hb_is_same : hb_true_type {}; /* Function overloading SFINAE and priority. */ -#define HB_RETURN(Ret, E) -> hb_head_tt { return (E); } +#define HB_RETURN(Ret, E) -> hb_head_t { return (E); } #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } #define HB_VOID_RETURN(E) -> hb_void_t { (E); } From c0485e32a320e17dd0634b2cc8b4dd8c4fdc65e0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:03:14 -0700 Subject: [PATCH 194/617] Use hb_void_t<> the way it's supposed to be used --- src/hb-null.hh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hb-null.hh b/src/hb-null.hh index 725db5024..674b4dffc 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -46,13 +46,13 @@ * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol */ -template +template struct _hb_null_size : hb_integral_constant {}; template -struct _hb_null_size> : hb_integral_constant {}; +struct _hb_null_size> : hb_integral_constant {}; template -using hb_null_size = _hb_null_size; +using hb_null_size = _hb_null_size; #define hb_null_size(T) hb_null_size::value /* These doesn't belong here, but since is copy/paste from above, put it here. */ @@ -60,12 +60,12 @@ using hb_null_size = _hb_null_size; /* hb_static_size (T) * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */ -template +template struct _hb_static_size : hb_integral_constant {}; template -struct _hb_static_size> : hb_integral_constant {}; +struct _hb_static_size> : hb_integral_constant {}; template -using hb_static_size = _hb_static_size; +using hb_static_size = _hb_static_size; #define hb_static_size(T) hb_static_size::value From 19e08a146712dacd11359370c91a7bad55bc6f62 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:25:07 -0700 Subject: [PATCH 195/617] [iter] Adjust source_of/sink_of --- src/hb-iter.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index a0beb2cdd..194a421ff 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -277,7 +277,7 @@ struct hb_is_source_of { private: template + hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference>))> static hb_true_type impl (hb_priority<2>); template static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_type ()); @@ -293,7 +293,7 @@ struct hb_is_sink_of { private: template + hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference))> static hb_true_type impl (hb_priority<2>); template static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_type ()); From b14745278ad16fe7f4e838b685029e3fdda516ca Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:42:59 -0700 Subject: [PATCH 196/617] [met]a Add is_constructible, ... --- src/hb-meta.hh | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ src/test-meta.cc | 23 +++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index f67623136..0ab717940 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -292,4 +292,77 @@ template <> struct hb_int_max : hb_integral_constant::value +template +struct _hb_is_constructible : hb_false_type {}; +template +struct _hb_is_constructible, Ts...> : hb_true_type {}; +template +using hb_is_constructible = _hb_is_constructible; +#define hb_is_constructible(...) hb_is_constructible<__VA_ARGS__>::value + +template +using hb_is_default_constructible = hb_is_constructible; +#define hb_is_default_constructible(T) hb_is_default_constructible::value + +template +using hb_is_copy_constructible = hb_is_constructible>>; +#define hb_is_copy_constructible(T) hb_is_copy_constructible::value + +template +using hb_is_move_constructible = hb_is_constructible>>; +#define hb_is_move_constructible(T) hb_is_move_constructible::value + +template +struct _hb_is_assignable : hb_false_type {}; +template +struct _hb_is_assignable> : hb_true_type {}; +template +using hb_is_assignable = _hb_is_assignable; +#define hb_is_assignable(T,U) hb_is_assignable::value + +template +using hb_is_copy_assignable = hb_is_assignable, + hb_add_lvalue_reference>>; +#define hb_is_copy_assignable(T) hb_is_copy_assignable::value + +template +using hb_is_move_assignable = hb_is_assignable, + hb_add_rvalue_reference>; +#define hb_is_move_assignable(T) hb_is_move_assignable::value + +/* Trivial versions. */ + +template union hb_trivial { T value; }; + +/* Don't know how to do the following. */ +//template +//using hb_is_trivially_constructible= hb_is_constructible, hb_trivial...>; +//#define hb_is_trivially_constructible(...) hb_is_trivially_constructible<__VA_ARGS__>::value + +template +using hb_is_trivially_default_constructible= hb_is_default_constructible>; +#define hb_is_trivially_default_constructible(T) hb_is_trivially_default_constructible::value + +template +using hb_is_trivially_copy_constructible= hb_is_copy_constructible>; +#define hb_is_trivially_copy_constructible(T) hb_is_trivially_copy_constructible::value + +template +using hb_is_trivially_move_constructible= hb_is_move_constructible>; +#define hb_is_trivially_move_constructible(T) hb_is_trivially_move_constructible::value + +/* Don't know how to do the following. */ +//template +//using hb_is_trivially_assignable= hb_is_assignable, hb_trivial>; +//#define hb_is_trivially_assignable(T,U) hb_is_trivially_assignable::value + +template +using hb_is_trivially_copy_assignable= hb_is_copy_assignable>; +#define hb_is_trivially_copy_assignable(T) hb_is_trivially_copy_assignable::value + +template +using hb_is_trivially_move_assignable= hb_is_move_assignable>; +#define hb_is_trivially_move_assignable(T) hb_is_trivially_move_assignable::value + + #endif /* HB_META_HH */ diff --git a/src/test-meta.cc b/src/test-meta.cc index 6fb8e4f19..af1ca2e09 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -27,6 +27,8 @@ #include "hb.hh" #include "hb-meta.hh" +#include + int main (int argc, char **argv) @@ -94,5 +96,26 @@ main (int argc, char **argv) static_assert (hb_is_base_of (X, const Y), ""); static_assert (!hb_is_base_of (Y, X), ""); + static_assert (hb_is_constructible (int), ""); + static_assert (hb_is_constructible (int, int), ""); + static_assert (hb_is_constructible (int, char), ""); + static_assert (hb_is_constructible (int, long), ""); + static_assert (!hb_is_constructible (int, X), ""); + static_assert (!hb_is_constructible (int, int, int), ""); + static_assert (hb_is_constructible (X), ""); + static_assert (!hb_is_constructible (X, int), ""); + static_assert (hb_is_constructible (X, X), ""); + static_assert (!hb_is_constructible (X, X, X), ""); + static_assert (hb_is_constructible (X, Y), ""); + static_assert (!hb_is_constructible (Y, X), ""); + + static_assert (hb_is_trivially_default_constructible (X), ""); + static_assert (hb_is_trivially_default_constructible (Y), ""); + static_assert (hb_is_trivially_copy_constructible (X), ""); + static_assert (hb_is_trivially_copy_constructible (Y), ""); + static_assert (hb_is_trivially_move_constructible (X), ""); + static_assert (hb_is_trivially_move_constructible (Y), ""); + /* TODO Add more meaningful tests. */ + return 0; } From 086772e409759e8f1edd0e34f6f25374e51e9e10 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:49:25 -0700 Subject: [PATCH 197/617] [meta] Add is_destructible --- src/hb-meta.hh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 0ab717940..47cefa869 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -292,6 +292,15 @@ template <> struct hb_int_max : hb_integral_constant::value + +template +struct _hb_is_destructible : hb_false_type {}; +template +struct _hb_is_destructible> : hb_true_type {}; +template +using hb_is_destructible = _hb_is_destructible; +#define hb_is_destructible(T) hb_is_destructible::value + template struct _hb_is_constructible : hb_false_type {}; template @@ -334,6 +343,11 @@ using hb_is_move_assignable = hb_is_assignable, template union hb_trivial { T value; }; +/* Don't know how to do the following. */ +//template +//using hb_is_trivially_destructible= hb_is_destructible>; +//#define hb_is_trivially_destructible(T) hb_is_trivially_destructible::value + /* Don't know how to do the following. */ //template //using hb_is_trivially_constructible= hb_is_constructible, hb_trivial...>; From 72cb5b8e52b7103c18adcb82cbcd4b91a2c85474 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:50:15 -0700 Subject: [PATCH 198/617] Remove accidentally included include --- src/test-meta.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test-meta.cc b/src/test-meta.cc index af1ca2e09..ffc3147dd 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -27,9 +27,6 @@ #include "hb.hh" #include "hb-meta.hh" -#include - - int main (int argc, char **argv) { From f2398f34c019a55d4f0e1a7031961714afadf2b3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 21:59:57 -0700 Subject: [PATCH 199/617] [meta] Add is_trivially_destructible --- src/hb-meta.hh | 6 +++--- src/test-meta.cc | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 47cefa869..f69a567c2 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -344,9 +344,9 @@ using hb_is_move_assignable = hb_is_assignable, template union hb_trivial { T value; }; /* Don't know how to do the following. */ -//template -//using hb_is_trivially_destructible= hb_is_destructible>; -//#define hb_is_trivially_destructible(T) hb_is_trivially_destructible::value +template +using hb_is_trivially_destructible= hb_is_destructible>; +#define hb_is_trivially_destructible(T) hb_is_trivially_destructible::value /* Don't know how to do the following. */ //template diff --git a/src/test-meta.cc b/src/test-meta.cc index ffc3147dd..ab7f6ad11 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -27,6 +27,8 @@ #include "hb.hh" #include "hb-meta.hh" +#include + int main (int argc, char **argv) { @@ -57,6 +59,7 @@ main (int argc, char **argv) static_assert (hb_is_convertible (const int&, const int), ""); struct X {}; + struct Y : X {}; static_assert (hb_is_convertible (const X &, const X), ""); static_assert (hb_is_convertible (X &, const X), ""); @@ -77,8 +80,6 @@ main (int argc, char **argv) static_assert (hb_is_convertible (int *, void *), ""); static_assert (!hb_is_convertible (void *, int *), ""); - struct Y : X {}; - static_assert (hb_is_base_of (void, void), ""); static_assert (hb_is_base_of (void, int), ""); static_assert (!hb_is_base_of (int, void), ""); @@ -112,6 +113,8 @@ main (int argc, char **argv) static_assert (hb_is_trivially_copy_constructible (Y), ""); static_assert (hb_is_trivially_move_constructible (X), ""); static_assert (hb_is_trivially_move_constructible (Y), ""); + static_assert (hb_is_trivially_destructible (Y), ""); + /* TODO Add more meaningful tests. */ return 0; From 7162a97bca6e0dde3d277701a3bf15688deef61d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 22:03:03 -0700 Subject: [PATCH 200/617] [meta] Add hb_is_trivially_copyable() --- src/hb-meta.hh | 11 +++++++++++ src/test-meta.cc | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index f69a567c2..a1e93d750 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -378,5 +378,16 @@ template using hb_is_trivially_move_assignable= hb_is_move_assignable>; #define hb_is_trivially_move_assignable(T) hb_is_trivially_move_assignable::value +template +using hb_is_trivially_copyable= hb_bool_constant< + hb_is_trivially_destructible (T) && + (!hb_is_move_assignable (T) || hb_is_trivially_move_assignable (T)) && + (!hb_is_move_constructible (T) || hb_is_trivially_move_constructible (T)) && + (!hb_is_copy_assignable (T) || hb_is_trivially_copy_assignable (T)) && + (!hb_is_copy_constructible (T) || hb_is_trivially_copy_constructible (T)) && + true +>; +#define hb_is_trivially_copyable(T) hb_is_trivially_copyable::value + #endif /* HB_META_HH */ diff --git a/src/test-meta.cc b/src/test-meta.cc index ab7f6ad11..f03be3064 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -115,6 +115,10 @@ main (int argc, char **argv) static_assert (hb_is_trivially_move_constructible (Y), ""); static_assert (hb_is_trivially_destructible (Y), ""); + static_assert (hb_is_trivially_copyable (int), ""); + static_assert (hb_is_trivially_copyable (X), ""); + static_assert (hb_is_trivially_copyable (Y), ""); + /* TODO Add more meaningful tests. */ return 0; From 0ff7954f9f09f80654ac91c16712154744a0dd2d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 22:04:40 -0700 Subject: [PATCH 201/617] [meta] Add hb_is_trivial --- src/hb-meta.hh | 7 +++++++ src/test-meta.cc | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/hb-meta.hh b/src/hb-meta.hh index a1e93d750..df8ebd175 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -389,5 +389,12 @@ using hb_is_trivially_copyable= hb_bool_constant< >; #define hb_is_trivially_copyable(T) hb_is_trivially_copyable::value +template +using hb_is_trivial= hb_bool_constant< + hb_is_trivially_copyable (T) && + hb_is_trivially_default_constructible (T) +>; +#define hb_is_trivial(T) hb_is_trivial::value + #endif /* HB_META_HH */ diff --git a/src/test-meta.cc b/src/test-meta.cc index f03be3064..ffd360b0d 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -119,6 +119,10 @@ main (int argc, char **argv) static_assert (hb_is_trivially_copyable (X), ""); static_assert (hb_is_trivially_copyable (Y), ""); + static_assert (hb_is_trivial (int), ""); + static_assert (hb_is_trivial (X), ""); + static_assert (hb_is_trivial (Y), ""); + /* TODO Add more meaningful tests. */ return 0; From 23168c3981f7c80883663fa69c608caee98d3d99 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 22:11:51 -0700 Subject: [PATCH 202/617] [sanitize] Use hb_is_trivially_copyable() --- src/hb-open-type.hh | 64 ++++++--------------------------------------- 1 file changed, 8 insertions(+), 56 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 9e17b5c88..3fc49400c 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -445,20 +445,8 @@ struct UnsizedArrayOf TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize() as well as an - * assignment opreator. This ensures that they do not - * reference other structs via offsets. - */ - if (false) - { - arrayZ[0].sanitize (c); - Type v; - v = arrayZ[0]; - } + static_assert ((hb_void_t (), true), ""); + static_assert (hb_is_trivially_copyable (Type), ""); return_trace (true); } @@ -626,20 +614,8 @@ struct ArrayOf TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize() as well as an - * assignment opreator. This ensures that they do not - * reference other structs via offsets. - */ - if (false) - { - arrayZ[0].sanitize (c); - Type v; - v = arrayZ[0]; - } + static_assert ((hb_void_t (), true), ""); + static_assert (hb_is_trivially_copyable (Type), ""); return_trace (true); } @@ -765,20 +741,8 @@ struct HeadlessArrayOf TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize() as well as an - * assignment opreator. This ensures that they do not - * reference other structs via offsets. - */ - if (false) - { - arrayZ[0].sanitize (c); - Type v; - v = arrayZ[0]; - } + static_assert ((hb_void_t (), true), ""); + static_assert (hb_is_trivially_copyable (Type), ""); return_trace (true); } @@ -1006,20 +970,8 @@ struct VarSizedBinSearchArrayOf TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize() as well as an - * assignment opreator. This ensures that they do not - * reference other structs via offsets. - */ - if (false) - { - (*this)[0].sanitize (c); - Type v; - v = (*this)[0]; - } + static_assert ((hb_void_t (), true), ""); + static_assert (hb_is_trivially_copyable (Type), ""); return_trace (true); } From 4dcf65328f04a11594fc190fd7e976afa54455e9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 22:23:24 -0700 Subject: [PATCH 203/617] [sanitize] Simplify --- src/hb-open-type.hh | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 3fc49400c..13b1245de 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -440,21 +440,12 @@ struct UnsizedArrayOf return_trace (out); } - bool sanitize (hb_sanitize_context_t *c, unsigned int count) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c, count))) return_trace (false); - - static_assert ((hb_void_t (), true), ""); - static_assert (hb_is_trivially_copyable (Type), ""); - - return_trace (true); - } template bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); + if (hb_is_trivially_copyable (Type)) return_trace (true); for (unsigned int i = 0; i < count; i++) if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) return_trace (false); @@ -609,21 +600,12 @@ struct ArrayOf return_trace (out); } - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - - static_assert ((hb_void_t (), true), ""); - static_assert (hb_is_trivially_copyable (Type), ""); - - return_trace (true); - } template bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); + if (hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = len; for (unsigned int i = 0; i < count; i++) if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) @@ -736,14 +718,16 @@ struct HeadlessArrayOf return_trace (true); } - bool sanitize (hb_sanitize_context_t *c) const + template + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - - static_assert ((hb_void_t (), true), ""); - static_assert (hb_is_trivially_copyable (Type), ""); - + if (hb_is_trivially_copyable (Type)) return_trace (true); + unsigned int count = lenP1 ? lenP1 - 1 : 0; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) + return_trace (false); return_trace (true); } @@ -965,21 +949,12 @@ struct VarSizedBinSearchArrayOf unsigned int get_size () const { return header.static_size + header.nUnits * header.unitSize; } - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - - static_assert ((hb_void_t (), true), ""); - static_assert (hb_is_trivially_copyable (Type), ""); - - return_trace (true); - } template bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); + if (hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = get_length (); for (unsigned int i = 0; i < count; i++) if (unlikely (!(*this)[i].sanitize (c, hb_forward (ds)...))) From 9bfe22af6113ee8cd24cb9ee091f0841c27bbf98 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 22:44:19 -0700 Subject: [PATCH 204/617] [sanitize] Fix previous commit --- src/hb-open-type.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 13b1245de..57b22a8e3 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -445,7 +445,7 @@ struct UnsizedArrayOf { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); - if (hb_is_trivially_copyable (Type)) return_trace (true); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); for (unsigned int i = 0; i < count; i++) if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) return_trace (false); @@ -605,7 +605,7 @@ struct ArrayOf { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - if (hb_is_trivially_copyable (Type)) return_trace (true); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = len; for (unsigned int i = 0; i < count; i++) if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) @@ -723,7 +723,7 @@ struct HeadlessArrayOf { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - if (hb_is_trivially_copyable (Type)) return_trace (true); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = lenP1 ? lenP1 - 1 : 0; for (unsigned int i = 0; i < count; i++) if (unlikely (!c->dispatch (arrayZ[i], hb_forward (ds)...))) @@ -954,7 +954,7 @@ struct VarSizedBinSearchArrayOf { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - if (hb_is_trivially_copyable (Type)) return_trace (true); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = get_length (); for (unsigned int i = 0; i < count; i++) if (unlikely (!(*this)[i].sanitize (c, hb_forward (ds)...))) From 227d85e138d4c785c2d658e225ed35f5acd1235f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:15:58 -0700 Subject: [PATCH 205/617] Minor --- src/hb-atomic.hh | 2 +- src/hb-debug.hh | 2 +- src/hb-font.cc | 2 +- src/hb-ot-font.cc | 4 ++-- src/hb-ot-layout.cc | 6 +++--- src/hb-ot-name-table.hh | 2 +- src/hb-ot-shape-complex-arabic.cc | 2 +- src/hb-ot-shape-complex-hebrew.cc | 2 +- src/hb-ot-shape-complex-thai.cc | 2 +- src/hb-ot-shape-complex-vowel-constraints.cc | 2 +- src/hb-ot-shape-fallback.cc | 6 +++--- src/hb-subset.cc | 4 ++-- src/hb-warning.cc | 4 ++-- src/hb.hh | 10 +++++----- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index 8307a549d..a82ce6cf3 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -107,7 +107,7 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) static inline void _hb_memory_barrier () { -#if !defined(MemoryBarrier) +#ifndef MemoryBarrier /* MinGW has a convoluted history of supporting MemoryBarrier. */ LONG dummy = 0; InterlockedExchange (&dummy, 1); diff --git a/src/hb-debug.hh b/src/hb-debug.hh index a03170b08..e6d06e310 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -63,7 +63,7 @@ extern HB_INTERNAL hb_atomic_int_t _hb_options; static inline hb_options_t hb_options () { -#if defined(HB_NO_GETENV) +#ifdef HB_NO_GETENV return hb_options_t (); #endif /* Make a local copy, so we can access bitfield threadsafely. */ diff --git a/src/hb-font.cc b/src/hb-font.cc index 20daefd27..c00f33329 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -1347,7 +1347,7 @@ hb_font_create (hb_face_t *face) { hb_font_t *font = _hb_font_create (face); -#if !defined(HB_NO_OT_FONT) +#ifndef HB_NO_OT_FONT /* Install our in-house, very lightweight, funcs. */ hb_ot_font_set_funcs (font); #endif diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 77e42cc53..5051fa0ea 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -183,13 +183,13 @@ hb_ot_get_glyph_extents (hb_font_t *font, bool ret = ot_face->sbix->get_extents (font, glyph, extents); if (!ret) ret = ot_face->glyf->get_extents (glyph, extents); -#if !defined(HB_NO_OT_FONT_CFF) +#ifndef HB_NO_OT_FONT_CFF if (!ret) ret = ot_face->cff1->get_extents (glyph, extents); if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents); #endif -#if !defined(HB_NO_OT_FONT_BITMAP) +#ifndef HB_NO_OT_FONT_BITMAP if (!ret) ret = ot_face->CBDT->get_extents (font, glyph, extents); #endif diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 817b28e68..cd603d8d0 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -138,7 +138,7 @@ bool OT::GDEF::is_blacklisted (hb_blob_t *blob, hb_face_t *face) const { -#if defined(HB_NO_OT_LAYOUT_BLACKLIST) +#ifdef HB_NO_OT_LAYOUT_BLACKLIST return false; #endif /* The ugly business of blacklisting individual fonts' tables happen here! @@ -384,7 +384,7 @@ bool OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face) const { -#if defined(HB_NO_OT_LAYOUT_BLACKLIST) +#ifdef HB_NO_OT_LAYOUT_BLACKLIST return false; #endif /* Mac OS X prefers morx over GSUB. It also ships with various Indic fonts, @@ -412,7 +412,7 @@ bool OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face HB_UNUSED) const { -#if defined(HB_NO_OT_LAYOUT_BLACKLIST) +#ifdef HB_NO_OT_LAYOUT_BLACKLIST return false; #endif return false; diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index f2f5a1a53..e7e32ecf8 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -60,7 +60,7 @@ struct NameRecord if (p == 1) return _hb_ot_name_language_for_mac_code (l); -#if !defined(HB_NO_NAME_TABLE_AAT) +#ifndef HB_NO_NAME_TABLE_AAT if (p == 0) return _hb_aat_language_get (face, l); #endif diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc index 4daf2a666..3212e0c96 100644 --- a/src/hb-ot-shape-complex-arabic.cc +++ b/src/hb-ot-shape-complex-arabic.cc @@ -383,7 +383,7 @@ arabic_fallback_shape (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#if defined(HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK) +#ifdef HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK return; #endif diff --git a/src/hb-ot-shape-complex-hebrew.cc b/src/hb-ot-shape-complex-hebrew.cc index db8801814..14989730f 100644 --- a/src/hb-ot-shape-complex-hebrew.cc +++ b/src/hb-ot-shape-complex-hebrew.cc @@ -70,7 +70,7 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c, bool found = (bool) c->unicode->compose (a, b, ab); -#if defined(HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK) +#ifdef HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK return found; #endif diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index 130ea1c98..22d4aa3ab 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -218,7 +218,7 @@ do_thai_pua_shaping (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, hb_font_t *font) { -#if defined(HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK) +#ifdef HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK return; #endif diff --git a/src/hb-ot-shape-complex-vowel-constraints.cc b/src/hb-ot-shape-complex-vowel-constraints.cc index 2eb313ae4..912ee35b4 100644 --- a/src/hb-ot-shape-complex-vowel-constraints.cc +++ b/src/hb-ot-shape-complex-vowel-constraints.cc @@ -34,7 +34,7 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, hb_font_t *font HB_UNUSED) { -#if defined(HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS) +#ifdef HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS return; #endif if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index b10eec666..42b728fd1 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -166,7 +166,7 @@ _hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { -#if defined(HB_NO_OT_SHAPE_FALLBACK) +#ifdef HB_NO_OT_SHAPE_FALLBACK return; #endif @@ -438,7 +438,7 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, bool adjust_offsets_when_zeroing) { -#if defined(HB_NO_OT_SHAPE_FALLBACK) +#ifdef HB_NO_OT_SHAPE_FALLBACK return; #endif @@ -481,7 +481,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#if defined(HB_NO_OT_SHAPE_FALLBACK) +#ifdef HB_NO_OT_SHAPE_FALLBACK return; #endif diff --git a/src/hb-subset.cc b/src/hb-subset.cc index f4fc77172..aa6934bc3 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -206,7 +206,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset (plan); break; -#if !defined(HB_NO_SUBSET_LAYOUT) +#ifndef HB_NO_SUBSET_LAYOUT case HB_OT_TAG_GDEF: result = _subset2 (plan); break; @@ -247,7 +247,7 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) case HB_OT_TAG_GDEF: case HB_OT_TAG_GPOS: case HB_OT_TAG_GSUB: -#if defined(HB_NO_SUBSET_LAYOUT) +#ifdef HB_NO_SUBSET_LAYOUT return true; #endif return plan->drop_layout; diff --git a/src/hb-warning.cc b/src/hb-warning.cc index 9fb410038..60c7445b7 100644 --- a/src/hb-warning.cc +++ b/src/hb-warning.cc @@ -26,12 +26,12 @@ #include "hb.hh" -#if defined(HB_ATOMIC_INT_NIL) +#ifdef HB_ATOMIC_INT_NIL #error "Could not find any system to define atomic_int macros, library WILL NOT be thread-safe" #error "Check hb-atomic.hh for possible resolutions." #endif -#if defined(HB_MUTEX_IMPL_NIL) +#ifdef HB_MUTEX_IMPL_NIL #error "Could not find any system to define mutex macros, library WILL NOT be thread-safe" #error "Check hb-mutex.hh for possible resolutions." #endif diff --git a/src/hb.hh b/src/hb.hh index 3d4b18033..0aa55af16 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -30,7 +30,7 @@ #define HB_HH #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC -#if defined(_MSC_VER) +#ifdef _MSC_VER #pragma warning( disable: 4068 ) /* Unknown pragma */ #endif #if defined(__GNUC__) || defined(__clang__) @@ -203,7 +203,7 @@ extern "C" void hb_free_impl(void *ptr); #define realloc hb_realloc_impl #define free hb_free_impl -#if defined(hb_memalign_impl) +#ifdef hb_memalign_impl extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); #define posix_memalign hb_memalign_impl #else @@ -315,7 +315,7 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); # define HB_FALLTHROUGH /* FALLTHROUGH */ #endif -#if defined(__clang__) +#ifdef __clang__ /* Disable certain sanitizer errors. */ /* https://github.com/harfbuzz/harfbuzz/issues/1247 */ #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow"))) @@ -445,12 +445,12 @@ static_assert ((sizeof (hb_var_int_t) == 4), ""); * * https://bugs.chromium.org/p/chromium/issues/detail?id=860184 */ -#if !defined(HB_VECTOR_SIZE) +#ifndef HB_VECTOR_SIZE # define HB_VECTOR_SIZE 0 #endif /* The `vector_size' attribute was introduced in gcc 3.1. */ -#if !defined(HB_VECTOR_SIZE) +#ifndef HB_VECTOR_SIZE # if defined( __GNUC__ ) && ( __GNUC__ >= 4 ) # define HB_VECTOR_SIZE 128 # else From 62dfe7aea23c95f4550543085071990e20ee4d54 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:17:15 -0700 Subject: [PATCH 206/617] [cff] Minor --- src/hb-subset-cff1.cc | 2 +- src/hb-subset-cff2.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index a69dd93ae..ab3ad0936 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -1064,7 +1064,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, return true; } -static bool +static inline bool _hb_subset_cff1 (const OT::cff1::accelerator_subset_t &acc, const char *data, hb_subset_plan_t *plan, diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index caee17550..9a03c3ed9 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -571,7 +571,7 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, return true; } -static bool +static inline bool _hb_subset_cff2 (const OT::cff2::accelerator_subset_t &acc, const char *data, hb_subset_plan_t *plan, From 2c93f0dee31b2277567ccbee041539732b9bd26d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:31:05 -0700 Subject: [PATCH 207/617] Add HB_NO_AAT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-aat-layout.cc | 58 +++++++++++++++++++++++++++++++++++++++++ src/hb-aat-map.cc | 8 ++++++ src/hb-ot-kern-table.hh | 14 ++++++++++ src/hb-ot-shape.cc | 28 +++++++++++++++++++- 4 files changed, 107 insertions(+), 1 deletion(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 1966ded32..20c82aeff 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -135,6 +135,10 @@ static const hb_aat_feature_mapping_t feature_mappings[] = const hb_aat_feature_mapping_t * hb_aat_layout_find_feature_mapping (hb_tag_t tag) { +#ifdef HB_NO_AAT + return nullptr; +#endif + return (const hb_aat_feature_mapping_t *) bsearch (&tag, feature_mappings, ARRAY_LENGTH (feature_mappings), @@ -147,6 +151,8 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) * hb_aat_apply_context_t */ +/* Note: This context is used for kerning, even without AAT. */ + AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, hb_font_t *font_, hb_buffer_t *buffer_, @@ -183,6 +189,10 @@ void hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_aat_map_t *map) { +#ifdef HB_NO_AAT + return; +#endif + const AAT::morx& morx = *mapper->face->table.morx; if (morx.has_data ()) { @@ -209,6 +219,10 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_bool_t hb_aat_layout_has_substitution (hb_face_t *face) { +#ifdef HB_NO_AAT + return false; +#endif + return face->table.morx->has_data () || face->table.mort->has_data (); } @@ -218,6 +232,10 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_AAT + return; +#endif + hb_blob_t *morx_blob = font->face->table.morx.get_blob (); const AAT::morx& morx = *morx_blob->as (); if (morx.has_data ()) @@ -240,6 +258,10 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, void hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) { +#ifdef HB_NO_AAT + return; +#endif + unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; hb_glyph_position_t *pos = buffer->pos; @@ -257,6 +279,10 @@ is_deleted_glyph (const hb_glyph_info_t *info) void hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { +#ifdef HB_NO_AAT + return; +#endif + hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); } @@ -270,6 +296,10 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) hb_bool_t hb_aat_layout_has_positioning (hb_face_t *face) { +#ifdef HB_NO_AAT + return false; +#endif + return face->table.kerx->has_data (); } @@ -278,6 +308,10 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_AAT + return; +#endif + hb_blob_t *kerx_blob = font->face->table.kerx.get_blob (); const AAT::kerx& kerx = *kerx_blob->as (); @@ -297,6 +331,10 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_bool_t hb_aat_layout_has_tracking (hb_face_t *face) { +#ifdef HB_NO_AAT + return false; +#endif + return face->table.trak->has_data (); } @@ -305,6 +343,10 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_AAT + return; +#endif + const AAT::trak& trak = *font->face->table.trak; AAT::hb_aat_apply_context_t c (plan, font, buffer); @@ -328,6 +370,12 @@ hb_aat_layout_get_feature_types (hb_face_t *face, unsigned int *feature_count, /* IN/OUT. May be NULL. */ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) { +#ifdef HB_NO_AAT + if (feature_count) + *feature_count = 0; + return 0; +#endif + return face->table.feat->get_feature_types (start_offset, feature_count, features); } @@ -344,6 +392,10 @@ hb_ot_name_id_t hb_aat_layout_feature_type_get_name_id (hb_face_t *face, hb_aat_layout_feature_type_t feature_type) { +#ifdef HB_NO_AAT + return HB_OT_NAME_ID_INVALID; +#endif + return face->table.feat->get_feature_name_id (feature_type); } @@ -372,5 +424,11 @@ hb_aat_layout_feature_type_get_selector_infos (hb_face_t hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ unsigned int *default_index /* OUT. May be NULL. */) { +#ifdef HB_NO_AAT + if (selector_count) + *selector_count = 0; + return 0; +#endif + return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index); } diff --git a/src/hb-aat-map.cc b/src/hb-aat-map.cc index 98c5d7fe4..618ec8f5a 100644 --- a/src/hb-aat-map.cc +++ b/src/hb-aat-map.cc @@ -34,6 +34,10 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, unsigned int value) { +#ifdef HB_NO_AAT + return; +#endif + if (tag == HB_TAG ('a','a','l','t')) { feature_info_t *info = features.push(); @@ -53,6 +57,10 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, void hb_aat_map_builder_t::compile (hb_aat_map_t &m) { +#ifdef HB_NO_AAT + return; +#endif + /* Sort features and merge duplicates */ if (features.length) { diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 436dad45d..e862718fb 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -128,9 +128,13 @@ struct KernSubTable TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.format0)); +#ifndef HB_NO_AAT case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward (ds)...) : c->default_return_value ()); +#endif case 2: return_trace (c->dispatch (u.format2)); +#ifndef HB_NO_AAT case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward (ds)...) : c->default_return_value ()); +#endif default: return_trace (c->default_return_value ()); } } @@ -278,7 +282,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_state_machine (); +#ifndef HB_NO_AAT case 1: return u.aat.has_state_machine (); +#endif default:return false; } } @@ -287,7 +293,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_cross_stream (); +#ifndef HB_NO_AAT case 1: return u.aat.has_cross_stream (); +#endif default:return false; } } @@ -296,7 +304,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.get_h_kerning (left, right); +#ifndef HB_NO_AAT case 1: return u.aat.get_h_kerning (left, right); +#endif default:return 0; } } @@ -311,7 +321,9 @@ struct kern TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.ot, hb_forward (ds)...)); +#ifndef HB_NO_AAT case 1: return_trace (c->dispatch (u.aat, hb_forward (ds)...)); +#endif default: return_trace (c->default_return_value ()); } } @@ -328,7 +340,9 @@ struct kern HBUINT32 version32; HBUINT16 major; KernOT ot; +#ifndef HB_NO_AAT KernAAT aat; +#endif } u; public: DEFINE_SIZE_UNION (4, version32); diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 03d9a68ae..0d8acc3a5 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -58,6 +58,10 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, static bool _hb_apply_morx (hb_face_t *face) { +#ifdef HB_NO_AAT + return false; +#endif + if (hb_options ().aat && hb_aat_layout_has_substitution (face)) return true; @@ -83,8 +87,10 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; script_fallback_mark_positioning = shaper->fallback_position; +#ifndef HB_NO_AAT if (apply_morx) shaper = &_hb_ot_complex_shaper_default; +#endif } void @@ -94,8 +100,10 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.props = props; plan.shaper = shaper; map.compile (plan.map, key); +#ifndef HB_NO_AAT if (apply_morx) aat_map.compile (plan.aat_map); +#endif plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c')); plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r')); @@ -130,12 +138,18 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, * Decide who does positioning. GPOS, kerx, kern, or fallback. */ - if (hb_options ().aat && hb_aat_layout_has_positioning (face)) + if (0) + ; +#ifndef HB_NO_AAT + else if (hb_options ().aat && hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face)) plan.apply_gpos = true; +#ifndef HB_NO_AAT else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif if (!plan.apply_kerx && !has_gpos_kern) { @@ -202,9 +216,11 @@ void hb_ot_shape_plan_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const { +#ifndef HB_NO_AAT if (unlikely (apply_morx)) hb_aat_layout_substitute (this, font, buffer); else +#endif map.substitute (this, font, buffer); } @@ -214,15 +230,19 @@ hb_ot_shape_plan_t::position (hb_font_t *font, { if (this->apply_gpos) map.position (this, font, buffer); +#ifndef HB_NO_AAT else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); +#endif else if (this->apply_kern) hb_ot_layout_kern (this, font, buffer); else _hb_ot_shape_fallback_kern (this, font, buffer); +#ifndef HB_NO_AAT if (this->apply_trak) hb_aat_layout_track (this, font, buffer); +#endif } @@ -318,6 +338,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, feature->value); } +#ifndef HB_NO_AAT if (planner->apply_morx) { hb_aat_map_builder_t *aat_map = &planner->aat_map; @@ -327,6 +348,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, aat_map->add_feature (feature->tag, feature->value); } } +#endif if (planner->shaper->override_features) planner->shaper->override_features (planner); @@ -761,8 +783,10 @@ static inline void hb_ot_substitute_post (const hb_ot_shape_context_t *c) { hb_ot_hide_default_ignorables (c->buffer, c->font); +#ifndef HB_NO_AAT if (c->plan->apply_morx) hb_aat_layout_remove_deleted_glyphs (c->buffer); +#endif if (c->plan->shaper->postprocess_glyphs) c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font); @@ -896,8 +920,10 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) /* Finish off. Has to follow a certain order. */ hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c->buffer); +#ifndef HB_NO_AAT if (c->plan->apply_morx) hb_aat_layout_zero_width_deleted_glyphs (c->buffer); +#endif hb_ot_layout_position_finish_offsets (c->font, c->buffer); /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ From 5ea8ad5c48f9baabc4ccf81dce4aee1067c401f6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:36:42 -0700 Subject: [PATCH 208/617] [subset] Add HB_NO_SUBSET_CFF Doesn't fully prune all the relevant code. To be fixed later. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-subset.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index aa6934bc3..a8ec14f57 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -196,6 +196,8 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_post: result = _subset (plan); break; + +#ifndef HB_NO_SUBSET_CFF case HB_OT_TAG_cff1: result = _subset (plan); break; @@ -205,6 +207,7 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_VORG: result = _subset (plan); break; +#endif #ifndef HB_NO_SUBSET_LAYOUT case HB_OT_TAG_GDEF: From 31c591d69f6a7605088883db59149e83c80d019c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:39:53 -0700 Subject: [PATCH 209/617] [cff] Prune more code if HB_NO_OT_FONT_CFF Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-cff1-table.cc | 5 +++++ src/hb-ot-cff2-table.cc | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index 1d97e5444..2844f3ca4 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -305,6 +305,11 @@ bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, boun bool OT::cff1::accelerator_t::get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { +#ifdef HB_NO_OT_FONT_CFF + /* XXX Remove check when this code moves to .hh file. */ + return true; +#endif + bounds_t bounds; if (!_get_bounds (this, glyph, bounds)) diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc index d2463d785..a1aaef636 100644 --- a/src/hb-ot-cff2-table.cc +++ b/src/hb-ot-cff2-table.cc @@ -99,6 +99,11 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { +#ifdef HB_NO_OT_FONT_CFF + /* XXX Remove check when this code moves to .hh file. */ + return true; +#endif + if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false; unsigned int num_coords; From d43af339e7a7f5dab1690703a78d2690baefbd59 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:46:22 -0700 Subject: [PATCH 210/617] [subset] More HB_NO_SUBSET_LAYOUT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-subset-plan.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 66976fa95..009faeb95 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -32,7 +32,7 @@ #include "hb-ot-glyf-table.hh" #include "hb-ot-cff1-table.hh" -static void +static inline void _add_gid_and_children (const OT::glyf::accelerator_t &glyf, hb_codepoint_t gid, hb_set_t *gids_to_retain) @@ -53,7 +53,7 @@ _add_gid_and_children (const OT::glyf::accelerator_t &glyf, } } -static void +static inline void _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_codepoint_t gid, hb_set_t *gids_to_retain) @@ -66,7 +66,7 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff, } } -static void +static inline void _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) { hb_set_t lookup_indices; @@ -81,7 +81,7 @@ _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) gids_to_retain); } -static void +static inline void _remove_invalid_gids (hb_set_t *glyphs, unsigned int num_glyphs) { @@ -126,9 +126,11 @@ _populate_gids_to_retain (hb_face_t *face, initial_gids_to_retain->add (gid); } +#ifndef HB_NO_SUBSET_LAYOUT if (close_over_gsub) // Add all glyphs needed for GSUB substitutions. _gsub_closure (face, initial_gids_to_retain); +#endif // Populate a full set of glyphs to retain by adding all referenced // composite glyphs. @@ -137,14 +139,15 @@ _populate_gids_to_retain (hb_face_t *face, while (initial_gids_to_retain->next (&gid)) { _add_gid_and_children (glyf, gid, all_gids_to_retain); +#ifndef HB_NO_SUBSET_CFF if (cff.is_valid ()) _add_cff_seac_components (cff, gid, all_gids_to_retain); +#endif } hb_set_destroy (initial_gids_to_retain); _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ()); - cff.fini (); glyf.fini (); cmap.fini (); From e6582de12f1af9ab5e3122d762a3e12438a66b6b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:53:38 -0700 Subject: [PATCH 211/617] Add hb-config.hh --- src/Makefile.sources | 1 + src/hb-config.hh | 36 ++++++++++++++++++++++++++++++++++++ src/hb.hh | 7 ++++--- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/hb-config.hh diff --git a/src/Makefile.sources b/src/Makefile.sources index e61315be6..0615a8bfc 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -31,6 +31,7 @@ HB_BASE_sources = \ hb-cff1-interp-cs.hh \ hb-cff2-interp-cs.hh \ hb-common.cc \ + hb-config.hh \ hb-debug.hh \ hb-dispatch.hh \ hb-face.cc \ diff --git a/src/hb-config.hh b/src/hb-config.hh new file mode 100644 index 000000000..385ea4828 --- /dev/null +++ b/src/hb-config.hh @@ -0,0 +1,36 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#ifndef HB_CONFIG_HH +#define HB_CONFIG_HH + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + + +#endif /* HB_CONFIG_HH */ diff --git a/src/hb.hh b/src/hb.hh index 0aa55af16..e4c7271bd 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -29,6 +29,7 @@ #ifndef HB_HH #define HB_HH + #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC #ifdef _MSC_VER #pragma warning( disable: 4068 ) /* Unknown pragma */ @@ -129,9 +130,9 @@ #endif #endif -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif + +#include "hb-config.hh" + /* * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to From 799c6a5081e5058260199eeeb2091ee2c1dfefff Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 May 2019 23:55:22 -0700 Subject: [PATCH 212/617] [config] Add some --- src/hb-aat-layout.cc | 26 +++++++++++++------------- src/hb-aat-map.cc | 4 ++-- src/hb-config.hh | 18 ++++++++++++++++++ src/hb-ot-kern-table.hh | 14 +++++++------- src/hb-ot-shape.cc | 22 +++++++++++----------- 5 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 20c82aeff..22cbd7338 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -135,7 +135,7 @@ static const hb_aat_feature_mapping_t feature_mappings[] = const hb_aat_feature_mapping_t * hb_aat_layout_find_feature_mapping (hb_tag_t tag) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return nullptr; #endif @@ -189,7 +189,7 @@ void hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_aat_map_t *map) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -219,7 +219,7 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_bool_t hb_aat_layout_has_substitution (hb_face_t *face) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return false; #endif @@ -232,7 +232,7 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -258,7 +258,7 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, void hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -279,7 +279,7 @@ is_deleted_glyph (const hb_glyph_info_t *info) void hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -296,7 +296,7 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) hb_bool_t hb_aat_layout_has_positioning (hb_face_t *face) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return false; #endif @@ -308,7 +308,7 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -331,7 +331,7 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_bool_t hb_aat_layout_has_tracking (hb_face_t *face) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return false; #endif @@ -343,7 +343,7 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -370,7 +370,7 @@ hb_aat_layout_get_feature_types (hb_face_t *face, unsigned int *feature_count, /* IN/OUT. May be NULL. */ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT if (feature_count) *feature_count = 0; return 0; @@ -392,7 +392,7 @@ hb_ot_name_id_t hb_aat_layout_feature_type_get_name_id (hb_face_t *face, hb_aat_layout_feature_type_t feature_type) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return HB_OT_NAME_ID_INVALID; #endif @@ -424,7 +424,7 @@ hb_aat_layout_feature_type_get_selector_infos (hb_face_t hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ unsigned int *default_index /* OUT. May be NULL. */) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT if (selector_count) *selector_count = 0; return 0; diff --git a/src/hb-aat-map.cc b/src/hb-aat-map.cc index 618ec8f5a..d57ee849d 100644 --- a/src/hb-aat-map.cc +++ b/src/hb-aat-map.cc @@ -34,7 +34,7 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, unsigned int value) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif @@ -57,7 +57,7 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, void hb_aat_map_builder_t::compile (hb_aat_map_t &m) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return; #endif diff --git a/src/hb-config.hh b/src/hb-config.hh index 385ea4828..03f1ba247 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -33,4 +33,22 @@ + + +/* Closure. */ + +#ifdef HB_NO_AAT +#define HB_NO_SHAPE_AAT +#endif + +#ifdef HB_NO_BITMAP +#define HB_NO_OT_FONT_BITMAP +#endif + +#ifdef HB_NO_CFF +#define HB_NO_OT_FONT_CFF +#define HB_NO_SUBSET_CFF +#endif + + #endif /* HB_CONFIG_HH */ diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index e862718fb..ae2bcc92d 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -128,11 +128,11 @@ struct KernSubTable TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.format0)); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward (ds)...) : c->default_return_value ()); #endif case 2: return_trace (c->dispatch (u.format2)); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward (ds)...) : c->default_return_value ()); #endif default: return_trace (c->default_return_value ()); @@ -282,7 +282,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_state_machine (); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.has_state_machine (); #endif default:return false; @@ -293,7 +293,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_cross_stream (); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.has_cross_stream (); #endif default:return false; @@ -304,7 +304,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.get_h_kerning (left, right); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.get_h_kerning (left, right); #endif default:return 0; @@ -321,7 +321,7 @@ struct kern TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.ot, hb_forward (ds)...)); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT case 1: return_trace (c->dispatch (u.aat, hb_forward (ds)...)); #endif default: return_trace (c->default_return_value ()); @@ -340,7 +340,7 @@ struct kern HBUINT32 version32; HBUINT16 major; KernOT ot; -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT KernAAT aat; #endif } u; diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 0d8acc3a5..09b8a582a 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -58,7 +58,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, static bool _hb_apply_morx (hb_face_t *face) { -#ifdef HB_NO_AAT +#ifdef HB_NO_SHAPE_AAT return false; #endif @@ -87,7 +87,7 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; script_fallback_mark_positioning = shaper->fallback_position; -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (apply_morx) shaper = &_hb_ot_complex_shaper_default; #endif @@ -100,7 +100,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.props = props; plan.shaper = shaper; map.compile (plan.map, key); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (apply_morx) aat_map.compile (plan.aat_map); #endif @@ -140,13 +140,13 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (0) ; -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT else if (hb_options ().aat && hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; #endif else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face)) plan.apply_gpos = true; -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; #endif @@ -216,7 +216,7 @@ void hb_ot_shape_plan_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const { -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (unlikely (apply_morx)) hb_aat_layout_substitute (this, font, buffer); else @@ -230,7 +230,7 @@ hb_ot_shape_plan_t::position (hb_font_t *font, { if (this->apply_gpos) map.position (this, font, buffer); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); #endif @@ -239,7 +239,7 @@ hb_ot_shape_plan_t::position (hb_font_t *font, else _hb_ot_shape_fallback_kern (this, font, buffer); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (this->apply_trak) hb_aat_layout_track (this, font, buffer); #endif @@ -338,7 +338,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, feature->value); } -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (planner->apply_morx) { hb_aat_map_builder_t *aat_map = &planner->aat_map; @@ -783,7 +783,7 @@ static inline void hb_ot_substitute_post (const hb_ot_shape_context_t *c) { hb_ot_hide_default_ignorables (c->buffer, c->font); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_remove_deleted_glyphs (c->buffer); #endif @@ -920,7 +920,7 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) /* Finish off. Has to follow a certain order. */ hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c->buffer); -#ifndef HB_NO_AAT +#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_zero_width_deleted_glyphs (c->buffer); #endif From 784df8eba1aaf20d2db464f8b3ea0984f7ea1308 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:04:59 -0700 Subject: [PATCH 213/617] [config] Flesh out more Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 03f1ba247..00a18e2d8 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -32,7 +32,16 @@ #endif +#ifdef HB_TINY +#define HB_MINI +#define HB_NO_BITMAP +#define HB_NO_CFF +#endif +#ifdef HB_MINI +#define HB_NO_AAT +#define HB_NO_FALLBACK +#endif /* Closure. */ @@ -50,5 +59,13 @@ #define HB_NO_SUBSET_CFF #endif +#ifdef HB_NO_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK +#define HB_NO_OT_SHAPE_FALLBACK +#define HB_NO_OT_SHAPE_FALLBACK +#endif + #endif /* HB_CONFIG_HH */ From 0bfd14c0ed2f95f00d0b94d396c777399afa4d68 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:06:57 -0700 Subject: [PATCH 214/617] [config] Fix tests --- src/hb-config.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 00a18e2d8..6c7a4eb0c 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -27,6 +27,9 @@ #ifndef HB_CONFIG_HH #define HB_CONFIG_HH +#if 0 /* Make test happy. */ +#include "hb.hh" +#endif #ifdef HAVE_CONFIG_H #include "config.h" #endif From 484f6e8215038006a945da67d245f14db3eeeb2e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:13:35 -0700 Subject: [PATCH 215/617] [config] Add HB_LEAN Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 5 +++++ src/hb-ot-math.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 6c7a4eb0c..b13215abf 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -36,9 +36,14 @@ #ifdef HB_TINY +#define HB_LEAN #define HB_MINI +#endif + +#ifdef HB_LEAN #define HB_NO_BITMAP #define HB_NO_CFF +#define HB_NO_MATH #endif #ifdef HB_MINI diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index bd31bf565..b06824a6e 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -58,6 +58,10 @@ hb_bool_t hb_ot_math_has_data (hb_face_t *face) { +#ifdef HB_NO_MATH + return false; +#endif + return face->table.MATH->has_data (); } @@ -80,6 +84,10 @@ hb_position_t hb_ot_math_get_constant (hb_font_t *font, hb_ot_math_constant_t constant) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_constant(constant, font); } @@ -96,6 +104,10 @@ hb_position_t hb_ot_math_get_glyph_italics_correction (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_italics_correction (glyph, font); } @@ -112,6 +124,10 @@ hb_position_t hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_top_accent_attachment (glyph, font); } @@ -128,6 +144,10 @@ hb_bool_t hb_ot_math_is_glyph_extended_shape (hb_face_t *face, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return false; +#endif + return face->table.MATH->get_glyph_info().is_extended_shape (glyph); } @@ -154,6 +174,10 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, hb_ot_math_kern_t kern, hb_position_t correction_height) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_kerning (glyph, kern, correction_height, @@ -187,6 +211,12 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, unsigned int *variants_count, /* IN/OUT */ hb_ot_math_glyph_variant_t *variants /* OUT */) { +#ifdef HB_NO_MATH + if (variants_count) + *variants_count = 0; + return 0; +#endif + return font->face->table.MATH->get_variants().get_glyph_variants (glyph, direction, font, start_offset, variants_count, @@ -211,6 +241,10 @@ hb_position_t hb_ot_math_get_min_connector_overlap (hb_font_t *font, hb_direction_t direction) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_variants().get_min_connector_overlap (direction, font); } @@ -243,6 +277,12 @@ hb_ot_math_get_glyph_assembly (hb_font_t *font, hb_ot_math_glyph_part_t *parts, /* OUT */ hb_position_t *italics_correction /* OUT */) { +#ifdef HB_NO_MATH + if (parts_count) + *parts_count = 0; + return 0; +#endif + return font->face->table.MATH->get_variants().get_glyph_parts (glyph, direction, font, From 771f1b21d1d7128440d6b4488705456d43dbc0e7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:16:18 -0700 Subject: [PATCH 216/617] [config] Adjust --- src/hb-config.hh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index b13215abf..7e5abd0a2 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -48,10 +48,9 @@ #ifdef HB_MINI #define HB_NO_AAT -#define HB_NO_FALLBACK +#define HB_NO_LEGACY #endif - /* Closure. */ #ifdef HB_NO_AAT @@ -67,12 +66,15 @@ #define HB_NO_SUBSET_CFF #endif -#ifdef HB_NO_FALLBACK +#ifdef HB_NO_LEGACY +#define HB_NO_OT_LAYOUT_BLACKLIST +#define HB_NO_OT_SHAPE_FALLBACK +#endif + +#ifdef HB_NO_OT_SHAPE_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK -#define HB_NO_OT_SHAPE_FALLBACK -#define HB_NO_OT_SHAPE_FALLBACK #endif From 5a48611ccd045de5782ad2fd5f6718357fe232a2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:19:03 -0700 Subject: [PATCH 217/617] [config] Add HB_NO_OT_LAYOUT_UNUSED Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-layout.cc | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 7e5abd0a2..bd1becb79 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -44,6 +44,7 @@ #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_MATH +#define HB_NO_OT_LAYOUT_UNUSED #endif #ifdef HB_MINI diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index cd603d8d0..25ad22625 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -335,6 +335,12 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int *point_count /* IN/OUT */, unsigned int *point_array /* OUT */) { +#ifdef HB_NO_OT_LAYOUT_UNUSED + if (point_count) + *point_count = 0; + return 0; +#endif + return face->table.GDEF->table->get_attach_points (glyph, start_offset, point_count, @@ -364,6 +370,12 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, unsigned int *caret_count /* IN/OUT */, hb_position_t *caret_array /* OUT */) { +#ifdef HB_NO_OT_LAYOUT_UNUSED + if (caret_count) + *caret_count = 0; + return 0; +#endif + unsigned int result_caret_count = 0; unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array); if (result) From fca27860417812d51e40f040de97c10177b1250e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:37:01 -0700 Subject: [PATCH 218/617] [config] Make HB_DISABLE_DEPRECATED actually compile Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 7 +++++++ src/hb-font.cc | 8 ++++++++ src/hb-font.hh | 12 ++++++++++-- src/hb-graphite2.cc | 2 ++ src/hb-icu.cc | 2 +- src/hb-ot-layout.cc | 7 ++++++- src/hb-ot-shape-fallback.cc | 4 ++++ src/hb-ot-tag.cc | 4 ++++ src/hb-ot-var-fvar-table.hh | 6 ++++++ src/hb-ot-var.cc | 2 ++ src/hb-set.cc | 2 ++ src/hb-unicode.cc | 6 ++++++ src/hb-unicode.hh | 10 +++++++--- 13 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index bd1becb79..087e669c9 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -41,6 +41,7 @@ #endif #ifdef HB_LEAN +#define HB_DISABLE_DEPRECATED #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_MATH @@ -54,6 +55,12 @@ /* Closure. */ +#ifdef HB_DISABLE_DEPRECATED +#define HB_IF_NOT_DEPRECATED(x) +#else +#define HB_IF_NOT_DEPRECATED(x) x +#endif + #ifdef HB_NO_AAT #define HB_NO_SHAPE_AAT #endif diff --git a/src/hb-font.cc b/src/hb-font.cc index c00f33329..19ee353eb 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -336,6 +336,7 @@ hb_font_get_glyph_v_origin_default (hb_font_t *font, return ret; } +#ifndef HB_DISABLE_DEPRECATED static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, @@ -373,6 +374,7 @@ hb_font_get_glyph_v_kerning_default (hb_font_t *font, { return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); } +#endif static hb_bool_t hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, @@ -925,6 +927,7 @@ hb_font_get_glyph_v_origin (hb_font_t *font, return font->get_glyph_v_origin (glyph, x, y); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_h_kerning: * @font: a font. @@ -964,6 +967,7 @@ hb_font_get_glyph_v_kerning (hb_font_t *font, { return font->get_glyph_v_kerning (top_glyph, bottom_glyph); } +#endif /** * hb_font_get_glyph_extents: @@ -1173,6 +1177,7 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, return font->subtract_glyph_origin_for_direction (glyph, direction, x, y); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_kerning_for_direction: * @font: a font. @@ -1195,6 +1200,7 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font, { return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y); } +#endif /** * hb_font_get_glyph_extents_for_origin: @@ -1916,6 +1922,7 @@ hb_font_get_var_coords_normalized (hb_font_t *font, } +#ifndef HB_DISABLE_DEPRECATED /* * Deprecated get_glyph_func(): */ @@ -2038,3 +2045,4 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, trampoline, trampoline_destroy); } +#endif diff --git a/src/hb-font.hh b/src/hb-font.hh index 4f5aa8a60..95551bfd2 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -51,8 +51,8 @@ HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \ HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ - HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ - HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \ + HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning)) \ + HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning)) \ HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ HB_FONT_FUNC_IMPLEMENT (glyph_name) \ @@ -304,17 +304,25 @@ struct hb_font_t hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) { +#ifdef HB_DISABLE_DEPRECATED + return 0; +#else return klass->get.f.glyph_h_kerning (this, user_data, left_glyph, right_glyph, klass->user_data.glyph_h_kerning); +#endif } hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph) { +#ifdef HB_DISABLE_DEPRECATED + return 0; +#else return klass->get.f.glyph_v_kerning (this, user_data, top_glyph, bottom_glyph, klass->user_data.glyph_v_kerning); +#endif } hb_bool_t get_glyph_extents (hb_codepoint_t glyph, diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index fdb545342..5b1ba4515 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -202,6 +202,7 @@ _hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED { } +#ifndef HB_DISABLE_DEPRECATED /** * hb_graphite2_font_get_gr_font: * @@ -213,6 +214,7 @@ hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED) { return nullptr; } +#endif /* diff --git a/src/hb-icu.cc b/src/hb-icu.cc index c26c91d48..99305ae55 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -236,7 +236,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, /* We don't ifdef-out the fallback code such that compiler always * sees it and makes sure it's compilable. */ - UChar utf16[2], normalized[2 * HB_UNICODE_MAX_DECOMPOSITION_LEN + 1]; + UChar utf16[2], normalized[2 * 19/*HB_UNICODE_MAX_DECOMPOSITION_LEN*/ + 1]; unsigned int len; hb_bool_t ret, err; UErrorCode icu_err; diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 25ad22625..acc996158 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -512,6 +512,7 @@ hb_ot_layout_table_find_script (hb_face_t *face, return false; } +#ifndef HB_DISABLE_DEPRECATED /** * hb_ot_layout_table_choose_script: * @face: #hb_face_t to work upon @@ -533,6 +534,7 @@ hb_ot_layout_table_choose_script (hb_face_t *face, for (t = script_tags; *t; t++); return hb_ot_layout_table_select_script (face, table_tag, t - script_tags, script_tags, script_index, chosen_script); } +#endif /** * hb_ot_layout_table_select_script: @@ -684,6 +686,7 @@ hb_ot_layout_script_get_language_tags (hb_face_t *face, } +#ifndef HB_DISABLE_DEPRECATED /** * hb_ot_layout_script_find_language: * @face: #hb_face_t to work upon @@ -697,6 +700,8 @@ hb_ot_layout_script_get_language_tags (hb_face_t *face, * * Return value: true if the language tag is found, false otherwise * + * Since: ?? + * Deprecated: ?? **/ hb_bool_t hb_ot_layout_script_find_language (hb_face_t *face, @@ -712,6 +717,7 @@ hb_ot_layout_script_find_language (hb_face_t *face, &language_tag, language_index); } +#endif /** @@ -728,7 +734,6 @@ hb_ot_layout_script_find_language (hb_face_t *face, * * Return value: true if the language tag is found, false otherwise * - * * Since: 2.0.0 **/ hb_bool_t diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index 42b728fd1..573af8ec6 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -456,6 +456,7 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan, } +#ifndef HB_DISABLE_DEPRECATED struct hb_ot_shape_fallback_kern_driver_t { hb_ot_shape_fallback_kern_driver_t (hb_font_t *font_, @@ -474,6 +475,7 @@ struct hb_ot_shape_fallback_kern_driver_t hb_font_t *font; hb_direction_t direction; }; +#endif /* Performs font-assisted kerning. */ void @@ -485,6 +487,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, return; #endif +#ifndef HB_DISABLE_DEPRECATED if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ? !font->has_glyph_h_kerning_func () : !font->has_glyph_v_kerning_func ()) @@ -501,6 +504,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, if (reverse) buffer->reverse (); +#endif } diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index 4b42da42d..ad3635bda 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -113,6 +113,7 @@ hb_ot_new_tag_to_script (hb_tag_t tag) return HB_SCRIPT_UNKNOWN; } +#ifndef HB_DISABLE_DEPRECATED void hb_ot_tags_from_script (hb_script_t script, hb_tag_t *script_tag_1, @@ -124,6 +125,7 @@ hb_ot_tags_from_script (hb_script_t script, *script_tag_1 = count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_SCRIPT; *script_tag_2 = count > 1 ? tags[1] : HB_OT_TAG_DEFAULT_SCRIPT; } +#endif /* * Complete list at: @@ -230,6 +232,7 @@ struct LangTag /*{"??", {HB_TAG('Y','I','C',' ')}},*/ /* Yi Classic */ /*{"zh?", {HB_TAG('Z','H','P',' ')}},*/ /* Chinese Phonetic */ +#ifndef HB_DISABLE_DEPRECATED hb_tag_t hb_ot_tag_from_language (hb_language_t language) { @@ -238,6 +241,7 @@ hb_ot_tag_from_language (hb_language_t language) hb_ot_tags_from_script_and_language (HB_SCRIPT_UNKNOWN, language, nullptr, nullptr, &count, tags); return count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_LANGUAGE; } +#endif static void hb_ot_tags_from_language (const char *lang_str, diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index c73348ef4..aa89dce26 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -114,6 +114,7 @@ struct fvar unsigned int get_axis_count () const { return axisCount; } +#ifndef HB_DISABLE_DEPRECATED void get_axis_deprecated (unsigned int axis_index, hb_ot_var_axis_t *info) const { @@ -125,6 +126,7 @@ struct fvar info->min_value = hb_min (info->default_value, axis.minValue / 65536.f); info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f); } +#endif void get_axis_info (unsigned int axis_index, hb_ot_var_axis_info_t *info) const @@ -141,6 +143,7 @@ struct fvar info->reserved = 0; } +#ifndef HB_DISABLE_DEPRECATED unsigned int get_axes_deprecated (unsigned int start_offset, unsigned int *axes_count /* IN/OUT */, hb_ot_var_axis_t *axes_array /* OUT */) const @@ -162,6 +165,7 @@ struct fvar } return axisCount; } +#endif unsigned int get_axis_infos (unsigned int start_offset, unsigned int *axes_count /* IN/OUT */, @@ -185,6 +189,7 @@ struct fvar return axisCount; } +#ifndef HB_DISABLE_DEPRECATED bool find_axis_deprecated (hb_tag_t tag, unsigned int *axis_index, hb_ot_var_axis_t *info) const @@ -203,6 +208,7 @@ struct fvar *axis_index = HB_OT_VAR_NO_AXIS_INDEX; return false; } +#endif bool find_axis_info (hb_tag_t tag, hb_ot_var_axis_info_t *info) const diff --git a/src/hb-ot-var.cc b/src/hb-ot-var.cc index e327fb762..25a246a21 100644 --- a/src/hb-ot-var.cc +++ b/src/hb-ot-var.cc @@ -75,6 +75,7 @@ hb_ot_var_get_axis_count (hb_face_t *face) return face->table.fvar->get_axis_count (); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_ot_var_get_axes: * @@ -104,6 +105,7 @@ hb_ot_var_find_axis (hb_face_t *face, { return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info); } +#endif /** * hb_ot_var_get_axis_infos: diff --git a/src/hb-set.cc b/src/hb-set.cc index 068236264..fa9868809 100644 --- a/src/hb-set.cc +++ b/src/hb-set.cc @@ -389,6 +389,7 @@ hb_set_symmetric_difference (hb_set_t *set, set->symmetric_difference (other); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_set_invert: * @set: a set. @@ -403,6 +404,7 @@ void hb_set_invert (hb_set_t *set HB_UNUSED) { } +#endif /** * hb_set_get_population: diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index d32cace64..94106faee 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -60,6 +60,7 @@ hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; } +#ifndef HB_DISABLE_DEPRECATED static unsigned int hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t unicode HB_UNUSED, @@ -67,6 +68,7 @@ hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, { return 1; } +#endif static hb_unicode_general_category_t hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, @@ -113,6 +115,7 @@ hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, } +#ifndef HB_DISABLE_DEPRECATED static unsigned int hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t u HB_UNUSED, @@ -121,6 +124,7 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED { return 0; } +#endif extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); @@ -425,6 +429,7 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, return ufuncs->decompose (ab, a, b); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_unicode_decompose_compatibility: * @ufuncs: Unicode functions. @@ -445,6 +450,7 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, { return ufuncs->decompose_compatibility (u, decomposed); } +#endif /* See hb-unicode.hh for details. */ diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 82ebb1064..80624c0ec 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -42,19 +42,19 @@ extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256]; #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \ HB_UNICODE_FUNC_IMPLEMENT (combining_class) \ - HB_UNICODE_FUNC_IMPLEMENT (eastasian_width) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (eastasian_width)) \ HB_UNICODE_FUNC_IMPLEMENT (general_category) \ HB_UNICODE_FUNC_IMPLEMENT (mirroring) \ HB_UNICODE_FUNC_IMPLEMENT (script) \ HB_UNICODE_FUNC_IMPLEMENT (compose) \ HB_UNICODE_FUNC_IMPLEMENT (decompose) \ - HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility)) \ /* ^--- Add new callbacks here */ /* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */ #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \ - HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width)) \ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \ HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \ HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \ @@ -89,7 +89,11 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE unsigned int decompose_compatibility (hb_codepoint_t u, hb_codepoint_t *decomposed) { +#ifdef HB_DISABLE_DEPRECATED + unsigned int ret = 0; +#else unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility); +#endif if (ret == 1 && u == decomposed[0]) { decomposed[0] = 0; return 0; From 42a21284778f3203d96133f74b0f846cd1567958 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:44:22 -0700 Subject: [PATCH 219/617] [config] Disbale getenv() and atexit() if HB_LEAN Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 087e669c9..2eada9877 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -42,8 +42,10 @@ #ifdef HB_LEAN #define HB_DISABLE_DEPRECATED +#define HB_NO_ATEXIT #define HB_NO_BITMAP #define HB_NO_CFF +#define HB_NO_GETENV #define HB_NO_MATH #define HB_NO_OT_LAYOUT_UNUSED #endif From b63a8e173cbc5a81f2ca4a0a82f20b9dafaedb30 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:47:20 -0700 Subject: [PATCH 220/617] [config Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS to LEAN Already I don't like the inflexibility of this approach :(. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 2eada9877..6393f56e2 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -85,6 +85,7 @@ #define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS #endif From 81b79dfc397599182f43d63bf9346eee28e2d220 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 00:53:52 -0700 Subject: [PATCH 221/617] [config] Add HB_NO_COLOR to HB_LEAN Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-color.cc | 49 ++++++++++++++++++++++++++++++++++++++++++---- src/hb-ot-color.h | 2 +- src/hb-ot-layout.h | 2 +- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 6393f56e2..ae7ca17da 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -45,6 +45,7 @@ #define HB_NO_ATEXIT #define HB_NO_BITMAP #define HB_NO_CFF +#define HB_NO_COLOR #define HB_NO_GETENV #define HB_NO_MATH #define HB_NO_OT_LAYOUT_UNUSED diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index 791135b10..5341a53f2 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -66,6 +66,9 @@ hb_bool_t hb_ot_color_has_palettes (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.CPAL->has_data (); } @@ -81,6 +84,9 @@ hb_ot_color_has_palettes (hb_face_t *face) unsigned int hb_ot_color_palette_get_count (hb_face_t *face) { +#ifdef HB_NO_COLOR + return 0; +#endif return face->table.CPAL->get_palette_count (); } @@ -101,6 +107,9 @@ hb_ot_name_id_t hb_ot_color_palette_get_name_id (hb_face_t *face, unsigned int palette_index) { +#ifdef HB_NO_COLOR + return HB_OT_NAME_ID_INVALID; +#endif return face->table.CPAL->get_palette_name_id (palette_index); } @@ -117,6 +126,9 @@ hb_ot_name_id_t hb_ot_color_palette_color_get_name_id (hb_face_t *face, unsigned int color_index) { +#ifdef HB_NO_COLOR + return HB_OT_NAME_ID_INVALID; +#endif return face->table.CPAL->get_color_name_id (color_index); } @@ -133,6 +145,9 @@ hb_ot_color_palette_flags_t hb_ot_color_palette_get_flags (hb_face_t *face, unsigned int palette_index) { +#ifdef HB_NO_COLOR + return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; +#endif return face->table.CPAL->get_palette_flags (palette_index); } @@ -167,6 +182,11 @@ hb_ot_color_palette_get_colors (hb_face_t *face, unsigned int *colors_count /* IN/OUT. May be NULL. */, hb_color_t *colors /* OUT. May be NULL. */) { +#ifdef HB_NO_COLOR + if (colors_count) + *colors_count = 0; + return 0; +#endif return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors); } @@ -186,6 +206,9 @@ hb_ot_color_palette_get_colors (hb_face_t *face, hb_bool_t hb_ot_color_has_layers (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.COLR->has_data (); } @@ -194,9 +217,9 @@ hb_ot_color_has_layers (hb_face_t *face) * @face: a font face. * @glyph: a layered color glyph id. * @start_offset: starting offset of layers. - * @count: (inout) (optional): gets number of layers available to be written on buffer + * @layer_count: (inout) (optional): gets number of layers available to be written on buffer * and returns number of written layers. - * @layers: (array length=count) (out) (optional): layers buffer to buffer. + * @layers: (array length=layer_count) (out) (optional): layers buffer to buffer. * * Returns: Total number of layers a layered color glyph have. * @@ -206,10 +229,15 @@ unsigned int hb_ot_color_glyph_get_layers (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, - unsigned int *count, /* IN/OUT. May be NULL. */ + unsigned int *layer_count, /* IN/OUT. May be NULL. */ hb_ot_color_layer_t *layers /* OUT. May be NULL. */) { - return face->table.COLR->get_glyph_layers (glyph, start_offset, count, layers); +#ifdef HB_NO_COLOR + if (layer_count) + *layer_count = 0; + return 0; +#endif + return face->table.COLR->get_glyph_layers (glyph, start_offset, layer_count, layers); } @@ -230,6 +258,9 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, hb_bool_t hb_ot_color_has_svg (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.SVG->has_data (); } @@ -247,6 +278,9 @@ hb_ot_color_has_svg (hb_face_t *face) hb_blob_t * hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) { +#ifdef HB_NO_COLOR + return hb_blob_get_empty (); +#endif return face->table.SVG->reference_blob_for_glyph (glyph); } @@ -268,6 +302,9 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) hb_bool_t hb_ot_color_has_png (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.CBDT->has_data () || face->table.sbix->has_data (); } @@ -287,6 +324,10 @@ hb_ot_color_has_png (hb_face_t *face) hb_blob_t * hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_COLOR + return hb_blob_get_empty (); +#endif + hb_blob_t *blob = hb_blob_get_empty (); if (font->face->table.sbix->has_data ()) diff --git a/src/hb-ot-color.h b/src/hb-ot-color.h index 49646bf3a..0d7daa5d3 100644 --- a/src/hb-ot-color.h +++ b/src/hb-ot-color.h @@ -110,7 +110,7 @@ HB_EXTERN unsigned int hb_ot_color_glyph_get_layers (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, - unsigned int *count, /* IN/OUT. May be NULL. */ + unsigned int *layer_count, /* IN/OUT. May be NULL. */ hb_ot_color_layer_t *layers /* OUT. May be NULL. */); /* diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index 359ee1b6f..3b9a78eaf 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -94,7 +94,7 @@ HB_EXTERN hb_bool_t hb_ot_layout_has_glyph_classes (hb_face_t *face); /** - * hb_ot_layout_get_glyph_class: + * hb_ot_layout_glyph_class_t: * @HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED: Glyphs not matching the other classifications * @HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH: Spacing, single characters, capable of accepting marks * @HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE: Glyphs that represent ligation of multiple characters From 9c921e6c32ab5ac4c524f554b7a7841eeeb0908f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 01:08:51 -0700 Subject: [PATCH 222/617] [config] Enable HB_NO_NAME_TABLE_AAT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index ae7ca17da..8d71a1102 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -48,6 +48,7 @@ #define HB_NO_COLOR #define HB_NO_GETENV #define HB_NO_MATH +#define HB_NO_NAME_TABLE_AAT #define HB_NO_OT_LAYOUT_UNUSED #endif @@ -65,6 +66,7 @@ #endif #ifdef HB_NO_AAT +#define HB_NO_NAME_TABLE_AAT #define HB_NO_SHAPE_AAT #endif From 4381bb2de7a554a148302836b86a5d73264abeae Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 01:14:04 -0700 Subject: [PATCH 223/617] [config] Comment --- src/hb-config.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 8d71a1102..09f71155b 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -38,6 +38,7 @@ #ifdef HB_TINY #define HB_LEAN #define HB_MINI +//#define HB_NO_MT /* Let user choose */ #endif #ifdef HB_LEAN From 1fc077211771c752768f63f178116d2b8f2f7d03 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 01:24:23 -0700 Subject: [PATCH 224/617] [config] HB_NO_OT_NAME_LANGUAGE AAT --- src/hb-config.hh | 4 ++-- src/hb-ot-name-language-static.hh | 3 +++ src/hb-ot-name-table.hh | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 09f71155b..40a0baef1 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -49,7 +49,7 @@ #define HB_NO_COLOR #define HB_NO_GETENV #define HB_NO_MATH -#define HB_NO_NAME_TABLE_AAT +#define HB_NO_OT_NAME_LANGUAGE #define HB_NO_OT_LAYOUT_UNUSED #endif @@ -67,7 +67,7 @@ #endif #ifdef HB_NO_AAT -#define HB_NO_NAME_TABLE_AAT +#define HB_NO_OT_NAME_LANGUAGE_AAT #define HB_NO_SHAPE_AAT #endif diff --git a/src/hb-ot-name-language-static.hh b/src/hb-ot-name-language-static.hh index fac317856..580e7637b 100644 --- a/src/hb-ot-name-language-static.hh +++ b/src/hb-ot-name-language-static.hh @@ -430,6 +430,9 @@ _hb_ot_name_language_for (unsigned int code, const hb_ot_language_map_t *array, unsigned int len) { +#ifdef HB_NO_OT_NAME_LANGUAGE + return HB_LANGUAGE_INVALID; +#endif const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *) hb_bsearch (&code, array, diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index e7e32ecf8..332f48533 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -51,6 +51,7 @@ struct NameRecord { hb_language_t language (hb_face_t *face) const { +#ifndef HB_NO_OT_NAME_LANGUAGE unsigned int p = platformID; unsigned int l = languageID; @@ -60,11 +61,12 @@ struct NameRecord if (p == 1) return _hb_ot_name_language_for_mac_code (l); -#ifndef HB_NO_NAME_TABLE_AAT +#ifndef HB_NO_OT_NAME_LANGUAGE_AAT if (p == 0) return _hb_aat_language_get (face, l); #endif +#endif return HB_LANGUAGE_INVALID; } From 0e78d4ddaec5f29d6652cc4185cbcca98c3a2927 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 01:27:50 -0700 Subject: [PATCH 225/617] [config] Add HB_NO_NAME Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 6 +++++- src/hb-ot-name.cc | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 40a0baef1..86f7b0105 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -49,7 +49,7 @@ #define HB_NO_COLOR #define HB_NO_GETENV #define HB_NO_MATH -#define HB_NO_OT_NAME_LANGUAGE +#define HB_NO_NAME #define HB_NO_OT_LAYOUT_UNUSED #endif @@ -85,6 +85,10 @@ #define HB_NO_OT_SHAPE_FALLBACK #endif +#ifdef HB_NO_NAME +#define HB_NO_OT_NAME_LANGUAGE +#endif + #ifdef HB_NO_OT_SHAPE_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc index 907ae6ab5..f7cd427ac 100644 --- a/src/hb-ot-name.cc +++ b/src/hb-ot-name.cc @@ -58,6 +58,11 @@ const hb_ot_name_entry_t * hb_ot_name_list_names (hb_face_t *face, unsigned int *num_entries /* OUT */) { +#ifdef HB_NO_NAME + if (num_entries) + *num_entries = 0; + return 0; +#endif const OT::name_accelerator_t &name = *face->table.name; if (num_entries) *num_entries = name.names.length; return (const hb_ot_name_entry_t *) name.names; @@ -167,6 +172,11 @@ hb_ot_name_get_utf8 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, char *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf (face, name_id, language, text_size, (hb_utf8_t::codepoint_t *) text); } @@ -194,6 +204,11 @@ hb_ot_name_get_utf16 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint16_t *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf (face, name_id, language, text_size, text); } @@ -220,5 +235,10 @@ hb_ot_name_get_utf32 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint32_t *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf (face, name_id, language, text_size, text); } From 7f45ce42dbf11366e904f48db45cf5405e4e94df Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 01:28:31 -0700 Subject: [PATCH 226/617] [config] Rename --- src/hb-config.hh | 2 +- src/hb-ot-layout.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 86f7b0105..836d0cdb1 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -50,7 +50,7 @@ #define HB_NO_GETENV #define HB_NO_MATH #define HB_NO_NAME -#define HB_NO_OT_LAYOUT_UNUSED +#define HB_NO_LAYOUT_UNUSED #endif #ifdef HB_MINI diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index acc996158..f5c11d8b3 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -335,7 +335,7 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int *point_count /* IN/OUT */, unsigned int *point_array /* OUT */) { -#ifdef HB_NO_OT_LAYOUT_UNUSED +#ifdef HB_NO_LAYOUT_UNUSED if (point_count) *point_count = 0; return 0; @@ -370,7 +370,7 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, unsigned int *caret_count /* IN/OUT */, hb_position_t *caret_array /* OUT */) { -#ifdef HB_NO_OT_LAYOUT_UNUSED +#ifdef HB_NO_LAYOUT_UNUSED if (caret_count) *caret_count = 0; return 0; From 12d2c472fe8ec3268a4b39a57603dcc734ab7b88 Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:06:56 +0100 Subject: [PATCH 227/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index f6844a29c..254e60b91 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -61,7 +61,7 @@ * hb_ot_color_has_palettes: * @face: #hb_face_t to work upon * - * Tests whether a face includes a CPAL color-palette table. + * Tests whether a face includes a `CPAL` color-palette table. * * Return value: true if data found, false otherwise * From 3535f2d31efe1ebe44ba63f980882ba23cdcde3b Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:07:38 +0100 Subject: [PATCH 228/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index 254e60b91..f952bca3f 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -94,7 +94,7 @@ hb_ot_color_palette_get_count (hb_face_t *face) * @face: #hb_face_t to work upon * @palette_index: The index of the color palette * - * Fetches the 'name' table Name ID that provides display names for + * Fetches the `name` table Name ID that provides display names for * a CPAL color palette. * * Palette display names can be generic (e.g., "Default") or provide From 12ea4a24c40c7ac28d058e9721479347951e3482 Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:08:40 +0100 Subject: [PATCH 229/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index f952bca3f..c4b800dbb 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -117,7 +117,7 @@ hb_ot_color_palette_get_name_id (hb_face_t *face, * @face: #hb_face_t to work upon * @color_index: The index of the color * - * Fetches the 'name' table Name ID that provides display names for + * Fetches the `name` table Name ID that provides display names for * the specificed color in a face's CPAL color palette. * * Display names can be generic (e.g., "Background") or specific From 6d9870b4799f20a6c58a2c071713e56aa93b0221 Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:09:26 +0100 Subject: [PATCH 230/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index c4b800dbb..a0248c5e2 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -118,7 +118,7 @@ hb_ot_color_palette_get_name_id (hb_face_t *face, * @color_index: The index of the color * * Fetches the `name` table Name ID that provides display names for - * the specificed color in a face's CPAL color palette. + * the specificed color in a face's `CPAL` color palette. * * Display names can be generic (e.g., "Background") or specific * (e.g., "Eye color"). From 46e05ecca16e561a0ff4ca60bb064f480374590a Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:09:52 +0100 Subject: [PATCH 231/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index a0248c5e2..bde36cada 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -167,7 +167,7 @@ hb_ot_color_palette_get_flags (hb_face_t *face, * colors. If @colors is NULL, the function will just return the number * of total colors without storing any actual colors; this can be used * for allocating a buffer of suitable size before calling - * #hb_ot_color_palette_get_colors() a second time. + * hb_ot_color_palette_get_colors() a second time. * * Return value: the total number of colors in the palette * From ddc6dd42f753a20204898e41cc711b0100638330 Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:10:11 +0100 Subject: [PATCH 232/617] Update src/hb-ot-math.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-math.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index 99ce74443..6883852a0 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -97,7 +97,7 @@ hb_ot_math_get_constant (hb_font_t *font, * Fetches an italics-correction value (if one exists) for the specified * glyph index. * - * Return value: the italics correction of the glyph or 0 + * Return value: the italics correction of the glyph or zero * * Since: 1.3.3 **/ From bcd81932f0bcb2258276ae313709780e90e9b0f6 Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 14:10:32 +0100 Subject: [PATCH 233/617] Update src/hb-ot-math.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-math.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index 6883852a0..c77096f01 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -152,7 +152,7 @@ hb_ot_math_is_glyph_extended_shape (hb_face_t *face, * @kern: The #hb_ot_math_kern_t from which to retrieve the value * @correction_height: the correction height to use to determine the kerning. * - * Fetches the MathKern table for the specified font, glyph index, and + * Fetches the math kerning (cut-ins) value for the specified font, glyph index, and * @kern. * * If the MathKern table is found, the function examines it to find a height From 79126df3070f00193fe3caefe9deb62c4520e048 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 11:23:31 -0700 Subject: [PATCH 234/617] [iter] Add hb_map_sorted() and hb_map_retains_sorting() --- src/hb-iter.hh | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 194a421ff..77edd1a0a 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -345,16 +345,24 @@ operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward (rhs) (hb_forw /* hb_map(), hb_filter(), hb_reduce() */ -template struct hb_map_iter_t : - hb_iter_t, + hb_iter_t, decltype (hb_get (hb_declval (Proj), *hb_declval (Iter)))> { hb_map_iter_t (const Iter& it, Proj f_) : it (it), f (f_) {} typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; + static constexpr bool is_sorted_iterator = + Sorted == SORTED ? true : Sorted == RETAINS_SORTING ? Iter::is_sorted_iterator : false; __item_t__ __item__ () const { return hb_get (f.get (), *it); } __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } bool __more__ () const { return bool (it); } @@ -372,16 +380,16 @@ struct hb_map_iter_t : hb_reference_wrapper f; }; -template +template struct hb_map_iter_factory_t { hb_map_iter_factory_t (Proj f) : f (f) {} template - hb_map_iter_t + hb_map_iter_t operator () (Iter it) - { return hb_map_iter_t (it, f); } + { return hb_map_iter_t (it, f); } private: Proj f; @@ -389,11 +397,27 @@ struct hb_map_iter_factory_t struct { template - hb_map_iter_factory_t + hb_map_iter_factory_t operator () (Proj&& f) const - { return hb_map_iter_factory_t (f); } + { return hb_map_iter_factory_t (f); } } HB_FUNCOBJ (hb_map); +struct +{ + template + hb_map_iter_factory_t + operator () (Proj&& f) const + { return hb_map_iter_factory_t (f); } +} +HB_FUNCOBJ (hb_map_retains_sorting); +struct +{ + template + hb_map_iter_factory_t + operator () (Proj&& f) const + { return hb_map_iter_factory_t (f); } +} +HB_FUNCOBJ (hb_map_sorted); template From 76e80c5ca5e820e955438e4c727929ddd99e695e Mon Sep 17 00:00:00 2001 From: n8willis Date: Sat, 11 May 2019 19:51:24 +0100 Subject: [PATCH 235/617] Update src/hb-ot-color.cc Co-Authored-By: Khaled Hosny --- src/hb-ot-color.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index bde36cada..f3afe0cbe 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -192,7 +192,7 @@ hb_ot_color_palette_get_colors (hb_face_t *face, * hb_ot_color_has_layers: * @face: #hb_face_t to work upon * - * Tests whether a face includes any COLR color layers. + * Tests whether a face includes any `COLR` color layers. * * Return value: true if data found, false otherwise * From b854d4ff46602104343201361919f30169144cf1 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Fri, 10 May 2019 22:51:49 -0400 Subject: [PATCH 236/617] [array] Fix rewinding --- src/hb-array.hh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 003fc5bed..705bc6a46 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -42,20 +42,20 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> /* * Constructors. */ - hb_array_t () : arrayZ (nullptr), length (0) {} - hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} + hb_array_t () : arrayZ (nullptr), length (0), backwards_length (0) {} + hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_), backwards_length (0) {} template - hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} + hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_), backwards_length (0) {} template hb_array_t (const hb_array_t &o) : hb_iter_with_fallback_t, Type&> (), - arrayZ (o.arrayZ), length (o.length) {} + arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {} template hb_array_t& operator = (const hb_array_t &o) - { arrayZ = o.arrayZ; length = o.length; return *this; } + { arrayZ = o.arrayZ; length = o.length; backwards_length = o.backwards_length; return *this; } /* * Iterator implementation. @@ -72,17 +72,20 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> if (unlikely (n > length)) n = length; length -= n; + backwards_length += n; arrayZ += n; } void __rewind__ (unsigned n) { - if (unlikely (n > length)) - n = length; - length -= n; + if (unlikely (n > backwards_length)) + n = backwards_length; + length += n; + backwards_length -= n; + arrayZ -= n; } unsigned __len__ () const { return length; } bool operator != (const hb_array_t& o) const - { return arrayZ != o.arrayZ || length != o.length; } + { return arrayZ != o.arrayZ || length != o.length || backwards_length != o.backwards_length; } /* Extra operators. */ @@ -199,6 +202,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> public: Type *arrayZ; unsigned int length; + unsigned int backwards_length; }; template inline hb_array_t hb_array (T *array, unsigned int length) From c1c122e7b3f60dc7b5a224c68d2acb106fda8b49 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 11 May 2019 11:38:06 -0400 Subject: [PATCH 237/617] [iter] Fix filter rewinding --- src/hb-iter.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 77edd1a0a..1b5c427df 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -433,7 +433,7 @@ struct hb_filter_iter_t : __item_t__ __item__ () const { return *it; } bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } - void __prev__ () { --it; } + void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); } bool operator != (const hb_filter_iter_t& o) const { return it != o.it || p != o.p || f != o.f; } From 606841b07017ac80dea2fc5ada25b5976f2f9192 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 11:54:30 -0700 Subject: [PATCH 238/617] [iter] Check for more before forwarding/rewinding past ends --- src/hb-iter.hh | 4 ++-- src/test-iter.cc | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 1b5c427df..dcc49ee5d 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -196,11 +196,11 @@ struct hb_iter_fallback_mixin_t /* Advancing: Implement __next__(), or __forward__() if random-access. */ void __next__ () { *thiz() += 1; } - void __forward__ (unsigned n) { while (n--) ++*thiz(); } + void __forward__ (unsigned n) { while (*thiz() && n--) ++*thiz(); } /* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */ void __prev__ () { *thiz() -= 1; } - void __rewind__ (unsigned n) { while (n--) --*thiz(); } + void __rewind__ (unsigned n) { while (*thiz() && n--) --*thiz(); } /* Range-based for: Implement __end__() if can be done faster, * and operator!=. */ diff --git a/src/test-iter.cc b/src/test-iter.cc index d9e2a97f1..f834640ff 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -82,10 +82,8 @@ test_iterator_non_default_constructable (Iter it) (void) _; it += it.len (); - if (0) - it = it + 10; - if (0) - it = 10 + it; + it = it + 10; + it = 10 + it; assert (*it == it[0]); From 32d3c06b61f2f4252f4403b55c6ba07fbb572149 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 11:59:18 -0700 Subject: [PATCH 239/617] Disable sbix if no-color or no-ot-font-bitmap Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-font.cc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 5051fa0ea..f5a676bb1 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -180,19 +180,20 @@ hb_ot_get_glyph_extents (hb_font_t *font, void *user_data HB_UNUSED) { const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; - bool ret = ot_face->sbix->get_extents (font, glyph, extents); - if (!ret) - ret = ot_face->glyf->get_extents (glyph, extents); + bool ret = false; + +#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) + if (!ret) ot_face->sbix->get_extents (font, glyph, extents); +#endif + if (!ret) ret = ot_face->glyf->get_extents (glyph, extents); #ifndef HB_NO_OT_FONT_CFF - if (!ret) - ret = ot_face->cff1->get_extents (glyph, extents); - if (!ret) - ret = ot_face->cff2->get_extents (font, glyph, extents); + if (!ret) ret = ot_face->cff1->get_extents (glyph, extents); + if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents); #endif -#ifndef HB_NO_OT_FONT_BITMAP - if (!ret) - ret = ot_face->CBDT->get_extents (font, glyph, extents); +#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) + if (!ret) ret = ot_face->CBDT->get_extents (font, glyph, extents); #endif + // TODO Hook up side-bearings variations. extents->x_bearing = font->em_scale_x (extents->x_bearing); extents->y_bearing = font->em_scale_y (extents->y_bearing); From a6048e4cd013987ecb846e0683a7cf6f0caa65f9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 12:11:22 -0700 Subject: [PATCH 240/617] Fix build --- src/hb-ot-font.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index f5a676bb1..3344c4b6b 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -183,7 +183,7 @@ hb_ot_get_glyph_extents (hb_font_t *font, bool ret = false; #if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) - if (!ret) ot_face->sbix->get_extents (font, glyph, extents); + if (!ret) ret = ot_face->sbix->get_extents (font, glyph, extents); #endif if (!ret) ret = ot_face->glyf->get_extents (glyph, extents); #ifndef HB_NO_OT_FONT_CFF From 301f5091f6663cc8a1fff848bf5285aa15cc0598 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sat, 11 May 2019 20:11:36 +0100 Subject: [PATCH 241/617] Corrections to OT Math gtk-doc comments. --- src/hb-ot-math.cc | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index c77096f01..df17371fb 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -116,7 +116,14 @@ hb_ot_math_get_glyph_italics_correction (hb_font_t *font, * Fetches a top-accent-attachment value (if one exists) for the specified * glyph index. * - * Return value: the top accent attachment of the glyph or 0 + * For any glyph that does not have a top-accent-attachment value - that is, + * a glyph not covered by the `MathTopAccentAttachment` table (or, when + * @font has no `MathTopAccentAttachment` table or no `MATH` table, any + * glyph) - the function synthesizes a value, returning the position at + * one-half the glyph's advance width. + * + * Return value: the top accent attachment of the glyph or 0.5 * the advance + * width of @glyph * * Since: 1.3.3 **/ @@ -180,7 +187,7 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, * hb_ot_math_get_glyph_variants: * @font: #hb_font_t to work upon * @glyph: The index of the glyph to stretch - * @direction: The direction of the stretching (H or V) + * @direction: The direction of the stretching (horizontal or vertical) * @start_offset: offset of the first variant to retrieve * @variants_count: (inout): Input = the maximum number of variants to return; * Output = the actual number of variants returned @@ -190,8 +197,10 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, * direction. The corresponding list of size variants is returned as a list of * #hb_ot_math_glyph_variant_t structs. * - * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered - * from the @direction parameter. + * The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered. * * Return value: the total number of size variants available or zero * @@ -214,14 +223,16 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, /** * hb_ot_math_get_min_connector_overlap: * @font: #hb_font_t to work upon - * @direction: direction of the stretching (H or V) + * @direction: direction of the stretching (horizontal or vertical) * * Fetches the MathVariants table for the specified font and returns the * minimum overlap of connecting glyphs that are required to draw a glyph * assembly in the specified direction. * - * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered - * from the @direction parameter. + * The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered. * * Return value: requested minimum connector overlap or zero * @@ -238,7 +249,7 @@ hb_ot_math_get_min_connector_overlap (hb_font_t *font, * hb_ot_math_get_glyph_assembly: * @font: #hb_font_t to work upon * @glyph: The index of the glyph to stretch - * @direction: direction of the stretching (H or V) + * @direction: direction of the stretching (horizontal or vertical) * @start_offset: offset of the first glyph part to retrieve * @parts_count: (inout): Input = maximum number of glyph parts to return; * Output = actual number of parts returned @@ -250,8 +261,10 @@ hb_ot_math_get_min_connector_overlap (hb_font_t *font, * used to draw the glyph and an italics-correction value (if one is defined * in the font). * - * Note that only the value of #HB_DIRECTION_IS_HORIZONTAL is considered - * from the @direction parameter. + * The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered. * * Return value: the total number of parts in the glyph assembly * From 8a544171d15bb36c15ca7bf679643b2b14f94b45 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sat, 11 May 2019 20:11:49 +0100 Subject: [PATCH 242/617] Corrections to OT Color gtk-doc comments. --- src/hb-ot-color.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index f3afe0cbe..badf0ecbc 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -48,7 +48,7 @@ * * Functions for fetching color-font information from OpenType font faces. * - * HarfBuzz supports COLR/CPAL, sbix, CBDT, and SVG color fonts. + * HarfBuzz supports `COLR`/`CPAL`, `sbix`, `CBDT`, and `SVG` color fonts. **/ @@ -95,7 +95,7 @@ hb_ot_color_palette_get_count (hb_face_t *face) * @palette_index: The index of the color palette * * Fetches the `name` table Name ID that provides display names for - * a CPAL color palette. + * a `CPAL` color palette. * * Palette display names can be generic (e.g., "Default") or provide * specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter"). @@ -159,7 +159,7 @@ hb_ot_color_palette_get_flags (hb_face_t *face, * @start_offset: offset of the first color to retrieve * @color_count: (inout) (optional): Input = the maximum number of colors to return; * Output = the actual number of colors returned (may be zero) - * @colors: (array length=color_count) (out) (optional): The array of #hb_color_t records found + * @colors: (out) (array length=color_count) (nullable): The array of #hb_color_t records found * * Fetches a list of the colors in a color palette. * @@ -211,7 +211,7 @@ hb_ot_color_has_layers (hb_face_t *face) * @start_offset: offset of the first layer to retrieve * @count: (inout) (optional): Input = the maximum number of layers to return; * Output = the actual number of layers returned (may be zero) - * @layers: (array length=count) (out) (optional): The array of layers found + * @layers: (out) (array length=count) (nullable): The array of layers found * * Fetches a list of all color layers for the specified glyph index in the specified * face. The list returned will begin at the offset provided. @@ -239,7 +239,7 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, * hb_ot_color_has_svg: * @face: #hb_face_t to work upon. * - * Tests whether a face includes any SVG glyph images. + * Tests whether a face includes any `SVG` glyph images. * * Return value: true if data found, false otherwise. * @@ -277,7 +277,7 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) * hb_ot_color_has_png: * @face: #hb_face_t to work upon * - * Tests whether a face has PNG glyph images (either in CBDT or sbix tables). + * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables). * * Return value: true if data found, false otherwise * @@ -292,7 +292,7 @@ hb_ot_color_has_png (hb_face_t *face) /** * hb_ot_color_glyph_reference_png: * @font: #hb_font_t to work upon - * @glyph: a glyph index. + * @glyph: a glyph index * * Fetches the PNG image for a glyph. This function takes a font object, not a face object, * as input. To get an optimally sized PNG blob, the UPEM value must be set on the @font From 25531a30394c451a7a2aee77928e0a550015b803 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 11 May 2019 19:50:42 +0000 Subject: [PATCH 243/617] [test] minor style fix and add return statement --- test/fuzzing/main.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/fuzzing/main.cc b/test/fuzzing/main.cc index f15247cdb..bf3c32cd0 100644 --- a/test/fuzzing/main.cc +++ b/test/fuzzing/main.cc @@ -4,7 +4,8 @@ #include #include -int main(int argc, char **argv) { +int main (int argc, char **argv) +{ hb_blob_t *blob = hb_blob_create_from_file (argv[1]); unsigned int len; const char *font_data = hb_blob_get_data (blob, &len); @@ -14,10 +15,13 @@ int main(int argc, char **argv) { exit (1); } - for (int i = 1; i < argc; i++) { + for (unsigned int i = 1; i < argc; i++) + { printf ("%s\n", argv[i]); - LLVMFuzzerTestOneInput((const uint8_t *) font_data, len); + LLVMFuzzerTestOneInput ((const uint8_t *) font_data, len); } hb_blob_destroy (blob); + + return 0; } From 78fcb14db9041af0e0d5ea209cf0cb1977f6dcc3 Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sat, 11 May 2019 20:56:02 +0100 Subject: [PATCH 244/617] Usermanual, minor: flesh out invisible-glyph discussion in buffers chapter. --- ...-buffers-language-script-and-direction.xml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index 719b6880f..b66f2709c 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -234,6 +234,10 @@ hb_buffer_set_replacement_codepoint(buf, replacement); + + passing in the replacement Unicode code point as the + replacement parameter. + The invisible glyph is used to replace all output glyphs that are invisible. By default, the standard space character @@ -242,8 +246,13 @@ spaces) with - hb_buffer_set_invisible_glyph(buf, replacement); + hb_buffer_set_invisible_glyph(buf, replacement_glyph); + + Do note that in the replacement_glyph + parameter, you must provide the glyph ID of the replacement you + wish to use, not the Unicode code point. + HarfBuzz supports a few additional flags you might want to set on your buffer under certain circumstances. The @@ -262,8 +271,9 @@ property designates control characters and other non-printing code points, such as joiners and variation selectors. Normally HarfBuzz replaces them in the output buffer with zero-width - space glyphs; setting this flag causes them to be printed, - which can be helpful for troubleshooting. + space glyphs (using the "invisible glyph" property discussed + above); setting this flag causes them to be printed, which can + be helpful for troubleshooting. Conversely, setting the @@ -315,7 +325,8 @@ In addition, you can mark your unicode_funcs as immutable by calling - hb_unicode_funcs_make_immutable (ufuncs). This is especially useful if your code is a + hb_unicode_funcs_make_immutable (ufuncs). + This is especially useful if your code is a library or framework that will have its own client programs. By marking your Unicode function choices as immutable, you prevent your own client programs from changing the From a29b1de55abca2e90733caff7423e5251d72e03c Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sat, 11 May 2019 20:56:55 +0100 Subject: [PATCH 245/617] Usermanual, fix up userfeatures example code in OpenType features section of shaping chapter. --- docs/usermanual-opentype-features.xml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/usermanual-opentype-features.xml b/docs/usermanual-opentype-features.xml index 4405328bf..242ac8e1f 100644 --- a/docs/usermanual-opentype-features.xml +++ b/docs/usermanual-opentype-features.xml @@ -167,13 +167,20 @@ "discretionary" ligatures in the font: - unsigned int num_features = 1; - hb_feature_t userfeatures[num_features]; + hb_feature_t userfeatures[1]; userfeatures[0].tag = HB_TAG('d','l','i','g'); userfeatures[0].value = 1; - userfeatures[0].start = 0; - userfeatures[0].end = (unsigned int) -1; + userfeatures[0].start = HB_FEATURE_GLOBAL_START; + userfeatures[0].end = HB_FEATURE_GLOBAL_END; + + HB_FEATURE_GLOBAL_END and + HB_FEATURE_GLOBAL_END are macros we can use + to indicate that the features will be applied to the entire + buffer. We could also have used a literal 0 + for the start and a -1 to indicate the end of + the buffer (or have selected other start and end positions, if needed). + When we pass the userfeatures array to hb_shape(), any discretionary ligature From 30c059a978c91fcd38d47f1ac4a03295f887a7da Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 11 May 2019 18:48:41 -0400 Subject: [PATCH 246/617] [test] minor, fix -Weverything bot --- test/fuzzing/main.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/fuzzing/main.cc b/test/fuzzing/main.cc index bf3c32cd0..5318f64ea 100644 --- a/test/fuzzing/main.cc +++ b/test/fuzzing/main.cc @@ -7,6 +7,7 @@ int main (int argc, char **argv) { hb_blob_t *blob = hb_blob_create_from_file (argv[1]); + unsigned int len; const char *font_data = hb_blob_get_data (blob, &len); if (len == 0) @@ -15,7 +16,7 @@ int main (int argc, char **argv) exit (1); } - for (unsigned int i = 1; i < argc; i++) + for (int i = 1; i < argc; i++) { printf ("%s\n", argv[i]); LLVMFuzzerTestOneInput ((const uint8_t *) font_data, len); From 5249eee43748db32b40ad2602b3243d2491642b3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 11 May 2019 16:12:07 -0700 Subject: [PATCH 247/617] [config] Allow overriding chosen config --- src/hb-config.hh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 836d0cdb1..6f31ad2d9 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -30,6 +30,7 @@ #if 0 /* Make test happy. */ #include "hb.hh" #endif + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -97,4 +98,9 @@ #endif +#ifdef HAVE_CONFIG_OVERRIDE_H +#include "config-override.h" +#endif + + #endif /* HB_CONFIG_HH */ From 7f6fca4ef78cf3c9384bf835def14219b2ce8791 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 10:29:47 -0700 Subject: [PATCH 248/617] Force-disable CFF code under disabling conditions Subsetter size goes down from 190kb to 119kb. Main library about 7kb. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-cff1-table.cc | 4 ++++ src/hb-ot-cff2-table.cc | 4 ++++ src/hb-subset-cff1.cc | 4 ++++ src/hb-subset-cff2.cc | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index 2844f3ca4..e6dd6a7b8 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -27,6 +27,8 @@ #include "hb-ot-cff1-table.hh" #include "hb-cff1-interp-cs.hh" +#ifndef HB_NO_CFF + using namespace CFF; /* SID to code */ @@ -388,3 +390,5 @@ bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_code } return false; } + +#endif diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc index a1aaef636..f1fa6ec30 100644 --- a/src/hb-ot-cff2-table.cc +++ b/src/hb-ot-cff2-table.cc @@ -27,6 +27,8 @@ #include "hb-ot-cff2-table.hh" #include "hb-cff2-interp-cs.hh" +#ifndef HB_NO_OT_FONT_CFF + using namespace CFF; struct extents_param_t @@ -139,3 +141,5 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, return true; } + +#endif diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index ab3ad0936..64b8b151b 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -32,6 +32,8 @@ #include "hb-subset-cff-common.hh" #include "hb-cff1-interp-cs.hh" +#ifndef HB_NO_SUBSET_CFF + using namespace CFF; struct remap_sid_t : remap_t @@ -1118,3 +1120,5 @@ hb_subset_cff1 (hb_subset_plan_t *plan, return result; } + +#endif diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 9a03c3ed9..729457889 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -32,6 +32,8 @@ #include "hb-subset-cff-common.hh" #include "hb-cff2-interp-cs.hh" +#ifndef HB_NO_SUBSET_CFF + using namespace CFF; struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t @@ -626,3 +628,5 @@ hb_subset_cff2 (hb_subset_plan_t *plan, return result; } + +#endif From 8694d6082901661e90e2ffcf732e9985a215063f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 11:05:24 -0700 Subject: [PATCH 249/617] [config] Enable HB_NO_MT in HB_TINY Now that user can override it if needed... Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 6f31ad2d9..e7e14df6a 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -39,7 +39,7 @@ #ifdef HB_TINY #define HB_LEAN #define HB_MINI -//#define HB_NO_MT /* Let user choose */ +#define HB_NO_MT #endif #ifdef HB_LEAN From a20db496f090abc5b937857b7c5f077161b6ffe4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 11:08:45 -0700 Subject: [PATCH 250/617] Fix builds --- src/hb-subset-plan.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 009faeb95..bbbfacb38 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -53,6 +53,7 @@ _add_gid_and_children (const OT::glyf::accelerator_t &glyf, } } +#ifndef HB_NO_SUBSET_CFF static inline void _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_codepoint_t gid, @@ -65,6 +66,7 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_set_add (gids_to_retain, accent_gid); } } +#endif static inline void _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) From dba1ac1b0e8f5f96974fc1119b318ae6127daa82 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 15:33:31 -0700 Subject: [PATCH 251/617] [config] Disable buffer serialize routines in HB_TINY Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-buffer-serialize.cc | 14 +++++++++++++- src/hb-config.hh | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc index dcbdcea45..d3732fd02 100644 --- a/src/hb-buffer-serialize.cc +++ b/src/hb-buffer-serialize.cc @@ -28,8 +28,10 @@ static const char *serialize_formats[] = { +#ifndef HB_NO_BUFFER_SERIALIZE "text", "json", +#endif nullptr }; @@ -85,10 +87,12 @@ hb_buffer_serialize_format_from_string (const char *str, int len) const char * hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) { - switch (format) + switch ((unsigned) format) { +#ifndef HB_NO_BUFFER_SERIALIZE case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0]; case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1]; +#endif default: case HB_BUFFER_SERIALIZE_FORMAT_INVALID: return nullptr; } @@ -344,6 +348,10 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer, if (buf_size) *buf = '\0'; +#ifdef HB_NO_BUFFER_SERIALIZE + return 0; +#endif + assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); @@ -449,6 +457,10 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, end_ptr = &end; *end_ptr = buf; +#ifdef HB_NO_BUFFER_SERIALIZE + return false; +#endif + assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); diff --git a/src/hb-config.hh b/src/hb-config.hh index e7e14df6a..2eab7d8b6 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -45,6 +45,7 @@ #ifdef HB_LEAN #define HB_DISABLE_DEPRECATED #define HB_NO_ATEXIT +#define HB_NO_BUFFER_SERIALIZE #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_COLOR From a1394a28fc4b3d15ef45481f3147f0685d343acb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 15:47:46 -0700 Subject: [PATCH 252/617] [config] Add HB_NO_UNISCRIBE_BUG_COMPATIBLE Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 4 ++++ src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 2eab7d8b6..f6dc4fbb1 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -82,6 +82,10 @@ #define HB_NO_SUBSET_CFF #endif +#ifdef HB_NO_GETENV +#define HB_NO_UNISCRIBE_BUG_COMPATIBLE +#endif + #ifdef HB_NO_LEGACY #define HB_NO_OT_LAYOUT_BLACKLIST #define HB_NO_OT_SHAPE_FALLBACK diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 7befbf630..45351b885 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -274,7 +274,9 @@ struct indic_shape_plan_t const indic_config_t *config; bool is_old_spec; +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE bool uniscribe_bug_compatible; +#endif mutable hb_atomic_int_t virama_glyph; would_substitute_feature_t rphf; @@ -300,7 +302,9 @@ data_create_indic (const hb_ot_shape_plan_t *plan) } indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2'); +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible; +#endif indic_plan->virama_glyph.set_relaxed (-1); /* Use zero-context would_substitute() matching for new-spec of the main @@ -918,11 +922,11 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, unsigned int start, unsigned int end) { - const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; - /* We treat placeholder/dotted-circle as if they are consonants, so we * should just chain. Only if not in compatibility mode that is... */ +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE + const HB_UNUSED indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; if (indic_plan->uniscribe_bug_compatible) { /* For dotted-circle, this is what Uniscribe does: @@ -931,6 +935,7 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, if (buffer->info[end - 1].indic_category() == OT_DOTTEDCIRCLE) return; } +#endif initial_reordering_consonant_syllable (plan, face, buffer, start, end); } @@ -1370,14 +1375,18 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * Uniscribe doesn't do this. * TEST: U+0930,U+094D,U+0915,U+094B,U+094D */ +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE if (!indic_plan->uniscribe_bug_compatible && - unlikely (is_halant (info[new_reph_pos]))) { + unlikely (is_halant (info[new_reph_pos]))) + { for (unsigned int i = base + 1; i < new_reph_pos; i++) if (info[i].indic_category() == OT_M) { /* Ok, got it. */ new_reph_pos--; } } +#endif + goto reph_move; } @@ -1476,6 +1485,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* * Finish off the clusters and go home! */ +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE if (indic_plan->uniscribe_bug_compatible) { switch ((hb_tag_t) plan->props.script) @@ -1493,6 +1503,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, break; } } +#endif } @@ -1590,11 +1601,11 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, * https://docs.microsoft.com/en-us/typography/script-development/sinhala#shaping */ + +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data; - hb_codepoint_t glyph; - - if (hb_options ().uniscribe_bug_compatible || + if (indic_plan->uniscribe_bug_compatible || (c->font->get_nominal_glyph (ab, &glyph) && indic_plan->pstf.would_substitute (&glyph, 1, c->font->face))) { @@ -1603,6 +1614,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, *b = ab; return true; } +#endif } return (bool) c->unicode->decompose (ab, a, b); From f8f9cb93b7166b0d8c816610596da486443c7391 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 15:56:25 -0700 Subject: [PATCH 253/617] [config] Define HB_NO_SUBSET_LAYOUT in HB_LEAN Assumning subsetter would be used for printing-like uses in that case, which don't need GSUB/GPOS. --- src/hb-config.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index f6dc4fbb1..c34d7fbcb 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -50,9 +50,10 @@ #define HB_NO_CFF #define HB_NO_COLOR #define HB_NO_GETENV +#define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH #define HB_NO_NAME -#define HB_NO_LAYOUT_UNUSED +#define HB_NO_SUBSET_LAYOUT #endif #ifdef HB_MINI From ccc88e98f34453100830d6408fdabfe90e6b47b8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 16:12:06 -0700 Subject: [PATCH 254/617] Fix MSVC build --- src/hb-ot-shape-complex-indic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 45351b885..37cd1ce8f 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -926,7 +926,7 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, * should just chain. Only if not in compatibility mode that is... */ #ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE - const HB_UNUSED indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; + const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; if (indic_plan->uniscribe_bug_compatible) { /* For dotted-circle, this is what Uniscribe does: From df3f36f0bb7aeed0554843f24f6542852e40f6cc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 May 2019 20:56:36 -0700 Subject: [PATCH 255/617] Minor --- src/gen-os2-unicode-ranges.py | 2 ++ 1 file changed, 2 insertions(+) mode change 100644 => 100755 src/gen-os2-unicode-ranges.py diff --git a/src/gen-os2-unicode-ranges.py b/src/gen-os2-unicode-ranges.py old mode 100644 new mode 100755 index 95f1f1156..515f4ca14 --- a/src/gen-os2-unicode-ranges.py +++ b/src/gen-os2-unicode-ranges.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + # -*- coding: utf-8 -*- # Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh From ae8719eb596485ebff07dd5016256015cd0cf86b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 12:27:10 -0700 Subject: [PATCH 256/617] [ragel] Switch to -T1 output instead of -F1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fedora upgraded to ragel 7, which is buggy if char is signed. Switching to -G2 output fails with sign-compare error: ../../src/hb-buffer-deserialize-json.hh:107:12: error: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘const char’ [-Werror=sign-compare] if ( 9u <= ( (*( p))) && ( (*( p))) <= 13u ) { ~~~^~~~~~~~~~~~~ Switching to -T1 for now. It actually results in smaller code, at the expense of some binary searching instead of flat tables. In the not distant future, we might actually generate two different outputs and choose between depending on size-optimize options. Fixes https://github.com/harfbuzz/harfbuzz/issues/1708 --- src/Makefile.am | 2 +- src/hb-buffer-deserialize-json.hh | 401 ++- src/hb-buffer-deserialize-text.hh | 312 +- src/hb-ot-shape-complex-indic-machine.hh | 3409 +++++++++++++++----- src/hb-ot-shape-complex-khmer-machine.hh | 406 ++- src/hb-ot-shape-complex-myanmar-machine.hh | 750 +++-- src/hb-ot-shape-complex-use-machine.hh | 1019 ++++-- 7 files changed, 4675 insertions(+), 1624 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index fc772e0ac..81eefde15 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -303,7 +303,7 @@ EXTRA_DIST += \ # We decided to add ragel-generated files to git... #MAINTAINERCLEANFILES += $(RAGEL_GENERATED) $(srcdir)/%.hh: $(srcdir)/%.rl - $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \ + $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -T1 -o "$*.hh" "$*.rl") \ || ($(RM) "$@"; false) noinst_PROGRAMS = \ diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 8631d52e8..9ae5fdbdc 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -30,116 +30,69 @@ #include "hb.hh" -static const unsigned char _deserialize_json_trans_keys[] = { - 1u, 0u, 0u, 18u, 0u, 2u, 11u, 14u, - 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, - 6u, 7u, 0u, 19u, 0u, 19u, 0u, 19u, - 2u, 2u, 0u, 8u, 0u, 7u, 6u, 7u, - 0u, 19u, 0u, 19u, 15u, 15u, 2u, 2u, - 0u, 8u, 0u, 7u, 0u, 19u, 0u, 19u, - 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, - 6u, 7u, 0u, 19u, 0u, 19u, 2u, 2u, - 0u, 8u, 0u, 7u, 6u, 7u, 0u, 19u, - 0u, 19u, 2u, 2u, 0u, 8u, 0u, 7u, - 9u, 17u, 2u, 17u, 0u, 19u, 0u, 19u, - 0u, 10u, 0u, 18u, 1u, 0u, 0u +static const short _deserialize_json_key_offsets[] = { + 0, 0, 4, 8, 12, 14, 15, 19, + 26, 29, 34, 39, 46, 47, 51, 58, + 61, 66, 73, 74, 75, 79, 85, 90, + 97, 99, 100, 104, 111, 114, 119, 126, + 127, 131, 138, 141, 146, 153, 154, 158, + 165, 169, 179, 184, 191, 196, 200, 0 }; -static const char _deserialize_json_char_class[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 5, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 1, 1, 1, 1, 1, 1, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 1, 1, 10, 1, 5, 1, - 11, 9, 12, 13, 9, 9, 14, 9, - 9, 9, 9, 15, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 16, - 17, 9, 18, 1, 19, 0 +static const unsigned char _deserialize_json_trans_keys[] = { + 32u, 123u, 9u, 13u, 32u, 34u, 9u, 13u, + 97u, 99u, 100u, 103u, 120u, 121u, 34u, 32u, + 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, + 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, + 9u, 13u, 32u, 44u, 125u, 9u, 13u, 32u, + 44u, 125u, 9u, 13u, 48u, 57u, 34u, 32u, + 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, + 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, + 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, + 57u, 108u, 34u, 32u, 58u, 9u, 13u, 32u, + 48u, 9u, 13u, 49u, 57u, 32u, 44u, 125u, + 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, + 57u, 120u, 121u, 34u, 32u, 58u, 9u, 13u, + 32u, 45u, 48u, 9u, 13u, 49u, 57u, 48u, + 49u, 57u, 32u, 44u, 125u, 9u, 13u, 32u, + 44u, 125u, 9u, 13u, 48u, 57u, 34u, 32u, + 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, + 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, + 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, + 57u, 34u, 32u, 58u, 9u, 13u, 32u, 34u, + 48u, 9u, 13u, 49u, 57u, 65u, 90u, 97u, + 122u, 34u, 95u, 45u, 46u, 48u, 57u, 65u, + 90u, 97u, 122u, 32u, 44u, 125u, 9u, 13u, + 32u, 44u, 125u, 9u, 13u, 48u, 57u, 32u, + 44u, 93u, 9u, 13u, 32u, 123u, 9u, 13u, + 0u +}; + +static const char _deserialize_json_single_lengths[] = { + 0, 2, 2, 4, 2, 1, 2, 3, + 1, 3, 3, 3, 1, 2, 3, 1, + 3, 3, 1, 1, 2, 2, 3, 3, + 2, 1, 2, 3, 1, 3, 3, 1, + 2, 3, 1, 3, 3, 1, 2, 3, + 0, 2, 3, 3, 3, 2, 0, 0 +}; + +static const char _deserialize_json_range_lengths[] = { + 0, 1, 1, 0, 0, 0, 1, 2, + 1, 1, 1, 2, 0, 1, 2, 1, + 1, 2, 0, 0, 1, 2, 1, 2, + 0, 0, 1, 2, 1, 1, 2, 0, + 1, 2, 1, 1, 2, 0, 1, 2, + 2, 4, 1, 2, 1, 1, 0, 0 }; static const short _deserialize_json_index_offsets[] = { - 0, 0, 19, 22, 26, 28, 29, 38, - 46, 48, 68, 88, 108, 109, 118, 126, - 128, 148, 168, 169, 170, 179, 187, 207, - 227, 229, 230, 239, 247, 249, 269, 289, - 290, 299, 307, 309, 329, 349, 350, 359, - 367, 376, 392, 412, 432, 443, 462, 0 -}; - -static const char _deserialize_json_indicies[] = { - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 1, 4, 5, 6, - 7, 8, 9, 10, 11, 11, 1, 1, - 1, 1, 1, 1, 1, 12, 12, 1, - 1, 1, 13, 1, 14, 15, 16, 17, - 18, 1, 1, 19, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 20, 21, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 22, - 18, 1, 1, 19, 1, 1, 17, 17, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 20, 23, 23, 1, 1, - 1, 1, 1, 1, 1, 24, 24, 1, - 1, 1, 25, 1, 26, 27, 28, 29, - 30, 1, 1, 31, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 32, 30, 1, 1, 31, - 1, 1, 29, 29, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 32, - 33, 34, 34, 1, 1, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, - 1, 36, 37, 38, 1, 1, 39, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 40, 38, - 1, 1, 39, 1, 1, 41, 41, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 40, 42, 43, 44, 44, 1, - 1, 1, 1, 1, 1, 1, 45, 45, - 1, 1, 1, 46, 1, 47, 48, 49, - 50, 51, 1, 1, 52, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 53, 51, 1, 1, - 52, 1, 1, 50, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 53, 54, 54, 1, 1, 1, 1, 1, - 1, 1, 55, 55, 1, 1, 1, 56, - 1, 57, 58, 59, 60, 61, 1, 1, - 62, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 63, 61, 1, 1, 62, 1, 1, 60, - 60, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 63, 64, 64, 1, - 1, 1, 1, 1, 1, 1, 65, 65, - 1, 66, 1, 1, 1, 67, 68, 69, - 1, 69, 69, 69, 69, 69, 69, 69, - 70, 1, 71, 71, 71, 71, 1, 71, - 1, 71, 71, 71, 71, 71, 71, 71, - 72, 1, 1, 73, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 74, 72, 1, 1, 73, - 1, 1, 75, 75, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 74, - 76, 1, 1, 77, 1, 1, 1, 1, - 1, 1, 78, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 0 -}; - -static const char _deserialize_json_index_defaults[] = { - 0, 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, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0 + 0, 0, 4, 8, 13, 16, 18, 22, + 28, 31, 36, 41, 47, 49, 53, 59, + 62, 67, 73, 75, 77, 81, 86, 91, + 97, 100, 102, 106, 112, 115, 120, 126, + 128, 132, 138, 141, 146, 152, 154, 158, + 164, 167, 174, 179, 185, 190, 194, 0 }; static const char _deserialize_json_trans_cond_spaces[] = { @@ -152,43 +105,172 @@ static const char _deserialize_json_trans_cond_spaces[] = { -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, -1, 0 + -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, -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, -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, -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, + -1, -1, -1, 0 +}; + +static const short _deserialize_json_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0 +}; + +static const char _deserialize_json_trans_lengths[] = { + 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, 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, 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, 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, + 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, 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, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0 +}; + +static const char _deserialize_json_cond_keys[] = { + 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, 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, 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, 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, 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, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; static const char _deserialize_json_cond_targs[] = { - 1, 0, 2, 2, 3, 4, 18, 24, - 37, 5, 12, 6, 7, 8, 9, 11, - 9, 11, 10, 2, 44, 10, 44, 13, - 14, 15, 16, 17, 16, 17, 10, 2, - 44, 19, 20, 21, 22, 23, 10, 2, - 44, 23, 25, 31, 26, 27, 28, 29, - 30, 29, 30, 10, 2, 44, 32, 33, - 34, 35, 36, 35, 36, 10, 2, 44, - 38, 39, 40, 42, 43, 41, 10, 41, - 10, 2, 44, 43, 44, 45, 46, 0 + 1, 2, 1, 0, 2, 3, 2, 0, + 4, 18, 24, 37, 0, 5, 12, 0, + 6, 0, 6, 7, 6, 0, 7, 8, + 9, 7, 11, 0, 9, 11, 0, 10, + 2, 44, 10, 0, 10, 2, 44, 10, + 0, 10, 2, 44, 10, 11, 0, 13, + 0, 13, 14, 13, 0, 14, 15, 16, + 14, 17, 0, 16, 17, 0, 10, 2, + 44, 10, 0, 10, 2, 44, 10, 17, + 0, 19, 0, 20, 0, 20, 21, 20, + 0, 21, 22, 21, 23, 0, 10, 2, + 44, 10, 0, 10, 2, 44, 10, 23, + 0, 25, 31, 0, 26, 0, 26, 27, + 26, 0, 27, 28, 29, 27, 30, 0, + 29, 30, 0, 10, 2, 44, 10, 0, + 10, 2, 44, 10, 30, 0, 32, 0, + 32, 33, 32, 0, 33, 34, 35, 33, + 36, 0, 35, 36, 0, 10, 2, 44, + 10, 0, 10, 2, 44, 10, 36, 0, + 38, 0, 38, 39, 38, 0, 39, 40, + 42, 39, 43, 0, 41, 41, 0, 10, + 41, 41, 41, 41, 41, 0, 10, 2, + 44, 10, 0, 10, 2, 44, 10, 43, + 0, 44, 45, 46, 44, 0, 1, 2, + 1, 0, 0, 0 }; static const char _deserialize_json_cond_actions[] = { - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 2, - 0, 0, 3, 3, 4, 0, 5, 0, - 0, 2, 2, 2, 0, 0, 6, 6, - 7, 0, 0, 0, 2, 2, 8, 8, - 9, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 10, 10, 11, 0, 0, - 2, 2, 2, 0, 0, 12, 12, 13, - 0, 0, 0, 2, 2, 2, 14, 0, - 15, 15, 16, 0, 0, 0, 0, 0 + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 2, 0, 0, 0, 0, 3, + 3, 4, 3, 0, 0, 0, 5, 0, + 0, 3, 3, 4, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, + 0, 2, 0, 0, 0, 0, 6, 6, + 7, 6, 0, 6, 6, 7, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 2, 0, 8, 8, + 9, 8, 0, 8, 8, 9, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 2, 0, + 0, 0, 0, 10, 10, 11, 10, 0, + 10, 10, 11, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 12, 12, 13, + 12, 0, 12, 12, 13, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 0, 2, 2, 0, 14, + 0, 0, 0, 0, 0, 0, 15, 15, + 16, 15, 0, 15, 15, 16, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0 }; static const char _deserialize_json_eof_cond_spaces[] = { - -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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0 + -1, -1, 0 }; static const char _deserialize_json_eof_cond_key_offs[] = { @@ -271,28 +353,63 @@ hb_font_t *font) } { - unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + int _klen;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: { - _keys = ( _deserialize_json_trans_keys + ((cs<<1))); - _inds = ( _deserialize_json_indicies + (_deserialize_json_index_offsets[cs])); + _keys = ( _deserialize_json_trans_keys + (_deserialize_json_key_offsets[cs])); + _trans = (unsigned int)_deserialize_json_index_offsets[cs]; - if ( ( (*( p))) <= 125 && ( (*( p))) >= 9 ) - { - int _ic = (int)_deserialize_json_char_class[(int)( (*( p))) - 9]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_deserialize_json_index_defaults[cs]; - } - else { - _trans = (unsigned int)_deserialize_json_index_defaults[cs]; + _klen = (int)_deserialize_json_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_deserialize_json_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_deserialize_json_cond_targs[_trans]; diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index 28ab3f1cd..702943660 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -30,76 +30,54 @@ #include "hb.hh" +static const short _deserialize_text_key_offsets[] = { + 0, 0, 10, 14, 17, 21, 24, 27, + 31, 34, 35, 39, 42, 45, 53, 58, + 58, 68, 78, 84, 89, 96, 104, 111, + 117, 125, 134, 0 +}; + static const unsigned char _deserialize_text_trans_keys[] = { - 1u, 0u, 0u, 10u, 4u, 7u, 6u, 7u, - 4u, 7u, 6u, 7u, 6u, 7u, 4u, 7u, - 6u, 7u, 3u, 3u, 4u, 7u, 6u, 7u, - 3u, 7u, 0u, 12u, 0u, 12u, 1u, 0u, - 0u, 10u, 0u, 12u, 0u, 12u, 0u, 12u, - 0u, 12u, 0u, 12u, 0u, 12u, 0u, 12u, - 0u, 12u, 0u, 12u, 0u, 12u, 0u + 32u, 48u, 9u, 13u, 49u, 57u, 65u, 90u, + 97u, 122u, 45u, 48u, 49u, 57u, 48u, 49u, + 57u, 45u, 48u, 49u, 57u, 48u, 49u, 57u, + 48u, 49u, 57u, 45u, 48u, 49u, 57u, 48u, + 49u, 57u, 44u, 45u, 48u, 49u, 57u, 48u, + 49u, 57u, 44u, 48u, 57u, 32u, 43u, 61u, + 64u, 93u, 124u, 9u, 13u, 32u, 93u, 124u, + 9u, 13u, 32u, 48u, 9u, 13u, 49u, 57u, + 65u, 90u, 97u, 122u, 32u, 43u, 61u, 64u, + 93u, 124u, 9u, 13u, 48u, 57u, 32u, 44u, + 93u, 124u, 9u, 13u, 32u, 93u, 124u, 9u, + 13u, 32u, 93u, 124u, 9u, 13u, 48u, 57u, + 32u, 44u, 93u, 124u, 9u, 13u, 48u, 57u, + 32u, 43u, 64u, 93u, 124u, 9u, 13u, 32u, + 43u, 93u, 124u, 9u, 13u, 32u, 43u, 93u, + 124u, 9u, 13u, 48u, 57u, 32u, 43u, 64u, + 93u, 124u, 9u, 13u, 48u, 57u, 32u, 43u, + 61u, 64u, 93u, 95u, 124u, 9u, 13u, 45u, + 46u, 48u, 57u, 65u, 90u, 97u, 122u, 0u }; -static const char _deserialize_text_char_class[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 4, 5, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 1, 1, 8, 1, 1, 9, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 1, 1, 11, 1, 5, 1, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 1, 12, 0 +static const char _deserialize_text_single_lengths[] = { + 0, 2, 2, 1, 2, 1, 1, 2, + 1, 1, 2, 1, 1, 6, 3, 0, + 2, 6, 4, 3, 3, 4, 5, 4, + 4, 5, 7, 0 }; -static const short _deserialize_text_index_offsets[] = { - 0, 0, 11, 15, 17, 21, 23, 25, - 29, 31, 32, 36, 38, 43, 56, 69, - 69, 80, 93, 106, 119, 132, 145, 158, - 171, 184, 197, 0 +static const char _deserialize_text_range_lengths[] = { + 0, 4, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, + 4, 2, 1, 1, 2, 2, 1, 1, + 2, 2, 5, 0 }; -static const char _deserialize_text_indicies[] = { - 0, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 5, 1, 6, 7, 8, - 9, 10, 1, 11, 12, 13, 14, 15, - 16, 17, 1, 18, 19, 20, 21, 22, - 23, 1, 24, 25, 26, 27, 22, 1, - 1, 21, 21, 28, 1, 29, 1, 1, - 1, 1, 1, 30, 31, 1, 32, 33, - 34, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 35, 36, 0, 1, 1, - 1, 1, 1, 2, 3, 1, 1, 4, - 28, 1, 29, 1, 1, 1, 37, 37, - 30, 31, 1, 32, 33, 38, 1, 1, - 39, 1, 1, 1, 1, 1, 1, 1, - 40, 41, 42, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 43, 44, 42, - 1, 1, 1, 1, 1, 14, 14, 1, - 1, 1, 43, 44, 38, 1, 1, 39, - 1, 1, 9, 9, 1, 1, 1, 40, - 41, 45, 1, 46, 1, 1, 1, 1, - 1, 1, 47, 1, 48, 49, 50, 1, - 51, 1, 1, 1, 1, 1, 1, 1, - 1, 52, 53, 50, 1, 51, 1, 1, - 1, 27, 27, 1, 1, 1, 52, 53, - 45, 1, 46, 1, 1, 1, 54, 54, - 1, 47, 1, 48, 49, 28, 1, 29, - 1, 55, 55, 55, 55, 30, 31, 55, - 32, 33, 0 -}; - -static const char _deserialize_text_index_defaults[] = { - 0, 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 +static const char _deserialize_text_index_offsets[] = { + 0, 0, 7, 11, 14, 18, 21, 24, + 28, 31, 33, 37, 40, 43, 51, 56, + 57, 64, 73, 79, 84, 90, 97, 104, + 110, 117, 125, 0 }; static const char _deserialize_text_trans_cond_spaces[] = { @@ -110,36 +88,136 @@ static const char _deserialize_text_trans_cond_spaces[] = { -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 + -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, -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0 +}; + +static const short _deserialize_text_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 0 +}; + +static const char _deserialize_text_trans_lengths[] = { + 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, 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, 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, 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, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0 +}; + +static const char _deserialize_text_cond_keys[] = { + 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, 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, 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, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; static const char _deserialize_text_cond_targs[] = { - 1, 0, 13, 17, 26, 3, 18, 21, - 18, 21, 5, 19, 20, 19, 20, 22, - 25, 8, 9, 12, 9, 12, 10, 11, - 23, 24, 23, 24, 14, 2, 6, 7, - 15, 16, 14, 15, 16, 17, 14, 4, - 15, 16, 14, 15, 16, 14, 2, 7, - 15, 16, 14, 2, 15, 16, 25, 26, - 0 + 1, 13, 1, 17, 26, 26, 0, 3, + 18, 21, 0, 18, 21, 0, 5, 19, + 20, 0, 19, 20, 0, 22, 25, 0, + 8, 9, 12, 0, 9, 12, 0, 10, + 0, 11, 23, 24, 0, 23, 24, 0, + 10, 12, 0, 14, 2, 6, 7, 15, + 16, 14, 0, 14, 15, 16, 14, 0, + 0, 1, 13, 1, 17, 26, 26, 0, + 14, 2, 6, 7, 15, 16, 14, 17, + 0, 14, 4, 15, 16, 14, 0, 14, + 15, 16, 14, 0, 14, 15, 16, 14, + 20, 0, 14, 4, 15, 16, 14, 21, + 0, 14, 2, 7, 15, 16, 14, 0, + 14, 2, 15, 16, 14, 0, 14, 2, + 15, 16, 14, 24, 0, 14, 2, 7, + 15, 16, 14, 25, 0, 14, 2, 6, + 7, 15, 26, 16, 14, 26, 26, 26, + 26, 0, 0 }; static const char _deserialize_text_cond_actions[] = { - 0, 0, 1, 1, 1, 2, 2, 2, - 0, 0, 2, 2, 2, 0, 0, 2, - 2, 2, 2, 2, 0, 0, 3, 2, - 2, 2, 0, 0, 4, 5, 5, 5, - 4, 4, 0, 0, 0, 0, 6, 7, - 6, 6, 8, 8, 8, 9, 10, 10, - 9, 9, 11, 12, 11, 11, 0, 0, - 0 + 0, 1, 0, 1, 1, 1, 0, 2, + 2, 2, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 0, 0, 3, + 0, 2, 2, 2, 0, 0, 0, 0, + 3, 0, 0, 4, 5, 5, 5, 4, + 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 1, 1, 0, + 4, 5, 5, 5, 4, 4, 4, 0, + 0, 6, 7, 6, 6, 6, 0, 8, + 8, 8, 8, 0, 8, 8, 8, 8, + 0, 0, 6, 7, 6, 6, 6, 0, + 0, 9, 10, 10, 9, 9, 9, 0, + 11, 12, 11, 11, 11, 0, 11, 12, + 11, 11, 11, 0, 0, 9, 10, 10, + 9, 9, 9, 0, 0, 4, 5, 5, + 5, 4, 0, 4, 4, 0, 0, 0, + 0, 0, 0 +}; + +static const char _deserialize_text_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 4, 6, 8, 8, 6, 9, 11, + 11, 9, 4, 0 }; static const char _deserialize_text_eof_cond_spaces[] = { + -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, - -1, -1, -1, 0 + -1, -1, -1, -1, -1, 0 }; static const char _deserialize_text_eof_cond_key_offs[] = { @@ -160,13 +238,6 @@ static const char _deserialize_text_eof_cond_keys[] = { 0 }; -static const char _deserialize_text_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 4, 6, 8, 8, 6, 9, 11, - 11, 9, 4, 0 -}; - static const char _deserialize_text_nfa_targs[] = { 0, 0 }; @@ -224,28 +295,63 @@ hb_font_t *font) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: { - _keys = ( _deserialize_text_trans_keys + ((cs<<1))); - _inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs])); + _keys = ( _deserialize_text_trans_keys + (_deserialize_text_key_offsets[cs])); + _trans = (unsigned int)_deserialize_text_index_offsets[cs]; - if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) - { - int _ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_deserialize_text_index_defaults[cs]; - } - else { - _trans = (unsigned int)_deserialize_text_index_defaults[cs]; + _klen = (int)_deserialize_text_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_deserialize_text_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_deserialize_text_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index dbab7e042..8474d4b9a 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -30,663 +30,489 @@ #include "hb.hh" -static const unsigned char _indic_syllable_machine_trans_keys[] = { - 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 7u, 7u, 3u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 7u, 7u, 3u, 7u, 4u, 6u, - 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 12u, 3u, 7u, - 3u, 12u, 3u, 7u, 3u, 12u, 3u, 7u, - 3u, 12u, 3u, 7u, 3u, 12u, 3u, 12u, - 4u, 7u, 7u, 7u, 0u, 17u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 4u, 9u, 4u, 9u, - 4u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, - 4u, 9u, 2u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 3u, 9u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 3u, 7u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 4u, 9u, 4u, 9u, 4u, 9u, - 9u, 9u, 9u, 9u, 9u, 9u, 4u, 9u, - 2u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 3u, 9u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 3u, 12u, 2u, 15u, - 3u, 7u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 0u, 15u, 2u, 15u, - 0u, 15u, 3u, 12u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, - 2u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, - 0u +static const short _indic_syllable_machine_key_offsets[] = { + 0, 1, 6, 9, 10, 14, 17, 18, + 22, 25, 26, 30, 33, 34, 36, 37, + 38, 43, 44, 45, 50, 51, 52, 57, + 58, 59, 65, 70, 76, 81, 87, 92, + 98, 103, 109, 110, 115, 118, 119, 123, + 126, 127, 131, 134, 135, 139, 142, 143, + 145, 146, 147, 152, 153, 154, 159, 160, + 161, 166, 167, 168, 174, 179, 185, 190, + 196, 201, 207, 212, 218, 219, 224, 227, + 228, 232, 235, 236, 240, 243, 244, 248, + 251, 252, 254, 255, 256, 261, 262, 263, + 268, 269, 270, 275, 276, 277, 283, 288, + 294, 299, 305, 310, 316, 321, 322, 327, + 330, 331, 335, 338, 339, 343, 346, 347, + 351, 354, 355, 357, 358, 359, 364, 365, + 366, 371, 372, 373, 378, 379, 380, 386, + 391, 397, 402, 408, 413, 419, 424, 430, + 436, 440, 441, 458, 467, 475, 482, 488, + 497, 505, 512, 518, 527, 535, 542, 548, + 557, 565, 572, 578, 587, 595, 602, 606, + 610, 613, 614, 615, 616, 618, 623, 627, + 634, 640, 645, 652, 658, 663, 670, 676, + 681, 687, 692, 698, 706, 715, 722, 728, + 734, 742, 751, 758, 764, 770, 778, 787, + 794, 800, 806, 814, 823, 830, 836, 842, + 850, 859, 868, 876, 883, 889, 898, 906, + 913, 919, 928, 936, 943, 949, 958, 966, + 973, 979, 988, 996, 1003, 1007, 1011, 1014, + 1015, 1016, 1017, 1019, 1024, 1028, 1035, 1041, + 1046, 1053, 1059, 1064, 1071, 1077, 1082, 1088, + 1093, 1099, 1107, 1116, 1123, 1129, 1135, 1143, + 1152, 1159, 1165, 1171, 1179, 1188, 1195, 1201, + 1207, 1215, 1224, 1231, 1237, 1243, 1248, 1256, + 1264, 1271, 1277, 1286, 1294, 1301, 1307, 1316, + 1324, 1331, 1337, 1346, 1354, 1361, 1367, 1376, + 1384, 1391, 1395, 1399, 1402, 1403, 1404, 1405, + 1407, 1412, 1416, 1423, 1429, 1434, 1441, 1447, + 1452, 1459, 1465, 1470, 1476, 1481, 1487, 1495, + 1504, 1511, 1517, 1523, 1531, 1540, 1547, 1553, + 1559, 1567, 1576, 1583, 1589, 1595, 1603, 1612, + 1619, 1625, 1631, 1637, 1645, 1650, 1659, 1667, + 1674, 1680, 1689, 1697, 1704, 1710, 1719, 1727, + 1734, 1740, 1749, 1757, 1764, 1770, 1779, 1787, + 1794, 1798, 1802, 1805, 1806, 1807, 1808, 1810, + 1815, 1819, 1826, 1832, 1837, 1844, 1850, 1855, + 1862, 1868, 1873, 1879, 1884, 1890, 1898, 1907, + 1914, 1920, 1926, 1934, 1943, 1950, 1956, 1962, + 1970, 1979, 1986, 1992, 1998, 2006, 2015, 2022, + 2028, 2034, 2042, 2056, 2065, 2078, 2085, 2088, + 2089, 2090, 2091, 2093, 2102, 2107, 2111, 2114, + 2115, 2116, 2117, 2119, 0 }; -static const char _indic_syllable_machine_char_class[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 8, 13, 14, - 15, 16, 17, 0 +static const unsigned char _indic_syllable_machine_trans_keys[] = { + 8u, 4u, 7u, 8u, 5u, 6u, 7u, 5u, + 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, + 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, + 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, + 6u, 7u, 4u, 8u, 6u, 16u, 4u, 7u, + 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, + 5u, 6u, 6u, 16u, 4u, 7u, 8u, 5u, + 6u, 6u, 16u, 4u, 7u, 8u, 13u, 5u, + 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, + 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, + 6u, 4u, 7u, 8u, 13u, 5u, 6u, 4u, + 7u, 8u, 5u, 6u, 4u, 7u, 8u, 13u, + 5u, 6u, 4u, 7u, 8u, 5u, 6u, 4u, + 7u, 8u, 13u, 5u, 6u, 8u, 4u, 7u, + 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, + 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, + 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, + 8u, 5u, 6u, 7u, 5u, 6u, 7u, 4u, + 8u, 6u, 16u, 4u, 7u, 8u, 5u, 6u, + 6u, 16u, 4u, 7u, 8u, 5u, 6u, 6u, + 16u, 4u, 7u, 8u, 5u, 6u, 6u, 16u, + 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, + 8u, 5u, 6u, 4u, 7u, 8u, 13u, 5u, + 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, + 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, + 6u, 4u, 7u, 8u, 13u, 5u, 6u, 4u, + 7u, 8u, 5u, 6u, 4u, 7u, 8u, 13u, + 5u, 6u, 8u, 4u, 7u, 8u, 5u, 6u, + 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, + 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, + 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, + 7u, 5u, 6u, 7u, 4u, 8u, 6u, 16u, + 4u, 7u, 8u, 5u, 6u, 6u, 16u, 4u, + 7u, 8u, 5u, 6u, 6u, 16u, 4u, 7u, + 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, + 13u, 5u, 6u, 4u, 7u, 8u, 5u, 6u, + 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, + 8u, 5u, 6u, 4u, 7u, 8u, 13u, 5u, + 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, + 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, + 6u, 8u, 4u, 7u, 8u, 5u, 6u, 7u, + 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, + 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, + 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, + 5u, 6u, 7u, 4u, 8u, 6u, 16u, 4u, + 7u, 8u, 5u, 6u, 6u, 16u, 4u, 7u, + 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, + 5u, 6u, 6u, 16u, 4u, 7u, 8u, 13u, + 5u, 6u, 4u, 7u, 8u, 5u, 6u, 4u, + 7u, 8u, 13u, 5u, 6u, 4u, 7u, 8u, + 5u, 6u, 4u, 7u, 8u, 13u, 5u, 6u, + 4u, 7u, 8u, 5u, 6u, 4u, 7u, 8u, + 13u, 5u, 6u, 4u, 7u, 8u, 5u, 6u, + 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, + 8u, 13u, 5u, 6u, 7u, 8u, 5u, 6u, + 8u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 15u, 16u, 17u, 18u, 19u, + 11u, 12u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 1u, 5u, 6u, 8u, 10u, 16u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, + 17u, 3u, 4u, 7u, 8u, 10u, 17u, 5u, + 6u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 1u, 5u, + 6u, 8u, 10u, 16u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 13u, 17u, 3u, 4u, 7u, + 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, + 10u, 17u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 5u, 6u, 8u, 10u, 8u, 10u, + 5u, 6u, 5u, 8u, 10u, 10u, 10u, 10u, + 5u, 10u, 3u, 8u, 10u, 5u, 6u, 5u, + 6u, 8u, 10u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 4u, 5u, 6u, 7u, 8u, 10u, + 7u, 8u, 10u, 5u, 6u, 3u, 4u, 5u, + 6u, 7u, 8u, 10u, 4u, 5u, 6u, 7u, + 8u, 10u, 7u, 8u, 10u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 4u, 5u, + 6u, 7u, 8u, 10u, 7u, 8u, 10u, 5u, + 6u, 3u, 4u, 5u, 6u, 8u, 10u, 4u, + 5u, 6u, 8u, 10u, 4u, 7u, 8u, 10u, + 5u, 6u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, + 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, + 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, + 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, + 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, + 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, + 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 17u, 4u, 5u, 6u, 7u, + 8u, 10u, 17u, 1u, 5u, 6u, 8u, 10u, + 16u, 3u, 4u, 5u, 6u, 7u, 8u, 10u, + 13u, 17u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 4u, 7u, 8u, 10u, 17u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 1u, + 5u, 6u, 8u, 10u, 16u, 3u, 4u, 5u, + 6u, 7u, 8u, 10u, 13u, 17u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 4u, 7u, + 8u, 10u, 17u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 3u, 4u, 7u, 8u, + 10u, 17u, 5u, 6u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 5u, 6u, 8u, 10u, 8u, + 10u, 5u, 6u, 5u, 8u, 10u, 10u, 10u, + 10u, 5u, 10u, 3u, 8u, 10u, 5u, 6u, + 5u, 6u, 8u, 10u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 4u, 5u, 6u, 7u, 8u, + 10u, 7u, 8u, 10u, 5u, 6u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 4u, 5u, 6u, + 7u, 8u, 10u, 7u, 8u, 10u, 5u, 6u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 4u, + 5u, 6u, 7u, 8u, 10u, 7u, 8u, 10u, + 5u, 6u, 3u, 4u, 5u, 6u, 8u, 10u, + 4u, 5u, 6u, 8u, 10u, 4u, 7u, 8u, + 10u, 5u, 6u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, + 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, + 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, + 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, + 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 4u, 7u, 8u, 5u, 6u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 17u, + 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 1u, + 5u, 6u, 8u, 10u, 16u, 3u, 4u, 5u, + 6u, 7u, 8u, 10u, 13u, 17u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 4u, 7u, + 8u, 10u, 17u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 3u, 4u, 7u, 8u, + 10u, 17u, 5u, 6u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 1u, 5u, 6u, 8u, 10u, + 16u, 3u, 4u, 5u, 6u, 7u, 8u, 10u, + 13u, 17u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 4u, 7u, 8u, 10u, 17u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 5u, + 6u, 8u, 10u, 8u, 10u, 5u, 6u, 5u, + 8u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, + 8u, 10u, 5u, 6u, 5u, 6u, 8u, 10u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 4u, + 5u, 6u, 7u, 8u, 10u, 7u, 8u, 10u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 4u, 5u, 6u, 7u, 8u, 10u, 7u, + 8u, 10u, 5u, 6u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 4u, 5u, 6u, 7u, 8u, + 10u, 7u, 8u, 10u, 5u, 6u, 3u, 4u, + 5u, 6u, 8u, 10u, 4u, 5u, 6u, 8u, + 10u, 4u, 7u, 8u, 10u, 5u, 6u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, + 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, + 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, + 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, + 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, + 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, + 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, + 6u, 1u, 5u, 6u, 8u, 10u, 16u, 4u, + 7u, 8u, 13u, 5u, 6u, 3u, 4u, 7u, + 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 1u, 5u, 6u, 8u, 10u, 16u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, + 17u, 3u, 4u, 7u, 8u, 10u, 17u, 5u, + 6u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 3u, + 4u, 7u, 8u, 10u, 17u, 5u, 6u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 1u, 5u, + 6u, 8u, 10u, 16u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 13u, 17u, 3u, 4u, 7u, + 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, + 10u, 17u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, + 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 5u, 6u, 8u, 10u, 8u, 10u, + 5u, 6u, 5u, 8u, 10u, 10u, 10u, 10u, + 5u, 10u, 3u, 8u, 10u, 5u, 6u, 5u, + 6u, 8u, 10u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 4u, 5u, 6u, 7u, 8u, 10u, + 7u, 8u, 10u, 5u, 6u, 3u, 4u, 5u, + 6u, 7u, 8u, 10u, 4u, 5u, 6u, 7u, + 8u, 10u, 7u, 8u, 10u, 5u, 6u, 3u, + 4u, 5u, 6u, 7u, 8u, 10u, 4u, 5u, + 6u, 7u, 8u, 10u, 7u, 8u, 10u, 5u, + 6u, 3u, 4u, 5u, 6u, 8u, 10u, 4u, + 5u, 6u, 8u, 10u, 4u, 7u, 8u, 10u, + 5u, 6u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, + 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, + 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, + 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, + 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, + 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, + 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, + 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, + 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, + 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, + 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, + 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, + 5u, 6u, 1u, 2u, 3u, 4u, 5u, 6u, + 7u, 8u, 10u, 13u, 16u, 17u, 11u, 12u, + 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, + 17u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, + 8u, 10u, 12u, 13u, 16u, 17u, 4u, 7u, + 8u, 10u, 13u, 5u, 6u, 5u, 8u, 10u, + 10u, 10u, 10u, 5u, 10u, 1u, 3u, 4u, + 7u, 8u, 10u, 16u, 5u, 6u, 3u, 8u, + 10u, 5u, 6u, 8u, 10u, 5u, 6u, 5u, + 8u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, + 11u, 16u, 0u +}; + +static const char _indic_syllable_machine_single_lengths[] = { + 1, 3, 1, 1, 2, 1, 1, 2, + 1, 1, 2, 1, 1, 2, 1, 1, + 3, 1, 1, 3, 1, 1, 3, 1, + 1, 4, 3, 4, 3, 4, 3, 4, + 3, 4, 1, 3, 1, 1, 2, 1, + 1, 2, 1, 1, 2, 1, 1, 2, + 1, 1, 3, 1, 1, 3, 1, 1, + 3, 1, 1, 4, 3, 4, 3, 4, + 3, 4, 3, 4, 1, 3, 1, 1, + 2, 1, 1, 2, 1, 1, 2, 1, + 1, 2, 1, 1, 3, 1, 1, 3, + 1, 1, 3, 1, 1, 4, 3, 4, + 3, 4, 3, 4, 3, 1, 3, 1, + 1, 2, 1, 1, 2, 1, 1, 2, + 1, 1, 2, 1, 1, 3, 1, 1, + 3, 1, 1, 3, 1, 1, 4, 3, + 4, 3, 4, 3, 4, 3, 4, 4, + 2, 1, 15, 9, 6, 5, 6, 9, + 6, 5, 6, 9, 6, 5, 6, 9, + 6, 5, 6, 9, 6, 5, 4, 2, + 3, 1, 1, 1, 2, 3, 4, 7, + 6, 3, 7, 6, 3, 7, 6, 3, + 6, 5, 4, 6, 9, 5, 4, 6, + 6, 9, 5, 4, 6, 6, 9, 5, + 4, 6, 6, 9, 5, 4, 6, 6, + 9, 9, 8, 7, 6, 9, 6, 5, + 6, 9, 6, 5, 6, 9, 6, 5, + 6, 9, 6, 5, 4, 2, 3, 1, + 1, 1, 2, 3, 4, 7, 6, 3, + 7, 6, 3, 7, 6, 3, 6, 5, + 4, 6, 9, 5, 4, 6, 6, 9, + 5, 4, 6, 6, 9, 5, 4, 6, + 6, 9, 5, 4, 6, 3, 8, 6, + 5, 6, 9, 6, 5, 6, 9, 6, + 5, 6, 9, 6, 5, 6, 9, 6, + 5, 4, 2, 3, 1, 1, 1, 2, + 3, 4, 7, 6, 3, 7, 6, 3, + 7, 6, 3, 6, 5, 4, 6, 9, + 5, 4, 6, 6, 9, 5, 4, 6, + 6, 9, 5, 4, 6, 6, 9, 5, + 4, 6, 4, 6, 3, 9, 6, 5, + 6, 9, 6, 5, 6, 9, 6, 5, + 6, 9, 6, 5, 6, 9, 6, 5, + 4, 2, 3, 1, 1, 1, 2, 3, + 4, 7, 6, 3, 7, 6, 3, 7, + 6, 3, 6, 5, 4, 6, 9, 5, + 4, 6, 6, 9, 5, 4, 6, 6, + 9, 5, 4, 6, 6, 9, 5, 4, + 6, 6, 12, 9, 13, 5, 3, 1, + 1, 1, 2, 7, 3, 2, 3, 1, + 1, 1, 2, 3, 0 +}; + +static const char _indic_syllable_machine_range_lengths[] = { + 0, 1, 1, 0, 1, 1, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, + 0, 1, 1, 0, 1, 1, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 0, + 1, 1, 0, 1, 1, 0, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 1, 0, 1, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 0, 1, 0, + 1, 1, 0, 1, 0, 1, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 1, + 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, + 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 1, 0, 1, + 1, 0, 1, 0, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 0, 1, 1, + 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 1, 6, 9, 10, 14, 17, 18, - 22, 25, 26, 30, 33, 34, 39, 40, - 41, 46, 47, 48, 53, 54, 55, 60, - 61, 62, 72, 77, 87, 92, 102, 107, - 117, 122, 132, 133, 138, 141, 142, 146, - 149, 150, 154, 157, 158, 162, 165, 166, - 171, 172, 173, 178, 179, 180, 185, 186, - 187, 192, 193, 194, 204, 209, 219, 224, - 234, 239, 249, 254, 264, 265, 270, 273, - 274, 278, 281, 282, 286, 289, 290, 294, - 297, 298, 303, 304, 305, 310, 311, 312, - 317, 318, 319, 324, 325, 326, 336, 341, - 351, 356, 366, 371, 381, 386, 387, 392, - 395, 396, 400, 403, 404, 408, 411, 412, - 416, 419, 420, 425, 426, 427, 432, 433, - 434, 439, 440, 441, 446, 447, 448, 458, - 463, 473, 478, 488, 493, 503, 508, 518, - 528, 532, 533, 551, 565, 579, 592, 607, - 621, 635, 648, 663, 677, 691, 704, 719, - 733, 747, 760, 775, 789, 803, 816, 822, - 828, 834, 835, 836, 837, 843, 851, 857, - 865, 872, 878, 886, 893, 899, 907, 914, - 920, 928, 935, 942, 956, 970, 985, 1000, - 1015, 1029, 1043, 1058, 1073, 1088, 1102, 1116, - 1131, 1146, 1161, 1175, 1189, 1204, 1219, 1234, - 1248, 1262, 1276, 1290, 1303, 1318, 1332, 1346, - 1359, 1374, 1388, 1402, 1415, 1430, 1444, 1458, - 1471, 1486, 1500, 1514, 1527, 1533, 1539, 1545, - 1546, 1547, 1548, 1554, 1562, 1568, 1576, 1583, - 1589, 1597, 1604, 1610, 1618, 1625, 1631, 1639, - 1646, 1653, 1667, 1681, 1696, 1711, 1726, 1740, - 1754, 1769, 1784, 1799, 1813, 1827, 1842, 1857, - 1872, 1886, 1900, 1915, 1930, 1945, 1950, 1964, - 1978, 1991, 2006, 2020, 2034, 2047, 2062, 2076, - 2090, 2103, 2118, 2132, 2146, 2159, 2174, 2188, - 2202, 2215, 2221, 2227, 2233, 2234, 2235, 2236, - 2242, 2250, 2256, 2264, 2271, 2277, 2285, 2292, - 2298, 2306, 2313, 2319, 2327, 2334, 2341, 2355, - 2369, 2384, 2399, 2414, 2428, 2442, 2457, 2472, - 2487, 2501, 2515, 2530, 2545, 2560, 2574, 2588, - 2603, 2618, 2633, 2643, 2657, 2662, 2676, 2690, - 2703, 2718, 2732, 2746, 2759, 2774, 2788, 2802, - 2815, 2830, 2844, 2858, 2871, 2886, 2900, 2914, - 2927, 2933, 2939, 2945, 2946, 2947, 2948, 2954, - 2962, 2968, 2976, 2983, 2989, 2997, 3004, 3010, - 3018, 3025, 3031, 3039, 3046, 3053, 3067, 3081, - 3096, 3111, 3126, 3140, 3154, 3169, 3184, 3199, - 3213, 3227, 3242, 3257, 3272, 3286, 3300, 3315, - 3330, 3345, 3359, 3375, 3389, 3405, 3415, 3421, - 3422, 3423, 3424, 3430, 3445, 3453, 3459, 3465, - 3466, 3467, 3468, 3474, 0 -}; - -static const short _indic_syllable_machine_indicies[] = { - 1, 2, 3, 3, 4, 1, 5, 5, - 4, 4, 6, 6, 7, 1, 8, 8, - 7, 7, 9, 9, 10, 1, 11, 11, - 10, 10, 12, 12, 13, 1, 14, 14, - 13, 13, 15, 0, 0, 0, 1, 16, - 17, 18, 12, 12, 13, 1, 19, 20, - 21, 9, 9, 10, 1, 22, 23, 24, - 6, 6, 7, 1, 25, 26, 2, 3, - 3, 4, 1, 0, 0, 0, 0, 27, - 28, 3, 3, 4, 1, 28, 3, 3, - 4, 1, 0, 0, 0, 0, 29, 30, - 3, 3, 4, 1, 30, 3, 3, 4, - 1, 0, 0, 0, 0, 31, 32, 3, - 3, 4, 1, 32, 3, 3, 4, 1, - 0, 0, 0, 0, 33, 34, 3, 3, - 4, 1, 34, 3, 3, 4, 1, 0, - 0, 0, 0, 35, 37, 38, 39, 39, - 40, 37, 41, 41, 40, 40, 42, 42, - 43, 37, 44, 44, 43, 43, 45, 45, - 46, 37, 47, 47, 46, 46, 48, 48, - 49, 37, 50, 50, 49, 49, 51, 36, - 36, 36, 37, 52, 53, 54, 48, 48, - 49, 37, 55, 56, 57, 45, 45, 46, - 37, 58, 59, 60, 42, 42, 43, 37, - 61, 62, 38, 39, 39, 40, 37, 36, - 36, 36, 36, 63, 64, 39, 39, 40, - 37, 64, 39, 39, 40, 37, 36, 36, - 36, 36, 65, 66, 39, 39, 40, 37, - 66, 39, 39, 40, 37, 36, 36, 36, - 36, 67, 68, 39, 39, 40, 37, 68, - 39, 39, 40, 37, 36, 36, 36, 36, - 69, 70, 39, 39, 40, 37, 70, 39, - 39, 40, 37, 36, 36, 36, 36, 71, - 73, 74, 75, 75, 76, 73, 78, 78, - 76, 76, 79, 79, 80, 73, 81, 81, - 80, 80, 82, 82, 83, 73, 84, 84, - 83, 83, 85, 85, 86, 73, 87, 87, - 86, 86, 88, 72, 72, 72, 73, 89, - 90, 91, 85, 85, 86, 73, 92, 93, - 94, 82, 82, 83, 73, 95, 96, 97, - 79, 79, 80, 73, 98, 99, 74, 75, - 75, 76, 73, 72, 72, 72, 72, 100, - 101, 75, 75, 76, 73, 101, 75, 75, - 76, 73, 72, 72, 72, 72, 102, 103, - 75, 75, 76, 73, 103, 75, 75, 76, - 73, 72, 72, 72, 72, 104, 105, 75, - 75, 76, 73, 105, 75, 75, 76, 73, - 72, 72, 72, 72, 106, 107, 75, 75, - 76, 73, 109, 110, 111, 111, 112, 109, - 113, 113, 112, 112, 114, 114, 115, 109, - 116, 116, 115, 115, 117, 117, 118, 109, - 119, 119, 118, 118, 120, 120, 121, 109, - 122, 122, 121, 121, 123, 108, 108, 108, - 109, 124, 125, 126, 120, 120, 121, 109, - 127, 128, 129, 117, 117, 118, 109, 130, - 131, 132, 114, 114, 115, 109, 133, 134, - 110, 111, 111, 112, 109, 108, 108, 108, - 108, 135, 136, 111, 111, 112, 109, 136, - 111, 111, 112, 109, 108, 108, 108, 108, - 137, 138, 111, 111, 112, 109, 138, 111, - 111, 112, 109, 108, 108, 108, 108, 139, - 140, 111, 111, 112, 109, 140, 111, 111, - 112, 109, 108, 108, 108, 108, 141, 142, - 111, 111, 112, 109, 142, 111, 111, 112, - 109, 108, 108, 108, 108, 143, 107, 75, - 75, 76, 73, 72, 72, 72, 72, 144, - 78, 78, 76, 1, 146, 148, 149, 150, - 151, 152, 153, 76, 73, 147, 154, 155, - 155, 144, 156, 157, 158, 159, 160, 162, - 163, 164, 165, 4, 1, 161, 166, 161, - 161, 35, 161, 161, 167, 168, 163, 169, - 169, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 170, 161, 161, 161, 17, 171, 161, 1, - 161, 166, 161, 161, 161, 161, 170, 172, - 173, 174, 175, 4, 1, 161, 166, 161, - 161, 33, 161, 161, 167, 176, 173, 177, - 177, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 173, 177, 177, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 178, 161, 161, 161, 17, 179, 161, 1, - 161, 166, 161, 161, 161, 161, 178, 180, - 181, 182, 183, 4, 1, 161, 166, 161, - 161, 31, 161, 161, 167, 184, 181, 185, - 185, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 181, 185, 185, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 186, 161, 161, 161, 17, 187, 161, 1, - 161, 166, 161, 161, 161, 161, 186, 188, - 189, 190, 191, 4, 1, 161, 166, 161, - 161, 29, 161, 161, 167, 192, 189, 193, - 193, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 189, 193, 193, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 194, 161, 161, 161, 17, 195, 161, 1, - 161, 166, 161, 161, 161, 161, 194, 196, - 197, 198, 199, 4, 1, 161, 166, 161, - 161, 27, 161, 161, 167, 200, 197, 201, - 201, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 197, 201, 201, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 17, 202, 161, 1, 161, 166, 203, 203, - 161, 1, 161, 166, 204, 161, 161, 205, - 161, 166, 166, 206, 207, 204, 161, 161, - 161, 161, 166, 17, 161, 203, 203, 161, - 1, 161, 166, 203, 202, 161, 1, 161, - 166, 208, 26, 209, 210, 7, 1, 161, - 166, 26, 209, 210, 7, 1, 161, 166, - 209, 209, 7, 1, 161, 166, 211, 23, - 212, 213, 10, 1, 161, 166, 23, 212, - 213, 10, 1, 161, 166, 212, 212, 10, - 1, 161, 166, 214, 20, 215, 216, 13, - 1, 161, 166, 20, 215, 216, 13, 1, - 161, 166, 215, 215, 13, 1, 161, 166, - 217, 17, 203, 218, 161, 1, 161, 166, - 17, 203, 218, 161, 1, 161, 166, 197, - 201, 201, 4, 1, 161, 166, 196, 197, - 201, 201, 4, 1, 161, 166, 161, 161, - 161, 161, 161, 167, 196, 197, 198, 201, - 4, 1, 161, 166, 161, 161, 27, 161, - 161, 167, 194, 161, 219, 161, 203, 203, - 161, 1, 161, 166, 161, 161, 161, 161, - 194, 194, 161, 161, 161, 203, 203, 161, - 1, 161, 166, 161, 161, 161, 161, 194, - 194, 161, 161, 161, 203, 195, 161, 1, - 161, 166, 161, 161, 161, 161, 194, 188, - 189, 193, 193, 4, 1, 161, 166, 161, - 161, 161, 161, 161, 167, 188, 189, 190, - 193, 4, 1, 161, 166, 161, 161, 29, - 161, 161, 167, 186, 161, 220, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 186, 186, 161, 161, 161, 203, 203, - 161, 1, 161, 166, 161, 161, 161, 161, - 186, 186, 161, 161, 161, 203, 187, 161, - 1, 161, 166, 161, 161, 161, 161, 186, - 180, 181, 185, 185, 4, 1, 161, 166, - 161, 161, 161, 161, 161, 167, 180, 181, - 182, 185, 4, 1, 161, 166, 161, 161, - 31, 161, 161, 167, 178, 161, 221, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 178, 178, 161, 161, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 178, 178, 161, 161, 161, 203, 179, - 161, 1, 161, 166, 161, 161, 161, 161, - 178, 172, 173, 177, 177, 4, 1, 161, - 166, 161, 161, 161, 161, 161, 167, 172, - 173, 174, 177, 4, 1, 161, 166, 161, - 161, 33, 161, 161, 167, 170, 161, 222, - 161, 203, 203, 161, 1, 161, 166, 161, - 161, 161, 161, 170, 170, 161, 161, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 170, 170, 161, 161, 161, 203, - 171, 161, 1, 161, 166, 161, 161, 161, - 161, 170, 162, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 162, 163, 164, 169, 4, 1, 161, 166, - 161, 161, 35, 161, 161, 167, 224, 225, - 226, 227, 40, 37, 223, 228, 223, 223, - 71, 223, 223, 229, 230, 225, 231, 227, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 225, 231, 227, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 232, - 223, 223, 223, 53, 233, 223, 37, 223, - 228, 223, 223, 223, 223, 232, 234, 235, - 236, 237, 40, 37, 223, 228, 223, 223, - 69, 223, 223, 229, 238, 235, 239, 239, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 235, 239, 239, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 240, - 223, 223, 223, 53, 241, 223, 37, 223, - 228, 223, 223, 223, 223, 240, 242, 243, - 244, 245, 40, 37, 223, 228, 223, 223, - 67, 223, 223, 229, 246, 243, 247, 247, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 248, - 223, 223, 223, 53, 249, 223, 37, 223, - 228, 223, 223, 223, 223, 248, 250, 251, - 252, 253, 40, 37, 223, 228, 223, 223, - 65, 223, 223, 229, 254, 251, 255, 255, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 251, 255, 255, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 256, - 223, 223, 223, 53, 257, 223, 37, 223, - 228, 223, 223, 223, 223, 256, 258, 259, - 260, 261, 40, 37, 223, 228, 223, 223, - 63, 223, 223, 229, 262, 259, 263, 263, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 259, 263, 263, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 53, - 264, 223, 37, 223, 228, 265, 265, 223, - 37, 223, 228, 266, 223, 223, 267, 223, - 228, 228, 268, 269, 266, 223, 223, 223, - 223, 228, 53, 223, 265, 265, 223, 37, - 223, 228, 265, 264, 223, 37, 223, 228, - 270, 62, 271, 272, 43, 37, 223, 228, - 62, 271, 272, 43, 37, 223, 228, 271, - 271, 43, 37, 223, 228, 273, 59, 274, - 275, 46, 37, 223, 228, 59, 274, 275, - 46, 37, 223, 228, 274, 274, 46, 37, - 223, 228, 276, 56, 277, 278, 49, 37, - 223, 228, 56, 277, 278, 49, 37, 223, - 228, 277, 277, 49, 37, 223, 228, 279, - 53, 265, 280, 223, 37, 223, 228, 53, - 265, 280, 223, 37, 223, 228, 259, 263, - 263, 40, 37, 223, 228, 258, 259, 263, - 263, 40, 37, 223, 228, 223, 223, 223, - 223, 223, 229, 258, 259, 260, 263, 40, - 37, 223, 228, 223, 223, 63, 223, 223, - 229, 256, 223, 281, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 256, - 256, 223, 223, 223, 265, 265, 223, 37, - 223, 228, 223, 223, 223, 223, 256, 256, - 223, 223, 223, 265, 257, 223, 37, 223, - 228, 223, 223, 223, 223, 256, 250, 251, - 255, 255, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 229, 250, 251, 252, 255, - 40, 37, 223, 228, 223, 223, 65, 223, - 223, 229, 248, 223, 282, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 248, 248, 223, 223, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 248, - 248, 223, 223, 223, 265, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 248, 242, - 243, 247, 247, 40, 37, 223, 228, 223, - 223, 223, 223, 223, 229, 242, 243, 244, - 247, 40, 37, 223, 228, 223, 223, 67, - 223, 223, 229, 240, 223, 283, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 240, 240, 223, 223, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 240, 240, 223, 223, 223, 265, 241, 223, - 37, 223, 228, 223, 223, 223, 223, 240, - 234, 235, 239, 239, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 229, 234, 235, - 236, 239, 40, 37, 223, 228, 223, 223, - 69, 223, 223, 229, 232, 223, 284, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 232, 232, 223, 223, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 232, 232, 223, 223, 223, 265, 233, - 223, 37, 223, 228, 223, 223, 223, 223, - 232, 70, 39, 39, 40, 37, 224, 225, - 231, 227, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 229, 286, 151, 287, 287, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 151, 287, 287, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 288, - 285, 285, 285, 90, 289, 285, 73, 285, - 154, 285, 285, 285, 285, 288, 290, 291, - 292, 293, 76, 73, 285, 154, 285, 285, - 106, 285, 285, 158, 294, 291, 295, 295, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 291, 295, 295, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 296, - 285, 285, 285, 90, 297, 285, 73, 285, - 154, 285, 285, 285, 285, 296, 298, 299, - 300, 301, 76, 73, 285, 154, 285, 285, - 104, 285, 285, 158, 302, 299, 303, 303, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 299, 303, 303, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 304, - 285, 285, 285, 90, 305, 285, 73, 285, - 154, 285, 285, 285, 285, 304, 306, 307, - 308, 309, 76, 73, 285, 154, 285, 285, - 102, 285, 285, 158, 310, 307, 311, 311, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 307, 311, 311, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 312, - 285, 285, 285, 90, 313, 285, 73, 285, - 154, 285, 285, 285, 285, 312, 314, 315, - 316, 317, 76, 73, 285, 154, 285, 285, - 100, 285, 285, 158, 318, 315, 319, 319, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 315, 319, 319, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 90, - 320, 285, 73, 285, 154, 321, 321, 285, - 73, 285, 154, 322, 285, 285, 323, 285, - 154, 154, 324, 325, 322, 285, 285, 285, - 285, 154, 90, 285, 321, 321, 285, 73, - 285, 154, 321, 320, 285, 73, 285, 154, - 326, 99, 327, 328, 80, 73, 285, 154, - 99, 327, 328, 80, 73, 285, 154, 327, - 327, 80, 73, 285, 154, 329, 96, 330, - 331, 83, 73, 285, 154, 96, 330, 331, - 83, 73, 285, 154, 330, 330, 83, 73, - 285, 154, 332, 93, 333, 334, 86, 73, - 285, 154, 93, 333, 334, 86, 73, 285, - 154, 333, 333, 86, 73, 285, 154, 335, - 90, 321, 336, 285, 73, 285, 154, 90, - 321, 336, 285, 73, 285, 154, 315, 319, - 319, 76, 73, 285, 154, 314, 315, 319, - 319, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 158, 314, 315, 316, 319, 76, - 73, 285, 154, 285, 285, 100, 285, 285, - 158, 312, 285, 337, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 312, - 312, 285, 285, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 312, 312, - 285, 285, 285, 321, 313, 285, 73, 285, - 154, 285, 285, 285, 285, 312, 306, 307, - 311, 311, 76, 73, 285, 154, 285, 285, - 285, 285, 285, 158, 306, 307, 308, 311, - 76, 73, 285, 154, 285, 285, 102, 285, - 285, 158, 304, 285, 338, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 304, 304, 285, 285, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 304, - 304, 285, 285, 285, 321, 305, 285, 73, - 285, 154, 285, 285, 285, 285, 304, 298, - 299, 303, 303, 76, 73, 285, 154, 285, - 285, 285, 285, 285, 158, 298, 299, 300, - 303, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 158, 296, 285, 339, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 296, 296, 285, 285, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 296, 296, 285, 285, 285, 321, 297, 285, - 73, 285, 154, 285, 285, 285, 285, 296, - 290, 291, 295, 295, 76, 73, 285, 154, - 285, 285, 285, 285, 285, 158, 290, 291, - 292, 295, 76, 73, 285, 154, 285, 285, - 106, 285, 285, 158, 288, 285, 340, 285, - 321, 321, 285, 73, 285, 154, 285, 285, - 285, 285, 288, 288, 285, 285, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 288, 288, 285, 285, 285, 321, 289, - 285, 73, 285, 154, 285, 285, 285, 285, - 288, 107, 75, 75, 76, 73, 341, 341, - 341, 341, 144, 150, 151, 287, 287, 76, - 73, 285, 154, 285, 285, 285, 285, 285, - 158, 107, 75, 75, 76, 73, 343, 344, - 345, 346, 112, 109, 342, 347, 342, 342, - 143, 342, 342, 348, 349, 344, 346, 346, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 344, 346, 346, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 350, - 342, 342, 342, 125, 351, 342, 109, 342, - 347, 342, 342, 342, 342, 350, 352, 353, - 354, 355, 112, 109, 342, 347, 342, 342, - 141, 342, 342, 348, 356, 353, 357, 357, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 353, 357, 357, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 358, - 342, 342, 342, 125, 359, 342, 109, 342, - 347, 342, 342, 342, 342, 358, 360, 361, - 362, 363, 112, 109, 342, 347, 342, 342, - 139, 342, 342, 348, 364, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 361, 365, 365, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 366, - 342, 342, 342, 125, 367, 342, 109, 342, - 347, 342, 342, 342, 342, 366, 368, 369, - 370, 371, 112, 109, 342, 347, 342, 342, - 137, 342, 342, 348, 372, 369, 373, 373, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 369, 373, 373, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 374, - 342, 342, 342, 125, 375, 342, 109, 342, - 347, 342, 342, 342, 342, 374, 376, 377, - 378, 379, 112, 109, 342, 347, 342, 342, - 135, 342, 342, 348, 380, 377, 381, 381, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 377, 381, 381, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 125, - 382, 342, 109, 342, 347, 383, 383, 342, - 109, 342, 347, 384, 342, 342, 385, 342, - 347, 347, 386, 387, 384, 342, 342, 342, - 342, 347, 125, 342, 383, 383, 342, 109, - 342, 347, 383, 382, 342, 109, 342, 347, - 388, 134, 389, 390, 115, 109, 342, 347, - 134, 389, 390, 115, 109, 342, 347, 389, - 389, 115, 109, 342, 347, 391, 131, 392, - 393, 118, 109, 342, 347, 131, 392, 393, - 118, 109, 342, 347, 392, 392, 118, 109, - 342, 347, 394, 128, 395, 396, 121, 109, - 342, 347, 128, 395, 396, 121, 109, 342, - 347, 395, 395, 121, 109, 342, 347, 397, - 125, 383, 398, 342, 109, 342, 347, 125, - 383, 398, 342, 109, 342, 347, 377, 381, - 381, 112, 109, 342, 347, 376, 377, 381, - 381, 112, 109, 342, 347, 342, 342, 342, - 342, 342, 348, 376, 377, 378, 381, 112, - 109, 342, 347, 342, 342, 135, 342, 342, - 348, 374, 342, 399, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 374, - 374, 342, 342, 342, 383, 383, 342, 109, - 342, 347, 342, 342, 342, 342, 374, 374, - 342, 342, 342, 383, 375, 342, 109, 342, - 347, 342, 342, 342, 342, 374, 368, 369, - 373, 373, 112, 109, 342, 347, 342, 342, - 342, 342, 342, 348, 368, 369, 370, 373, - 112, 109, 342, 347, 342, 342, 137, 342, - 342, 348, 366, 342, 400, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 366, 366, 342, 342, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 366, - 366, 342, 342, 342, 383, 367, 342, 109, - 342, 347, 342, 342, 342, 342, 366, 360, - 361, 365, 365, 112, 109, 342, 347, 342, - 342, 342, 342, 342, 348, 360, 361, 362, - 365, 112, 109, 342, 347, 342, 342, 139, - 342, 342, 348, 358, 342, 401, 342, 383, - 383, 342, 109, 342, 347, 342, 342, 342, - 342, 358, 358, 342, 342, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 358, 358, 342, 342, 342, 383, 359, 342, - 109, 342, 347, 342, 342, 342, 342, 358, - 352, 353, 357, 357, 112, 109, 342, 347, - 342, 342, 342, 342, 342, 348, 352, 353, - 354, 357, 112, 109, 342, 347, 342, 342, - 141, 342, 342, 348, 350, 342, 402, 342, - 383, 383, 342, 109, 342, 347, 342, 342, - 342, 342, 350, 350, 342, 342, 342, 383, - 383, 342, 109, 342, 347, 342, 342, 342, - 342, 350, 350, 342, 342, 342, 383, 351, - 342, 109, 342, 347, 342, 342, 342, 342, - 350, 343, 344, 346, 346, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 148, - 149, 150, 151, 403, 287, 76, 73, 285, - 154, 155, 155, 144, 285, 148, 158, 162, - 404, 164, 165, 4, 1, 161, 166, 161, - 161, 35, 161, 161, 167, 170, 149, 150, - 151, 405, 406, 76, 407, 161, 408, 161, - 155, 144, 161, 170, 158, 107, 409, 409, - 76, 407, 161, 166, 161, 161, 144, 410, - 161, 161, 411, 161, 408, 408, 412, 207, - 410, 161, 161, 161, 161, 408, 170, 161, - 222, 107, 409, 409, 76, 407, 161, 166, - 161, 161, 161, 161, 170, 414, 413, 415, - 415, 413, 146, 413, 416, 415, 415, 413, - 146, 413, 416, 417, 413, 413, 418, 413, - 416, 416, 419, 420, 417, 413, 413, 413, - 413, 416, 148, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 155, 341, 341, 341, - 148, 0 -}; - -static const short _indic_syllable_machine_index_defaults[] = { - 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, 0, 0, 0, - 0, 0, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 72, 72, 77, 77, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 72, - 0, 145, 147, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 341, 285, 341, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 285, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 413, 413, 413, 413, - 413, 413, 413, 341, 0 + 0, 2, 7, 10, 12, 16, 19, 21, + 25, 28, 30, 34, 37, 39, 42, 44, + 46, 51, 53, 55, 60, 62, 64, 69, + 71, 73, 79, 84, 90, 95, 101, 106, + 112, 117, 123, 125, 130, 133, 135, 139, + 142, 144, 148, 151, 153, 157, 160, 162, + 165, 167, 169, 174, 176, 178, 183, 185, + 187, 192, 194, 196, 202, 207, 213, 218, + 224, 229, 235, 240, 246, 248, 253, 256, + 258, 262, 265, 267, 271, 274, 276, 280, + 283, 285, 288, 290, 292, 297, 299, 301, + 306, 308, 310, 315, 317, 319, 325, 330, + 336, 341, 347, 352, 358, 363, 365, 370, + 373, 375, 379, 382, 384, 388, 391, 393, + 397, 400, 402, 405, 407, 409, 414, 416, + 418, 423, 425, 427, 432, 434, 436, 442, + 447, 453, 458, 464, 469, 475, 480, 486, + 492, 496, 498, 515, 525, 533, 540, 547, + 557, 565, 572, 579, 589, 597, 604, 611, + 621, 629, 636, 643, 653, 661, 668, 673, + 677, 681, 683, 685, 687, 690, 695, 700, + 708, 715, 720, 728, 735, 740, 748, 755, + 760, 767, 773, 779, 787, 797, 804, 810, + 817, 825, 835, 842, 848, 855, 863, 873, + 880, 886, 893, 901, 911, 918, 924, 931, + 939, 949, 959, 968, 976, 983, 993, 1001, + 1008, 1015, 1025, 1033, 1040, 1047, 1057, 1065, + 1072, 1079, 1089, 1097, 1104, 1109, 1113, 1117, + 1119, 1121, 1123, 1126, 1131, 1136, 1144, 1151, + 1156, 1164, 1171, 1176, 1184, 1191, 1196, 1203, + 1209, 1215, 1223, 1233, 1240, 1246, 1253, 1261, + 1271, 1278, 1284, 1291, 1299, 1309, 1316, 1322, + 1329, 1337, 1347, 1354, 1360, 1367, 1372, 1381, + 1389, 1396, 1403, 1413, 1421, 1428, 1435, 1445, + 1453, 1460, 1467, 1477, 1485, 1492, 1499, 1509, + 1517, 1524, 1529, 1533, 1537, 1539, 1541, 1543, + 1546, 1551, 1556, 1564, 1571, 1576, 1584, 1591, + 1596, 1604, 1611, 1616, 1623, 1629, 1635, 1643, + 1653, 1660, 1666, 1673, 1681, 1691, 1698, 1704, + 1711, 1719, 1729, 1736, 1742, 1749, 1757, 1767, + 1774, 1780, 1787, 1793, 1801, 1806, 1816, 1824, + 1831, 1838, 1848, 1856, 1863, 1870, 1880, 1888, + 1895, 1902, 1912, 1920, 1927, 1934, 1944, 1952, + 1959, 1964, 1968, 1972, 1974, 1976, 1978, 1981, + 1986, 1991, 1999, 2006, 2011, 2019, 2026, 2031, + 2039, 2046, 2051, 2058, 2064, 2070, 2078, 2088, + 2095, 2101, 2108, 2116, 2126, 2133, 2139, 2146, + 2154, 2164, 2171, 2177, 2184, 2192, 2202, 2209, + 2215, 2222, 2230, 2244, 2254, 2268, 2275, 2279, + 2281, 2283, 2285, 2288, 2297, 2302, 2306, 2310, + 2312, 2314, 2316, 2319, 0 }; static const char _indic_syllable_machine_trans_cond_spaces[] = { @@ -742,119 +568,2015 @@ static const char _indic_syllable_machine_trans_cond_spaces[] = { -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 + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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 +}; + +static const short _indic_syllable_machine_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 757, 758, 759, + 760, 761, 762, 763, 764, 765, 766, 767, + 768, 769, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 788, 789, 790, 791, + 792, 793, 794, 795, 796, 797, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, + 808, 809, 810, 811, 812, 813, 814, 815, + 816, 817, 818, 819, 820, 821, 822, 823, + 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, + 856, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 868, 869, 870, 871, + 872, 873, 874, 875, 876, 877, 878, 879, + 880, 881, 882, 883, 884, 885, 886, 887, + 888, 889, 890, 891, 892, 893, 894, 895, + 896, 897, 898, 899, 900, 901, 902, 903, + 904, 905, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 930, 931, 932, 933, 934, 935, + 936, 937, 938, 939, 940, 941, 942, 943, + 944, 945, 946, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, + 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, + 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, + 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, + 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, + 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, + 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, + 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, + 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, + 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, + 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, + 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, + 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, + 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, + 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, + 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, + 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, + 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, + 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, + 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, + 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, + 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, + 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, + 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, + 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, + 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, + 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, + 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, + 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, + 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, + 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, + 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, + 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, + 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, + 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, + 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, + 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, + 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, + 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, + 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, + 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, + 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, + 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, + 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, + 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, + 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, + 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, + 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, + 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, + 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, + 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, + 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, + 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, + 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, + 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, + 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, + 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, + 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, + 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, + 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, + 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, + 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, + 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, + 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, + 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, + 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, + 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, + 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, + 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, + 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, + 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, + 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, + 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, + 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, + 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, + 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, + 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, + 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, + 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, + 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, + 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, + 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, + 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, + 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, + 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, + 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, + 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, + 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, + 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, + 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, + 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, + 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, + 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, + 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, + 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, + 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, + 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, + 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, + 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, + 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, + 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, + 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, + 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, + 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, + 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, + 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, + 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, + 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, + 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, + 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, + 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, + 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, + 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, + 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, + 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, + 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, + 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, + 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, + 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, + 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, + 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, + 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, + 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, + 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, + 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, + 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, + 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, + 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, + 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, + 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, + 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, + 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, + 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, + 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, + 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, + 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, + 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, + 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, + 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, + 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, + 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, + 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, + 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, + 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, + 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, + 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, + 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, + 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, + 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, + 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, + 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, + 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, + 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, + 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, + 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, + 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, + 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, + 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, + 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, + 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, + 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, + 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, + 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, + 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, + 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, + 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, + 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, + 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, + 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, + 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, + 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, + 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, + 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, + 2720, 2721, 2722, 2723, 2724, 2725, 0 +}; + +static const char _indic_syllable_machine_trans_lengths[] = { + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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 +}; + +static const char _indic_syllable_machine_cond_keys[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 0 }; static const short _indic_syllable_machine_cond_targs[] = { - 138, 160, 166, 2, 167, 3, 5, 170, - 6, 8, 173, 9, 11, 176, 12, 14, - 15, 159, 17, 18, 175, 20, 21, 172, - 23, 24, 169, 179, 183, 184, 188, 189, - 193, 194, 198, 199, 138, 222, 228, 36, - 229, 37, 39, 232, 40, 42, 235, 43, - 45, 238, 46, 48, 49, 221, 51, 52, - 237, 54, 55, 234, 57, 58, 231, 241, - 245, 246, 250, 251, 255, 256, 260, 262, - 138, 283, 289, 70, 290, 138, 71, 73, - 293, 74, 76, 296, 77, 79, 299, 80, - 82, 83, 282, 85, 86, 298, 88, 89, - 295, 91, 92, 292, 302, 306, 307, 311, - 312, 316, 317, 321, 138, 346, 352, 103, - 353, 104, 106, 356, 107, 109, 359, 110, - 112, 362, 113, 115, 116, 345, 118, 119, - 361, 121, 122, 358, 124, 125, 355, 365, - 369, 370, 374, 375, 379, 380, 384, 385, - 323, 138, 398, 138, 139, 201, 263, 265, - 322, 324, 285, 325, 386, 387, 301, 396, - 403, 138, 140, 142, 33, 200, 162, 178, - 141, 32, 143, 196, 144, 146, 31, 195, - 145, 30, 147, 191, 148, 150, 29, 190, - 149, 28, 151, 186, 152, 154, 27, 185, - 153, 26, 155, 181, 156, 158, 25, 180, - 157, 1, 165, 0, 161, 164, 163, 138, - 168, 4, 22, 171, 7, 19, 174, 10, - 16, 177, 13, 182, 187, 192, 197, 138, - 202, 204, 67, 261, 224, 240, 203, 66, - 205, 258, 206, 208, 65, 257, 207, 64, - 209, 253, 210, 212, 63, 252, 211, 62, - 213, 248, 214, 216, 61, 247, 215, 60, - 217, 243, 218, 220, 59, 242, 219, 35, - 227, 34, 223, 226, 225, 138, 230, 38, - 56, 233, 41, 53, 236, 44, 50, 239, - 47, 244, 249, 254, 259, 138, 264, 100, - 266, 319, 267, 269, 99, 318, 268, 98, - 270, 314, 271, 273, 97, 313, 272, 96, - 274, 309, 275, 277, 95, 308, 276, 94, - 278, 304, 279, 281, 93, 303, 280, 69, - 288, 68, 284, 287, 286, 138, 291, 72, - 90, 294, 75, 87, 297, 78, 84, 300, - 81, 305, 310, 315, 320, 138, 138, 326, - 328, 134, 133, 348, 364, 327, 329, 382, - 330, 332, 132, 381, 331, 131, 333, 377, - 334, 336, 130, 376, 335, 129, 337, 372, - 338, 340, 128, 371, 339, 127, 341, 367, - 342, 344, 126, 366, 343, 102, 351, 101, - 347, 350, 349, 138, 354, 105, 123, 357, - 108, 120, 360, 111, 117, 363, 114, 368, - 373, 378, 383, 135, 388, 389, 395, 390, - 392, 136, 391, 394, 393, 138, 397, 137, - 400, 399, 402, 401, 138, 0 + 160, 138, 166, 167, 160, 2, 138, 167, + 3, 138, 167, 138, 170, 160, 5, 138, + 170, 6, 138, 170, 138, 173, 160, 8, + 138, 173, 9, 138, 173, 138, 176, 160, + 11, 138, 176, 12, 138, 176, 138, 14, + 160, 138, 15, 138, 159, 138, 17, 176, + 160, 11, 138, 18, 138, 175, 138, 20, + 173, 160, 8, 138, 21, 138, 172, 138, + 23, 170, 160, 5, 138, 24, 138, 169, + 138, 166, 167, 160, 179, 2, 138, 183, + 167, 160, 2, 138, 183, 167, 160, 184, + 2, 138, 188, 167, 160, 2, 138, 188, + 167, 160, 189, 2, 138, 193, 167, 160, + 2, 138, 193, 167, 160, 194, 2, 138, + 198, 167, 160, 2, 138, 198, 167, 160, + 199, 2, 138, 222, 138, 228, 229, 222, + 36, 138, 229, 37, 138, 229, 138, 232, + 222, 39, 138, 232, 40, 138, 232, 138, + 235, 222, 42, 138, 235, 43, 138, 235, + 138, 238, 222, 45, 138, 238, 46, 138, + 238, 138, 48, 222, 138, 49, 138, 221, + 138, 51, 238, 222, 45, 138, 52, 138, + 237, 138, 54, 235, 222, 42, 138, 55, + 138, 234, 138, 57, 232, 222, 39, 138, + 58, 138, 231, 138, 228, 229, 222, 241, + 36, 138, 245, 229, 222, 36, 138, 245, + 229, 222, 246, 36, 138, 250, 229, 222, + 36, 138, 250, 229, 222, 251, 36, 138, + 255, 229, 222, 36, 138, 255, 229, 222, + 256, 36, 138, 260, 229, 222, 36, 138, + 260, 229, 222, 262, 36, 138, 283, 138, + 289, 290, 283, 70, 138, 290, 71, 138, + 290, 138, 293, 283, 73, 138, 293, 74, + 138, 293, 138, 296, 283, 76, 138, 296, + 77, 138, 296, 138, 299, 283, 79, 138, + 299, 80, 138, 299, 138, 82, 283, 138, + 83, 138, 282, 138, 85, 299, 283, 79, + 138, 86, 138, 298, 138, 88, 296, 283, + 76, 138, 89, 138, 295, 138, 91, 293, + 283, 73, 138, 92, 138, 292, 138, 289, + 290, 283, 302, 70, 138, 306, 290, 283, + 70, 138, 306, 290, 283, 307, 70, 138, + 311, 290, 283, 70, 138, 311, 290, 283, + 312, 70, 138, 316, 290, 283, 70, 138, + 316, 290, 283, 317, 70, 138, 321, 290, + 283, 70, 138, 346, 138, 352, 353, 346, + 103, 138, 353, 104, 138, 353, 138, 356, + 346, 106, 138, 356, 107, 138, 356, 138, + 359, 346, 109, 138, 359, 110, 138, 359, + 138, 362, 346, 112, 138, 362, 113, 138, + 362, 138, 115, 346, 138, 116, 138, 345, + 138, 118, 362, 346, 112, 138, 119, 138, + 361, 138, 121, 359, 346, 109, 138, 122, + 138, 358, 138, 124, 356, 346, 106, 138, + 125, 138, 355, 138, 352, 353, 346, 365, + 103, 138, 369, 353, 346, 103, 138, 369, + 353, 346, 370, 103, 138, 374, 353, 346, + 103, 138, 374, 353, 346, 375, 103, 138, + 379, 353, 346, 103, 138, 379, 353, 346, + 380, 103, 138, 384, 353, 346, 103, 138, + 384, 353, 346, 385, 103, 138, 321, 290, + 283, 323, 70, 138, 290, 160, 71, 138, + 398, 138, 139, 201, 263, 265, 322, 324, + 290, 283, 285, 323, 386, 387, 301, 396, + 403, 325, 138, 140, 142, 33, 200, 167, + 160, 162, 199, 178, 138, 141, 142, 167, + 160, 162, 178, 32, 138, 142, 167, 160, + 162, 178, 32, 138, 143, 159, 196, 160, + 162, 143, 138, 144, 146, 31, 195, 167, + 160, 162, 194, 178, 138, 145, 146, 167, + 160, 162, 178, 30, 138, 146, 167, 160, + 162, 178, 30, 138, 147, 159, 191, 160, + 162, 147, 138, 148, 150, 29, 190, 167, + 160, 162, 189, 178, 138, 149, 150, 167, + 160, 162, 178, 28, 138, 150, 167, 160, + 162, 178, 28, 138, 151, 159, 186, 160, + 162, 151, 138, 152, 154, 27, 185, 167, + 160, 162, 184, 178, 138, 153, 154, 167, + 160, 162, 178, 26, 138, 154, 167, 160, + 162, 178, 26, 138, 155, 159, 181, 160, + 162, 155, 138, 156, 158, 25, 180, 167, + 160, 162, 179, 178, 138, 157, 158, 167, + 160, 162, 178, 1, 138, 158, 167, 160, + 162, 178, 1, 138, 159, 165, 160, 162, + 138, 160, 162, 0, 138, 161, 164, 162, + 138, 162, 138, 163, 138, 138, 138, 161, + 162, 138, 159, 160, 162, 0, 138, 0, + 165, 160, 162, 138, 168, 169, 4, 22, + 170, 160, 162, 138, 169, 4, 22, 170, + 160, 162, 138, 170, 160, 162, 4, 138, + 171, 172, 7, 19, 173, 160, 162, 138, + 172, 7, 19, 173, 160, 162, 138, 173, + 160, 162, 7, 138, 174, 175, 10, 16, + 176, 160, 162, 138, 175, 10, 16, 176, + 160, 162, 138, 176, 160, 162, 10, 138, + 177, 159, 0, 13, 160, 162, 138, 159, + 0, 13, 160, 162, 138, 158, 167, 160, + 162, 1, 138, 156, 158, 167, 160, 162, + 178, 1, 138, 156, 158, 25, 1, 167, + 160, 162, 179, 178, 138, 155, 182, 160, + 162, 155, 0, 138, 155, 160, 162, 155, + 0, 138, 155, 0, 181, 160, 162, 155, + 138, 152, 154, 167, 160, 162, 178, 26, + 138, 152, 154, 27, 26, 167, 160, 162, + 184, 178, 138, 151, 187, 160, 162, 151, + 0, 138, 151, 160, 162, 151, 0, 138, + 151, 0, 186, 160, 162, 151, 138, 148, + 150, 167, 160, 162, 178, 28, 138, 148, + 150, 29, 28, 167, 160, 162, 189, 178, + 138, 147, 192, 160, 162, 147, 0, 138, + 147, 160, 162, 147, 0, 138, 147, 0, + 191, 160, 162, 147, 138, 144, 146, 167, + 160, 162, 178, 30, 138, 144, 146, 31, + 30, 167, 160, 162, 194, 178, 138, 143, + 197, 160, 162, 143, 0, 138, 143, 160, + 162, 143, 0, 138, 143, 0, 196, 160, + 162, 143, 138, 140, 142, 167, 160, 162, + 178, 32, 138, 140, 142, 33, 32, 167, + 160, 162, 199, 178, 138, 202, 204, 67, + 261, 229, 222, 224, 262, 240, 138, 203, + 204, 66, 261, 229, 222, 224, 240, 138, + 204, 66, 261, 229, 222, 224, 240, 138, + 205, 221, 258, 222, 224, 205, 138, 206, + 208, 65, 257, 229, 222, 224, 256, 240, + 138, 207, 208, 229, 222, 224, 240, 64, + 138, 208, 229, 222, 224, 240, 64, 138, + 209, 221, 253, 222, 224, 209, 138, 210, + 212, 63, 252, 229, 222, 224, 251, 240, + 138, 211, 212, 229, 222, 224, 240, 62, + 138, 212, 229, 222, 224, 240, 62, 138, + 213, 221, 248, 222, 224, 213, 138, 214, + 216, 61, 247, 229, 222, 224, 246, 240, + 138, 215, 216, 229, 222, 224, 240, 60, + 138, 216, 229, 222, 224, 240, 60, 138, + 217, 221, 243, 222, 224, 217, 138, 218, + 220, 59, 242, 229, 222, 224, 241, 240, + 138, 219, 220, 229, 222, 224, 240, 35, + 138, 220, 229, 222, 224, 240, 35, 138, + 221, 227, 222, 224, 138, 222, 224, 34, + 138, 223, 226, 224, 138, 224, 138, 225, + 138, 138, 138, 223, 224, 138, 221, 222, + 224, 34, 138, 34, 227, 222, 224, 138, + 230, 231, 38, 56, 232, 222, 224, 138, + 231, 38, 56, 232, 222, 224, 138, 232, + 222, 224, 38, 138, 233, 234, 41, 53, + 235, 222, 224, 138, 234, 41, 53, 235, + 222, 224, 138, 235, 222, 224, 41, 138, + 236, 237, 44, 50, 238, 222, 224, 138, + 237, 44, 50, 238, 222, 224, 138, 238, + 222, 224, 44, 138, 239, 221, 34, 47, + 222, 224, 138, 221, 34, 47, 222, 224, + 138, 220, 229, 222, 224, 35, 138, 218, + 220, 229, 222, 224, 240, 35, 138, 218, + 220, 59, 35, 229, 222, 224, 241, 240, + 138, 217, 244, 222, 224, 217, 34, 138, + 217, 222, 224, 217, 34, 138, 217, 34, + 243, 222, 224, 217, 138, 214, 216, 229, + 222, 224, 240, 60, 138, 214, 216, 61, + 60, 229, 222, 224, 246, 240, 138, 213, + 249, 222, 224, 213, 34, 138, 213, 222, + 224, 213, 34, 138, 213, 34, 248, 222, + 224, 213, 138, 210, 212, 229, 222, 224, + 240, 62, 138, 210, 212, 63, 62, 229, + 222, 224, 251, 240, 138, 209, 254, 222, + 224, 209, 34, 138, 209, 222, 224, 209, + 34, 138, 209, 34, 253, 222, 224, 209, + 138, 206, 208, 229, 222, 224, 240, 64, + 138, 206, 208, 65, 64, 229, 222, 224, + 256, 240, 138, 205, 259, 222, 224, 205, + 34, 138, 205, 222, 224, 205, 34, 138, + 205, 34, 258, 222, 224, 205, 138, 260, + 229, 222, 36, 138, 202, 204, 66, 261, + 229, 222, 224, 240, 138, 264, 265, 290, + 283, 285, 301, 100, 138, 265, 290, 283, + 285, 301, 100, 138, 266, 282, 319, 283, + 285, 266, 138, 267, 269, 99, 318, 290, + 283, 285, 317, 301, 138, 268, 269, 290, + 283, 285, 301, 98, 138, 269, 290, 283, + 285, 301, 98, 138, 270, 282, 314, 283, + 285, 270, 138, 271, 273, 97, 313, 290, + 283, 285, 312, 301, 138, 272, 273, 290, + 283, 285, 301, 96, 138, 273, 290, 283, + 285, 301, 96, 138, 274, 282, 309, 283, + 285, 274, 138, 275, 277, 95, 308, 290, + 283, 285, 307, 301, 138, 276, 277, 290, + 283, 285, 301, 94, 138, 277, 290, 283, + 285, 301, 94, 138, 278, 282, 304, 283, + 285, 278, 138, 279, 281, 93, 303, 290, + 283, 285, 302, 301, 138, 280, 281, 290, + 283, 285, 301, 69, 138, 281, 290, 283, + 285, 301, 69, 138, 282, 288, 283, 285, + 138, 283, 285, 68, 138, 284, 287, 285, + 138, 285, 138, 286, 138, 138, 138, 284, + 285, 138, 282, 283, 285, 68, 138, 68, + 288, 283, 285, 138, 291, 292, 72, 90, + 293, 283, 285, 138, 292, 72, 90, 293, + 283, 285, 138, 293, 283, 285, 72, 138, + 294, 295, 75, 87, 296, 283, 285, 138, + 295, 75, 87, 296, 283, 285, 138, 296, + 283, 285, 75, 138, 297, 298, 78, 84, + 299, 283, 285, 138, 298, 78, 84, 299, + 283, 285, 138, 299, 283, 285, 78, 138, + 300, 282, 68, 81, 283, 285, 138, 282, + 68, 81, 283, 285, 138, 281, 290, 283, + 285, 69, 138, 279, 281, 290, 283, 285, + 301, 69, 138, 279, 281, 93, 69, 290, + 283, 285, 302, 301, 138, 278, 305, 283, + 285, 278, 68, 138, 278, 283, 285, 278, + 68, 138, 278, 68, 304, 283, 285, 278, + 138, 275, 277, 290, 283, 285, 301, 94, + 138, 275, 277, 95, 94, 290, 283, 285, + 307, 301, 138, 274, 310, 283, 285, 274, + 68, 138, 274, 283, 285, 274, 68, 138, + 274, 68, 309, 283, 285, 274, 138, 271, + 273, 290, 283, 285, 301, 96, 138, 271, + 273, 97, 96, 290, 283, 285, 312, 301, + 138, 270, 315, 283, 285, 270, 68, 138, + 270, 283, 285, 270, 68, 138, 270, 68, + 314, 283, 285, 270, 138, 267, 269, 290, + 283, 285, 301, 98, 138, 267, 269, 99, + 98, 290, 283, 285, 317, 301, 138, 266, + 320, 283, 285, 266, 68, 138, 266, 283, + 285, 266, 68, 138, 266, 68, 319, 283, + 285, 266, 138, 321, 290, 283, 323, 70, + 138, 263, 265, 290, 283, 285, 301, 100, + 138, 321, 290, 283, 70, 138, 326, 328, + 134, 133, 353, 346, 348, 385, 364, 138, + 327, 328, 353, 346, 348, 364, 133, 138, + 328, 353, 346, 348, 364, 133, 138, 329, + 345, 382, 346, 348, 329, 138, 330, 332, + 132, 381, 353, 346, 348, 380, 364, 138, + 331, 332, 353, 346, 348, 364, 131, 138, + 332, 353, 346, 348, 364, 131, 138, 333, + 345, 377, 346, 348, 333, 138, 334, 336, + 130, 376, 353, 346, 348, 375, 364, 138, + 335, 336, 353, 346, 348, 364, 129, 138, + 336, 353, 346, 348, 364, 129, 138, 337, + 345, 372, 346, 348, 337, 138, 338, 340, + 128, 371, 353, 346, 348, 370, 364, 138, + 339, 340, 353, 346, 348, 364, 127, 138, + 340, 353, 346, 348, 364, 127, 138, 341, + 345, 367, 346, 348, 341, 138, 342, 344, + 126, 366, 353, 346, 348, 365, 364, 138, + 343, 344, 353, 346, 348, 364, 102, 138, + 344, 353, 346, 348, 364, 102, 138, 345, + 351, 346, 348, 138, 346, 348, 101, 138, + 347, 350, 348, 138, 348, 138, 349, 138, + 138, 138, 347, 348, 138, 345, 346, 348, + 101, 138, 101, 351, 346, 348, 138, 354, + 355, 105, 123, 356, 346, 348, 138, 355, + 105, 123, 356, 346, 348, 138, 356, 346, + 348, 105, 138, 357, 358, 108, 120, 359, + 346, 348, 138, 358, 108, 120, 359, 346, + 348, 138, 359, 346, 348, 108, 138, 360, + 361, 111, 117, 362, 346, 348, 138, 361, + 111, 117, 362, 346, 348, 138, 362, 346, + 348, 111, 138, 363, 345, 101, 114, 346, + 348, 138, 345, 101, 114, 346, 348, 138, + 344, 353, 346, 348, 102, 138, 342, 344, + 353, 346, 348, 364, 102, 138, 342, 344, + 126, 102, 353, 346, 348, 365, 364, 138, + 341, 368, 346, 348, 341, 101, 138, 341, + 346, 348, 341, 101, 138, 341, 101, 367, + 346, 348, 341, 138, 338, 340, 353, 346, + 348, 364, 127, 138, 338, 340, 128, 127, + 353, 346, 348, 370, 364, 138, 337, 373, + 346, 348, 337, 101, 138, 337, 346, 348, + 337, 101, 138, 337, 101, 372, 346, 348, + 337, 138, 334, 336, 353, 346, 348, 364, + 129, 138, 334, 336, 130, 129, 353, 346, + 348, 375, 364, 138, 333, 378, 346, 348, + 333, 101, 138, 333, 346, 348, 333, 101, + 138, 333, 101, 377, 346, 348, 333, 138, + 330, 332, 353, 346, 348, 364, 131, 138, + 330, 332, 132, 131, 353, 346, 348, 380, + 364, 138, 329, 383, 346, 348, 329, 101, + 138, 329, 346, 348, 329, 101, 138, 329, + 101, 382, 346, 348, 329, 138, 326, 328, + 353, 346, 348, 364, 133, 138, 139, 201, + 263, 265, 135, 100, 290, 283, 285, 323, + 139, 301, 325, 138, 140, 388, 33, 200, + 167, 160, 162, 199, 178, 138, 143, 201, + 263, 265, 389, 395, 290, 390, 392, 325, + 323, 143, 301, 138, 321, 290, 390, 162, + 323, 136, 138, 391, 394, 392, 138, 392, + 138, 393, 138, 138, 138, 391, 392, 138, + 143, 197, 321, 290, 390, 162, 143, 136, + 138, 397, 398, 400, 137, 138, 398, 400, + 137, 138, 399, 402, 400, 138, 400, 138, + 401, 138, 138, 138, 399, 400, 138, 139, + 325, 139, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 0 }; static const char _indic_syllable_machine_cond_actions[] = { - 1, 0, 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, 3, 0, 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, - 4, 0, 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, 6, 2, 6, 2, - 6, 2, 6, 2, 7, 0, 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, - 6, 8, 0, 11, 2, 2, 6, 0, - 12, 12, 0, 2, 6, 2, 6, 2, - 0, 13, 2, 0, 0, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 14, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 15, - 2, 0, 0, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 16, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 17, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 2, 0, 0, 0, 0, 18, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 19, 20, 2, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 21, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 0, 0, 22, 22, 0, - 0, 0, 0, 0, 0, 23, 2, 0, - 0, 0, 0, 0, 24, 0 + 0, 1, 2, 2, 0, 0, 1, 2, + 0, 1, 2, 1, 2, 0, 0, 1, + 2, 0, 1, 2, 1, 2, 0, 0, + 1, 2, 0, 1, 2, 1, 2, 0, + 0, 1, 2, 0, 1, 2, 1, 0, + 0, 1, 0, 1, 2, 1, 0, 2, + 0, 0, 1, 0, 1, 2, 1, 0, + 2, 0, 0, 1, 0, 1, 2, 1, + 0, 2, 0, 0, 1, 0, 1, 2, + 1, 2, 2, 0, 2, 0, 1, 2, + 2, 0, 0, 1, 2, 2, 0, 2, + 0, 1, 2, 2, 0, 0, 1, 2, + 2, 0, 2, 0, 1, 2, 2, 0, + 0, 1, 2, 2, 0, 2, 0, 1, + 2, 2, 0, 0, 1, 2, 2, 0, + 2, 0, 1, 0, 3, 2, 2, 0, + 0, 3, 2, 0, 3, 2, 3, 2, + 0, 0, 3, 2, 0, 3, 2, 3, + 2, 0, 0, 3, 2, 0, 3, 2, + 3, 2, 0, 0, 3, 2, 0, 3, + 2, 3, 0, 0, 3, 0, 3, 2, + 3, 0, 2, 0, 0, 3, 0, 3, + 2, 3, 0, 2, 0, 0, 3, 0, + 3, 2, 3, 0, 2, 0, 0, 3, + 0, 3, 2, 3, 2, 2, 0, 2, + 0, 3, 2, 2, 0, 0, 3, 2, + 2, 0, 2, 0, 3, 2, 2, 0, + 0, 3, 2, 2, 0, 2, 0, 3, + 2, 2, 0, 0, 3, 2, 2, 0, + 2, 0, 3, 2, 2, 0, 0, 3, + 2, 2, 0, 2, 0, 3, 0, 4, + 2, 2, 0, 0, 4, 2, 0, 5, + 2, 5, 2, 0, 0, 4, 2, 0, + 4, 2, 4, 2, 0, 0, 4, 2, + 0, 4, 2, 4, 2, 0, 0, 4, + 2, 0, 4, 2, 4, 0, 0, 4, + 0, 4, 2, 4, 0, 2, 0, 0, + 4, 0, 4, 2, 4, 0, 2, 0, + 0, 4, 0, 4, 2, 4, 0, 2, + 0, 0, 4, 0, 4, 2, 4, 2, + 2, 0, 6, 0, 4, 2, 2, 0, + 0, 4, 2, 2, 0, 6, 0, 4, + 2, 2, 0, 0, 4, 2, 2, 0, + 6, 0, 4, 2, 2, 0, 0, 4, + 2, 2, 0, 6, 0, 4, 2, 2, + 0, 0, 4, 0, 7, 2, 2, 0, + 0, 7, 2, 0, 7, 2, 7, 2, + 0, 0, 7, 2, 0, 7, 2, 7, + 2, 0, 0, 7, 2, 0, 7, 2, + 7, 2, 0, 0, 7, 2, 0, 7, + 2, 7, 0, 0, 7, 0, 7, 2, + 7, 0, 2, 0, 0, 7, 0, 7, + 2, 7, 0, 2, 0, 0, 7, 0, + 7, 2, 7, 0, 2, 0, 0, 7, + 0, 7, 2, 7, 2, 2, 0, 2, + 0, 7, 2, 2, 0, 0, 7, 2, + 2, 0, 2, 0, 7, 2, 2, 0, + 0, 7, 2, 2, 0, 2, 0, 7, + 2, 2, 0, 0, 7, 2, 2, 0, + 2, 0, 7, 2, 2, 0, 0, 7, + 2, 2, 0, 2, 0, 7, 2, 2, + 0, 6, 0, 4, 2, 0, 0, 1, + 0, 8, 2, 2, 6, 0, 12, 12, + 2, 0, 0, 6, 6, 2, 6, 2, + 0, 2, 11, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 0, 2, 0, + 0, 2, 0, 13, 2, 2, 2, 0, + 0, 2, 13, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 0, 2, 0, + 0, 2, 0, 13, 2, 2, 2, 0, + 0, 2, 13, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 0, 2, 0, + 0, 2, 0, 13, 2, 2, 2, 0, + 0, 2, 13, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 0, 2, 0, + 0, 2, 0, 13, 2, 2, 2, 0, + 0, 2, 13, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 0, 2, 0, + 0, 2, 0, 13, 2, 2, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 0, + 13, 0, 13, 0, 13, 14, 13, 0, + 0, 13, 2, 0, 0, 0, 13, 0, + 2, 0, 0, 13, 2, 2, 0, 0, + 2, 0, 0, 13, 2, 0, 0, 2, + 0, 0, 13, 2, 0, 0, 0, 13, + 2, 2, 0, 0, 2, 0, 0, 13, + 2, 0, 0, 2, 0, 0, 13, 2, + 0, 0, 0, 13, 2, 2, 0, 0, + 2, 0, 0, 13, 2, 0, 0, 2, + 0, 0, 13, 2, 0, 0, 0, 13, + 2, 2, 0, 0, 0, 0, 13, 2, + 0, 0, 0, 0, 13, 0, 2, 0, + 0, 0, 13, 2, 0, 2, 0, 0, + 2, 0, 13, 2, 0, 0, 0, 2, + 0, 0, 2, 2, 13, 2, 2, 0, + 0, 2, 0, 13, 2, 0, 0, 2, + 0, 13, 2, 0, 2, 0, 0, 2, + 13, 2, 0, 2, 0, 0, 2, 0, + 13, 2, 0, 0, 0, 2, 0, 0, + 2, 2, 13, 2, 2, 0, 0, 2, + 0, 13, 2, 0, 0, 2, 0, 13, + 2, 0, 2, 0, 0, 2, 13, 2, + 0, 2, 0, 0, 2, 0, 13, 2, + 0, 0, 0, 2, 0, 0, 2, 2, + 13, 2, 2, 0, 0, 2, 0, 13, + 2, 0, 0, 2, 0, 13, 2, 0, + 2, 0, 0, 2, 13, 2, 0, 2, + 0, 0, 2, 0, 13, 2, 0, 0, + 0, 2, 0, 0, 2, 2, 13, 2, + 2, 0, 0, 2, 0, 13, 2, 0, + 0, 2, 0, 13, 2, 0, 2, 0, + 0, 2, 13, 2, 0, 2, 0, 0, + 2, 0, 13, 2, 0, 0, 0, 2, + 0, 0, 2, 2, 13, 2, 0, 0, + 2, 2, 0, 0, 2, 2, 15, 2, + 0, 0, 2, 2, 0, 0, 2, 15, + 0, 0, 2, 2, 0, 0, 2, 15, + 2, 2, 2, 0, 0, 2, 15, 2, + 0, 0, 2, 2, 0, 0, 2, 2, + 15, 2, 0, 2, 0, 0, 2, 0, + 15, 0, 2, 0, 0, 2, 0, 15, + 2, 2, 2, 0, 0, 2, 15, 2, + 0, 0, 2, 2, 0, 0, 2, 2, + 15, 2, 0, 2, 0, 0, 2, 0, + 15, 0, 2, 0, 0, 2, 0, 15, + 2, 2, 2, 0, 0, 2, 15, 2, + 0, 0, 2, 2, 0, 0, 2, 2, + 15, 2, 0, 2, 0, 0, 2, 0, + 15, 0, 2, 0, 0, 2, 0, 15, + 2, 2, 2, 0, 0, 2, 15, 2, + 0, 0, 2, 2, 0, 0, 2, 2, + 15, 2, 0, 2, 0, 0, 2, 0, + 15, 0, 2, 0, 0, 2, 0, 15, + 2, 2, 0, 0, 15, 0, 0, 0, + 15, 0, 0, 0, 15, 0, 15, 0, + 15, 16, 15, 0, 0, 15, 2, 0, + 0, 0, 15, 0, 2, 0, 0, 15, + 2, 2, 0, 0, 2, 0, 0, 15, + 2, 0, 0, 2, 0, 0, 15, 2, + 0, 0, 0, 15, 2, 2, 0, 0, + 2, 0, 0, 15, 2, 0, 0, 2, + 0, 0, 15, 2, 0, 0, 0, 15, + 2, 2, 0, 0, 2, 0, 0, 15, + 2, 0, 0, 2, 0, 0, 15, 2, + 0, 0, 0, 15, 2, 2, 0, 0, + 0, 0, 15, 2, 0, 0, 0, 0, + 15, 0, 2, 0, 0, 0, 15, 2, + 0, 2, 0, 0, 2, 0, 15, 2, + 0, 0, 0, 2, 0, 0, 2, 2, + 15, 2, 2, 0, 0, 2, 0, 15, + 2, 0, 0, 2, 0, 15, 2, 0, + 2, 0, 0, 2, 15, 2, 0, 2, + 0, 0, 2, 0, 15, 2, 0, 0, + 0, 2, 0, 0, 2, 2, 15, 2, + 2, 0, 0, 2, 0, 15, 2, 0, + 0, 2, 0, 15, 2, 0, 2, 0, + 0, 2, 15, 2, 0, 2, 0, 0, + 2, 0, 15, 2, 0, 0, 0, 2, + 0, 0, 2, 2, 15, 2, 2, 0, + 0, 2, 0, 15, 2, 0, 0, 2, + 0, 15, 2, 0, 2, 0, 0, 2, + 15, 2, 0, 2, 0, 0, 2, 0, + 15, 2, 0, 0, 0, 2, 0, 0, + 2, 2, 15, 2, 2, 0, 0, 2, + 0, 15, 2, 0, 0, 2, 0, 15, + 2, 0, 2, 0, 0, 2, 15, 2, + 2, 0, 0, 15, 2, 0, 0, 2, + 2, 0, 0, 2, 15, 6, 0, 2, + 0, 0, 6, 0, 17, 0, 2, 0, + 0, 6, 0, 17, 6, 2, 2, 0, + 0, 6, 17, 6, 0, 0, 6, 2, + 0, 0, 6, 6, 17, 6, 0, 2, + 0, 0, 6, 0, 17, 0, 2, 0, + 0, 6, 0, 17, 6, 2, 2, 0, + 0, 6, 17, 6, 0, 0, 6, 2, + 0, 0, 6, 6, 17, 6, 0, 2, + 0, 0, 6, 0, 17, 0, 2, 0, + 0, 6, 0, 17, 6, 2, 2, 0, + 0, 6, 17, 6, 0, 0, 6, 2, + 0, 0, 6, 6, 17, 6, 0, 2, + 0, 0, 6, 0, 17, 0, 2, 0, + 0, 6, 0, 17, 6, 2, 2, 0, + 0, 6, 17, 6, 0, 0, 6, 2, + 0, 0, 6, 6, 17, 6, 0, 2, + 0, 0, 6, 0, 17, 0, 2, 0, + 0, 6, 0, 17, 2, 2, 0, 0, + 17, 0, 0, 0, 17, 0, 0, 0, + 17, 0, 17, 0, 17, 18, 17, 0, + 0, 17, 2, 0, 0, 0, 17, 0, + 2, 0, 0, 17, 2, 2, 0, 0, + 2, 0, 0, 17, 2, 0, 0, 2, + 0, 0, 17, 2, 0, 0, 0, 17, + 2, 2, 0, 0, 2, 0, 0, 17, + 2, 0, 0, 2, 0, 0, 17, 2, + 0, 0, 0, 17, 2, 2, 0, 0, + 2, 0, 0, 17, 2, 0, 0, 2, + 0, 0, 17, 2, 0, 0, 0, 17, + 2, 2, 0, 0, 0, 0, 17, 2, + 0, 0, 0, 0, 17, 0, 2, 0, + 0, 0, 17, 6, 0, 2, 0, 0, + 6, 0, 17, 6, 0, 0, 0, 2, + 0, 0, 6, 6, 17, 6, 2, 0, + 0, 6, 0, 17, 6, 0, 0, 6, + 0, 17, 6, 0, 2, 0, 0, 6, + 17, 6, 0, 2, 0, 0, 6, 0, + 17, 6, 0, 0, 0, 2, 0, 0, + 6, 6, 17, 6, 2, 0, 0, 6, + 0, 17, 6, 0, 0, 6, 0, 17, + 6, 0, 2, 0, 0, 6, 17, 6, + 0, 2, 0, 0, 6, 0, 17, 6, + 0, 0, 0, 2, 0, 0, 6, 6, + 17, 6, 2, 0, 0, 6, 0, 17, + 6, 0, 0, 6, 0, 17, 6, 0, + 2, 0, 0, 6, 17, 6, 0, 2, + 0, 0, 6, 0, 17, 6, 0, 0, + 0, 2, 0, 0, 6, 6, 17, 6, + 2, 0, 0, 6, 0, 17, 6, 0, + 0, 6, 0, 17, 6, 0, 2, 0, + 0, 6, 17, 2, 2, 0, 6, 0, + 19, 6, 0, 2, 0, 0, 6, 0, + 17, 2, 2, 0, 0, 19, 2, 0, + 0, 0, 2, 0, 0, 2, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 0, 2, 0, 0, 2, 0, 20, 2, + 2, 2, 0, 0, 2, 20, 2, 0, + 0, 2, 2, 0, 0, 2, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 0, 2, 0, 0, 2, 0, 20, 2, + 2, 2, 0, 0, 2, 20, 2, 0, + 0, 2, 2, 0, 0, 2, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 0, 2, 0, 0, 2, 0, 20, 2, + 2, 2, 0, 0, 2, 20, 2, 0, + 0, 2, 2, 0, 0, 2, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 0, 2, 0, 0, 2, 0, 20, 2, + 2, 2, 0, 0, 2, 20, 2, 0, + 0, 2, 2, 0, 0, 2, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 0, 2, 0, 0, 2, 0, 20, 2, + 2, 0, 0, 20, 0, 0, 0, 20, + 0, 0, 0, 20, 0, 20, 0, 20, + 21, 20, 0, 0, 20, 2, 0, 0, + 0, 20, 0, 2, 0, 0, 20, 2, + 2, 0, 0, 2, 0, 0, 20, 2, + 0, 0, 2, 0, 0, 20, 2, 0, + 0, 0, 20, 2, 2, 0, 0, 2, + 0, 0, 20, 2, 0, 0, 2, 0, + 0, 20, 2, 0, 0, 0, 20, 2, + 2, 0, 0, 2, 0, 0, 20, 2, + 0, 0, 2, 0, 0, 20, 2, 0, + 0, 0, 20, 2, 2, 0, 0, 0, + 0, 20, 2, 0, 0, 0, 0, 20, + 0, 2, 0, 0, 0, 20, 2, 0, + 2, 0, 0, 2, 0, 20, 2, 0, + 0, 0, 2, 0, 0, 2, 2, 20, + 2, 2, 0, 0, 2, 0, 20, 2, + 0, 0, 2, 0, 20, 2, 0, 2, + 0, 0, 2, 20, 2, 0, 2, 0, + 0, 2, 0, 20, 2, 0, 0, 0, + 2, 0, 0, 2, 2, 20, 2, 2, + 0, 0, 2, 0, 20, 2, 0, 0, + 2, 0, 20, 2, 0, 2, 0, 0, + 2, 20, 2, 0, 2, 0, 0, 2, + 0, 20, 2, 0, 0, 0, 2, 0, + 0, 2, 2, 20, 2, 2, 0, 0, + 2, 0, 20, 2, 0, 0, 2, 0, + 20, 2, 0, 2, 0, 0, 2, 20, + 2, 0, 2, 0, 0, 2, 0, 20, + 2, 0, 0, 0, 2, 0, 0, 2, + 2, 20, 2, 2, 0, 0, 2, 0, + 20, 2, 0, 0, 2, 0, 20, 2, + 0, 2, 0, 0, 2, 20, 2, 0, + 2, 0, 0, 2, 0, 20, 2, 2, + 6, 0, 0, 0, 2, 0, 0, 6, + 2, 6, 2, 17, 2, 0, 0, 2, + 2, 0, 0, 2, 2, 13, 2, 2, + 6, 0, 22, 22, 2, 0, 0, 2, + 6, 2, 6, 13, 2, 2, 0, 0, + 6, 0, 13, 0, 0, 0, 13, 0, + 13, 0, 13, 14, 13, 0, 0, 13, + 2, 2, 2, 2, 0, 0, 2, 0, + 13, 2, 0, 0, 0, 23, 0, 0, + 0, 23, 0, 0, 0, 23, 0, 23, + 0, 23, 24, 23, 0, 0, 23, 2, + 2, 2, 19, 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, 1, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 4, + 4, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 4, 1, 8, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 19, 17, 19, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 17, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 23, 23, + 23, 23, 23, 23, 23, 19, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -966,7 +2688,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { }; static const char _indic_syllable_machine_eof_cond_spaces[] = { - -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, @@ -1017,7 +2739,7 @@ static const char _indic_syllable_machine_eof_cond_spaces[] = { -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 + -1, -1, 0 }; static const char _indic_syllable_machine_eof_cond_key_offs[] = { @@ -1133,57 +2855,57 @@ static const char _indic_syllable_machine_eof_cond_keys[] = { }; 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, 1, 1, 1, 1, - 1, 1, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 73, 73, 78, 78, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 73, - 1, 146, 0, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 342, 286, 342, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 286, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 414, 414, 414, 414, - 414, 414, 414, 342, 0 + 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, + 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, + 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, + 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, + 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, + 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, + 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, + 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, + 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, + 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, + 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, + 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, + 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, + 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, + 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, + 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, + 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 0, 2462, 2463, 2464, 2465, 2466, + 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, + 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, + 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, + 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, + 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, + 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, + 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, + 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, + 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, + 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, + 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, + 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, + 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, + 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, + 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, + 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, + 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, + 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, + 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, + 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, + 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, + 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, + 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, + 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, + 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, + 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, + 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, + 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, + 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, + 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, + 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, + 2723, 2724, 2725, 2726, 0 }; static const char _indic_syllable_machine_nfa_targs[] = { @@ -1293,7 +3015,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const short * _inds; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; _resume: { @@ -1306,22 +3028,57 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _indic_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _indic_syllable_machine_indicies + (_indic_syllable_machine_index_offsets[cs])); + _keys = ( _indic_syllable_machine_trans_keys + (_indic_syllable_machine_key_offsets[cs])); + _trans = (unsigned int)_indic_syllable_machine_index_offsets[cs]; - if ( (info[p].indic_category()) <= 19 && (info[p].indic_category()) >= 1 ) - { - int _ic = (int)_indic_syllable_machine_char_class[(int)(info[p].indic_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; + _klen = (int)_indic_syllable_machine_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (info[p].indic_category()) < (*( _mid)) ) + _upper = _mid - 1; + else if ( (info[p].indic_category()) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_indic_syllable_machine_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (info[p].indic_category()) < (*( _mid)) ) + _upper = _mid - 2; + else if ( (info[p].indic_category()) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_indic_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 034b65750..7d5c3803b 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -30,78 +30,68 @@ #include "hb.hh" -static const unsigned char _khmer_syllable_machine_trans_keys[] = { - 2u, 8u, 2u, 6u, 2u, 8u, 2u, 6u, - 0u, 0u, 2u, 6u, 2u, 8u, 2u, 6u, - 2u, 8u, 2u, 6u, 2u, 6u, 2u, 8u, - 2u, 6u, 0u, 0u, 2u, 6u, 2u, 8u, - 2u, 6u, 2u, 8u, 2u, 6u, 2u, 8u, - 0u, 11u, 2u, 11u, 2u, 11u, 2u, 11u, - 7u, 7u, 2u, 7u, 2u, 11u, 2u, 11u, - 2u, 11u, 0u, 0u, 2u, 8u, 2u, 11u, - 2u, 11u, 7u, 7u, 2u, 7u, 2u, 11u, - 2u, 11u, 0u, 0u, 2u, 11u, 2u, 11u, - 0u -}; - -static const char _khmer_syllable_machine_char_class[] = { - 0, 0, 1, 1, 2, 2, 1, 1, - 1, 1, 3, 3, 1, 4, 1, 0, - 1, 1, 1, 5, 6, 7, 1, 1, - 1, 8, 9, 10, 11, 0 -}; - -static const short _khmer_syllable_machine_index_offsets[] = { - 0, 7, 12, 19, 24, 25, 30, 37, - 42, 49, 54, 59, 66, 71, 72, 77, - 84, 89, 96, 101, 108, 120, 130, 140, - 150, 151, 157, 167, 177, 187, 188, 195, - 205, 215, 216, 222, 232, 242, 243, 253, +static const short _khmer_syllable_machine_key_offsets[] = { + 0, 5, 8, 12, 15, 18, 21, 25, + 28, 32, 35, 38, 42, 45, 48, 51, + 55, 58, 62, 65, 70, 84, 94, 103, + 109, 110, 115, 122, 130, 139, 142, 146, + 155, 161, 162, 167, 174, 182, 185, 195, 0 }; -static const char _khmer_syllable_machine_indicies[] = { - 1, 0, 0, 2, 3, 0, 4, 1, - 0, 0, 0, 3, 1, 0, 0, 0, - 3, 0, 4, 5, 0, 0, 0, 4, - 6, 7, 0, 0, 0, 8, 9, 0, - 0, 0, 10, 0, 4, 9, 0, 0, - 0, 10, 11, 0, 0, 0, 12, 0, - 4, 11, 0, 0, 0, 12, 14, 13, - 13, 13, 15, 14, 16, 16, 16, 15, - 16, 17, 18, 16, 16, 16, 17, 19, - 20, 16, 16, 16, 21, 22, 16, 16, - 16, 23, 16, 17, 22, 16, 16, 16, - 23, 24, 16, 16, 16, 25, 16, 17, - 24, 16, 16, 16, 25, 14, 16, 16, - 26, 15, 16, 17, 28, 27, 29, 2, - 30, 27, 15, 19, 17, 23, 25, 21, - 32, 31, 33, 2, 3, 6, 4, 10, - 12, 8, 34, 31, 35, 31, 3, 6, - 4, 10, 12, 8, 5, 31, 35, 31, - 4, 6, 31, 31, 31, 8, 6, 7, - 31, 35, 31, 8, 6, 36, 31, 35, - 31, 10, 6, 4, 31, 31, 8, 37, - 31, 35, 31, 12, 6, 4, 10, 31, - 8, 34, 31, 33, 31, 3, 6, 4, - 10, 12, 8, 28, 14, 38, 38, 38, - 15, 38, 17, 40, 39, 41, 39, 15, - 19, 17, 23, 25, 21, 18, 39, 41, - 39, 17, 19, 39, 39, 39, 21, 19, - 20, 39, 41, 39, 21, 19, 42, 39, - 41, 39, 23, 19, 17, 39, 39, 21, - 43, 39, 41, 39, 25, 19, 17, 23, - 39, 21, 44, 45, 39, 30, 26, 15, - 19, 17, 23, 25, 21, 40, 39, 30, - 39, 15, 19, 17, 23, 25, 21, 0 +static const unsigned char _khmer_syllable_machine_trans_keys[] = { + 20u, 21u, 26u, 5u, 6u, 21u, 5u, 6u, + 21u, 26u, 5u, 6u, 21u, 5u, 6u, 16u, + 1u, 2u, 21u, 5u, 6u, 21u, 26u, 5u, + 6u, 21u, 5u, 6u, 21u, 26u, 5u, 6u, + 21u, 5u, 6u, 21u, 5u, 6u, 21u, 26u, + 5u, 6u, 21u, 5u, 6u, 16u, 1u, 2u, + 21u, 5u, 6u, 21u, 26u, 5u, 6u, 21u, + 5u, 6u, 21u, 26u, 5u, 6u, 21u, 5u, + 6u, 20u, 21u, 26u, 5u, 6u, 14u, 16u, + 21u, 22u, 26u, 27u, 28u, 29u, 1u, 2u, + 5u, 6u, 11u, 12u, 14u, 20u, 21u, 22u, + 26u, 27u, 28u, 29u, 5u, 6u, 14u, 21u, + 22u, 26u, 27u, 28u, 29u, 5u, 6u, 14u, + 21u, 22u, 29u, 5u, 6u, 22u, 14u, 21u, + 22u, 5u, 6u, 14u, 21u, 22u, 26u, 29u, + 5u, 6u, 14u, 21u, 22u, 26u, 27u, 29u, + 5u, 6u, 14u, 21u, 22u, 26u, 27u, 28u, + 29u, 5u, 6u, 16u, 1u, 2u, 21u, 26u, + 5u, 6u, 14u, 21u, 22u, 26u, 27u, 28u, + 29u, 5u, 6u, 14u, 21u, 22u, 29u, 5u, + 6u, 22u, 14u, 21u, 22u, 5u, 6u, 14u, + 21u, 22u, 26u, 29u, 5u, 6u, 14u, 21u, + 22u, 26u, 27u, 29u, 5u, 6u, 16u, 1u, + 2u, 14u, 20u, 21u, 22u, 26u, 27u, 28u, + 29u, 5u, 6u, 14u, 21u, 22u, 26u, 27u, + 28u, 29u, 5u, 6u, 0u }; -static const char _khmer_syllable_machine_index_defaults[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 27, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 38, 39, - 39, 39, 39, 39, 39, 39, 39, 39, +static const char _khmer_syllable_machine_single_lengths[] = { + 3, 1, 2, 1, 1, 1, 2, 1, + 2, 1, 1, 2, 1, 1, 1, 2, + 1, 2, 1, 3, 8, 8, 7, 4, + 1, 3, 5, 6, 7, 1, 2, 7, + 4, 1, 3, 5, 6, 1, 8, 7, + 0 +}; + +static const char _khmer_syllable_machine_range_lengths[] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, + 0 +}; + +static const short _khmer_syllable_machine_index_offsets[] = { + 0, 5, 8, 12, 15, 18, 21, 25, + 28, 32, 35, 38, 42, 45, 48, 51, + 55, 58, 62, 65, 70, 82, 92, 101, + 107, 109, 114, 121, 129, 138, 141, 145, + 154, 160, 162, 167, 174, 182, 185, 195, 0 }; @@ -111,25 +101,202 @@ static const char _khmer_syllable_machine_trans_cond_spaces[] = { -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 + -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, -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, -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, -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, + -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, -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 0 +}; + +static const short _khmer_syllable_machine_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 0 +}; + +static const char _khmer_syllable_machine_trans_lengths[] = { + 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, 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, 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, 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, + 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, 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, 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, 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, + 1, 1, 1, 0 +}; + +static const char _khmer_syllable_machine_cond_keys[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; static const char _khmer_syllable_machine_cond_targs[] = { - 20, 1, 28, 22, 23, 3, 24, 5, - 25, 7, 26, 9, 27, 20, 10, 31, - 20, 32, 12, 33, 14, 34, 16, 35, - 18, 36, 39, 20, 21, 30, 37, 20, - 0, 29, 2, 4, 6, 8, 20, 20, - 11, 13, 15, 17, 38, 19, 0 + 28, 22, 23, 1, 20, 22, 1, 20, + 22, 23, 1, 20, 23, 3, 20, 24, + 24, 20, 25, 5, 20, 26, 23, 7, + 20, 26, 7, 20, 27, 23, 9, 20, + 27, 9, 20, 31, 10, 20, 31, 32, + 10, 20, 32, 12, 20, 33, 33, 20, + 34, 14, 20, 35, 32, 16, 20, 35, + 16, 20, 36, 32, 18, 20, 36, 18, + 20, 39, 31, 32, 10, 20, 37, 21, + 31, 33, 32, 35, 36, 34, 21, 30, + 28, 20, 29, 28, 22, 24, 23, 26, + 27, 25, 0, 20, 4, 22, 24, 23, + 26, 27, 25, 2, 20, 4, 23, 24, + 25, 3, 20, 24, 20, 4, 25, 24, + 5, 20, 4, 26, 24, 23, 25, 6, + 20, 4, 27, 24, 23, 26, 25, 8, + 20, 29, 22, 24, 23, 26, 27, 25, + 2, 20, 21, 21, 20, 31, 32, 10, + 20, 13, 31, 33, 32, 35, 36, 34, + 11, 20, 13, 32, 33, 34, 12, 20, + 33, 20, 13, 34, 33, 14, 20, 13, + 35, 33, 32, 34, 15, 20, 13, 36, + 33, 32, 35, 34, 17, 20, 38, 38, + 20, 37, 39, 31, 33, 32, 35, 36, + 34, 19, 20, 37, 31, 33, 32, 35, + 36, 34, 11, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 0 }; static const char _khmer_syllable_machine_cond_actions[] = { - 1, 0, 2, 2, 2, 0, 0, 0, - 2, 0, 2, 0, 2, 3, 0, 4, - 5, 2, 0, 0, 0, 2, 0, 2, - 0, 2, 4, 8, 2, 9, 0, 10, - 0, 0, 0, 0, 0, 0, 11, 12, - 0, 0, 0, 0, 4, 0, 0 + 2, 2, 2, 0, 1, 2, 0, 1, + 2, 2, 0, 1, 2, 0, 1, 0, + 0, 1, 2, 0, 1, 2, 2, 0, + 1, 2, 0, 1, 2, 2, 0, 1, + 2, 0, 1, 4, 0, 3, 4, 2, + 0, 5, 2, 0, 5, 0, 0, 5, + 2, 0, 5, 2, 2, 0, 5, 2, + 0, 5, 2, 2, 0, 5, 2, 0, + 5, 4, 4, 2, 0, 5, 0, 2, + 4, 0, 2, 2, 2, 2, 2, 9, + 2, 8, 0, 2, 2, 0, 2, 2, + 2, 2, 0, 10, 0, 2, 0, 2, + 2, 2, 2, 0, 10, 0, 2, 0, + 2, 0, 10, 0, 10, 0, 2, 0, + 0, 10, 0, 2, 0, 2, 2, 0, + 10, 0, 2, 0, 2, 2, 2, 0, + 10, 0, 2, 0, 2, 2, 2, 2, + 0, 10, 2, 2, 10, 4, 2, 0, + 11, 0, 4, 0, 2, 2, 2, 2, + 0, 12, 0, 2, 0, 2, 0, 12, + 0, 12, 0, 2, 0, 0, 12, 0, + 2, 0, 2, 2, 0, 12, 0, 2, + 0, 2, 2, 2, 0, 12, 4, 4, + 12, 0, 4, 4, 0, 2, 2, 2, + 2, 0, 12, 0, 4, 0, 2, 2, + 2, 2, 0, 12, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 11, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 0 }; static const char _khmer_syllable_machine_to_state_actions[] = { @@ -151,12 +318,12 @@ static const char _khmer_syllable_machine_from_state_actions[] = { }; static const char _khmer_syllable_machine_eof_cond_spaces[] = { - -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, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0 + -1, -1, -1, 0 }; static const char _khmer_syllable_machine_eof_cond_key_offs[] = { @@ -181,12 +348,12 @@ static const char _khmer_syllable_machine_eof_cond_keys[] = { 0 }; -static const char _khmer_syllable_machine_eof_trans[] = { - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 14, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 39, 40, - 40, 40, 40, 40, 40, 40, 40, 40, +static const short _khmer_syllable_machine_eof_trans[] = { + 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 0, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 0 }; @@ -252,7 +419,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; _resume: { @@ -265,22 +432,57 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _khmer_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _khmer_syllable_machine_indicies + (_khmer_syllable_machine_index_offsets[cs])); + _keys = ( _khmer_syllable_machine_trans_keys + (_khmer_syllable_machine_key_offsets[cs])); + _trans = (unsigned int)_khmer_syllable_machine_index_offsets[cs]; - if ( (info[p].khmer_category()) <= 29 && (info[p].khmer_category()) >= 1 ) - { - int _ic = (int)_khmer_syllable_machine_char_class[(int)(info[p].khmer_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; + _klen = (int)_khmer_syllable_machine_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (info[p].khmer_category()) < (*( _mid)) ) + _upper = _mid - 1; + else if ( (info[p].khmer_category()) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_khmer_syllable_machine_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (info[p].khmer_category()) < (*( _mid)) ) + _upper = _mid - 2; + else if ( (info[p].khmer_category()) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_khmer_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index f40a47999..75247d8c4 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -30,157 +30,109 @@ #include "hb.hh" -static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 0u, 21u, 1u, 20u, 3u, 19u, 3u, 5u, - 3u, 19u, 1u, 15u, 3u, 15u, 3u, 15u, - 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, - 0u, 8u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 20u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 19u, 3u, 19u, - 3u, 5u, 3u, 19u, 1u, 15u, 3u, 15u, - 3u, 15u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 0u, 8u, 1u, 20u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 20u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 1u, 20u, 1u, 19u, 0u, 20u, - 0u, 8u, 5u, 5u, 0u +static const short _myanmar_syllable_machine_key_offsets[] = { + 0, 24, 41, 47, 50, 55, 62, 67, + 71, 81, 88, 97, 105, 108, 123, 134, + 144, 153, 161, 172, 185, 197, 211, 227, + 233, 236, 241, 248, 253, 257, 267, 274, + 283, 291, 294, 311, 326, 337, 347, 356, + 364, 375, 388, 400, 414, 430, 447, 463, + 485, 490, 0 }; -static const char _myanmar_syllable_machine_char_class[] = { - 0, 0, 1, 2, 3, 3, 4, 5, - 4, 6, 7, 4, 4, 4, 4, 8, - 4, 9, 10, 4, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 7, - 0 +static const unsigned char _myanmar_syllable_machine_trans_keys[] = { + 3u, 4u, 8u, 10u, 11u, 16u, 18u, 19u, + 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, + 29u, 30u, 31u, 32u, 1u, 2u, 5u, 6u, + 3u, 4u, 8u, 10u, 18u, 21u, 22u, 23u, + 24u, 25u, 26u, 27u, 28u, 29u, 30u, 5u, + 6u, 8u, 18u, 25u, 29u, 5u, 6u, 8u, + 5u, 6u, 8u, 25u, 29u, 5u, 6u, 3u, + 8u, 10u, 18u, 25u, 5u, 6u, 8u, 18u, + 25u, 5u, 6u, 8u, 25u, 5u, 6u, 3u, + 8u, 10u, 18u, 21u, 25u, 26u, 29u, 5u, + 6u, 3u, 8u, 10u, 25u, 29u, 5u, 6u, + 3u, 8u, 10u, 18u, 25u, 26u, 29u, 5u, + 6u, 3u, 8u, 10u, 25u, 26u, 29u, 5u, + 6u, 16u, 1u, 2u, 3u, 8u, 10u, 18u, + 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, + 29u, 5u, 6u, 3u, 8u, 10u, 18u, 25u, + 26u, 27u, 28u, 29u, 5u, 6u, 3u, 8u, + 10u, 25u, 26u, 27u, 28u, 29u, 5u, 6u, + 3u, 8u, 10u, 25u, 26u, 27u, 29u, 5u, + 6u, 3u, 8u, 10u, 25u, 27u, 29u, 5u, + 6u, 3u, 8u, 10u, 25u, 26u, 27u, 28u, + 29u, 30u, 5u, 6u, 3u, 8u, 10u, 18u, + 21u, 23u, 25u, 26u, 27u, 28u, 29u, 5u, + 6u, 3u, 8u, 10u, 18u, 21u, 25u, 26u, + 27u, 28u, 29u, 5u, 6u, 3u, 8u, 10u, + 18u, 21u, 22u, 23u, 25u, 26u, 27u, 28u, + 29u, 5u, 6u, 3u, 4u, 8u, 10u, 18u, + 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, + 29u, 5u, 6u, 8u, 18u, 25u, 29u, 5u, + 6u, 8u, 5u, 6u, 8u, 25u, 29u, 5u, + 6u, 3u, 8u, 10u, 18u, 25u, 5u, 6u, + 8u, 18u, 25u, 5u, 6u, 8u, 25u, 5u, + 6u, 3u, 8u, 10u, 18u, 21u, 25u, 26u, + 29u, 5u, 6u, 3u, 8u, 10u, 25u, 29u, + 5u, 6u, 3u, 8u, 10u, 18u, 25u, 26u, + 29u, 5u, 6u, 3u, 8u, 10u, 25u, 26u, + 29u, 5u, 6u, 16u, 1u, 2u, 3u, 4u, + 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, + 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, + 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, + 26u, 27u, 28u, 29u, 5u, 6u, 3u, 8u, + 10u, 18u, 25u, 26u, 27u, 28u, 29u, 5u, + 6u, 3u, 8u, 10u, 25u, 26u, 27u, 28u, + 29u, 5u, 6u, 3u, 8u, 10u, 25u, 26u, + 27u, 29u, 5u, 6u, 3u, 8u, 10u, 25u, + 27u, 29u, 5u, 6u, 3u, 8u, 10u, 25u, + 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, + 8u, 10u, 18u, 21u, 23u, 25u, 26u, 27u, + 28u, 29u, 5u, 6u, 3u, 8u, 10u, 18u, + 21u, 25u, 26u, 27u, 28u, 29u, 5u, 6u, + 3u, 8u, 10u, 18u, 21u, 22u, 23u, 25u, + 26u, 27u, 28u, 29u, 5u, 6u, 3u, 4u, + 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, + 26u, 27u, 28u, 29u, 5u, 6u, 3u, 4u, + 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, + 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, + 4u, 8u, 10u, 18u, 21u, 22u, 23u, 24u, + 25u, 26u, 27u, 28u, 29u, 5u, 6u, 3u, + 4u, 8u, 10u, 11u, 16u, 18u, 21u, 22u, + 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, + 32u, 1u, 2u, 5u, 6u, 11u, 16u, 32u, + 1u, 2u, 8u, 0u +}; + +static const char _myanmar_syllable_machine_single_lengths[] = { + 20, 15, 4, 1, 3, 5, 3, 2, + 8, 5, 7, 6, 1, 13, 9, 8, + 7, 6, 9, 11, 10, 12, 14, 4, + 1, 3, 5, 3, 2, 8, 5, 7, + 6, 1, 15, 13, 9, 8, 7, 6, + 9, 11, 10, 12, 14, 15, 14, 18, + 3, 1, 0 +}; + +static const char _myanmar_syllable_machine_range_lengths[] = { + 2, 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, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 0, 0 }; static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 22, 42, 59, 62, 79, 94, 107, - 120, 139, 158, 177, 196, 205, 224, 243, - 262, 281, 300, 320, 339, 358, 377, 396, - 413, 416, 433, 448, 461, 474, 493, 512, - 531, 550, 559, 579, 598, 617, 636, 655, - 674, 694, 713, 732, 751, 770, 790, 809, - 830, 839, 0 -}; - -static const char _myanmar_syllable_machine_indicies[] = { - 1, 2, 3, 4, 0, 5, 6, 1, - 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 22, 23, - 24, 21, 25, 26, 21, 21, 27, 21, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 24, 21, 25, 21, 21, 21, - 38, 21, 21, 21, 21, 21, 32, 21, - 21, 21, 36, 24, 21, 25, 24, 21, - 25, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 21, 21, 21, 36, 39, - 21, 24, 21, 25, 32, 21, 21, 40, - 21, 21, 21, 21, 21, 32, 24, 21, - 25, 21, 21, 21, 40, 21, 21, 21, - 21, 21, 32, 24, 21, 25, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 22, 21, 24, 21, 25, 26, 21, 21, - 41, 21, 41, 21, 21, 21, 32, 42, - 21, 21, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 21, 21, 21, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 41, 21, - 21, 21, 21, 21, 32, 42, 21, 21, - 36, 22, 21, 24, 21, 25, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 42, 21, 21, 36, 1, 21, 21, 21, - 21, 21, 21, 21, 1, 22, 21, 24, - 21, 25, 26, 21, 21, 27, 21, 28, - 29, 30, 31, 32, 33, 34, 35, 36, - 22, 21, 24, 21, 25, 26, 21, 21, - 43, 21, 21, 21, 21, 21, 32, 33, - 34, 35, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 33, 34, 35, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 21, 21, - 21, 21, 21, 21, 32, 33, 34, 21, - 36, 22, 21, 24, 21, 25, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 21, 34, 21, 36, 22, 21, 24, 21, - 25, 26, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 33, 34, 35, 36, 43, - 22, 21, 24, 21, 25, 26, 21, 21, - 43, 21, 28, 21, 30, 21, 32, 33, - 34, 35, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 43, 21, 28, 21, 21, - 21, 32, 33, 34, 35, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 43, 21, - 28, 29, 30, 21, 32, 33, 34, 35, - 36, 22, 23, 24, 21, 25, 26, 21, - 21, 27, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 45, 44, 5, 44, - 44, 44, 46, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 45, 44, 5, - 45, 44, 5, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 44, 44, 44, - 18, 47, 44, 45, 44, 5, 14, 44, - 44, 48, 44, 44, 44, 44, 44, 14, - 45, 44, 5, 44, 44, 44, 48, 44, - 44, 44, 44, 44, 14, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 14, 2, 44, 45, 44, 5, 6, - 44, 44, 49, 44, 49, 44, 44, 44, - 14, 50, 44, 44, 18, 2, 44, 45, - 44, 5, 6, 44, 44, 44, 44, 44, - 44, 44, 44, 14, 44, 44, 44, 18, - 2, 44, 45, 44, 5, 6, 44, 44, - 49, 44, 44, 44, 44, 44, 14, 50, - 44, 44, 18, 2, 44, 45, 44, 5, - 6, 44, 44, 44, 44, 44, 44, 44, - 44, 14, 50, 44, 44, 18, 51, 44, - 44, 44, 44, 44, 44, 44, 51, 2, - 3, 45, 44, 5, 6, 44, 44, 8, - 44, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 2, 44, 45, 44, 5, - 6, 44, 44, 8, 44, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 2, 44, - 45, 44, 5, 6, 44, 44, 52, 44, - 44, 44, 44, 44, 14, 15, 16, 17, - 18, 2, 44, 45, 44, 5, 6, 44, - 44, 44, 44, 44, 44, 44, 44, 14, - 15, 16, 17, 18, 2, 44, 45, 44, - 5, 6, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 44, 18, 2, - 44, 45, 44, 5, 6, 44, 44, 44, - 44, 44, 44, 44, 44, 14, 44, 16, - 44, 18, 2, 44, 45, 44, 5, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 15, 16, 17, 18, 52, 2, 44, - 45, 44, 5, 6, 44, 44, 52, 44, - 10, 44, 12, 44, 14, 15, 16, 17, - 18, 2, 44, 45, 44, 5, 6, 44, - 44, 52, 44, 10, 44, 44, 44, 14, - 15, 16, 17, 18, 2, 44, 45, 44, - 5, 6, 44, 44, 52, 44, 10, 11, - 12, 44, 14, 15, 16, 17, 18, 2, - 3, 45, 44, 5, 6, 44, 44, 8, - 44, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 22, 23, 24, 21, 25, 26, - 21, 21, 53, 21, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 22, 54, - 24, 21, 25, 26, 21, 21, 27, 21, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 1, 2, 3, 45, 44, 5, 6, - 1, 1, 8, 44, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 1, 55, - 55, 55, 55, 55, 55, 1, 1, 56, - 0 -}; - -static const char _myanmar_syllable_machine_index_defaults[] = { - 0, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 21, 21, 44, - 55, 55, 0 + 0, 23, 40, 46, 49, 54, 61, 66, + 70, 80, 87, 96, 104, 107, 122, 133, + 143, 152, 160, 171, 184, 196, 210, 226, + 232, 235, 240, 247, 252, 256, 266, 273, + 282, 290, 293, 310, 325, 336, 346, 355, + 363, 374, 387, 399, 413, 429, 446, 462, + 483, 488, 0 }; static const char _myanmar_syllable_machine_trans_cond_spaces[] = { @@ -191,29 +143,422 @@ static const char _myanmar_syllable_machine_trans_cond_spaces[] = { -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 + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -1, -1, -1, 0 +}; + +static const short _myanmar_syllable_machine_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 0 +}; + +static const char _myanmar_syllable_machine_trans_lengths[] = { + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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 +}; + +static const char _myanmar_syllable_machine_cond_keys[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_cond_targs[] = { - 0, 1, 23, 33, 0, 24, 30, 45, - 35, 48, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 44, 49, 0, 2, 12, - 0, 3, 9, 13, 14, 19, 20, 21, - 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 0, 25, 27, - 28, 31, 32, 34, 37, 46, 47, 0, - 0, 0 + 23, 33, 24, 30, 1, 45, 35, 48, + 36, 41, 42, 43, 26, 38, 39, 40, + 29, 44, 49, 1, 1, 0, 0, 2, + 12, 3, 9, 13, 14, 19, 20, 21, + 5, 16, 17, 18, 8, 22, 0, 0, + 3, 4, 5, 8, 0, 0, 3, 0, + 0, 3, 5, 8, 0, 0, 6, 3, + 5, 7, 5, 0, 0, 3, 7, 5, + 0, 0, 3, 5, 0, 0, 2, 3, + 9, 10, 10, 5, 11, 8, 0, 0, + 2, 3, 9, 5, 8, 0, 0, 2, + 3, 9, 10, 5, 11, 8, 0, 0, + 2, 3, 9, 5, 11, 8, 0, 0, + 1, 1, 0, 2, 3, 9, 13, 14, + 19, 20, 21, 5, 16, 17, 18, 8, + 0, 0, 2, 3, 9, 15, 5, 16, + 17, 18, 8, 0, 0, 2, 3, 9, + 5, 16, 17, 18, 8, 0, 0, 2, + 3, 9, 5, 16, 17, 8, 0, 0, + 2, 3, 9, 5, 17, 8, 0, 0, + 2, 3, 9, 5, 16, 17, 18, 8, + 15, 0, 0, 2, 3, 9, 15, 14, + 20, 5, 16, 17, 18, 8, 0, 0, + 2, 3, 9, 15, 14, 5, 16, 17, + 18, 8, 0, 0, 2, 3, 9, 15, + 14, 19, 20, 5, 16, 17, 18, 8, + 0, 0, 2, 12, 3, 9, 13, 14, + 19, 20, 21, 5, 16, 17, 18, 8, + 0, 0, 24, 25, 26, 29, 0, 0, + 24, 0, 0, 24, 26, 29, 0, 0, + 27, 24, 26, 28, 26, 0, 0, 24, + 28, 26, 0, 0, 24, 26, 0, 0, + 23, 24, 30, 31, 31, 26, 32, 29, + 0, 0, 23, 24, 30, 26, 29, 0, + 0, 23, 24, 30, 31, 26, 32, 29, + 0, 0, 23, 24, 30, 26, 32, 29, + 0, 0, 34, 34, 0, 23, 33, 24, + 30, 35, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 0, 0, 23, 24, + 30, 35, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 0, 0, 23, 24, 30, + 37, 26, 38, 39, 40, 29, 0, 0, + 23, 24, 30, 26, 38, 39, 40, 29, + 0, 0, 23, 24, 30, 26, 38, 39, + 29, 0, 0, 23, 24, 30, 26, 39, + 29, 0, 0, 23, 24, 30, 26, 38, + 39, 40, 29, 37, 0, 0, 23, 24, + 30, 37, 36, 42, 26, 38, 39, 40, + 29, 0, 0, 23, 24, 30, 37, 36, + 26, 38, 39, 40, 29, 0, 0, 23, + 24, 30, 37, 36, 41, 42, 26, 38, + 39, 40, 29, 0, 0, 23, 33, 24, + 30, 35, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 0, 0, 2, 12, 3, + 9, 46, 14, 19, 20, 21, 5, 16, + 17, 18, 8, 22, 0, 0, 2, 47, + 3, 9, 13, 14, 19, 20, 21, 5, + 16, 17, 18, 8, 0, 0, 23, 33, + 24, 30, 1, 1, 35, 36, 41, 42, + 43, 26, 38, 39, 40, 29, 44, 1, + 1, 0, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_cond_actions[] = { - 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 10, 0 + 0, 0, 0, 0, 0, 4, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 6, 5, 0, 6, + 5, 0, 0, 0, 6, 5, 0, 0, + 0, 0, 0, 6, 5, 0, 0, 0, + 6, 5, 0, 0, 6, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 0, 6, 5, 0, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 5, 0, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 5, 0, 0, 0, 0, 8, 7, + 0, 8, 7, 0, 0, 0, 8, 7, + 0, 0, 0, 0, 0, 8, 7, 0, + 0, 0, 8, 7, 0, 0, 8, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 8, + 7, 0, 0, 0, 0, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 0, + 8, 7, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 0, + 0, 8, 7, 0, 0, 0, 0, 0, + 0, 8, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 7, 0, 0, 0, 0, 9, + 10, 9, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 5, 5, + 7, 9, 9, 0 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -237,13 +582,13 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { }; static const char _myanmar_syllable_machine_eof_cond_spaces[] = { - -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, -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 + -1, -1, -1, -1, -1, 0 }; static const char _myanmar_syllable_machine_eof_cond_key_offs[] = { @@ -270,14 +615,14 @@ static const char _myanmar_syllable_machine_eof_cond_keys[] = { 0 }; -static const char _myanmar_syllable_machine_eof_trans[] = { - 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 22, 22, 45, - 56, 56, 0 +static const short _myanmar_syllable_machine_eof_trans[] = { + 0, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 0 }; static const char _myanmar_syllable_machine_nfa_targs[] = { @@ -342,7 +687,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; _resume: { @@ -355,22 +700,57 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _myanmar_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _myanmar_syllable_machine_indicies + (_myanmar_syllable_machine_index_offsets[cs])); + _keys = ( _myanmar_syllable_machine_trans_keys + (_myanmar_syllable_machine_key_offsets[cs])); + _trans = (unsigned int)_myanmar_syllable_machine_index_offsets[cs]; - if ( (info[p].myanmar_category()) <= 32 && (info[p].myanmar_category()) >= 1 ) - { - int _ic = (int)_myanmar_syllable_machine_char_class[(int)(info[p].myanmar_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; + _klen = (int)_myanmar_syllable_machine_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (info[p].myanmar_category()) < (*( _mid)) ) + _upper = _mid - 1; + else if ( (info[p].myanmar_category()) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_myanmar_syllable_machine_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (info[p].myanmar_category()) < (*( _mid)) ) + _upper = _mid - 2; + else if ( (info[p].myanmar_category()) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_myanmar_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index e4b1884cf..607922e61 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -32,228 +32,136 @@ #include "hb.hh" -static const unsigned char _use_syllable_machine_trans_keys[] = { - 7u, 33u, 1u, 9u, 1u, 1u, 7u, 33u, - 0u, 33u, 12u, 12u, 5u, 33u, 5u, 33u, - 1u, 9u, 1u, 1u, 5u, 33u, 5u, 33u, - 5u, 29u, 5u, 17u, 5u, 17u, 5u, 17u, - 5u, 29u, 5u, 29u, 5u, 29u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 1u, 29u, - 5u, 33u, 8u, 12u, 3u, 3u, 8u, 8u, - 5u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 29u, - 5u, 17u, 5u, 17u, 5u, 17u, 5u, 29u, - 5u, 29u, 5u, 29u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 1u, 29u, 1u, 9u, - 3u, 3u, 8u, 12u, 8u, 8u, 7u, 33u, - 1u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, - 12u, 31u, 1u, 4u, 0u +static const short _use_syllable_machine_key_offsets[] = { + 0, 2, 4, 5, 7, 42, 43, 66, + 89, 91, 92, 114, 127, 135, 139, 142, + 144, 151, 157, 162, 174, 185, 195, 210, + 225, 239, 255, 276, 286, 308, 310, 311, + 312, 337, 361, 363, 364, 387, 409, 422, + 430, 434, 437, 439, 446, 452, 457, 469, + 480, 490, 505, 520, 534, 550, 571, 581, + 583, 584, 586, 587, 589, 616, 638, 640, + 641, 644, 0 }; -static const char _use_syllable_machine_char_class[] = { - 0, 1, 2, 0, 3, 4, 2, 2, - 5, 2, 2, 6, 7, 8, 2, 9, - 0, 0, 10, 11, 2, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 2, 27, 28, 29, - 2, 30, 31, 32, 33, 0 +static const unsigned char _use_syllable_machine_trans_keys[] = { + 12u, 44u, 1u, 15u, 1u, 12u, 44u, 0u, + 1u, 3u, 4u, 5u, 8u, 11u, 12u, 13u, + 15u, 18u, 19u, 23u, 24u, 25u, 26u, 27u, + 28u, 30u, 31u, 32u, 33u, 34u, 35u, 37u, + 38u, 39u, 41u, 42u, 43u, 44u, 16u, 17u, + 22u, 29u, 21u, 8u, 11u, 12u, 15u, 22u, + 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, + 32u, 33u, 34u, 35u, 37u, 38u, 39u, 44u, + 21u, 31u, 8u, 11u, 12u, 15u, 21u, 23u, + 24u, 25u, 26u, 27u, 28u, 30u, 33u, 34u, + 35u, 37u, 38u, 39u, 44u, 22u, 29u, 31u, + 32u, 1u, 15u, 1u, 8u, 11u, 12u, 15u, + 23u, 24u, 25u, 26u, 27u, 28u, 30u, 33u, + 34u, 35u, 37u, 38u, 39u, 44u, 22u, 29u, + 31u, 32u, 8u, 22u, 23u, 24u, 25u, 26u, + 33u, 34u, 35u, 37u, 38u, 39u, 44u, 8u, + 23u, 24u, 25u, 26u, 37u, 38u, 39u, 8u, + 24u, 25u, 26u, 8u, 25u, 26u, 8u, 26u, + 8u, 24u, 25u, 26u, 37u, 38u, 39u, 8u, + 24u, 25u, 26u, 38u, 39u, 8u, 24u, 25u, + 26u, 39u, 8u, 23u, 24u, 25u, 26u, 33u, + 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, + 24u, 25u, 26u, 34u, 35u, 37u, 38u, 39u, + 44u, 8u, 23u, 24u, 25u, 26u, 35u, 37u, + 38u, 39u, 44u, 8u, 22u, 23u, 24u, 25u, + 26u, 28u, 29u, 33u, 34u, 35u, 37u, 38u, + 39u, 44u, 8u, 22u, 23u, 24u, 25u, 26u, + 28u, 29u, 33u, 34u, 35u, 37u, 38u, 39u, + 44u, 8u, 22u, 23u, 24u, 25u, 26u, 29u, + 33u, 34u, 35u, 37u, 38u, 39u, 44u, 8u, + 23u, 24u, 25u, 26u, 27u, 28u, 33u, 34u, + 35u, 37u, 38u, 39u, 44u, 22u, 29u, 8u, + 11u, 12u, 15u, 23u, 24u, 25u, 26u, 27u, + 28u, 30u, 32u, 33u, 34u, 35u, 37u, 38u, + 39u, 44u, 22u, 29u, 1u, 8u, 15u, 23u, + 24u, 25u, 26u, 37u, 38u, 39u, 8u, 11u, + 12u, 15u, 23u, 24u, 25u, 26u, 27u, 28u, + 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, + 39u, 44u, 22u, 29u, 13u, 21u, 4u, 13u, + 8u, 11u, 12u, 15u, 21u, 23u, 24u, 25u, + 26u, 27u, 28u, 30u, 31u, 32u, 33u, 34u, + 35u, 37u, 38u, 39u, 41u, 42u, 44u, 22u, + 29u, 8u, 11u, 12u, 15u, 23u, 24u, 25u, + 26u, 27u, 28u, 30u, 31u, 32u, 33u, 34u, + 35u, 37u, 38u, 39u, 41u, 42u, 44u, 22u, + 29u, 41u, 42u, 42u, 8u, 11u, 12u, 15u, + 21u, 23u, 24u, 25u, 26u, 27u, 28u, 30u, + 33u, 34u, 35u, 37u, 38u, 39u, 44u, 22u, + 29u, 31u, 32u, 8u, 11u, 12u, 15u, 23u, + 24u, 25u, 26u, 27u, 28u, 30u, 33u, 34u, + 35u, 37u, 38u, 39u, 44u, 22u, 29u, 31u, + 32u, 8u, 22u, 23u, 24u, 25u, 26u, 33u, + 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, + 24u, 25u, 26u, 37u, 38u, 39u, 8u, 24u, + 25u, 26u, 8u, 25u, 26u, 8u, 26u, 8u, + 24u, 25u, 26u, 37u, 38u, 39u, 8u, 24u, + 25u, 26u, 38u, 39u, 8u, 24u, 25u, 26u, + 39u, 8u, 23u, 24u, 25u, 26u, 33u, 34u, + 35u, 37u, 38u, 39u, 44u, 8u, 23u, 24u, + 25u, 26u, 34u, 35u, 37u, 38u, 39u, 44u, + 8u, 23u, 24u, 25u, 26u, 35u, 37u, 38u, + 39u, 44u, 8u, 22u, 23u, 24u, 25u, 26u, + 28u, 29u, 33u, 34u, 35u, 37u, 38u, 39u, + 44u, 8u, 22u, 23u, 24u, 25u, 26u, 28u, + 29u, 33u, 34u, 35u, 37u, 38u, 39u, 44u, + 8u, 22u, 23u, 24u, 25u, 26u, 29u, 33u, + 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, + 24u, 25u, 26u, 27u, 28u, 33u, 34u, 35u, + 37u, 38u, 39u, 44u, 22u, 29u, 8u, 11u, + 12u, 15u, 23u, 24u, 25u, 26u, 27u, 28u, + 30u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, + 44u, 22u, 29u, 1u, 8u, 15u, 23u, 24u, + 25u, 26u, 37u, 38u, 39u, 1u, 15u, 4u, + 13u, 21u, 13u, 12u, 44u, 1u, 5u, 8u, + 11u, 12u, 13u, 15u, 23u, 24u, 25u, 26u, + 27u, 28u, 30u, 31u, 32u, 33u, 34u, 35u, + 37u, 38u, 39u, 41u, 42u, 44u, 22u, 29u, + 8u, 11u, 12u, 15u, 23u, 24u, 25u, 26u, + 27u, 28u, 30u, 31u, 32u, 33u, 34u, 35u, + 37u, 38u, 39u, 44u, 22u, 29u, 41u, 42u, + 42u, 21u, 41u, 42u, 1u, 5u, 0u +}; + +static const char _use_syllable_machine_single_lengths[] = { + 2, 2, 1, 2, 31, 1, 21, 19, + 2, 1, 18, 13, 8, 4, 3, 2, + 7, 6, 5, 12, 11, 10, 15, 15, + 14, 14, 19, 10, 20, 2, 1, 1, + 23, 22, 2, 1, 19, 18, 13, 8, + 4, 3, 2, 7, 6, 5, 12, 11, + 10, 15, 15, 14, 14, 19, 10, 2, + 1, 2, 1, 2, 25, 20, 2, 1, + 3, 2, 0 +}; + +static const char _use_syllable_machine_range_lengths[] = { + 0, 0, 0, 0, 2, 0, 1, 2, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 27, 36, 37, 64, 98, 99, 128, - 157, 166, 167, 196, 225, 250, 263, 276, - 289, 314, 339, 364, 393, 422, 451, 480, - 509, 538, 567, 596, 625, 654, 659, 660, - 661, 690, 719, 721, 722, 751, 780, 809, - 834, 847, 860, 873, 898, 923, 948, 977, - 1006, 1035, 1064, 1093, 1122, 1151, 1180, 1209, - 1218, 1219, 1224, 1225, 1252, 1285, 1314, 1316, - 1317, 1337, 0 -}; - -static const char _use_syllable_machine_indicies[] = { - 1, 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, 1, 3, 2, 2, 2, 2, - 2, 2, 2, 4, 3, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 6, - 7, 8, 9, 10, 11, 12, 3, 13, - 14, 15, 16, 17, 9, 18, 19, 20, - 21, 22, 23, 24, 18, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 39, 41, 42, 1, 40, 43, - 40, 40, 44, 45, 46, 47, 48, 49, - 50, 51, 45, 52, 44, 53, 54, 55, - 56, 57, 58, 59, 40, 40, 40, 60, - 41, 42, 1, 40, 43, 40, 40, 61, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 53, 53, 54, 55, 56, 57, 58, - 59, 40, 40, 40, 60, 42, 62, 62, - 62, 62, 62, 62, 62, 63, 42, 41, - 42, 1, 40, 43, 40, 40, 40, 45, - 46, 47, 48, 49, 50, 51, 45, 52, - 53, 53, 54, 55, 56, 57, 58, 59, - 40, 40, 40, 60, 41, 40, 40, 40, - 40, 40, 40, 40, 45, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 54, - 55, 56, 57, 58, 59, 40, 40, 40, - 46, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 46, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 57, - 58, 59, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 47, 48, 49, 41, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 48, 49, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 49, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 57, - 58, 59, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 47, 48, 49, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 58, 59, 41, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 47, 48, 49, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 59, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 54, - 55, 56, 57, 58, 59, 40, 40, 40, - 46, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 46, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 55, 56, 57, - 58, 59, 40, 40, 40, 46, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 40, 40, 56, 57, 58, 59, 40, - 40, 40, 46, 41, 40, 40, 40, 40, - 40, 40, 40, 45, 46, 47, 48, 49, - 40, 51, 45, 40, 40, 40, 54, 55, - 56, 57, 58, 59, 40, 40, 40, 46, - 41, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 64, 45, - 40, 40, 40, 54, 55, 56, 57, 58, - 59, 40, 40, 40, 46, 41, 40, 40, - 40, 40, 40, 40, 40, 45, 46, 47, - 48, 49, 40, 40, 45, 40, 40, 40, - 54, 55, 56, 57, 58, 59, 40, 40, - 40, 46, 41, 40, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 40, 40, 40, 54, 55, 56, - 57, 58, 59, 40, 40, 40, 46, 41, - 42, 1, 40, 43, 40, 40, 40, 45, - 46, 47, 48, 49, 50, 51, 45, 52, - 40, 53, 54, 55, 56, 57, 58, 59, - 40, 40, 40, 60, 42, 62, 62, 62, - 41, 62, 62, 62, 63, 62, 62, 62, - 62, 46, 47, 48, 49, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 57, 58, - 59, 41, 42, 1, 40, 43, 40, 40, - 40, 45, 46, 47, 48, 49, 50, 51, - 45, 52, 44, 53, 54, 55, 56, 57, - 58, 59, 40, 40, 40, 60, 66, 65, - 65, 65, 67, 10, 66, 41, 42, 1, - 40, 43, 40, 40, 69, 45, 46, 47, - 48, 49, 50, 51, 45, 52, 44, 53, - 54, 55, 56, 57, 58, 59, 70, 71, - 40, 60, 41, 42, 1, 40, 43, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 44, 53, 54, 55, 56, - 57, 58, 59, 70, 71, 40, 60, 70, - 71, 71, 12, 3, 6, 73, 74, 73, - 73, 75, 18, 19, 20, 21, 22, 23, - 24, 18, 25, 27, 27, 28, 29, 30, - 31, 32, 33, 73, 73, 73, 37, 12, - 3, 6, 73, 74, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 27, 27, 28, 29, 30, 31, 32, 33, - 73, 73, 73, 37, 12, 73, 73, 73, - 73, 73, 73, 73, 18, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 28, - 29, 30, 31, 32, 33, 73, 73, 73, - 19, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 31, - 32, 33, 12, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 21, 22, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 22, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 31, - 32, 33, 12, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 32, 33, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 33, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 28, - 29, 30, 31, 32, 33, 73, 73, 73, - 19, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 29, 30, 31, - 32, 33, 73, 73, 73, 19, 12, 73, - 73, 73, 73, 73, 73, 73, 73, 19, - 20, 21, 22, 73, 73, 73, 73, 73, - 73, 73, 73, 30, 31, 32, 33, 73, - 73, 73, 19, 12, 73, 73, 73, 73, - 73, 73, 73, 18, 19, 20, 21, 22, - 73, 24, 18, 73, 73, 73, 28, 29, - 30, 31, 32, 33, 73, 73, 73, 19, - 12, 73, 73, 73, 73, 73, 73, 73, - 18, 19, 20, 21, 22, 73, 76, 18, - 73, 73, 73, 28, 29, 30, 31, 32, - 33, 73, 73, 73, 19, 12, 73, 73, - 73, 73, 73, 73, 73, 18, 19, 20, - 21, 22, 73, 73, 18, 73, 73, 73, - 28, 29, 30, 31, 32, 33, 73, 73, - 73, 19, 12, 73, 73, 73, 73, 73, - 73, 73, 18, 19, 20, 21, 22, 23, - 24, 18, 73, 73, 73, 28, 29, 30, - 31, 32, 33, 73, 73, 73, 19, 12, - 3, 6, 73, 74, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 73, 27, 28, 29, 30, 31, 32, 33, - 73, 73, 73, 37, 3, 73, 73, 73, - 12, 73, 73, 73, 4, 73, 73, 73, - 73, 19, 20, 21, 22, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 31, 32, - 33, 3, 77, 77, 77, 77, 77, 77, - 77, 4, 78, 14, 73, 73, 73, 79, - 14, 6, 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, 6, 8, 73, 73, 8, - 12, 3, 6, 14, 74, 73, 73, 73, - 18, 19, 20, 21, 22, 23, 24, 18, - 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 73, 37, 12, 3, 6, - 73, 74, 73, 73, 73, 18, 19, 20, - 21, 22, 23, 24, 18, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 73, 73, - 73, 37, 34, 35, 35, 70, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 70, - 71, 8, 77, 77, 8, 0 -}; - -static const char _use_syllable_machine_index_defaults[] = { - 0, 2, 2, 5, 9, 38, 40, 40, - 62, 62, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 62, 40, 65, 68, 65, - 40, 40, 72, 72, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 77, - 73, 73, 73, 77, 73, 73, 73, 73, - 72, 77, 0 + 0, 3, 6, 8, 11, 45, 47, 70, + 92, 95, 97, 118, 132, 141, 146, 150, + 153, 161, 168, 174, 187, 199, 210, 226, + 242, 257, 273, 294, 305, 327, 330, 332, + 334, 359, 383, 386, 388, 410, 431, 445, + 454, 459, 463, 466, 474, 481, 487, 500, + 512, 523, 539, 555, 570, 586, 607, 618, + 621, 623, 626, 628, 631, 658, 680, 683, + 685, 689, 0 }; static const char _use_syllable_machine_trans_cond_spaces[] = { @@ -267,35 +175,581 @@ static const char _use_syllable_machine_trans_cond_spaces[] = { -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 + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -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, -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, + -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, -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, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0 +}; + +static const short _use_syllable_machine_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 0 +}; + +static const char _use_syllable_machine_trans_lengths[] = { + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 1, 1, + 1, 1, 1, 1, 1, 0 +}; + +static const char _use_syllable_machine_cond_keys[] = { + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 0, 0, 0, 0 }; static const char _use_syllable_machine_cond_targs[] = { - 4, 8, 4, 36, 2, 4, 1, 5, - 6, 4, 29, 32, 4, 55, 56, 59, - 60, 64, 38, 39, 40, 41, 42, 49, - 50, 52, 61, 53, 46, 47, 48, 43, - 44, 45, 62, 63, 65, 54, 4, 4, - 4, 4, 7, 0, 28, 11, 12, 13, - 14, 15, 22, 23, 25, 26, 19, 20, - 21, 16, 17, 18, 27, 10, 4, 9, - 24, 4, 30, 31, 4, 33, 34, 35, - 4, 4, 3, 37, 51, 4, 57, 58, - 0 + 8, 8, 4, 36, 2, 4, 36, 4, + 1, 1, 4, 5, 6, 5, 29, 32, + 4, 36, 55, 56, 59, 60, 64, 39, + 40, 41, 42, 49, 50, 52, 61, 53, + 46, 47, 48, 43, 44, 45, 62, 63, + 65, 54, 5, 38, 4, 4, 4, 4, + 7, 8, 0, 11, 12, 13, 14, 15, + 22, 23, 11, 25, 26, 19, 20, 21, + 16, 17, 18, 27, 28, 4, 4, 7, + 8, 0, 10, 12, 13, 14, 15, 22, + 23, 25, 19, 20, 21, 16, 17, 18, + 27, 11, 26, 4, 7, 9, 4, 7, + 4, 4, 7, 8, 0, 12, 13, 14, + 15, 22, 23, 25, 19, 20, 21, 16, + 17, 18, 27, 11, 26, 4, 4, 11, + 12, 13, 14, 15, 19, 20, 21, 16, + 17, 18, 12, 4, 4, 12, 13, 14, + 15, 16, 17, 18, 4, 4, 13, 14, + 15, 4, 4, 14, 15, 4, 4, 15, + 4, 4, 13, 14, 15, 16, 17, 18, + 4, 4, 13, 14, 15, 17, 18, 4, + 4, 13, 14, 15, 18, 4, 4, 12, + 13, 14, 15, 19, 20, 21, 16, 17, + 18, 12, 4, 4, 12, 13, 14, 15, + 20, 21, 16, 17, 18, 12, 4, 4, + 12, 13, 14, 15, 21, 16, 17, 18, + 12, 4, 4, 11, 12, 13, 14, 15, + 23, 11, 19, 20, 21, 16, 17, 18, + 12, 4, 4, 11, 12, 13, 14, 15, + 24, 11, 19, 20, 21, 16, 17, 18, + 12, 4, 4, 11, 12, 13, 14, 15, + 11, 19, 20, 21, 16, 17, 18, 12, + 4, 4, 12, 13, 14, 15, 22, 23, + 19, 20, 21, 16, 17, 18, 12, 11, + 4, 4, 7, 8, 0, 12, 13, 14, + 15, 22, 23, 25, 26, 19, 20, 21, + 16, 17, 18, 27, 11, 4, 7, 4, + 9, 12, 13, 14, 15, 16, 17, 18, + 4, 4, 7, 8, 0, 12, 13, 14, + 15, 22, 23, 25, 28, 26, 19, 20, + 21, 16, 17, 18, 27, 11, 4, 30, + 31, 4, 29, 4, 30, 4, 4, 7, + 8, 0, 33, 12, 13, 14, 15, 22, + 23, 25, 28, 26, 19, 20, 21, 16, + 17, 18, 34, 35, 27, 11, 4, 4, + 7, 8, 0, 12, 13, 14, 15, 22, + 23, 25, 28, 26, 19, 20, 21, 16, + 17, 18, 34, 35, 27, 11, 4, 34, + 35, 4, 35, 4, 4, 36, 1, 3, + 37, 39, 40, 41, 42, 49, 50, 52, + 46, 47, 48, 43, 44, 45, 54, 38, + 53, 4, 4, 36, 1, 3, 39, 40, + 41, 42, 49, 50, 52, 46, 47, 48, + 43, 44, 45, 54, 38, 53, 4, 4, + 38, 39, 40, 41, 42, 46, 47, 48, + 43, 44, 45, 39, 4, 4, 39, 40, + 41, 42, 43, 44, 45, 4, 4, 40, + 41, 42, 4, 4, 41, 42, 4, 4, + 42, 4, 4, 40, 41, 42, 43, 44, + 45, 4, 4, 40, 41, 42, 44, 45, + 4, 4, 40, 41, 42, 45, 4, 4, + 39, 40, 41, 42, 46, 47, 48, 43, + 44, 45, 39, 4, 4, 39, 40, 41, + 42, 47, 48, 43, 44, 45, 39, 4, + 4, 39, 40, 41, 42, 48, 43, 44, + 45, 39, 4, 4, 38, 39, 40, 41, + 42, 50, 38, 46, 47, 48, 43, 44, + 45, 39, 4, 4, 38, 39, 40, 41, + 42, 51, 38, 46, 47, 48, 43, 44, + 45, 39, 4, 4, 38, 39, 40, 41, + 42, 38, 46, 47, 48, 43, 44, 45, + 39, 4, 4, 39, 40, 41, 42, 49, + 50, 46, 47, 48, 43, 44, 45, 39, + 38, 4, 4, 36, 1, 3, 39, 40, + 41, 42, 49, 50, 52, 53, 46, 47, + 48, 43, 44, 45, 54, 38, 4, 36, + 4, 2, 39, 40, 41, 42, 43, 44, + 45, 4, 36, 2, 4, 57, 4, 56, + 58, 4, 56, 4, 1, 1, 4, 6, + 6, 4, 36, 1, 56, 3, 39, 40, + 41, 42, 49, 50, 52, 61, 53, 46, + 47, 48, 43, 44, 45, 62, 63, 54, + 38, 4, 4, 36, 1, 3, 39, 40, + 41, 42, 49, 50, 52, 61, 53, 46, + 47, 48, 43, 44, 45, 54, 38, 4, + 62, 63, 4, 63, 4, 34, 34, 35, + 4, 6, 6, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 0 }; static const char _use_syllable_machine_cond_actions[] = { - 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 7, 9, 10, 0, 10, + 0, 0, 1, 3, 0, 2, 3, 2, + 0, 0, 4, 0, 7, 0, 0, 7, + 9, 3, 10, 0, 10, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 8, 12, 11, 14, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 7, 13, 14, 7, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 13, 7, 0, 15, 7, + 15, 14, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 13, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 14, 0, 0, 0, + 0, 0, 0, 0, 13, 14, 0, 0, + 0, 13, 14, 0, 0, 13, 14, 0, + 13, 14, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 0, 13, + 14, 0, 0, 0, 0, 13, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 14, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 7, 14, + 0, 0, 0, 0, 0, 0, 0, 0, + 15, 14, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, + 0, 16, 0, 17, 0, 16, 14, 7, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 14, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, + 0, 18, 0, 18, 9, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 11, 12, - 13, 14, 7, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, 15, 0, - 0, 16, 0, 0, 17, 7, 0, 0, - 18, 19, 0, 3, 0, 20, 0, 0, - 0 + 0, 0, 0, 0, 0, 0, 3, 0, + 3, 19, 9, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 3, 19, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 9, 0, 0, + 0, 0, 0, 0, 0, 19, 9, 0, + 0, 0, 19, 9, 0, 0, 19, 9, + 0, 19, 9, 0, 0, 0, 0, 0, + 0, 19, 9, 0, 0, 0, 0, 0, + 19, 9, 0, 0, 0, 0, 19, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, + 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 9, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 19, 3, + 9, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 3, 0, 20, 0, 19, 0, + 0, 19, 0, 19, 0, 0, 20, 7, + 7, 9, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 19, 9, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 3, 0, 19, + 0, 0, 19, 0, 19, 0, 0, 0, + 18, 7, 7, 20, 1, 2, 2, 4, + 11, 13, 13, 15, 15, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 15, 13, + 16, 17, 16, 13, 13, 18, 18, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 20, 19, 19, 19, 20, 19, + 19, 19, 19, 18, 20, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -323,6 +777,7 @@ static const char _use_syllable_machine_from_state_actions[] = { }; static const char _use_syllable_machine_eof_cond_spaces[] = { + -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, @@ -330,8 +785,7 @@ static const char _use_syllable_machine_eof_cond_spaces[] = { -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, -1, -1, - -1, -1, 0 + -1, -1, -1, -1, -1, -1, -1, 0 }; static const char _use_syllable_machine_eof_cond_key_offs[] = { @@ -362,16 +816,16 @@ static const char _use_syllable_machine_eof_cond_keys[] = { 0 }; -static const char _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 39, 41, 41, - 63, 63, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 63, 41, 66, 69, 66, - 41, 41, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 78, - 74, 74, 74, 78, 74, 74, 74, 74, - 73, 78, 0 +static const short _use_syllable_machine_eof_trans[] = { + 693, 694, 695, 696, 0, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 0 }; static const char _use_syllable_machine_nfa_targs[] = { @@ -439,7 +893,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { if ( p == pe ) goto _test_eof; _resume: { @@ -452,22 +906,57 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); + _keys = ( _use_syllable_machine_trans_keys + (_use_syllable_machine_key_offsets[cs])); + _trans = (unsigned int)_use_syllable_machine_index_offsets[cs]; - if ( (info[p].use_category()) <= 44 ) - { - int _ic = (int)_use_syllable_machine_char_class[(int)(info[p].use_category()) - 0]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + _klen = (int)_use_syllable_machine_single_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + _klen - 1; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (info[p].use_category()) < (*( _mid)) ) + _upper = _mid - 1; + else if ( (info[p].use_category()) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += (unsigned int)_klen; } - goto _match_cond; + _klen = (int)_use_syllable_machine_range_lengths[cs]; + if ( _klen > 0 ) { + const unsigned char *_lower = _keys; + const unsigned char *_upper = _keys + (_klen<<1) - 2; + const unsigned char *_mid; + while ( 1 ) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (info[p].use_category()) < (*( _mid)) ) + _upper = _mid - 2; + else if ( (info[p].use_category()) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += (unsigned int)_klen; + } + + _match: { + goto _match_cond; + } } _match_cond: { cs = (int)_use_syllable_machine_cond_targs[_trans]; From e98f0ddd6373f64ef4b542daa36b5841399170af Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 13:53:06 -0700 Subject: [PATCH 257/617] Fix extra semi-colon --- src/hb-iter.hh | 2 +- src/hb.hh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index dcc49ee5d..cf3e1fe9d 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -192,7 +192,7 @@ struct hb_iter_fallback_mixin_t /* Termination: Implement __more__(), or __len__() if random-access. */ bool __more__ () const { return bool (thiz()->len ()); } unsigned __len__ () const - { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; } + { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; } return l; } /* Advancing: Implement __next__(), or __forward__() if random-access. */ void __next__ () { *thiz() += 1; } diff --git a/src/hb.hh b/src/hb.hh index e4c7271bd..47f24af1e 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -67,6 +67,7 @@ #pragma GCC diagnostic error "-Wcast-function-type" #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" #pragma GCC diagnostic error "-Wdouble-promotion" +#pragma GCC diagnostic error "-Wextra-semi-stmt" #pragma GCC diagnostic error "-Wformat-security" #pragma GCC diagnostic error "-Wimplicit-function-declaration" #pragma GCC diagnostic error "-Winit-self" From 52c15b053aec06d351404a4c15609384946b26e1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:10:28 -0700 Subject: [PATCH 258/617] Revert "[ragel] Switch to -T1 output instead of -F1" This reverts commit ae8719eb596485ebff07dd5016256015cd0cf86b. Part of https://github.com/harfbuzz/harfbuzz/issues/1708 --- src/Makefile.am | 2 +- src/hb-buffer-deserialize-json.hh | 399 +-- src/hb-buffer-deserialize-text.hh | 312 +- src/hb-ot-shape-complex-indic-machine.hh | 3407 +++++--------------- src/hb-ot-shape-complex-khmer-machine.hh | 404 +-- src/hb-ot-shape-complex-myanmar-machine.hh | 748 ++--- src/hb-ot-shape-complex-use-machine.hh | 1017 ++---- 7 files changed, 1619 insertions(+), 4670 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 81eefde15..fc772e0ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -303,7 +303,7 @@ EXTRA_DIST += \ # We decided to add ragel-generated files to git... #MAINTAINERCLEANFILES += $(RAGEL_GENERATED) $(srcdir)/%.hh: $(srcdir)/%.rl - $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -T1 -o "$*.hh" "$*.rl") \ + $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \ || ($(RM) "$@"; false) noinst_PROGRAMS = \ diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 9ae5fdbdc..8631d52e8 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -30,69 +30,116 @@ #include "hb.hh" -static const short _deserialize_json_key_offsets[] = { - 0, 0, 4, 8, 12, 14, 15, 19, - 26, 29, 34, 39, 46, 47, 51, 58, - 61, 66, 73, 74, 75, 79, 85, 90, - 97, 99, 100, 104, 111, 114, 119, 126, - 127, 131, 138, 141, 146, 153, 154, 158, - 165, 169, 179, 184, 191, 196, 200, 0 -}; - static const unsigned char _deserialize_json_trans_keys[] = { - 32u, 123u, 9u, 13u, 32u, 34u, 9u, 13u, - 97u, 99u, 100u, 103u, 120u, 121u, 34u, 32u, - 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, - 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, - 9u, 13u, 32u, 44u, 125u, 9u, 13u, 32u, - 44u, 125u, 9u, 13u, 48u, 57u, 34u, 32u, - 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, - 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, - 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, - 57u, 108u, 34u, 32u, 58u, 9u, 13u, 32u, - 48u, 9u, 13u, 49u, 57u, 32u, 44u, 125u, - 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, - 57u, 120u, 121u, 34u, 32u, 58u, 9u, 13u, - 32u, 45u, 48u, 9u, 13u, 49u, 57u, 48u, - 49u, 57u, 32u, 44u, 125u, 9u, 13u, 32u, - 44u, 125u, 9u, 13u, 48u, 57u, 34u, 32u, - 58u, 9u, 13u, 32u, 45u, 48u, 9u, 13u, - 49u, 57u, 48u, 49u, 57u, 32u, 44u, 125u, - 9u, 13u, 32u, 44u, 125u, 9u, 13u, 48u, - 57u, 34u, 32u, 58u, 9u, 13u, 32u, 34u, - 48u, 9u, 13u, 49u, 57u, 65u, 90u, 97u, - 122u, 34u, 95u, 45u, 46u, 48u, 57u, 65u, - 90u, 97u, 122u, 32u, 44u, 125u, 9u, 13u, - 32u, 44u, 125u, 9u, 13u, 48u, 57u, 32u, - 44u, 93u, 9u, 13u, 32u, 123u, 9u, 13u, - 0u + 1u, 0u, 0u, 18u, 0u, 2u, 11u, 14u, + 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, + 6u, 7u, 0u, 19u, 0u, 19u, 0u, 19u, + 2u, 2u, 0u, 8u, 0u, 7u, 6u, 7u, + 0u, 19u, 0u, 19u, 15u, 15u, 2u, 2u, + 0u, 8u, 0u, 7u, 0u, 19u, 0u, 19u, + 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, + 6u, 7u, 0u, 19u, 0u, 19u, 2u, 2u, + 0u, 8u, 0u, 7u, 6u, 7u, 0u, 19u, + 0u, 19u, 2u, 2u, 0u, 8u, 0u, 7u, + 9u, 17u, 2u, 17u, 0u, 19u, 0u, 19u, + 0u, 10u, 0u, 18u, 1u, 0u, 0u }; -static const char _deserialize_json_single_lengths[] = { - 0, 2, 2, 4, 2, 1, 2, 3, - 1, 3, 3, 3, 1, 2, 3, 1, - 3, 3, 1, 1, 2, 2, 3, 3, - 2, 1, 2, 3, 1, 3, 3, 1, - 2, 3, 1, 3, 3, 1, 2, 3, - 0, 2, 3, 3, 3, 2, 0, 0 -}; - -static const char _deserialize_json_range_lengths[] = { - 0, 1, 1, 0, 0, 0, 1, 2, - 1, 1, 1, 2, 0, 1, 2, 1, - 1, 2, 0, 0, 1, 2, 1, 2, - 0, 0, 1, 2, 1, 1, 2, 0, - 1, 2, 1, 1, 2, 0, 1, 2, - 2, 4, 1, 2, 1, 1, 0, 0 +static const char _deserialize_json_char_class[] = { + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 4, 5, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 1, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 10, 1, 5, 1, + 11, 9, 12, 13, 9, 9, 14, 9, + 9, 9, 9, 15, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 16, + 17, 9, 18, 1, 19, 0 }; static const short _deserialize_json_index_offsets[] = { - 0, 0, 4, 8, 13, 16, 18, 22, - 28, 31, 36, 41, 47, 49, 53, 59, - 62, 67, 73, 75, 77, 81, 86, 91, - 97, 100, 102, 106, 112, 115, 120, 126, - 128, 132, 138, 141, 146, 152, 154, 158, - 164, 167, 174, 179, 185, 190, 194, 0 + 0, 0, 19, 22, 26, 28, 29, 38, + 46, 48, 68, 88, 108, 109, 118, 126, + 128, 148, 168, 169, 170, 179, 187, 207, + 227, 229, 230, 239, 247, 249, 269, 289, + 290, 299, 307, 309, 329, 349, 350, 359, + 367, 376, 392, 412, 432, 443, 462, 0 +}; + +static const char _deserialize_json_indicies[] = { + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 1, 4, 5, 6, + 7, 8, 9, 10, 11, 11, 1, 1, + 1, 1, 1, 1, 1, 12, 12, 1, + 1, 1, 13, 1, 14, 15, 16, 17, + 18, 1, 1, 19, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 20, 21, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 22, + 18, 1, 1, 19, 1, 1, 17, 17, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 20, 23, 23, 1, 1, + 1, 1, 1, 1, 1, 24, 24, 1, + 1, 1, 25, 1, 26, 27, 28, 29, + 30, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 32, 30, 1, 1, 31, + 1, 1, 29, 29, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 32, + 33, 34, 34, 1, 1, 1, 1, 1, + 1, 1, 35, 35, 1, 1, 1, 1, + 1, 36, 37, 38, 1, 1, 39, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 40, 38, + 1, 1, 39, 1, 1, 41, 41, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 40, 42, 43, 44, 44, 1, + 1, 1, 1, 1, 1, 1, 45, 45, + 1, 1, 1, 46, 1, 47, 48, 49, + 50, 51, 1, 1, 52, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 53, 51, 1, 1, + 52, 1, 1, 50, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 53, 54, 54, 1, 1, 1, 1, 1, + 1, 1, 55, 55, 1, 1, 1, 56, + 1, 57, 58, 59, 60, 61, 1, 1, + 62, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 63, 61, 1, 1, 62, 1, 1, 60, + 60, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 63, 64, 64, 1, + 1, 1, 1, 1, 1, 1, 65, 65, + 1, 66, 1, 1, 1, 67, 68, 69, + 1, 69, 69, 69, 69, 69, 69, 69, + 70, 1, 71, 71, 71, 71, 1, 71, + 1, 71, 71, 71, 71, 71, 71, 71, + 72, 1, 1, 73, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 74, 72, 1, 1, 73, + 1, 1, 75, 75, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 74, + 76, 1, 1, 77, 1, 1, 1, 1, + 1, 1, 78, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 0 +}; + +static const char _deserialize_json_index_defaults[] = { + 0, 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, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0 }; static const char _deserialize_json_trans_cond_spaces[] = { @@ -105,172 +152,43 @@ static const char _deserialize_json_trans_cond_spaces[] = { -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, -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, -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, -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, - -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 -}; - -static const short _deserialize_json_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 0 -}; - -static const char _deserialize_json_trans_lengths[] = { - 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, 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, 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, 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, - 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, 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, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0 -}; - -static const char _deserialize_json_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + -1, -1, -1, -1, -1, -1, -1, 0 }; static const char _deserialize_json_cond_targs[] = { - 1, 2, 1, 0, 2, 3, 2, 0, - 4, 18, 24, 37, 0, 5, 12, 0, - 6, 0, 6, 7, 6, 0, 7, 8, - 9, 7, 11, 0, 9, 11, 0, 10, - 2, 44, 10, 0, 10, 2, 44, 10, - 0, 10, 2, 44, 10, 11, 0, 13, - 0, 13, 14, 13, 0, 14, 15, 16, - 14, 17, 0, 16, 17, 0, 10, 2, - 44, 10, 0, 10, 2, 44, 10, 17, - 0, 19, 0, 20, 0, 20, 21, 20, - 0, 21, 22, 21, 23, 0, 10, 2, - 44, 10, 0, 10, 2, 44, 10, 23, - 0, 25, 31, 0, 26, 0, 26, 27, - 26, 0, 27, 28, 29, 27, 30, 0, - 29, 30, 0, 10, 2, 44, 10, 0, - 10, 2, 44, 10, 30, 0, 32, 0, - 32, 33, 32, 0, 33, 34, 35, 33, - 36, 0, 35, 36, 0, 10, 2, 44, - 10, 0, 10, 2, 44, 10, 36, 0, - 38, 0, 38, 39, 38, 0, 39, 40, - 42, 39, 43, 0, 41, 41, 0, 10, - 41, 41, 41, 41, 41, 0, 10, 2, - 44, 10, 0, 10, 2, 44, 10, 43, - 0, 44, 45, 46, 44, 0, 1, 2, - 1, 0, 0, 0 + 1, 0, 2, 2, 3, 4, 18, 24, + 37, 5, 12, 6, 7, 8, 9, 11, + 9, 11, 10, 2, 44, 10, 44, 13, + 14, 15, 16, 17, 16, 17, 10, 2, + 44, 19, 20, 21, 22, 23, 10, 2, + 44, 23, 25, 31, 26, 27, 28, 29, + 30, 29, 30, 10, 2, 44, 32, 33, + 34, 35, 36, 35, 36, 10, 2, 44, + 38, 39, 40, 42, 43, 41, 10, 41, + 10, 2, 44, 43, 44, 45, 46, 0 }; static const char _deserialize_json_cond_actions[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 3, - 3, 4, 3, 0, 0, 0, 5, 0, - 0, 3, 3, 4, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 2, - 0, 2, 0, 0, 0, 0, 6, 6, - 7, 6, 0, 6, 6, 7, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 2, 0, 8, 8, - 9, 8, 0, 8, 8, 9, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 10, 10, 11, 10, 0, - 10, 10, 11, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 12, 12, 13, - 12, 0, 12, 12, 13, 12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 2, 0, 2, 2, 0, 14, - 0, 0, 0, 0, 0, 0, 15, 15, - 16, 15, 0, 15, 15, 16, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0 + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, + 0, 0, 3, 3, 4, 0, 5, 0, + 0, 2, 2, 2, 0, 0, 6, 6, + 7, 0, 0, 0, 2, 2, 8, 8, + 9, 0, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 10, 10, 11, 0, 0, + 2, 2, 2, 0, 0, 12, 12, 13, + 0, 0, 0, 2, 2, 2, 14, 0, + 15, 15, 16, 0, 0, 0, 0, 0 }; static const char _deserialize_json_eof_cond_spaces[] = { - -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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0 + -1, -1, -1, -1, -1, -1, 0 }; static const char _deserialize_json_eof_cond_key_offs[] = { @@ -353,63 +271,28 @@ hb_font_t *font) } { - int _klen;unsigned int _trans = 0;const unsigned char * _keys; { + unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: { - _keys = ( _deserialize_json_trans_keys + (_deserialize_json_key_offsets[cs])); - _trans = (unsigned int)_deserialize_json_index_offsets[cs]; + _keys = ( _deserialize_json_trans_keys + ((cs<<1))); + _inds = ( _deserialize_json_indicies + (_deserialize_json_index_offsets[cs])); - _klen = (int)_deserialize_json_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( ( (*( p))) < (*( _mid)) ) - _upper = _mid - 1; - else if ( ( (*( p))) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( ( (*( p))) <= 125 && ( (*( p))) >= 9 ) + { + int _ic = (int)_deserialize_json_char_class[(int)( (*( p))) - 9]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_deserialize_json_index_defaults[cs]; + } + else { + _trans = (unsigned int)_deserialize_json_index_defaults[cs]; } - _klen = (int)_deserialize_json_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( ( (*( p))) < (*( _mid)) ) - _upper = _mid - 2; - else if ( ( (*( p))) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_deserialize_json_cond_targs[_trans]; diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index 702943660..28ab3f1cd 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -30,54 +30,76 @@ #include "hb.hh" -static const short _deserialize_text_key_offsets[] = { - 0, 0, 10, 14, 17, 21, 24, 27, - 31, 34, 35, 39, 42, 45, 53, 58, - 58, 68, 78, 84, 89, 96, 104, 111, - 117, 125, 134, 0 -}; - static const unsigned char _deserialize_text_trans_keys[] = { - 32u, 48u, 9u, 13u, 49u, 57u, 65u, 90u, - 97u, 122u, 45u, 48u, 49u, 57u, 48u, 49u, - 57u, 45u, 48u, 49u, 57u, 48u, 49u, 57u, - 48u, 49u, 57u, 45u, 48u, 49u, 57u, 48u, - 49u, 57u, 44u, 45u, 48u, 49u, 57u, 48u, - 49u, 57u, 44u, 48u, 57u, 32u, 43u, 61u, - 64u, 93u, 124u, 9u, 13u, 32u, 93u, 124u, - 9u, 13u, 32u, 48u, 9u, 13u, 49u, 57u, - 65u, 90u, 97u, 122u, 32u, 43u, 61u, 64u, - 93u, 124u, 9u, 13u, 48u, 57u, 32u, 44u, - 93u, 124u, 9u, 13u, 32u, 93u, 124u, 9u, - 13u, 32u, 93u, 124u, 9u, 13u, 48u, 57u, - 32u, 44u, 93u, 124u, 9u, 13u, 48u, 57u, - 32u, 43u, 64u, 93u, 124u, 9u, 13u, 32u, - 43u, 93u, 124u, 9u, 13u, 32u, 43u, 93u, - 124u, 9u, 13u, 48u, 57u, 32u, 43u, 64u, - 93u, 124u, 9u, 13u, 48u, 57u, 32u, 43u, - 61u, 64u, 93u, 95u, 124u, 9u, 13u, 45u, - 46u, 48u, 57u, 65u, 90u, 97u, 122u, 0u + 1u, 0u, 0u, 10u, 4u, 7u, 6u, 7u, + 4u, 7u, 6u, 7u, 6u, 7u, 4u, 7u, + 6u, 7u, 3u, 3u, 4u, 7u, 6u, 7u, + 3u, 7u, 0u, 12u, 0u, 12u, 1u, 0u, + 0u, 10u, 0u, 12u, 0u, 12u, 0u, 12u, + 0u, 12u, 0u, 12u, 0u, 12u, 0u, 12u, + 0u, 12u, 0u, 12u, 0u, 12u, 0u }; -static const char _deserialize_text_single_lengths[] = { - 0, 2, 2, 1, 2, 1, 1, 2, - 1, 1, 2, 1, 1, 6, 3, 0, - 2, 6, 4, 3, 3, 4, 5, 4, - 4, 5, 7, 0 +static const char _deserialize_text_char_class[] = { + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 4, 5, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 1, 1, 8, 1, 1, 9, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 1, 11, 1, 5, 1, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 12, 0 }; -static const char _deserialize_text_range_lengths[] = { - 0, 4, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 0, - 4, 2, 1, 1, 2, 2, 1, 1, - 2, 2, 5, 0 +static const short _deserialize_text_index_offsets[] = { + 0, 0, 11, 15, 17, 21, 23, 25, + 29, 31, 32, 36, 38, 43, 56, 69, + 69, 80, 93, 106, 119, 132, 145, 158, + 171, 184, 197, 0 }; -static const char _deserialize_text_index_offsets[] = { - 0, 0, 7, 11, 14, 18, 21, 24, - 28, 31, 33, 37, 40, 43, 51, 56, - 57, 64, 73, 79, 84, 90, 97, 104, - 110, 117, 125, 0 +static const char _deserialize_text_indicies[] = { + 0, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 5, 1, 6, 7, 8, + 9, 10, 1, 11, 12, 13, 14, 15, + 16, 17, 1, 18, 19, 20, 21, 22, + 23, 1, 24, 25, 26, 27, 22, 1, + 1, 21, 21, 28, 1, 29, 1, 1, + 1, 1, 1, 30, 31, 1, 32, 33, + 34, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 35, 36, 0, 1, 1, + 1, 1, 1, 2, 3, 1, 1, 4, + 28, 1, 29, 1, 1, 1, 37, 37, + 30, 31, 1, 32, 33, 38, 1, 1, + 39, 1, 1, 1, 1, 1, 1, 1, + 40, 41, 42, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 43, 44, 42, + 1, 1, 1, 1, 1, 14, 14, 1, + 1, 1, 43, 44, 38, 1, 1, 39, + 1, 1, 9, 9, 1, 1, 1, 40, + 41, 45, 1, 46, 1, 1, 1, 1, + 1, 1, 47, 1, 48, 49, 50, 1, + 51, 1, 1, 1, 1, 1, 1, 1, + 1, 52, 53, 50, 1, 51, 1, 1, + 1, 27, 27, 1, 1, 1, 52, 53, + 45, 1, 46, 1, 1, 1, 54, 54, + 1, 47, 1, 48, 49, 28, 1, 29, + 1, 55, 55, 55, 55, 30, 31, 55, + 32, 33, 0 +}; + +static const char _deserialize_text_index_defaults[] = { + 0, 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 }; static const char _deserialize_text_trans_cond_spaces[] = { @@ -88,136 +110,36 @@ static const char _deserialize_text_trans_cond_spaces[] = { -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, -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, -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, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0 -}; - -static const short _deserialize_text_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 0 -}; - -static const char _deserialize_text_trans_lengths[] = { - 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, 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, 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, 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, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0 -}; - -static const char _deserialize_text_cond_keys[] = { - 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, 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, 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, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0 }; static const char _deserialize_text_cond_targs[] = { - 1, 13, 1, 17, 26, 26, 0, 3, - 18, 21, 0, 18, 21, 0, 5, 19, - 20, 0, 19, 20, 0, 22, 25, 0, - 8, 9, 12, 0, 9, 12, 0, 10, - 0, 11, 23, 24, 0, 23, 24, 0, - 10, 12, 0, 14, 2, 6, 7, 15, - 16, 14, 0, 14, 15, 16, 14, 0, - 0, 1, 13, 1, 17, 26, 26, 0, - 14, 2, 6, 7, 15, 16, 14, 17, - 0, 14, 4, 15, 16, 14, 0, 14, - 15, 16, 14, 0, 14, 15, 16, 14, - 20, 0, 14, 4, 15, 16, 14, 21, - 0, 14, 2, 7, 15, 16, 14, 0, - 14, 2, 15, 16, 14, 0, 14, 2, - 15, 16, 14, 24, 0, 14, 2, 7, - 15, 16, 14, 25, 0, 14, 2, 6, - 7, 15, 26, 16, 14, 26, 26, 26, - 26, 0, 0 + 1, 0, 13, 17, 26, 3, 18, 21, + 18, 21, 5, 19, 20, 19, 20, 22, + 25, 8, 9, 12, 9, 12, 10, 11, + 23, 24, 23, 24, 14, 2, 6, 7, + 15, 16, 14, 15, 16, 17, 14, 4, + 15, 16, 14, 15, 16, 14, 2, 7, + 15, 16, 14, 2, 15, 16, 25, 26, + 0 }; static const char _deserialize_text_cond_actions[] = { - 0, 1, 0, 1, 1, 1, 0, 2, - 2, 2, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 0, 0, 3, - 0, 2, 2, 2, 0, 0, 0, 0, - 3, 0, 0, 4, 5, 5, 5, 4, - 4, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 1, 1, 1, 0, - 4, 5, 5, 5, 4, 4, 4, 0, - 0, 6, 7, 6, 6, 6, 0, 8, - 8, 8, 8, 0, 8, 8, 8, 8, - 0, 0, 6, 7, 6, 6, 6, 0, - 0, 9, 10, 10, 9, 9, 9, 0, - 11, 12, 11, 11, 11, 0, 11, 12, - 11, 11, 11, 0, 0, 9, 10, 10, - 9, 9, 9, 0, 0, 4, 5, 5, - 5, 4, 0, 4, 4, 0, 0, 0, - 0, 0, 0 -}; - -static const char _deserialize_text_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 4, 6, 8, 8, 6, 9, 11, - 11, 9, 4, 0 + 0, 0, 1, 1, 1, 2, 2, 2, + 0, 0, 2, 2, 2, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 3, 2, + 2, 2, 0, 0, 4, 5, 5, 5, + 4, 4, 0, 0, 0, 0, 6, 7, + 6, 6, 8, 8, 8, 9, 10, 10, + 9, 9, 11, 12, 11, 11, 0, 0, + 0 }; static const char _deserialize_text_eof_cond_spaces[] = { - -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 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 0 }; static const char _deserialize_text_eof_cond_key_offs[] = { @@ -238,6 +160,13 @@ static const char _deserialize_text_eof_cond_keys[] = { 0 }; +static const char _deserialize_text_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 4, 6, 8, 8, 6, 9, 11, + 11, 9, 4, 0 +}; + static const char _deserialize_text_nfa_targs[] = { 0, 0 }; @@ -295,63 +224,28 @@ hb_font_t *font) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: { - _keys = ( _deserialize_text_trans_keys + (_deserialize_text_key_offsets[cs])); - _trans = (unsigned int)_deserialize_text_index_offsets[cs]; + _keys = ( _deserialize_text_trans_keys + ((cs<<1))); + _inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs])); - _klen = (int)_deserialize_text_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( ( (*( p))) < (*( _mid)) ) - _upper = _mid - 1; - else if ( ( (*( p))) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) + { + int _ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_deserialize_text_index_defaults[cs]; + } + else { + _trans = (unsigned int)_deserialize_text_index_defaults[cs]; } - _klen = (int)_deserialize_text_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( ( (*( p))) < (*( _mid)) ) - _upper = _mid - 2; - else if ( ( (*( p))) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_deserialize_text_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index 8474d4b9a..dbab7e042 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -30,489 +30,663 @@ #include "hb.hh" -static const short _indic_syllable_machine_key_offsets[] = { - 0, 1, 6, 9, 10, 14, 17, 18, - 22, 25, 26, 30, 33, 34, 36, 37, - 38, 43, 44, 45, 50, 51, 52, 57, - 58, 59, 65, 70, 76, 81, 87, 92, - 98, 103, 109, 110, 115, 118, 119, 123, - 126, 127, 131, 134, 135, 139, 142, 143, - 145, 146, 147, 152, 153, 154, 159, 160, - 161, 166, 167, 168, 174, 179, 185, 190, - 196, 201, 207, 212, 218, 219, 224, 227, - 228, 232, 235, 236, 240, 243, 244, 248, - 251, 252, 254, 255, 256, 261, 262, 263, - 268, 269, 270, 275, 276, 277, 283, 288, - 294, 299, 305, 310, 316, 321, 322, 327, - 330, 331, 335, 338, 339, 343, 346, 347, - 351, 354, 355, 357, 358, 359, 364, 365, - 366, 371, 372, 373, 378, 379, 380, 386, - 391, 397, 402, 408, 413, 419, 424, 430, - 436, 440, 441, 458, 467, 475, 482, 488, - 497, 505, 512, 518, 527, 535, 542, 548, - 557, 565, 572, 578, 587, 595, 602, 606, - 610, 613, 614, 615, 616, 618, 623, 627, - 634, 640, 645, 652, 658, 663, 670, 676, - 681, 687, 692, 698, 706, 715, 722, 728, - 734, 742, 751, 758, 764, 770, 778, 787, - 794, 800, 806, 814, 823, 830, 836, 842, - 850, 859, 868, 876, 883, 889, 898, 906, - 913, 919, 928, 936, 943, 949, 958, 966, - 973, 979, 988, 996, 1003, 1007, 1011, 1014, - 1015, 1016, 1017, 1019, 1024, 1028, 1035, 1041, - 1046, 1053, 1059, 1064, 1071, 1077, 1082, 1088, - 1093, 1099, 1107, 1116, 1123, 1129, 1135, 1143, - 1152, 1159, 1165, 1171, 1179, 1188, 1195, 1201, - 1207, 1215, 1224, 1231, 1237, 1243, 1248, 1256, - 1264, 1271, 1277, 1286, 1294, 1301, 1307, 1316, - 1324, 1331, 1337, 1346, 1354, 1361, 1367, 1376, - 1384, 1391, 1395, 1399, 1402, 1403, 1404, 1405, - 1407, 1412, 1416, 1423, 1429, 1434, 1441, 1447, - 1452, 1459, 1465, 1470, 1476, 1481, 1487, 1495, - 1504, 1511, 1517, 1523, 1531, 1540, 1547, 1553, - 1559, 1567, 1576, 1583, 1589, 1595, 1603, 1612, - 1619, 1625, 1631, 1637, 1645, 1650, 1659, 1667, - 1674, 1680, 1689, 1697, 1704, 1710, 1719, 1727, - 1734, 1740, 1749, 1757, 1764, 1770, 1779, 1787, - 1794, 1798, 1802, 1805, 1806, 1807, 1808, 1810, - 1815, 1819, 1826, 1832, 1837, 1844, 1850, 1855, - 1862, 1868, 1873, 1879, 1884, 1890, 1898, 1907, - 1914, 1920, 1926, 1934, 1943, 1950, 1956, 1962, - 1970, 1979, 1986, 1992, 1998, 2006, 2015, 2022, - 2028, 2034, 2042, 2056, 2065, 2078, 2085, 2088, - 2089, 2090, 2091, 2093, 2102, 2107, 2111, 2114, - 2115, 2116, 2117, 2119, 0 -}; - static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 4u, 7u, 8u, 5u, 6u, 7u, 5u, - 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, - 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, - 6u, 7u, 7u, 8u, 5u, 6u, 7u, 5u, - 6u, 7u, 4u, 8u, 6u, 16u, 4u, 7u, - 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, - 5u, 6u, 6u, 16u, 4u, 7u, 8u, 5u, - 6u, 6u, 16u, 4u, 7u, 8u, 13u, 5u, - 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, - 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, - 6u, 4u, 7u, 8u, 13u, 5u, 6u, 4u, - 7u, 8u, 5u, 6u, 4u, 7u, 8u, 13u, - 5u, 6u, 4u, 7u, 8u, 5u, 6u, 4u, - 7u, 8u, 13u, 5u, 6u, 8u, 4u, 7u, - 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, - 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, - 8u, 5u, 6u, 7u, 5u, 6u, 7u, 7u, - 8u, 5u, 6u, 7u, 5u, 6u, 7u, 4u, - 8u, 6u, 16u, 4u, 7u, 8u, 5u, 6u, - 6u, 16u, 4u, 7u, 8u, 5u, 6u, 6u, - 16u, 4u, 7u, 8u, 5u, 6u, 6u, 16u, - 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, - 8u, 5u, 6u, 4u, 7u, 8u, 13u, 5u, - 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, - 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, - 6u, 4u, 7u, 8u, 13u, 5u, 6u, 4u, - 7u, 8u, 5u, 6u, 4u, 7u, 8u, 13u, - 5u, 6u, 8u, 4u, 7u, 8u, 5u, 6u, - 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, - 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, - 7u, 5u, 6u, 7u, 7u, 8u, 5u, 6u, - 7u, 5u, 6u, 7u, 4u, 8u, 6u, 16u, - 4u, 7u, 8u, 5u, 6u, 6u, 16u, 4u, - 7u, 8u, 5u, 6u, 6u, 16u, 4u, 7u, - 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, - 13u, 5u, 6u, 4u, 7u, 8u, 5u, 6u, - 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, - 8u, 5u, 6u, 4u, 7u, 8u, 13u, 5u, - 6u, 4u, 7u, 8u, 5u, 6u, 4u, 7u, - 8u, 13u, 5u, 6u, 4u, 7u, 8u, 5u, - 6u, 8u, 4u, 7u, 8u, 5u, 6u, 7u, - 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, - 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, - 5u, 6u, 7u, 7u, 8u, 5u, 6u, 7u, - 5u, 6u, 7u, 4u, 8u, 6u, 16u, 4u, - 7u, 8u, 5u, 6u, 6u, 16u, 4u, 7u, - 8u, 5u, 6u, 6u, 16u, 4u, 7u, 8u, - 5u, 6u, 6u, 16u, 4u, 7u, 8u, 13u, - 5u, 6u, 4u, 7u, 8u, 5u, 6u, 4u, - 7u, 8u, 13u, 5u, 6u, 4u, 7u, 8u, - 5u, 6u, 4u, 7u, 8u, 13u, 5u, 6u, - 4u, 7u, 8u, 5u, 6u, 4u, 7u, 8u, - 13u, 5u, 6u, 4u, 7u, 8u, 5u, 6u, - 4u, 7u, 8u, 13u, 5u, 6u, 4u, 7u, - 8u, 13u, 5u, 6u, 7u, 8u, 5u, 6u, - 8u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 15u, 16u, 17u, 18u, 19u, - 11u, 12u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 1u, 5u, 6u, 8u, 10u, 16u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, - 17u, 3u, 4u, 7u, 8u, 10u, 17u, 5u, - 6u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 1u, 5u, - 6u, 8u, 10u, 16u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 13u, 17u, 3u, 4u, 7u, - 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, - 10u, 17u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 5u, 6u, 8u, 10u, 8u, 10u, - 5u, 6u, 5u, 8u, 10u, 10u, 10u, 10u, - 5u, 10u, 3u, 8u, 10u, 5u, 6u, 5u, - 6u, 8u, 10u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 4u, 5u, 6u, 7u, 8u, 10u, - 7u, 8u, 10u, 5u, 6u, 3u, 4u, 5u, - 6u, 7u, 8u, 10u, 4u, 5u, 6u, 7u, - 8u, 10u, 7u, 8u, 10u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 4u, 5u, - 6u, 7u, 8u, 10u, 7u, 8u, 10u, 5u, - 6u, 3u, 4u, 5u, 6u, 8u, 10u, 4u, - 5u, 6u, 8u, 10u, 4u, 7u, 8u, 10u, - 5u, 6u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, - 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, - 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, - 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, - 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, - 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, - 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 17u, 4u, 5u, 6u, 7u, - 8u, 10u, 17u, 1u, 5u, 6u, 8u, 10u, - 16u, 3u, 4u, 5u, 6u, 7u, 8u, 10u, - 13u, 17u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 4u, 7u, 8u, 10u, 17u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 1u, - 5u, 6u, 8u, 10u, 16u, 3u, 4u, 5u, - 6u, 7u, 8u, 10u, 13u, 17u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 4u, 7u, - 8u, 10u, 17u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 3u, 4u, 7u, 8u, - 10u, 17u, 5u, 6u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 5u, 6u, 8u, 10u, 8u, - 10u, 5u, 6u, 5u, 8u, 10u, 10u, 10u, - 10u, 5u, 10u, 3u, 8u, 10u, 5u, 6u, - 5u, 6u, 8u, 10u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 4u, 5u, 6u, 7u, 8u, - 10u, 7u, 8u, 10u, 5u, 6u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 4u, 5u, 6u, - 7u, 8u, 10u, 7u, 8u, 10u, 5u, 6u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 4u, - 5u, 6u, 7u, 8u, 10u, 7u, 8u, 10u, - 5u, 6u, 3u, 4u, 5u, 6u, 8u, 10u, - 4u, 5u, 6u, 8u, 10u, 4u, 7u, 8u, - 10u, 5u, 6u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, - 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, - 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, - 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, - 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 4u, 7u, 8u, 5u, 6u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 17u, - 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 1u, - 5u, 6u, 8u, 10u, 16u, 3u, 4u, 5u, - 6u, 7u, 8u, 10u, 13u, 17u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 4u, 7u, - 8u, 10u, 17u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 3u, 4u, 7u, 8u, - 10u, 17u, 5u, 6u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 1u, 5u, 6u, 8u, 10u, - 16u, 3u, 4u, 5u, 6u, 7u, 8u, 10u, - 13u, 17u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 4u, 7u, 8u, 10u, 17u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 3u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 5u, - 6u, 8u, 10u, 8u, 10u, 5u, 6u, 5u, - 8u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, - 8u, 10u, 5u, 6u, 5u, 6u, 8u, 10u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 4u, - 5u, 6u, 7u, 8u, 10u, 7u, 8u, 10u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 4u, 5u, 6u, 7u, 8u, 10u, 7u, - 8u, 10u, 5u, 6u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 4u, 5u, 6u, 7u, 8u, - 10u, 7u, 8u, 10u, 5u, 6u, 3u, 4u, - 5u, 6u, 8u, 10u, 4u, 5u, 6u, 8u, - 10u, 4u, 7u, 8u, 10u, 5u, 6u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, - 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, - 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 13u, 17u, - 1u, 3u, 8u, 10u, 16u, 5u, 6u, 1u, - 8u, 10u, 16u, 5u, 6u, 1u, 5u, 6u, - 8u, 10u, 16u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 13u, 17u, 1u, 3u, 8u, 10u, - 16u, 5u, 6u, 1u, 8u, 10u, 16u, 5u, - 6u, 1u, 5u, 6u, 8u, 10u, 16u, 4u, - 7u, 8u, 13u, 5u, 6u, 3u, 4u, 7u, - 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 1u, 5u, 6u, 8u, 10u, 16u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, - 17u, 3u, 4u, 7u, 8u, 10u, 17u, 5u, - 6u, 4u, 7u, 8u, 10u, 17u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 3u, - 4u, 7u, 8u, 10u, 17u, 5u, 6u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 1u, 5u, - 6u, 8u, 10u, 16u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 13u, 17u, 3u, 4u, 7u, - 8u, 10u, 17u, 5u, 6u, 4u, 7u, 8u, - 10u, 17u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 3u, 4u, 7u, 8u, 10u, - 17u, 5u, 6u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 5u, 6u, 8u, 10u, 8u, 10u, - 5u, 6u, 5u, 8u, 10u, 10u, 10u, 10u, - 5u, 10u, 3u, 8u, 10u, 5u, 6u, 5u, - 6u, 8u, 10u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 4u, 5u, 6u, 7u, 8u, 10u, - 7u, 8u, 10u, 5u, 6u, 3u, 4u, 5u, - 6u, 7u, 8u, 10u, 4u, 5u, 6u, 7u, - 8u, 10u, 7u, 8u, 10u, 5u, 6u, 3u, - 4u, 5u, 6u, 7u, 8u, 10u, 4u, 5u, - 6u, 7u, 8u, 10u, 7u, 8u, 10u, 5u, - 6u, 3u, 4u, 5u, 6u, 8u, 10u, 4u, - 5u, 6u, 8u, 10u, 4u, 7u, 8u, 10u, - 5u, 6u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, - 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, - 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, - 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 3u, 4u, 5u, 6u, 7u, 8u, - 10u, 13u, 17u, 1u, 3u, 8u, 10u, 16u, - 5u, 6u, 1u, 8u, 10u, 16u, 5u, 6u, - 1u, 5u, 6u, 8u, 10u, 16u, 3u, 4u, - 7u, 8u, 10u, 17u, 5u, 6u, 3u, 4u, - 5u, 6u, 7u, 8u, 10u, 13u, 17u, 1u, - 3u, 8u, 10u, 16u, 5u, 6u, 1u, 8u, - 10u, 16u, 5u, 6u, 1u, 5u, 6u, 8u, - 10u, 16u, 3u, 4u, 7u, 8u, 10u, 17u, - 5u, 6u, 1u, 2u, 3u, 4u, 5u, 6u, - 7u, 8u, 10u, 13u, 16u, 17u, 11u, 12u, - 3u, 4u, 5u, 6u, 7u, 8u, 10u, 13u, - 17u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, - 8u, 10u, 12u, 13u, 16u, 17u, 4u, 7u, - 8u, 10u, 13u, 5u, 6u, 5u, 8u, 10u, - 10u, 10u, 10u, 5u, 10u, 1u, 3u, 4u, - 7u, 8u, 10u, 16u, 5u, 6u, 3u, 8u, - 10u, 5u, 6u, 8u, 10u, 5u, 6u, 5u, - 8u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, - 11u, 16u, 0u + 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 7u, 7u, 3u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, + 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, + 3u, 7u, 7u, 7u, 3u, 7u, 4u, 6u, + 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, + 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, + 4u, 6u, 6u, 6u, 3u, 7u, 5u, 5u, + 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, + 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, + 5u, 5u, 14u, 14u, 3u, 12u, 3u, 7u, + 3u, 12u, 3u, 7u, 3u, 12u, 3u, 7u, + 3u, 12u, 3u, 7u, 3u, 12u, 3u, 12u, + 4u, 7u, 7u, 7u, 0u, 17u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, + 2u, 15u, 3u, 15u, 4u, 9u, 4u, 9u, + 4u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, + 4u, 9u, 2u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 3u, 9u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 3u, 7u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, + 3u, 15u, 4u, 9u, 4u, 9u, 4u, 9u, + 9u, 9u, 9u, 9u, 9u, 9u, 4u, 9u, + 2u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 3u, 9u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 3u, 12u, 2u, 15u, + 3u, 7u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, + 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, + 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, + 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, + 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, + 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, + 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, + 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, + 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, + 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, + 0u, 14u, 2u, 15u, 0u, 15u, 2u, 15u, + 0u, 15u, 3u, 12u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, + 2u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, + 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, + 0u }; -static const char _indic_syllable_machine_single_lengths[] = { - 1, 3, 1, 1, 2, 1, 1, 2, - 1, 1, 2, 1, 1, 2, 1, 1, - 3, 1, 1, 3, 1, 1, 3, 1, - 1, 4, 3, 4, 3, 4, 3, 4, - 3, 4, 1, 3, 1, 1, 2, 1, - 1, 2, 1, 1, 2, 1, 1, 2, - 1, 1, 3, 1, 1, 3, 1, 1, - 3, 1, 1, 4, 3, 4, 3, 4, - 3, 4, 3, 4, 1, 3, 1, 1, - 2, 1, 1, 2, 1, 1, 2, 1, - 1, 2, 1, 1, 3, 1, 1, 3, - 1, 1, 3, 1, 1, 4, 3, 4, - 3, 4, 3, 4, 3, 1, 3, 1, - 1, 2, 1, 1, 2, 1, 1, 2, - 1, 1, 2, 1, 1, 3, 1, 1, - 3, 1, 1, 3, 1, 1, 4, 3, - 4, 3, 4, 3, 4, 3, 4, 4, - 2, 1, 15, 9, 6, 5, 6, 9, - 6, 5, 6, 9, 6, 5, 6, 9, - 6, 5, 6, 9, 6, 5, 4, 2, - 3, 1, 1, 1, 2, 3, 4, 7, - 6, 3, 7, 6, 3, 7, 6, 3, - 6, 5, 4, 6, 9, 5, 4, 6, - 6, 9, 5, 4, 6, 6, 9, 5, - 4, 6, 6, 9, 5, 4, 6, 6, - 9, 9, 8, 7, 6, 9, 6, 5, - 6, 9, 6, 5, 6, 9, 6, 5, - 6, 9, 6, 5, 4, 2, 3, 1, - 1, 1, 2, 3, 4, 7, 6, 3, - 7, 6, 3, 7, 6, 3, 6, 5, - 4, 6, 9, 5, 4, 6, 6, 9, - 5, 4, 6, 6, 9, 5, 4, 6, - 6, 9, 5, 4, 6, 3, 8, 6, - 5, 6, 9, 6, 5, 6, 9, 6, - 5, 6, 9, 6, 5, 6, 9, 6, - 5, 4, 2, 3, 1, 1, 1, 2, - 3, 4, 7, 6, 3, 7, 6, 3, - 7, 6, 3, 6, 5, 4, 6, 9, - 5, 4, 6, 6, 9, 5, 4, 6, - 6, 9, 5, 4, 6, 6, 9, 5, - 4, 6, 4, 6, 3, 9, 6, 5, - 6, 9, 6, 5, 6, 9, 6, 5, - 6, 9, 6, 5, 6, 9, 6, 5, - 4, 2, 3, 1, 1, 1, 2, 3, - 4, 7, 6, 3, 7, 6, 3, 7, - 6, 3, 6, 5, 4, 6, 9, 5, - 4, 6, 6, 9, 5, 4, 6, 6, - 9, 5, 4, 6, 6, 9, 5, 4, - 6, 6, 12, 9, 13, 5, 3, 1, - 1, 1, 2, 7, 3, 2, 3, 1, - 1, 1, 2, 3, 0 -}; - -static const char _indic_syllable_machine_range_lengths[] = { - 0, 1, 1, 0, 1, 1, 0, 1, - 1, 0, 1, 1, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 1, 0, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 0, 1, 1, - 0, 1, 1, 0, 1, 1, 0, 0, - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, - 0, 0, 0, 0, 1, 0, 0, 1, - 0, 0, 1, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 1, 1, - 0, 1, 1, 0, 1, 1, 0, 1, - 1, 0, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 1, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 1, 1, 0, 0, - 1, 1, 0, 0, 1, 1, 0, 0, - 1, 1, 0, 0, 1, 1, 0, 1, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 1, 0, 0, 1, - 0, 0, 1, 1, 0, 1, 1, 0, - 1, 0, 1, 1, 0, 1, 0, 1, - 1, 0, 1, 0, 1, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 1, - 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 1, 1, 0, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 1, 0, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 0, 1, 1, 0, - 1, 0, 1, 1, 0, 1, 0, 1, - 1, 0, 0, 1, 1, 0, 0, 1, - 1, 0, 0, 1, 1, 0, 0, 1, - 1, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 1, - 0, 0, 1, 0, 0, 1, 1, 0, - 1, 1, 0, 1, 0, 1, 1, 0, - 1, 0, 1, 1, 0, 1, 0, 1, - 1, 0, 1, 1, 1, 0, 1, 1, - 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 1, 1, 0, 0, 1, 1, - 0, 1, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, 1, 0, - 0, 1, 0, 0, 1, 1, 0, 1, - 1, 0, 1, 0, 1, 1, 0, 1, - 0, 1, 1, 0, 1, 0, 1, 1, - 0, 1, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0 +static const char _indic_syllable_machine_char_class[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 8, 13, 14, + 15, 16, 17, 0 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 7, 10, 12, 16, 19, 21, - 25, 28, 30, 34, 37, 39, 42, 44, - 46, 51, 53, 55, 60, 62, 64, 69, - 71, 73, 79, 84, 90, 95, 101, 106, - 112, 117, 123, 125, 130, 133, 135, 139, - 142, 144, 148, 151, 153, 157, 160, 162, - 165, 167, 169, 174, 176, 178, 183, 185, - 187, 192, 194, 196, 202, 207, 213, 218, - 224, 229, 235, 240, 246, 248, 253, 256, - 258, 262, 265, 267, 271, 274, 276, 280, - 283, 285, 288, 290, 292, 297, 299, 301, - 306, 308, 310, 315, 317, 319, 325, 330, - 336, 341, 347, 352, 358, 363, 365, 370, - 373, 375, 379, 382, 384, 388, 391, 393, - 397, 400, 402, 405, 407, 409, 414, 416, - 418, 423, 425, 427, 432, 434, 436, 442, - 447, 453, 458, 464, 469, 475, 480, 486, - 492, 496, 498, 515, 525, 533, 540, 547, - 557, 565, 572, 579, 589, 597, 604, 611, - 621, 629, 636, 643, 653, 661, 668, 673, - 677, 681, 683, 685, 687, 690, 695, 700, - 708, 715, 720, 728, 735, 740, 748, 755, - 760, 767, 773, 779, 787, 797, 804, 810, - 817, 825, 835, 842, 848, 855, 863, 873, - 880, 886, 893, 901, 911, 918, 924, 931, - 939, 949, 959, 968, 976, 983, 993, 1001, - 1008, 1015, 1025, 1033, 1040, 1047, 1057, 1065, - 1072, 1079, 1089, 1097, 1104, 1109, 1113, 1117, - 1119, 1121, 1123, 1126, 1131, 1136, 1144, 1151, - 1156, 1164, 1171, 1176, 1184, 1191, 1196, 1203, - 1209, 1215, 1223, 1233, 1240, 1246, 1253, 1261, - 1271, 1278, 1284, 1291, 1299, 1309, 1316, 1322, - 1329, 1337, 1347, 1354, 1360, 1367, 1372, 1381, - 1389, 1396, 1403, 1413, 1421, 1428, 1435, 1445, - 1453, 1460, 1467, 1477, 1485, 1492, 1499, 1509, - 1517, 1524, 1529, 1533, 1537, 1539, 1541, 1543, - 1546, 1551, 1556, 1564, 1571, 1576, 1584, 1591, - 1596, 1604, 1611, 1616, 1623, 1629, 1635, 1643, - 1653, 1660, 1666, 1673, 1681, 1691, 1698, 1704, - 1711, 1719, 1729, 1736, 1742, 1749, 1757, 1767, - 1774, 1780, 1787, 1793, 1801, 1806, 1816, 1824, - 1831, 1838, 1848, 1856, 1863, 1870, 1880, 1888, - 1895, 1902, 1912, 1920, 1927, 1934, 1944, 1952, - 1959, 1964, 1968, 1972, 1974, 1976, 1978, 1981, - 1986, 1991, 1999, 2006, 2011, 2019, 2026, 2031, - 2039, 2046, 2051, 2058, 2064, 2070, 2078, 2088, - 2095, 2101, 2108, 2116, 2126, 2133, 2139, 2146, - 2154, 2164, 2171, 2177, 2184, 2192, 2202, 2209, - 2215, 2222, 2230, 2244, 2254, 2268, 2275, 2279, - 2281, 2283, 2285, 2288, 2297, 2302, 2306, 2310, - 2312, 2314, 2316, 2319, 0 + 0, 1, 6, 9, 10, 14, 17, 18, + 22, 25, 26, 30, 33, 34, 39, 40, + 41, 46, 47, 48, 53, 54, 55, 60, + 61, 62, 72, 77, 87, 92, 102, 107, + 117, 122, 132, 133, 138, 141, 142, 146, + 149, 150, 154, 157, 158, 162, 165, 166, + 171, 172, 173, 178, 179, 180, 185, 186, + 187, 192, 193, 194, 204, 209, 219, 224, + 234, 239, 249, 254, 264, 265, 270, 273, + 274, 278, 281, 282, 286, 289, 290, 294, + 297, 298, 303, 304, 305, 310, 311, 312, + 317, 318, 319, 324, 325, 326, 336, 341, + 351, 356, 366, 371, 381, 386, 387, 392, + 395, 396, 400, 403, 404, 408, 411, 412, + 416, 419, 420, 425, 426, 427, 432, 433, + 434, 439, 440, 441, 446, 447, 448, 458, + 463, 473, 478, 488, 493, 503, 508, 518, + 528, 532, 533, 551, 565, 579, 592, 607, + 621, 635, 648, 663, 677, 691, 704, 719, + 733, 747, 760, 775, 789, 803, 816, 822, + 828, 834, 835, 836, 837, 843, 851, 857, + 865, 872, 878, 886, 893, 899, 907, 914, + 920, 928, 935, 942, 956, 970, 985, 1000, + 1015, 1029, 1043, 1058, 1073, 1088, 1102, 1116, + 1131, 1146, 1161, 1175, 1189, 1204, 1219, 1234, + 1248, 1262, 1276, 1290, 1303, 1318, 1332, 1346, + 1359, 1374, 1388, 1402, 1415, 1430, 1444, 1458, + 1471, 1486, 1500, 1514, 1527, 1533, 1539, 1545, + 1546, 1547, 1548, 1554, 1562, 1568, 1576, 1583, + 1589, 1597, 1604, 1610, 1618, 1625, 1631, 1639, + 1646, 1653, 1667, 1681, 1696, 1711, 1726, 1740, + 1754, 1769, 1784, 1799, 1813, 1827, 1842, 1857, + 1872, 1886, 1900, 1915, 1930, 1945, 1950, 1964, + 1978, 1991, 2006, 2020, 2034, 2047, 2062, 2076, + 2090, 2103, 2118, 2132, 2146, 2159, 2174, 2188, + 2202, 2215, 2221, 2227, 2233, 2234, 2235, 2236, + 2242, 2250, 2256, 2264, 2271, 2277, 2285, 2292, + 2298, 2306, 2313, 2319, 2327, 2334, 2341, 2355, + 2369, 2384, 2399, 2414, 2428, 2442, 2457, 2472, + 2487, 2501, 2515, 2530, 2545, 2560, 2574, 2588, + 2603, 2618, 2633, 2643, 2657, 2662, 2676, 2690, + 2703, 2718, 2732, 2746, 2759, 2774, 2788, 2802, + 2815, 2830, 2844, 2858, 2871, 2886, 2900, 2914, + 2927, 2933, 2939, 2945, 2946, 2947, 2948, 2954, + 2962, 2968, 2976, 2983, 2989, 2997, 3004, 3010, + 3018, 3025, 3031, 3039, 3046, 3053, 3067, 3081, + 3096, 3111, 3126, 3140, 3154, 3169, 3184, 3199, + 3213, 3227, 3242, 3257, 3272, 3286, 3300, 3315, + 3330, 3345, 3359, 3375, 3389, 3405, 3415, 3421, + 3422, 3423, 3424, 3430, 3445, 3453, 3459, 3465, + 3466, 3467, 3468, 3474, 0 +}; + +static const short _indic_syllable_machine_indicies[] = { + 1, 2, 3, 3, 4, 1, 5, 5, + 4, 4, 6, 6, 7, 1, 8, 8, + 7, 7, 9, 9, 10, 1, 11, 11, + 10, 10, 12, 12, 13, 1, 14, 14, + 13, 13, 15, 0, 0, 0, 1, 16, + 17, 18, 12, 12, 13, 1, 19, 20, + 21, 9, 9, 10, 1, 22, 23, 24, + 6, 6, 7, 1, 25, 26, 2, 3, + 3, 4, 1, 0, 0, 0, 0, 27, + 28, 3, 3, 4, 1, 28, 3, 3, + 4, 1, 0, 0, 0, 0, 29, 30, + 3, 3, 4, 1, 30, 3, 3, 4, + 1, 0, 0, 0, 0, 31, 32, 3, + 3, 4, 1, 32, 3, 3, 4, 1, + 0, 0, 0, 0, 33, 34, 3, 3, + 4, 1, 34, 3, 3, 4, 1, 0, + 0, 0, 0, 35, 37, 38, 39, 39, + 40, 37, 41, 41, 40, 40, 42, 42, + 43, 37, 44, 44, 43, 43, 45, 45, + 46, 37, 47, 47, 46, 46, 48, 48, + 49, 37, 50, 50, 49, 49, 51, 36, + 36, 36, 37, 52, 53, 54, 48, 48, + 49, 37, 55, 56, 57, 45, 45, 46, + 37, 58, 59, 60, 42, 42, 43, 37, + 61, 62, 38, 39, 39, 40, 37, 36, + 36, 36, 36, 63, 64, 39, 39, 40, + 37, 64, 39, 39, 40, 37, 36, 36, + 36, 36, 65, 66, 39, 39, 40, 37, + 66, 39, 39, 40, 37, 36, 36, 36, + 36, 67, 68, 39, 39, 40, 37, 68, + 39, 39, 40, 37, 36, 36, 36, 36, + 69, 70, 39, 39, 40, 37, 70, 39, + 39, 40, 37, 36, 36, 36, 36, 71, + 73, 74, 75, 75, 76, 73, 78, 78, + 76, 76, 79, 79, 80, 73, 81, 81, + 80, 80, 82, 82, 83, 73, 84, 84, + 83, 83, 85, 85, 86, 73, 87, 87, + 86, 86, 88, 72, 72, 72, 73, 89, + 90, 91, 85, 85, 86, 73, 92, 93, + 94, 82, 82, 83, 73, 95, 96, 97, + 79, 79, 80, 73, 98, 99, 74, 75, + 75, 76, 73, 72, 72, 72, 72, 100, + 101, 75, 75, 76, 73, 101, 75, 75, + 76, 73, 72, 72, 72, 72, 102, 103, + 75, 75, 76, 73, 103, 75, 75, 76, + 73, 72, 72, 72, 72, 104, 105, 75, + 75, 76, 73, 105, 75, 75, 76, 73, + 72, 72, 72, 72, 106, 107, 75, 75, + 76, 73, 109, 110, 111, 111, 112, 109, + 113, 113, 112, 112, 114, 114, 115, 109, + 116, 116, 115, 115, 117, 117, 118, 109, + 119, 119, 118, 118, 120, 120, 121, 109, + 122, 122, 121, 121, 123, 108, 108, 108, + 109, 124, 125, 126, 120, 120, 121, 109, + 127, 128, 129, 117, 117, 118, 109, 130, + 131, 132, 114, 114, 115, 109, 133, 134, + 110, 111, 111, 112, 109, 108, 108, 108, + 108, 135, 136, 111, 111, 112, 109, 136, + 111, 111, 112, 109, 108, 108, 108, 108, + 137, 138, 111, 111, 112, 109, 138, 111, + 111, 112, 109, 108, 108, 108, 108, 139, + 140, 111, 111, 112, 109, 140, 111, 111, + 112, 109, 108, 108, 108, 108, 141, 142, + 111, 111, 112, 109, 142, 111, 111, 112, + 109, 108, 108, 108, 108, 143, 107, 75, + 75, 76, 73, 72, 72, 72, 72, 144, + 78, 78, 76, 1, 146, 148, 149, 150, + 151, 152, 153, 76, 73, 147, 154, 155, + 155, 144, 156, 157, 158, 159, 160, 162, + 163, 164, 165, 4, 1, 161, 166, 161, + 161, 35, 161, 161, 167, 168, 163, 169, + 169, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 163, 169, 169, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 170, 161, 161, 161, 17, 171, 161, 1, + 161, 166, 161, 161, 161, 161, 170, 172, + 173, 174, 175, 4, 1, 161, 166, 161, + 161, 33, 161, 161, 167, 176, 173, 177, + 177, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 173, 177, 177, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 178, 161, 161, 161, 17, 179, 161, 1, + 161, 166, 161, 161, 161, 161, 178, 180, + 181, 182, 183, 4, 1, 161, 166, 161, + 161, 31, 161, 161, 167, 184, 181, 185, + 185, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 181, 185, 185, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 186, 161, 161, 161, 17, 187, 161, 1, + 161, 166, 161, 161, 161, 161, 186, 188, + 189, 190, 191, 4, 1, 161, 166, 161, + 161, 29, 161, 161, 167, 192, 189, 193, + 193, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 189, 193, 193, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 194, 161, 161, 161, 17, 195, 161, 1, + 161, 166, 161, 161, 161, 161, 194, 196, + 197, 198, 199, 4, 1, 161, 166, 161, + 161, 27, 161, 161, 167, 200, 197, 201, + 201, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 167, 197, 201, 201, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 17, 202, 161, 1, 161, 166, 203, 203, + 161, 1, 161, 166, 204, 161, 161, 205, + 161, 166, 166, 206, 207, 204, 161, 161, + 161, 161, 166, 17, 161, 203, 203, 161, + 1, 161, 166, 203, 202, 161, 1, 161, + 166, 208, 26, 209, 210, 7, 1, 161, + 166, 26, 209, 210, 7, 1, 161, 166, + 209, 209, 7, 1, 161, 166, 211, 23, + 212, 213, 10, 1, 161, 166, 23, 212, + 213, 10, 1, 161, 166, 212, 212, 10, + 1, 161, 166, 214, 20, 215, 216, 13, + 1, 161, 166, 20, 215, 216, 13, 1, + 161, 166, 215, 215, 13, 1, 161, 166, + 217, 17, 203, 218, 161, 1, 161, 166, + 17, 203, 218, 161, 1, 161, 166, 197, + 201, 201, 4, 1, 161, 166, 196, 197, + 201, 201, 4, 1, 161, 166, 161, 161, + 161, 161, 161, 167, 196, 197, 198, 201, + 4, 1, 161, 166, 161, 161, 27, 161, + 161, 167, 194, 161, 219, 161, 203, 203, + 161, 1, 161, 166, 161, 161, 161, 161, + 194, 194, 161, 161, 161, 203, 203, 161, + 1, 161, 166, 161, 161, 161, 161, 194, + 194, 161, 161, 161, 203, 195, 161, 1, + 161, 166, 161, 161, 161, 161, 194, 188, + 189, 193, 193, 4, 1, 161, 166, 161, + 161, 161, 161, 161, 167, 188, 189, 190, + 193, 4, 1, 161, 166, 161, 161, 29, + 161, 161, 167, 186, 161, 220, 161, 203, + 203, 161, 1, 161, 166, 161, 161, 161, + 161, 186, 186, 161, 161, 161, 203, 203, + 161, 1, 161, 166, 161, 161, 161, 161, + 186, 186, 161, 161, 161, 203, 187, 161, + 1, 161, 166, 161, 161, 161, 161, 186, + 180, 181, 185, 185, 4, 1, 161, 166, + 161, 161, 161, 161, 161, 167, 180, 181, + 182, 185, 4, 1, 161, 166, 161, 161, + 31, 161, 161, 167, 178, 161, 221, 161, + 203, 203, 161, 1, 161, 166, 161, 161, + 161, 161, 178, 178, 161, 161, 161, 203, + 203, 161, 1, 161, 166, 161, 161, 161, + 161, 178, 178, 161, 161, 161, 203, 179, + 161, 1, 161, 166, 161, 161, 161, 161, + 178, 172, 173, 177, 177, 4, 1, 161, + 166, 161, 161, 161, 161, 161, 167, 172, + 173, 174, 177, 4, 1, 161, 166, 161, + 161, 33, 161, 161, 167, 170, 161, 222, + 161, 203, 203, 161, 1, 161, 166, 161, + 161, 161, 161, 170, 170, 161, 161, 161, + 203, 203, 161, 1, 161, 166, 161, 161, + 161, 161, 170, 170, 161, 161, 161, 203, + 171, 161, 1, 161, 166, 161, 161, 161, + 161, 170, 162, 163, 169, 169, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 167, + 162, 163, 164, 169, 4, 1, 161, 166, + 161, 161, 35, 161, 161, 167, 224, 225, + 226, 227, 40, 37, 223, 228, 223, 223, + 71, 223, 223, 229, 230, 225, 231, 227, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 225, 231, 227, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 232, + 223, 223, 223, 53, 233, 223, 37, 223, + 228, 223, 223, 223, 223, 232, 234, 235, + 236, 237, 40, 37, 223, 228, 223, 223, + 69, 223, 223, 229, 238, 235, 239, 239, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 235, 239, 239, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 240, + 223, 223, 223, 53, 241, 223, 37, 223, + 228, 223, 223, 223, 223, 240, 242, 243, + 244, 245, 40, 37, 223, 228, 223, 223, + 67, 223, 223, 229, 246, 243, 247, 247, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 243, 247, 247, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 248, + 223, 223, 223, 53, 249, 223, 37, 223, + 228, 223, 223, 223, 223, 248, 250, 251, + 252, 253, 40, 37, 223, 228, 223, 223, + 65, 223, 223, 229, 254, 251, 255, 255, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 251, 255, 255, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 256, + 223, 223, 223, 53, 257, 223, 37, 223, + 228, 223, 223, 223, 223, 256, 258, 259, + 260, 261, 40, 37, 223, 228, 223, 223, + 63, 223, 223, 229, 262, 259, 263, 263, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 229, 259, 263, 263, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 229, 53, + 264, 223, 37, 223, 228, 265, 265, 223, + 37, 223, 228, 266, 223, 223, 267, 223, + 228, 228, 268, 269, 266, 223, 223, 223, + 223, 228, 53, 223, 265, 265, 223, 37, + 223, 228, 265, 264, 223, 37, 223, 228, + 270, 62, 271, 272, 43, 37, 223, 228, + 62, 271, 272, 43, 37, 223, 228, 271, + 271, 43, 37, 223, 228, 273, 59, 274, + 275, 46, 37, 223, 228, 59, 274, 275, + 46, 37, 223, 228, 274, 274, 46, 37, + 223, 228, 276, 56, 277, 278, 49, 37, + 223, 228, 56, 277, 278, 49, 37, 223, + 228, 277, 277, 49, 37, 223, 228, 279, + 53, 265, 280, 223, 37, 223, 228, 53, + 265, 280, 223, 37, 223, 228, 259, 263, + 263, 40, 37, 223, 228, 258, 259, 263, + 263, 40, 37, 223, 228, 223, 223, 223, + 223, 223, 229, 258, 259, 260, 263, 40, + 37, 223, 228, 223, 223, 63, 223, 223, + 229, 256, 223, 281, 223, 265, 265, 223, + 37, 223, 228, 223, 223, 223, 223, 256, + 256, 223, 223, 223, 265, 265, 223, 37, + 223, 228, 223, 223, 223, 223, 256, 256, + 223, 223, 223, 265, 257, 223, 37, 223, + 228, 223, 223, 223, 223, 256, 250, 251, + 255, 255, 40, 37, 223, 228, 223, 223, + 223, 223, 223, 229, 250, 251, 252, 255, + 40, 37, 223, 228, 223, 223, 65, 223, + 223, 229, 248, 223, 282, 223, 265, 265, + 223, 37, 223, 228, 223, 223, 223, 223, + 248, 248, 223, 223, 223, 265, 265, 223, + 37, 223, 228, 223, 223, 223, 223, 248, + 248, 223, 223, 223, 265, 249, 223, 37, + 223, 228, 223, 223, 223, 223, 248, 242, + 243, 247, 247, 40, 37, 223, 228, 223, + 223, 223, 223, 223, 229, 242, 243, 244, + 247, 40, 37, 223, 228, 223, 223, 67, + 223, 223, 229, 240, 223, 283, 223, 265, + 265, 223, 37, 223, 228, 223, 223, 223, + 223, 240, 240, 223, 223, 223, 265, 265, + 223, 37, 223, 228, 223, 223, 223, 223, + 240, 240, 223, 223, 223, 265, 241, 223, + 37, 223, 228, 223, 223, 223, 223, 240, + 234, 235, 239, 239, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 229, 234, 235, + 236, 239, 40, 37, 223, 228, 223, 223, + 69, 223, 223, 229, 232, 223, 284, 223, + 265, 265, 223, 37, 223, 228, 223, 223, + 223, 223, 232, 232, 223, 223, 223, 265, + 265, 223, 37, 223, 228, 223, 223, 223, + 223, 232, 232, 223, 223, 223, 265, 233, + 223, 37, 223, 228, 223, 223, 223, 223, + 232, 70, 39, 39, 40, 37, 224, 225, + 231, 227, 40, 37, 223, 228, 223, 223, + 223, 223, 223, 229, 286, 151, 287, 287, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 151, 287, 287, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 288, + 285, 285, 285, 90, 289, 285, 73, 285, + 154, 285, 285, 285, 285, 288, 290, 291, + 292, 293, 76, 73, 285, 154, 285, 285, + 106, 285, 285, 158, 294, 291, 295, 295, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 291, 295, 295, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 296, + 285, 285, 285, 90, 297, 285, 73, 285, + 154, 285, 285, 285, 285, 296, 298, 299, + 300, 301, 76, 73, 285, 154, 285, 285, + 104, 285, 285, 158, 302, 299, 303, 303, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 299, 303, 303, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 304, + 285, 285, 285, 90, 305, 285, 73, 285, + 154, 285, 285, 285, 285, 304, 306, 307, + 308, 309, 76, 73, 285, 154, 285, 285, + 102, 285, 285, 158, 310, 307, 311, 311, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 307, 311, 311, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 312, + 285, 285, 285, 90, 313, 285, 73, 285, + 154, 285, 285, 285, 285, 312, 314, 315, + 316, 317, 76, 73, 285, 154, 285, 285, + 100, 285, 285, 158, 318, 315, 319, 319, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 158, 315, 319, 319, 76, 73, 285, + 154, 285, 285, 285, 285, 285, 158, 90, + 320, 285, 73, 285, 154, 321, 321, 285, + 73, 285, 154, 322, 285, 285, 323, 285, + 154, 154, 324, 325, 322, 285, 285, 285, + 285, 154, 90, 285, 321, 321, 285, 73, + 285, 154, 321, 320, 285, 73, 285, 154, + 326, 99, 327, 328, 80, 73, 285, 154, + 99, 327, 328, 80, 73, 285, 154, 327, + 327, 80, 73, 285, 154, 329, 96, 330, + 331, 83, 73, 285, 154, 96, 330, 331, + 83, 73, 285, 154, 330, 330, 83, 73, + 285, 154, 332, 93, 333, 334, 86, 73, + 285, 154, 93, 333, 334, 86, 73, 285, + 154, 333, 333, 86, 73, 285, 154, 335, + 90, 321, 336, 285, 73, 285, 154, 90, + 321, 336, 285, 73, 285, 154, 315, 319, + 319, 76, 73, 285, 154, 314, 315, 319, + 319, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 158, 314, 315, 316, 319, 76, + 73, 285, 154, 285, 285, 100, 285, 285, + 158, 312, 285, 337, 285, 321, 321, 285, + 73, 285, 154, 285, 285, 285, 285, 312, + 312, 285, 285, 285, 321, 321, 285, 73, + 285, 154, 285, 285, 285, 285, 312, 312, + 285, 285, 285, 321, 313, 285, 73, 285, + 154, 285, 285, 285, 285, 312, 306, 307, + 311, 311, 76, 73, 285, 154, 285, 285, + 285, 285, 285, 158, 306, 307, 308, 311, + 76, 73, 285, 154, 285, 285, 102, 285, + 285, 158, 304, 285, 338, 285, 321, 321, + 285, 73, 285, 154, 285, 285, 285, 285, + 304, 304, 285, 285, 285, 321, 321, 285, + 73, 285, 154, 285, 285, 285, 285, 304, + 304, 285, 285, 285, 321, 305, 285, 73, + 285, 154, 285, 285, 285, 285, 304, 298, + 299, 303, 303, 76, 73, 285, 154, 285, + 285, 285, 285, 285, 158, 298, 299, 300, + 303, 76, 73, 285, 154, 285, 285, 104, + 285, 285, 158, 296, 285, 339, 285, 321, + 321, 285, 73, 285, 154, 285, 285, 285, + 285, 296, 296, 285, 285, 285, 321, 321, + 285, 73, 285, 154, 285, 285, 285, 285, + 296, 296, 285, 285, 285, 321, 297, 285, + 73, 285, 154, 285, 285, 285, 285, 296, + 290, 291, 295, 295, 76, 73, 285, 154, + 285, 285, 285, 285, 285, 158, 290, 291, + 292, 295, 76, 73, 285, 154, 285, 285, + 106, 285, 285, 158, 288, 285, 340, 285, + 321, 321, 285, 73, 285, 154, 285, 285, + 285, 285, 288, 288, 285, 285, 285, 321, + 321, 285, 73, 285, 154, 285, 285, 285, + 285, 288, 288, 285, 285, 285, 321, 289, + 285, 73, 285, 154, 285, 285, 285, 285, + 288, 107, 75, 75, 76, 73, 341, 341, + 341, 341, 144, 150, 151, 287, 287, 76, + 73, 285, 154, 285, 285, 285, 285, 285, + 158, 107, 75, 75, 76, 73, 343, 344, + 345, 346, 112, 109, 342, 347, 342, 342, + 143, 342, 342, 348, 349, 344, 346, 346, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 344, 346, 346, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 350, + 342, 342, 342, 125, 351, 342, 109, 342, + 347, 342, 342, 342, 342, 350, 352, 353, + 354, 355, 112, 109, 342, 347, 342, 342, + 141, 342, 342, 348, 356, 353, 357, 357, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 353, 357, 357, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 358, + 342, 342, 342, 125, 359, 342, 109, 342, + 347, 342, 342, 342, 342, 358, 360, 361, + 362, 363, 112, 109, 342, 347, 342, 342, + 139, 342, 342, 348, 364, 361, 365, 365, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 361, 365, 365, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 366, + 342, 342, 342, 125, 367, 342, 109, 342, + 347, 342, 342, 342, 342, 366, 368, 369, + 370, 371, 112, 109, 342, 347, 342, 342, + 137, 342, 342, 348, 372, 369, 373, 373, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 369, 373, 373, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 374, + 342, 342, 342, 125, 375, 342, 109, 342, + 347, 342, 342, 342, 342, 374, 376, 377, + 378, 379, 112, 109, 342, 347, 342, 342, + 135, 342, 342, 348, 380, 377, 381, 381, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 348, 377, 381, 381, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 125, + 382, 342, 109, 342, 347, 383, 383, 342, + 109, 342, 347, 384, 342, 342, 385, 342, + 347, 347, 386, 387, 384, 342, 342, 342, + 342, 347, 125, 342, 383, 383, 342, 109, + 342, 347, 383, 382, 342, 109, 342, 347, + 388, 134, 389, 390, 115, 109, 342, 347, + 134, 389, 390, 115, 109, 342, 347, 389, + 389, 115, 109, 342, 347, 391, 131, 392, + 393, 118, 109, 342, 347, 131, 392, 393, + 118, 109, 342, 347, 392, 392, 118, 109, + 342, 347, 394, 128, 395, 396, 121, 109, + 342, 347, 128, 395, 396, 121, 109, 342, + 347, 395, 395, 121, 109, 342, 347, 397, + 125, 383, 398, 342, 109, 342, 347, 125, + 383, 398, 342, 109, 342, 347, 377, 381, + 381, 112, 109, 342, 347, 376, 377, 381, + 381, 112, 109, 342, 347, 342, 342, 342, + 342, 342, 348, 376, 377, 378, 381, 112, + 109, 342, 347, 342, 342, 135, 342, 342, + 348, 374, 342, 399, 342, 383, 383, 342, + 109, 342, 347, 342, 342, 342, 342, 374, + 374, 342, 342, 342, 383, 383, 342, 109, + 342, 347, 342, 342, 342, 342, 374, 374, + 342, 342, 342, 383, 375, 342, 109, 342, + 347, 342, 342, 342, 342, 374, 368, 369, + 373, 373, 112, 109, 342, 347, 342, 342, + 342, 342, 342, 348, 368, 369, 370, 373, + 112, 109, 342, 347, 342, 342, 137, 342, + 342, 348, 366, 342, 400, 342, 383, 383, + 342, 109, 342, 347, 342, 342, 342, 342, + 366, 366, 342, 342, 342, 383, 383, 342, + 109, 342, 347, 342, 342, 342, 342, 366, + 366, 342, 342, 342, 383, 367, 342, 109, + 342, 347, 342, 342, 342, 342, 366, 360, + 361, 365, 365, 112, 109, 342, 347, 342, + 342, 342, 342, 342, 348, 360, 361, 362, + 365, 112, 109, 342, 347, 342, 342, 139, + 342, 342, 348, 358, 342, 401, 342, 383, + 383, 342, 109, 342, 347, 342, 342, 342, + 342, 358, 358, 342, 342, 342, 383, 383, + 342, 109, 342, 347, 342, 342, 342, 342, + 358, 358, 342, 342, 342, 383, 359, 342, + 109, 342, 347, 342, 342, 342, 342, 358, + 352, 353, 357, 357, 112, 109, 342, 347, + 342, 342, 342, 342, 342, 348, 352, 353, + 354, 357, 112, 109, 342, 347, 342, 342, + 141, 342, 342, 348, 350, 342, 402, 342, + 383, 383, 342, 109, 342, 347, 342, 342, + 342, 342, 350, 350, 342, 342, 342, 383, + 383, 342, 109, 342, 347, 342, 342, 342, + 342, 350, 350, 342, 342, 342, 383, 351, + 342, 109, 342, 347, 342, 342, 342, 342, + 350, 343, 344, 346, 346, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 348, 148, + 149, 150, 151, 403, 287, 76, 73, 285, + 154, 155, 155, 144, 285, 148, 158, 162, + 404, 164, 165, 4, 1, 161, 166, 161, + 161, 35, 161, 161, 167, 170, 149, 150, + 151, 405, 406, 76, 407, 161, 408, 161, + 155, 144, 161, 170, 158, 107, 409, 409, + 76, 407, 161, 166, 161, 161, 144, 410, + 161, 161, 411, 161, 408, 408, 412, 207, + 410, 161, 161, 161, 161, 408, 170, 161, + 222, 107, 409, 409, 76, 407, 161, 166, + 161, 161, 161, 161, 170, 414, 413, 415, + 415, 413, 146, 413, 416, 415, 415, 413, + 146, 413, 416, 417, 413, 413, 418, 413, + 416, 416, 419, 420, 417, 413, 413, 413, + 413, 416, 148, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 155, 341, 341, 341, + 148, 0 +}; + +static const short _indic_syllable_machine_index_defaults[] = { + 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, 0, 0, 0, + 0, 0, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 72, 72, 77, 77, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 72, + 0, 145, 147, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 341, 285, 341, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 285, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 413, 413, 413, 413, + 413, 413, 413, 341, 0 }; static const char _indic_syllable_machine_trans_cond_spaces[] = { @@ -568,2015 +742,119 @@ static const char _indic_syllable_machine_trans_cond_spaces[] = { -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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 -}; - -static const short _indic_syllable_machine_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 559, - 560, 561, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 591, - 592, 593, 594, 595, 596, 597, 598, 599, - 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, - 616, 617, 618, 619, 620, 621, 622, 623, - 624, 625, 626, 627, 628, 629, 630, 631, - 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, - 688, 689, 690, 691, 692, 693, 694, 695, - 696, 697, 698, 699, 700, 701, 702, 703, - 704, 705, 706, 707, 708, 709, 710, 711, - 712, 713, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 757, 758, 759, - 760, 761, 762, 763, 764, 765, 766, 767, - 768, 769, 770, 771, 772, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 783, - 784, 785, 786, 787, 788, 789, 790, 791, - 792, 793, 794, 795, 796, 797, 798, 799, - 800, 801, 802, 803, 804, 805, 806, 807, - 808, 809, 810, 811, 812, 813, 814, 815, - 816, 817, 818, 819, 820, 821, 822, 823, - 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, - 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, - 856, 857, 858, 859, 860, 861, 862, 863, - 864, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 877, 878, 879, - 880, 881, 882, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 894, 895, - 896, 897, 898, 899, 900, 901, 902, 903, - 904, 905, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 930, 931, 932, 933, 934, 935, - 936, 937, 938, 939, 940, 941, 942, 943, - 944, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 978, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, - 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, - 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, - 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, - 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, - 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, - 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, - 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, - 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, - 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, - 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, - 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, - 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, - 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, - 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, - 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, - 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, - 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, - 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, - 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, - 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, - 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, - 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, - 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, - 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, - 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, - 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, - 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, - 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, - 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, - 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, - 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, - 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, - 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, - 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, - 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, - 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, - 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, - 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, - 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, - 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, - 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, - 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, - 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, - 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, - 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, - 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, - 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, - 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, - 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, - 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, - 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, - 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, - 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, - 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, - 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, - 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, - 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, - 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, - 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, - 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, - 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, - 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, - 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, - 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, - 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, - 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, - 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, - 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, - 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, - 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, - 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, - 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, - 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, - 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, - 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, - 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, - 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, - 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, - 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, - 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, - 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, - 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, - 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, - 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, - 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, - 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, - 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, - 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, - 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, - 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, - 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, - 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, - 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, - 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, - 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, - 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, - 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, - 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, - 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, - 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, - 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, - 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, - 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, - 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, - 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, - 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, - 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, - 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, - 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, - 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, - 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, - 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, - 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, - 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, - 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, - 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, - 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, - 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, - 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, - 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, - 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, - 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, - 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, - 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, - 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, - 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, - 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, - 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, - 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, - 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, - 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, - 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, - 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, - 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, - 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, - 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, - 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, - 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, - 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, - 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, - 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, - 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, - 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, - 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, - 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, - 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, - 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, - 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, - 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, - 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, - 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, - 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, - 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, - 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, - 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, - 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, - 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, - 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, - 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, - 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, - 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, - 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, - 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, - 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, - 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, - 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, - 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, - 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, - 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, - 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, - 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, - 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, - 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, - 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, - 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, - 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, - 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, - 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, - 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, - 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, - 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, - 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, - 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, - 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, - 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, - 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, - 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, - 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, - 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, - 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, - 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, - 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, - 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, - 2720, 2721, 2722, 2723, 2724, 2725, 0 -}; - -static const char _indic_syllable_machine_trans_lengths[] = { - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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 -}; - -static const char _indic_syllable_machine_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 0 + -1, -1, -1, -1, -1, 0 }; static const short _indic_syllable_machine_cond_targs[] = { - 160, 138, 166, 167, 160, 2, 138, 167, - 3, 138, 167, 138, 170, 160, 5, 138, - 170, 6, 138, 170, 138, 173, 160, 8, - 138, 173, 9, 138, 173, 138, 176, 160, - 11, 138, 176, 12, 138, 176, 138, 14, - 160, 138, 15, 138, 159, 138, 17, 176, - 160, 11, 138, 18, 138, 175, 138, 20, - 173, 160, 8, 138, 21, 138, 172, 138, - 23, 170, 160, 5, 138, 24, 138, 169, - 138, 166, 167, 160, 179, 2, 138, 183, - 167, 160, 2, 138, 183, 167, 160, 184, - 2, 138, 188, 167, 160, 2, 138, 188, - 167, 160, 189, 2, 138, 193, 167, 160, - 2, 138, 193, 167, 160, 194, 2, 138, - 198, 167, 160, 2, 138, 198, 167, 160, - 199, 2, 138, 222, 138, 228, 229, 222, - 36, 138, 229, 37, 138, 229, 138, 232, - 222, 39, 138, 232, 40, 138, 232, 138, - 235, 222, 42, 138, 235, 43, 138, 235, - 138, 238, 222, 45, 138, 238, 46, 138, - 238, 138, 48, 222, 138, 49, 138, 221, - 138, 51, 238, 222, 45, 138, 52, 138, - 237, 138, 54, 235, 222, 42, 138, 55, - 138, 234, 138, 57, 232, 222, 39, 138, - 58, 138, 231, 138, 228, 229, 222, 241, - 36, 138, 245, 229, 222, 36, 138, 245, - 229, 222, 246, 36, 138, 250, 229, 222, - 36, 138, 250, 229, 222, 251, 36, 138, - 255, 229, 222, 36, 138, 255, 229, 222, - 256, 36, 138, 260, 229, 222, 36, 138, - 260, 229, 222, 262, 36, 138, 283, 138, - 289, 290, 283, 70, 138, 290, 71, 138, - 290, 138, 293, 283, 73, 138, 293, 74, - 138, 293, 138, 296, 283, 76, 138, 296, - 77, 138, 296, 138, 299, 283, 79, 138, - 299, 80, 138, 299, 138, 82, 283, 138, - 83, 138, 282, 138, 85, 299, 283, 79, - 138, 86, 138, 298, 138, 88, 296, 283, - 76, 138, 89, 138, 295, 138, 91, 293, - 283, 73, 138, 92, 138, 292, 138, 289, - 290, 283, 302, 70, 138, 306, 290, 283, - 70, 138, 306, 290, 283, 307, 70, 138, - 311, 290, 283, 70, 138, 311, 290, 283, - 312, 70, 138, 316, 290, 283, 70, 138, - 316, 290, 283, 317, 70, 138, 321, 290, - 283, 70, 138, 346, 138, 352, 353, 346, - 103, 138, 353, 104, 138, 353, 138, 356, - 346, 106, 138, 356, 107, 138, 356, 138, - 359, 346, 109, 138, 359, 110, 138, 359, - 138, 362, 346, 112, 138, 362, 113, 138, - 362, 138, 115, 346, 138, 116, 138, 345, - 138, 118, 362, 346, 112, 138, 119, 138, - 361, 138, 121, 359, 346, 109, 138, 122, - 138, 358, 138, 124, 356, 346, 106, 138, - 125, 138, 355, 138, 352, 353, 346, 365, - 103, 138, 369, 353, 346, 103, 138, 369, - 353, 346, 370, 103, 138, 374, 353, 346, - 103, 138, 374, 353, 346, 375, 103, 138, - 379, 353, 346, 103, 138, 379, 353, 346, - 380, 103, 138, 384, 353, 346, 103, 138, - 384, 353, 346, 385, 103, 138, 321, 290, - 283, 323, 70, 138, 290, 160, 71, 138, - 398, 138, 139, 201, 263, 265, 322, 324, - 290, 283, 285, 323, 386, 387, 301, 396, - 403, 325, 138, 140, 142, 33, 200, 167, - 160, 162, 199, 178, 138, 141, 142, 167, - 160, 162, 178, 32, 138, 142, 167, 160, - 162, 178, 32, 138, 143, 159, 196, 160, - 162, 143, 138, 144, 146, 31, 195, 167, - 160, 162, 194, 178, 138, 145, 146, 167, - 160, 162, 178, 30, 138, 146, 167, 160, - 162, 178, 30, 138, 147, 159, 191, 160, - 162, 147, 138, 148, 150, 29, 190, 167, - 160, 162, 189, 178, 138, 149, 150, 167, - 160, 162, 178, 28, 138, 150, 167, 160, - 162, 178, 28, 138, 151, 159, 186, 160, - 162, 151, 138, 152, 154, 27, 185, 167, - 160, 162, 184, 178, 138, 153, 154, 167, - 160, 162, 178, 26, 138, 154, 167, 160, - 162, 178, 26, 138, 155, 159, 181, 160, - 162, 155, 138, 156, 158, 25, 180, 167, - 160, 162, 179, 178, 138, 157, 158, 167, - 160, 162, 178, 1, 138, 158, 167, 160, - 162, 178, 1, 138, 159, 165, 160, 162, - 138, 160, 162, 0, 138, 161, 164, 162, - 138, 162, 138, 163, 138, 138, 138, 161, - 162, 138, 159, 160, 162, 0, 138, 0, - 165, 160, 162, 138, 168, 169, 4, 22, - 170, 160, 162, 138, 169, 4, 22, 170, - 160, 162, 138, 170, 160, 162, 4, 138, - 171, 172, 7, 19, 173, 160, 162, 138, - 172, 7, 19, 173, 160, 162, 138, 173, - 160, 162, 7, 138, 174, 175, 10, 16, - 176, 160, 162, 138, 175, 10, 16, 176, - 160, 162, 138, 176, 160, 162, 10, 138, - 177, 159, 0, 13, 160, 162, 138, 159, - 0, 13, 160, 162, 138, 158, 167, 160, - 162, 1, 138, 156, 158, 167, 160, 162, - 178, 1, 138, 156, 158, 25, 1, 167, - 160, 162, 179, 178, 138, 155, 182, 160, - 162, 155, 0, 138, 155, 160, 162, 155, - 0, 138, 155, 0, 181, 160, 162, 155, - 138, 152, 154, 167, 160, 162, 178, 26, - 138, 152, 154, 27, 26, 167, 160, 162, - 184, 178, 138, 151, 187, 160, 162, 151, - 0, 138, 151, 160, 162, 151, 0, 138, - 151, 0, 186, 160, 162, 151, 138, 148, - 150, 167, 160, 162, 178, 28, 138, 148, - 150, 29, 28, 167, 160, 162, 189, 178, - 138, 147, 192, 160, 162, 147, 0, 138, - 147, 160, 162, 147, 0, 138, 147, 0, - 191, 160, 162, 147, 138, 144, 146, 167, - 160, 162, 178, 30, 138, 144, 146, 31, - 30, 167, 160, 162, 194, 178, 138, 143, - 197, 160, 162, 143, 0, 138, 143, 160, - 162, 143, 0, 138, 143, 0, 196, 160, - 162, 143, 138, 140, 142, 167, 160, 162, - 178, 32, 138, 140, 142, 33, 32, 167, - 160, 162, 199, 178, 138, 202, 204, 67, - 261, 229, 222, 224, 262, 240, 138, 203, - 204, 66, 261, 229, 222, 224, 240, 138, - 204, 66, 261, 229, 222, 224, 240, 138, - 205, 221, 258, 222, 224, 205, 138, 206, - 208, 65, 257, 229, 222, 224, 256, 240, - 138, 207, 208, 229, 222, 224, 240, 64, - 138, 208, 229, 222, 224, 240, 64, 138, - 209, 221, 253, 222, 224, 209, 138, 210, - 212, 63, 252, 229, 222, 224, 251, 240, - 138, 211, 212, 229, 222, 224, 240, 62, - 138, 212, 229, 222, 224, 240, 62, 138, - 213, 221, 248, 222, 224, 213, 138, 214, - 216, 61, 247, 229, 222, 224, 246, 240, - 138, 215, 216, 229, 222, 224, 240, 60, - 138, 216, 229, 222, 224, 240, 60, 138, - 217, 221, 243, 222, 224, 217, 138, 218, - 220, 59, 242, 229, 222, 224, 241, 240, - 138, 219, 220, 229, 222, 224, 240, 35, - 138, 220, 229, 222, 224, 240, 35, 138, - 221, 227, 222, 224, 138, 222, 224, 34, - 138, 223, 226, 224, 138, 224, 138, 225, - 138, 138, 138, 223, 224, 138, 221, 222, - 224, 34, 138, 34, 227, 222, 224, 138, - 230, 231, 38, 56, 232, 222, 224, 138, - 231, 38, 56, 232, 222, 224, 138, 232, - 222, 224, 38, 138, 233, 234, 41, 53, - 235, 222, 224, 138, 234, 41, 53, 235, - 222, 224, 138, 235, 222, 224, 41, 138, - 236, 237, 44, 50, 238, 222, 224, 138, - 237, 44, 50, 238, 222, 224, 138, 238, - 222, 224, 44, 138, 239, 221, 34, 47, - 222, 224, 138, 221, 34, 47, 222, 224, - 138, 220, 229, 222, 224, 35, 138, 218, - 220, 229, 222, 224, 240, 35, 138, 218, - 220, 59, 35, 229, 222, 224, 241, 240, - 138, 217, 244, 222, 224, 217, 34, 138, - 217, 222, 224, 217, 34, 138, 217, 34, - 243, 222, 224, 217, 138, 214, 216, 229, - 222, 224, 240, 60, 138, 214, 216, 61, - 60, 229, 222, 224, 246, 240, 138, 213, - 249, 222, 224, 213, 34, 138, 213, 222, - 224, 213, 34, 138, 213, 34, 248, 222, - 224, 213, 138, 210, 212, 229, 222, 224, - 240, 62, 138, 210, 212, 63, 62, 229, - 222, 224, 251, 240, 138, 209, 254, 222, - 224, 209, 34, 138, 209, 222, 224, 209, - 34, 138, 209, 34, 253, 222, 224, 209, - 138, 206, 208, 229, 222, 224, 240, 64, - 138, 206, 208, 65, 64, 229, 222, 224, - 256, 240, 138, 205, 259, 222, 224, 205, - 34, 138, 205, 222, 224, 205, 34, 138, - 205, 34, 258, 222, 224, 205, 138, 260, - 229, 222, 36, 138, 202, 204, 66, 261, - 229, 222, 224, 240, 138, 264, 265, 290, - 283, 285, 301, 100, 138, 265, 290, 283, - 285, 301, 100, 138, 266, 282, 319, 283, - 285, 266, 138, 267, 269, 99, 318, 290, - 283, 285, 317, 301, 138, 268, 269, 290, - 283, 285, 301, 98, 138, 269, 290, 283, - 285, 301, 98, 138, 270, 282, 314, 283, - 285, 270, 138, 271, 273, 97, 313, 290, - 283, 285, 312, 301, 138, 272, 273, 290, - 283, 285, 301, 96, 138, 273, 290, 283, - 285, 301, 96, 138, 274, 282, 309, 283, - 285, 274, 138, 275, 277, 95, 308, 290, - 283, 285, 307, 301, 138, 276, 277, 290, - 283, 285, 301, 94, 138, 277, 290, 283, - 285, 301, 94, 138, 278, 282, 304, 283, - 285, 278, 138, 279, 281, 93, 303, 290, - 283, 285, 302, 301, 138, 280, 281, 290, - 283, 285, 301, 69, 138, 281, 290, 283, - 285, 301, 69, 138, 282, 288, 283, 285, - 138, 283, 285, 68, 138, 284, 287, 285, - 138, 285, 138, 286, 138, 138, 138, 284, - 285, 138, 282, 283, 285, 68, 138, 68, - 288, 283, 285, 138, 291, 292, 72, 90, - 293, 283, 285, 138, 292, 72, 90, 293, - 283, 285, 138, 293, 283, 285, 72, 138, - 294, 295, 75, 87, 296, 283, 285, 138, - 295, 75, 87, 296, 283, 285, 138, 296, - 283, 285, 75, 138, 297, 298, 78, 84, - 299, 283, 285, 138, 298, 78, 84, 299, - 283, 285, 138, 299, 283, 285, 78, 138, - 300, 282, 68, 81, 283, 285, 138, 282, - 68, 81, 283, 285, 138, 281, 290, 283, - 285, 69, 138, 279, 281, 290, 283, 285, - 301, 69, 138, 279, 281, 93, 69, 290, - 283, 285, 302, 301, 138, 278, 305, 283, - 285, 278, 68, 138, 278, 283, 285, 278, - 68, 138, 278, 68, 304, 283, 285, 278, - 138, 275, 277, 290, 283, 285, 301, 94, - 138, 275, 277, 95, 94, 290, 283, 285, - 307, 301, 138, 274, 310, 283, 285, 274, - 68, 138, 274, 283, 285, 274, 68, 138, - 274, 68, 309, 283, 285, 274, 138, 271, - 273, 290, 283, 285, 301, 96, 138, 271, - 273, 97, 96, 290, 283, 285, 312, 301, - 138, 270, 315, 283, 285, 270, 68, 138, - 270, 283, 285, 270, 68, 138, 270, 68, - 314, 283, 285, 270, 138, 267, 269, 290, - 283, 285, 301, 98, 138, 267, 269, 99, - 98, 290, 283, 285, 317, 301, 138, 266, - 320, 283, 285, 266, 68, 138, 266, 283, - 285, 266, 68, 138, 266, 68, 319, 283, - 285, 266, 138, 321, 290, 283, 323, 70, - 138, 263, 265, 290, 283, 285, 301, 100, - 138, 321, 290, 283, 70, 138, 326, 328, - 134, 133, 353, 346, 348, 385, 364, 138, - 327, 328, 353, 346, 348, 364, 133, 138, - 328, 353, 346, 348, 364, 133, 138, 329, - 345, 382, 346, 348, 329, 138, 330, 332, - 132, 381, 353, 346, 348, 380, 364, 138, - 331, 332, 353, 346, 348, 364, 131, 138, - 332, 353, 346, 348, 364, 131, 138, 333, - 345, 377, 346, 348, 333, 138, 334, 336, - 130, 376, 353, 346, 348, 375, 364, 138, - 335, 336, 353, 346, 348, 364, 129, 138, - 336, 353, 346, 348, 364, 129, 138, 337, - 345, 372, 346, 348, 337, 138, 338, 340, - 128, 371, 353, 346, 348, 370, 364, 138, - 339, 340, 353, 346, 348, 364, 127, 138, - 340, 353, 346, 348, 364, 127, 138, 341, - 345, 367, 346, 348, 341, 138, 342, 344, - 126, 366, 353, 346, 348, 365, 364, 138, - 343, 344, 353, 346, 348, 364, 102, 138, - 344, 353, 346, 348, 364, 102, 138, 345, - 351, 346, 348, 138, 346, 348, 101, 138, - 347, 350, 348, 138, 348, 138, 349, 138, - 138, 138, 347, 348, 138, 345, 346, 348, - 101, 138, 101, 351, 346, 348, 138, 354, - 355, 105, 123, 356, 346, 348, 138, 355, - 105, 123, 356, 346, 348, 138, 356, 346, - 348, 105, 138, 357, 358, 108, 120, 359, - 346, 348, 138, 358, 108, 120, 359, 346, - 348, 138, 359, 346, 348, 108, 138, 360, - 361, 111, 117, 362, 346, 348, 138, 361, - 111, 117, 362, 346, 348, 138, 362, 346, - 348, 111, 138, 363, 345, 101, 114, 346, - 348, 138, 345, 101, 114, 346, 348, 138, - 344, 353, 346, 348, 102, 138, 342, 344, - 353, 346, 348, 364, 102, 138, 342, 344, - 126, 102, 353, 346, 348, 365, 364, 138, - 341, 368, 346, 348, 341, 101, 138, 341, - 346, 348, 341, 101, 138, 341, 101, 367, - 346, 348, 341, 138, 338, 340, 353, 346, - 348, 364, 127, 138, 338, 340, 128, 127, - 353, 346, 348, 370, 364, 138, 337, 373, - 346, 348, 337, 101, 138, 337, 346, 348, - 337, 101, 138, 337, 101, 372, 346, 348, - 337, 138, 334, 336, 353, 346, 348, 364, - 129, 138, 334, 336, 130, 129, 353, 346, - 348, 375, 364, 138, 333, 378, 346, 348, - 333, 101, 138, 333, 346, 348, 333, 101, - 138, 333, 101, 377, 346, 348, 333, 138, - 330, 332, 353, 346, 348, 364, 131, 138, - 330, 332, 132, 131, 353, 346, 348, 380, - 364, 138, 329, 383, 346, 348, 329, 101, - 138, 329, 346, 348, 329, 101, 138, 329, - 101, 382, 346, 348, 329, 138, 326, 328, - 353, 346, 348, 364, 133, 138, 139, 201, - 263, 265, 135, 100, 290, 283, 285, 323, - 139, 301, 325, 138, 140, 388, 33, 200, - 167, 160, 162, 199, 178, 138, 143, 201, - 263, 265, 389, 395, 290, 390, 392, 325, - 323, 143, 301, 138, 321, 290, 390, 162, - 323, 136, 138, 391, 394, 392, 138, 392, - 138, 393, 138, 138, 138, 391, 392, 138, - 143, 197, 321, 290, 390, 162, 143, 136, - 138, 397, 398, 400, 137, 138, 398, 400, - 137, 138, 399, 402, 400, 138, 400, 138, - 401, 138, 138, 138, 399, 400, 138, 139, - 325, 139, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 0 + 138, 160, 166, 2, 167, 3, 5, 170, + 6, 8, 173, 9, 11, 176, 12, 14, + 15, 159, 17, 18, 175, 20, 21, 172, + 23, 24, 169, 179, 183, 184, 188, 189, + 193, 194, 198, 199, 138, 222, 228, 36, + 229, 37, 39, 232, 40, 42, 235, 43, + 45, 238, 46, 48, 49, 221, 51, 52, + 237, 54, 55, 234, 57, 58, 231, 241, + 245, 246, 250, 251, 255, 256, 260, 262, + 138, 283, 289, 70, 290, 138, 71, 73, + 293, 74, 76, 296, 77, 79, 299, 80, + 82, 83, 282, 85, 86, 298, 88, 89, + 295, 91, 92, 292, 302, 306, 307, 311, + 312, 316, 317, 321, 138, 346, 352, 103, + 353, 104, 106, 356, 107, 109, 359, 110, + 112, 362, 113, 115, 116, 345, 118, 119, + 361, 121, 122, 358, 124, 125, 355, 365, + 369, 370, 374, 375, 379, 380, 384, 385, + 323, 138, 398, 138, 139, 201, 263, 265, + 322, 324, 285, 325, 386, 387, 301, 396, + 403, 138, 140, 142, 33, 200, 162, 178, + 141, 32, 143, 196, 144, 146, 31, 195, + 145, 30, 147, 191, 148, 150, 29, 190, + 149, 28, 151, 186, 152, 154, 27, 185, + 153, 26, 155, 181, 156, 158, 25, 180, + 157, 1, 165, 0, 161, 164, 163, 138, + 168, 4, 22, 171, 7, 19, 174, 10, + 16, 177, 13, 182, 187, 192, 197, 138, + 202, 204, 67, 261, 224, 240, 203, 66, + 205, 258, 206, 208, 65, 257, 207, 64, + 209, 253, 210, 212, 63, 252, 211, 62, + 213, 248, 214, 216, 61, 247, 215, 60, + 217, 243, 218, 220, 59, 242, 219, 35, + 227, 34, 223, 226, 225, 138, 230, 38, + 56, 233, 41, 53, 236, 44, 50, 239, + 47, 244, 249, 254, 259, 138, 264, 100, + 266, 319, 267, 269, 99, 318, 268, 98, + 270, 314, 271, 273, 97, 313, 272, 96, + 274, 309, 275, 277, 95, 308, 276, 94, + 278, 304, 279, 281, 93, 303, 280, 69, + 288, 68, 284, 287, 286, 138, 291, 72, + 90, 294, 75, 87, 297, 78, 84, 300, + 81, 305, 310, 315, 320, 138, 138, 326, + 328, 134, 133, 348, 364, 327, 329, 382, + 330, 332, 132, 381, 331, 131, 333, 377, + 334, 336, 130, 376, 335, 129, 337, 372, + 338, 340, 128, 371, 339, 127, 341, 367, + 342, 344, 126, 366, 343, 102, 351, 101, + 347, 350, 349, 138, 354, 105, 123, 357, + 108, 120, 360, 111, 117, 363, 114, 368, + 373, 378, 383, 135, 388, 389, 395, 390, + 392, 136, 391, 394, 393, 138, 397, 137, + 400, 399, 402, 401, 138, 0 }; static const char _indic_syllable_machine_cond_actions[] = { - 0, 1, 2, 2, 0, 0, 1, 2, - 0, 1, 2, 1, 2, 0, 0, 1, - 2, 0, 1, 2, 1, 2, 0, 0, - 1, 2, 0, 1, 2, 1, 2, 0, - 0, 1, 2, 0, 1, 2, 1, 0, - 0, 1, 0, 1, 2, 1, 0, 2, - 0, 0, 1, 0, 1, 2, 1, 0, - 2, 0, 0, 1, 0, 1, 2, 1, - 0, 2, 0, 0, 1, 0, 1, 2, - 1, 2, 2, 0, 2, 0, 1, 2, - 2, 0, 0, 1, 2, 2, 0, 2, - 0, 1, 2, 2, 0, 0, 1, 2, - 2, 0, 2, 0, 1, 2, 2, 0, - 0, 1, 2, 2, 0, 2, 0, 1, - 2, 2, 0, 0, 1, 2, 2, 0, - 2, 0, 1, 0, 3, 2, 2, 0, - 0, 3, 2, 0, 3, 2, 3, 2, - 0, 0, 3, 2, 0, 3, 2, 3, - 2, 0, 0, 3, 2, 0, 3, 2, - 3, 2, 0, 0, 3, 2, 0, 3, - 2, 3, 0, 0, 3, 0, 3, 2, - 3, 0, 2, 0, 0, 3, 0, 3, - 2, 3, 0, 2, 0, 0, 3, 0, - 3, 2, 3, 0, 2, 0, 0, 3, - 0, 3, 2, 3, 2, 2, 0, 2, - 0, 3, 2, 2, 0, 0, 3, 2, - 2, 0, 2, 0, 3, 2, 2, 0, - 0, 3, 2, 2, 0, 2, 0, 3, - 2, 2, 0, 0, 3, 2, 2, 0, - 2, 0, 3, 2, 2, 0, 0, 3, - 2, 2, 0, 2, 0, 3, 0, 4, - 2, 2, 0, 0, 4, 2, 0, 5, - 2, 5, 2, 0, 0, 4, 2, 0, - 4, 2, 4, 2, 0, 0, 4, 2, - 0, 4, 2, 4, 2, 0, 0, 4, - 2, 0, 4, 2, 4, 0, 0, 4, - 0, 4, 2, 4, 0, 2, 0, 0, - 4, 0, 4, 2, 4, 0, 2, 0, - 0, 4, 0, 4, 2, 4, 0, 2, - 0, 0, 4, 0, 4, 2, 4, 2, - 2, 0, 6, 0, 4, 2, 2, 0, - 0, 4, 2, 2, 0, 6, 0, 4, - 2, 2, 0, 0, 4, 2, 2, 0, - 6, 0, 4, 2, 2, 0, 0, 4, - 2, 2, 0, 6, 0, 4, 2, 2, - 0, 0, 4, 0, 7, 2, 2, 0, - 0, 7, 2, 0, 7, 2, 7, 2, - 0, 0, 7, 2, 0, 7, 2, 7, - 2, 0, 0, 7, 2, 0, 7, 2, - 7, 2, 0, 0, 7, 2, 0, 7, - 2, 7, 0, 0, 7, 0, 7, 2, - 7, 0, 2, 0, 0, 7, 0, 7, - 2, 7, 0, 2, 0, 0, 7, 0, - 7, 2, 7, 0, 2, 0, 0, 7, - 0, 7, 2, 7, 2, 2, 0, 2, - 0, 7, 2, 2, 0, 0, 7, 2, - 2, 0, 2, 0, 7, 2, 2, 0, - 0, 7, 2, 2, 0, 2, 0, 7, - 2, 2, 0, 0, 7, 2, 2, 0, - 2, 0, 7, 2, 2, 0, 0, 7, - 2, 2, 0, 2, 0, 7, 2, 2, - 0, 6, 0, 4, 2, 0, 0, 1, - 0, 8, 2, 2, 6, 0, 12, 12, - 2, 0, 0, 6, 6, 2, 6, 2, - 0, 2, 11, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 0, 2, 0, - 0, 2, 0, 13, 2, 2, 2, 0, - 0, 2, 13, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 0, 2, 0, - 0, 2, 0, 13, 2, 2, 2, 0, - 0, 2, 13, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 0, 2, 0, - 0, 2, 0, 13, 2, 2, 2, 0, - 0, 2, 13, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 0, 2, 0, - 0, 2, 0, 13, 2, 2, 2, 0, - 0, 2, 13, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 0, 2, 0, - 0, 2, 0, 13, 2, 2, 0, 0, - 13, 0, 0, 0, 13, 0, 0, 0, - 13, 0, 13, 0, 13, 14, 13, 0, - 0, 13, 2, 0, 0, 0, 13, 0, - 2, 0, 0, 13, 2, 2, 0, 0, - 2, 0, 0, 13, 2, 0, 0, 2, - 0, 0, 13, 2, 0, 0, 0, 13, - 2, 2, 0, 0, 2, 0, 0, 13, - 2, 0, 0, 2, 0, 0, 13, 2, - 0, 0, 0, 13, 2, 2, 0, 0, - 2, 0, 0, 13, 2, 0, 0, 2, - 0, 0, 13, 2, 0, 0, 0, 13, - 2, 2, 0, 0, 0, 0, 13, 2, - 0, 0, 0, 0, 13, 0, 2, 0, - 0, 0, 13, 2, 0, 2, 0, 0, - 2, 0, 13, 2, 0, 0, 0, 2, - 0, 0, 2, 2, 13, 2, 2, 0, - 0, 2, 0, 13, 2, 0, 0, 2, - 0, 13, 2, 0, 2, 0, 0, 2, - 13, 2, 0, 2, 0, 0, 2, 0, - 13, 2, 0, 0, 0, 2, 0, 0, - 2, 2, 13, 2, 2, 0, 0, 2, - 0, 13, 2, 0, 0, 2, 0, 13, - 2, 0, 2, 0, 0, 2, 13, 2, - 0, 2, 0, 0, 2, 0, 13, 2, - 0, 0, 0, 2, 0, 0, 2, 2, - 13, 2, 2, 0, 0, 2, 0, 13, - 2, 0, 0, 2, 0, 13, 2, 0, - 2, 0, 0, 2, 13, 2, 0, 2, - 0, 0, 2, 0, 13, 2, 0, 0, - 0, 2, 0, 0, 2, 2, 13, 2, - 2, 0, 0, 2, 0, 13, 2, 0, - 0, 2, 0, 13, 2, 0, 2, 0, - 0, 2, 13, 2, 0, 2, 0, 0, - 2, 0, 13, 2, 0, 0, 0, 2, - 0, 0, 2, 2, 13, 2, 0, 0, - 2, 2, 0, 0, 2, 2, 15, 2, - 0, 0, 2, 2, 0, 0, 2, 15, - 0, 0, 2, 2, 0, 0, 2, 15, - 2, 2, 2, 0, 0, 2, 15, 2, - 0, 0, 2, 2, 0, 0, 2, 2, - 15, 2, 0, 2, 0, 0, 2, 0, - 15, 0, 2, 0, 0, 2, 0, 15, - 2, 2, 2, 0, 0, 2, 15, 2, - 0, 0, 2, 2, 0, 0, 2, 2, - 15, 2, 0, 2, 0, 0, 2, 0, - 15, 0, 2, 0, 0, 2, 0, 15, - 2, 2, 2, 0, 0, 2, 15, 2, - 0, 0, 2, 2, 0, 0, 2, 2, - 15, 2, 0, 2, 0, 0, 2, 0, - 15, 0, 2, 0, 0, 2, 0, 15, - 2, 2, 2, 0, 0, 2, 15, 2, - 0, 0, 2, 2, 0, 0, 2, 2, - 15, 2, 0, 2, 0, 0, 2, 0, - 15, 0, 2, 0, 0, 2, 0, 15, - 2, 2, 0, 0, 15, 0, 0, 0, - 15, 0, 0, 0, 15, 0, 15, 0, - 15, 16, 15, 0, 0, 15, 2, 0, - 0, 0, 15, 0, 2, 0, 0, 15, - 2, 2, 0, 0, 2, 0, 0, 15, - 2, 0, 0, 2, 0, 0, 15, 2, - 0, 0, 0, 15, 2, 2, 0, 0, - 2, 0, 0, 15, 2, 0, 0, 2, - 0, 0, 15, 2, 0, 0, 0, 15, - 2, 2, 0, 0, 2, 0, 0, 15, - 2, 0, 0, 2, 0, 0, 15, 2, - 0, 0, 0, 15, 2, 2, 0, 0, - 0, 0, 15, 2, 0, 0, 0, 0, - 15, 0, 2, 0, 0, 0, 15, 2, - 0, 2, 0, 0, 2, 0, 15, 2, - 0, 0, 0, 2, 0, 0, 2, 2, - 15, 2, 2, 0, 0, 2, 0, 15, - 2, 0, 0, 2, 0, 15, 2, 0, - 2, 0, 0, 2, 15, 2, 0, 2, - 0, 0, 2, 0, 15, 2, 0, 0, - 0, 2, 0, 0, 2, 2, 15, 2, - 2, 0, 0, 2, 0, 15, 2, 0, - 0, 2, 0, 15, 2, 0, 2, 0, - 0, 2, 15, 2, 0, 2, 0, 0, - 2, 0, 15, 2, 0, 0, 0, 2, - 0, 0, 2, 2, 15, 2, 2, 0, - 0, 2, 0, 15, 2, 0, 0, 2, - 0, 15, 2, 0, 2, 0, 0, 2, - 15, 2, 0, 2, 0, 0, 2, 0, - 15, 2, 0, 0, 0, 2, 0, 0, - 2, 2, 15, 2, 2, 0, 0, 2, - 0, 15, 2, 0, 0, 2, 0, 15, - 2, 0, 2, 0, 0, 2, 15, 2, - 2, 0, 0, 15, 2, 0, 0, 2, - 2, 0, 0, 2, 15, 6, 0, 2, - 0, 0, 6, 0, 17, 0, 2, 0, - 0, 6, 0, 17, 6, 2, 2, 0, - 0, 6, 17, 6, 0, 0, 6, 2, - 0, 0, 6, 6, 17, 6, 0, 2, - 0, 0, 6, 0, 17, 0, 2, 0, - 0, 6, 0, 17, 6, 2, 2, 0, - 0, 6, 17, 6, 0, 0, 6, 2, - 0, 0, 6, 6, 17, 6, 0, 2, - 0, 0, 6, 0, 17, 0, 2, 0, - 0, 6, 0, 17, 6, 2, 2, 0, - 0, 6, 17, 6, 0, 0, 6, 2, - 0, 0, 6, 6, 17, 6, 0, 2, - 0, 0, 6, 0, 17, 0, 2, 0, - 0, 6, 0, 17, 6, 2, 2, 0, - 0, 6, 17, 6, 0, 0, 6, 2, - 0, 0, 6, 6, 17, 6, 0, 2, - 0, 0, 6, 0, 17, 0, 2, 0, - 0, 6, 0, 17, 2, 2, 0, 0, - 17, 0, 0, 0, 17, 0, 0, 0, - 17, 0, 17, 0, 17, 18, 17, 0, - 0, 17, 2, 0, 0, 0, 17, 0, - 2, 0, 0, 17, 2, 2, 0, 0, - 2, 0, 0, 17, 2, 0, 0, 2, - 0, 0, 17, 2, 0, 0, 0, 17, - 2, 2, 0, 0, 2, 0, 0, 17, - 2, 0, 0, 2, 0, 0, 17, 2, - 0, 0, 0, 17, 2, 2, 0, 0, - 2, 0, 0, 17, 2, 0, 0, 2, - 0, 0, 17, 2, 0, 0, 0, 17, - 2, 2, 0, 0, 0, 0, 17, 2, - 0, 0, 0, 0, 17, 0, 2, 0, - 0, 0, 17, 6, 0, 2, 0, 0, - 6, 0, 17, 6, 0, 0, 0, 2, - 0, 0, 6, 6, 17, 6, 2, 0, - 0, 6, 0, 17, 6, 0, 0, 6, - 0, 17, 6, 0, 2, 0, 0, 6, - 17, 6, 0, 2, 0, 0, 6, 0, - 17, 6, 0, 0, 0, 2, 0, 0, - 6, 6, 17, 6, 2, 0, 0, 6, - 0, 17, 6, 0, 0, 6, 0, 17, - 6, 0, 2, 0, 0, 6, 17, 6, - 0, 2, 0, 0, 6, 0, 17, 6, - 0, 0, 0, 2, 0, 0, 6, 6, - 17, 6, 2, 0, 0, 6, 0, 17, - 6, 0, 0, 6, 0, 17, 6, 0, - 2, 0, 0, 6, 17, 6, 0, 2, - 0, 0, 6, 0, 17, 6, 0, 0, - 0, 2, 0, 0, 6, 6, 17, 6, - 2, 0, 0, 6, 0, 17, 6, 0, - 0, 6, 0, 17, 6, 0, 2, 0, - 0, 6, 17, 2, 2, 0, 6, 0, - 19, 6, 0, 2, 0, 0, 6, 0, - 17, 2, 2, 0, 0, 19, 2, 0, - 0, 0, 2, 0, 0, 2, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 0, 2, 0, 0, 2, 0, 20, 2, - 2, 2, 0, 0, 2, 20, 2, 0, - 0, 2, 2, 0, 0, 2, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 0, 2, 0, 0, 2, 0, 20, 2, - 2, 2, 0, 0, 2, 20, 2, 0, - 0, 2, 2, 0, 0, 2, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 0, 2, 0, 0, 2, 0, 20, 2, - 2, 2, 0, 0, 2, 20, 2, 0, - 0, 2, 2, 0, 0, 2, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 0, 2, 0, 0, 2, 0, 20, 2, - 2, 2, 0, 0, 2, 20, 2, 0, - 0, 2, 2, 0, 0, 2, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 0, 2, 0, 0, 2, 0, 20, 2, - 2, 0, 0, 20, 0, 0, 0, 20, - 0, 0, 0, 20, 0, 20, 0, 20, - 21, 20, 0, 0, 20, 2, 0, 0, - 0, 20, 0, 2, 0, 0, 20, 2, - 2, 0, 0, 2, 0, 0, 20, 2, - 0, 0, 2, 0, 0, 20, 2, 0, - 0, 0, 20, 2, 2, 0, 0, 2, - 0, 0, 20, 2, 0, 0, 2, 0, - 0, 20, 2, 0, 0, 0, 20, 2, - 2, 0, 0, 2, 0, 0, 20, 2, - 0, 0, 2, 0, 0, 20, 2, 0, - 0, 0, 20, 2, 2, 0, 0, 0, - 0, 20, 2, 0, 0, 0, 0, 20, - 0, 2, 0, 0, 0, 20, 2, 0, - 2, 0, 0, 2, 0, 20, 2, 0, - 0, 0, 2, 0, 0, 2, 2, 20, - 2, 2, 0, 0, 2, 0, 20, 2, - 0, 0, 2, 0, 20, 2, 0, 2, - 0, 0, 2, 20, 2, 0, 2, 0, - 0, 2, 0, 20, 2, 0, 0, 0, - 2, 0, 0, 2, 2, 20, 2, 2, - 0, 0, 2, 0, 20, 2, 0, 0, - 2, 0, 20, 2, 0, 2, 0, 0, - 2, 20, 2, 0, 2, 0, 0, 2, - 0, 20, 2, 0, 0, 0, 2, 0, - 0, 2, 2, 20, 2, 2, 0, 0, - 2, 0, 20, 2, 0, 0, 2, 0, - 20, 2, 0, 2, 0, 0, 2, 20, - 2, 0, 2, 0, 0, 2, 0, 20, - 2, 0, 0, 0, 2, 0, 0, 2, - 2, 20, 2, 2, 0, 0, 2, 0, - 20, 2, 0, 0, 2, 0, 20, 2, - 0, 2, 0, 0, 2, 20, 2, 0, - 2, 0, 0, 2, 0, 20, 2, 2, - 6, 0, 0, 0, 2, 0, 0, 6, - 2, 6, 2, 17, 2, 0, 0, 2, - 2, 0, 0, 2, 2, 13, 2, 2, - 6, 0, 22, 22, 2, 0, 0, 2, - 6, 2, 6, 13, 2, 2, 0, 0, - 6, 0, 13, 0, 0, 0, 13, 0, - 13, 0, 13, 14, 13, 0, 0, 13, - 2, 2, 2, 2, 0, 0, 2, 0, - 13, 2, 0, 0, 0, 23, 0, 0, - 0, 23, 0, 0, 0, 23, 0, 23, - 0, 23, 24, 23, 0, 0, 23, 2, - 2, 2, 19, 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, 1, 1, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 4, - 4, 5, 5, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 4, 1, 8, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 19, 17, 19, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 17, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 23, 23, - 23, 23, 23, 23, 23, 19, 0 + 1, 0, 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, 3, 0, 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, + 4, 0, 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, 6, 2, 6, 2, + 6, 2, 6, 2, 7, 0, 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, + 6, 8, 0, 11, 2, 2, 6, 0, + 12, 12, 0, 2, 6, 2, 6, 2, + 0, 13, 2, 0, 0, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 0, 0, 0, 0, 14, + 2, 0, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 2, 2, 2, 2, 15, + 2, 0, 0, 2, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 16, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 17, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 2, 0, 0, 0, 0, 18, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 19, 20, 2, + 0, 0, 0, 0, 2, 2, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 0, + 0, 0, 0, 21, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 2, + 2, 2, 2, 0, 0, 22, 22, 0, + 0, 0, 0, 0, 0, 23, 2, 0, + 0, 0, 0, 0, 24, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -2688,7 +966,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { }; static const char _indic_syllable_machine_eof_cond_spaces[] = { - -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, @@ -2739,7 +1017,7 @@ static const char _indic_syllable_machine_eof_cond_spaces[] = { -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 + -1, 0 }; static const char _indic_syllable_machine_eof_cond_key_offs[] = { @@ -2855,57 +1133,57 @@ static const char _indic_syllable_machine_eof_cond_keys[] = { }; static const short _indic_syllable_machine_eof_trans[] = { - 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, - 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, - 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, - 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, - 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, - 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, - 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, - 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, - 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, - 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, - 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, - 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, - 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, - 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, - 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, - 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, - 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, - 2460, 2461, 0, 2462, 2463, 2464, 2465, 2466, - 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, - 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, - 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, - 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, - 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, - 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, - 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, - 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, - 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, - 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, - 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, - 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, - 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, - 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, - 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, - 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, - 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, - 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, - 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, - 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, - 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, - 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, - 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, - 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, - 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, - 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, - 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, - 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, - 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, - 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, - 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, - 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, - 2723, 2724, 2725, 2726, 0 + 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, 1, 1, + 1, 1, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 73, 73, 78, 78, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 73, + 1, 146, 0, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 342, 286, 342, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 286, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 414, 414, 414, 414, + 414, 414, 414, 342, 0 }; static const char _indic_syllable_machine_nfa_targs[] = { @@ -3015,7 +1293,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const short * _inds; { if ( p == pe ) goto _test_eof; _resume: { @@ -3028,57 +1306,22 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _indic_syllable_machine_trans_keys + (_indic_syllable_machine_key_offsets[cs])); - _trans = (unsigned int)_indic_syllable_machine_index_offsets[cs]; + _keys = ( _indic_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _indic_syllable_machine_indicies + (_indic_syllable_machine_index_offsets[cs])); - _klen = (int)_indic_syllable_machine_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (info[p].indic_category()) < (*( _mid)) ) - _upper = _mid - 1; - else if ( (info[p].indic_category()) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( (info[p].indic_category()) <= 19 && (info[p].indic_category()) >= 1 ) + { + int _ic = (int)_indic_syllable_machine_char_class[(int)(info[p].indic_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; } - _klen = (int)_indic_syllable_machine_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (info[p].indic_category()) < (*( _mid)) ) - _upper = _mid - 2; - else if ( (info[p].indic_category()) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_indic_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 7d5c3803b..034b65750 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -30,68 +30,78 @@ #include "hb.hh" -static const short _khmer_syllable_machine_key_offsets[] = { - 0, 5, 8, 12, 15, 18, 21, 25, - 28, 32, 35, 38, 42, 45, 48, 51, - 55, 58, 62, 65, 70, 84, 94, 103, - 109, 110, 115, 122, 130, 139, 142, 146, - 155, 161, 162, 167, 174, 182, 185, 195, - 0 -}; - static const unsigned char _khmer_syllable_machine_trans_keys[] = { - 20u, 21u, 26u, 5u, 6u, 21u, 5u, 6u, - 21u, 26u, 5u, 6u, 21u, 5u, 6u, 16u, - 1u, 2u, 21u, 5u, 6u, 21u, 26u, 5u, - 6u, 21u, 5u, 6u, 21u, 26u, 5u, 6u, - 21u, 5u, 6u, 21u, 5u, 6u, 21u, 26u, - 5u, 6u, 21u, 5u, 6u, 16u, 1u, 2u, - 21u, 5u, 6u, 21u, 26u, 5u, 6u, 21u, - 5u, 6u, 21u, 26u, 5u, 6u, 21u, 5u, - 6u, 20u, 21u, 26u, 5u, 6u, 14u, 16u, - 21u, 22u, 26u, 27u, 28u, 29u, 1u, 2u, - 5u, 6u, 11u, 12u, 14u, 20u, 21u, 22u, - 26u, 27u, 28u, 29u, 5u, 6u, 14u, 21u, - 22u, 26u, 27u, 28u, 29u, 5u, 6u, 14u, - 21u, 22u, 29u, 5u, 6u, 22u, 14u, 21u, - 22u, 5u, 6u, 14u, 21u, 22u, 26u, 29u, - 5u, 6u, 14u, 21u, 22u, 26u, 27u, 29u, - 5u, 6u, 14u, 21u, 22u, 26u, 27u, 28u, - 29u, 5u, 6u, 16u, 1u, 2u, 21u, 26u, - 5u, 6u, 14u, 21u, 22u, 26u, 27u, 28u, - 29u, 5u, 6u, 14u, 21u, 22u, 29u, 5u, - 6u, 22u, 14u, 21u, 22u, 5u, 6u, 14u, - 21u, 22u, 26u, 29u, 5u, 6u, 14u, 21u, - 22u, 26u, 27u, 29u, 5u, 6u, 16u, 1u, - 2u, 14u, 20u, 21u, 22u, 26u, 27u, 28u, - 29u, 5u, 6u, 14u, 21u, 22u, 26u, 27u, - 28u, 29u, 5u, 6u, 0u + 2u, 8u, 2u, 6u, 2u, 8u, 2u, 6u, + 0u, 0u, 2u, 6u, 2u, 8u, 2u, 6u, + 2u, 8u, 2u, 6u, 2u, 6u, 2u, 8u, + 2u, 6u, 0u, 0u, 2u, 6u, 2u, 8u, + 2u, 6u, 2u, 8u, 2u, 6u, 2u, 8u, + 0u, 11u, 2u, 11u, 2u, 11u, 2u, 11u, + 7u, 7u, 2u, 7u, 2u, 11u, 2u, 11u, + 2u, 11u, 0u, 0u, 2u, 8u, 2u, 11u, + 2u, 11u, 7u, 7u, 2u, 7u, 2u, 11u, + 2u, 11u, 0u, 0u, 2u, 11u, 2u, 11u, + 0u }; -static const char _khmer_syllable_machine_single_lengths[] = { - 3, 1, 2, 1, 1, 1, 2, 1, - 2, 1, 1, 2, 1, 1, 1, 2, - 1, 2, 1, 3, 8, 8, 7, 4, - 1, 3, 5, 6, 7, 1, 2, 7, - 4, 1, 3, 5, 6, 1, 8, 7, - 0 -}; - -static const char _khmer_syllable_machine_range_lengths[] = { - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, - 0 +static const char _khmer_syllable_machine_char_class[] = { + 0, 0, 1, 1, 2, 2, 1, 1, + 1, 1, 3, 3, 1, 4, 1, 0, + 1, 1, 1, 5, 6, 7, 1, 1, + 1, 8, 9, 10, 11, 0 }; static const short _khmer_syllable_machine_index_offsets[] = { - 0, 5, 8, 12, 15, 18, 21, 25, - 28, 32, 35, 38, 42, 45, 48, 51, - 55, 58, 62, 65, 70, 82, 92, 101, - 107, 109, 114, 121, 129, 138, 141, 145, - 154, 160, 162, 167, 174, 182, 185, 195, + 0, 7, 12, 19, 24, 25, 30, 37, + 42, 49, 54, 59, 66, 71, 72, 77, + 84, 89, 96, 101, 108, 120, 130, 140, + 150, 151, 157, 167, 177, 187, 188, 195, + 205, 215, 216, 222, 232, 242, 243, 253, + 0 +}; + +static const char _khmer_syllable_machine_indicies[] = { + 1, 0, 0, 2, 3, 0, 4, 1, + 0, 0, 0, 3, 1, 0, 0, 0, + 3, 0, 4, 5, 0, 0, 0, 4, + 6, 7, 0, 0, 0, 8, 9, 0, + 0, 0, 10, 0, 4, 9, 0, 0, + 0, 10, 11, 0, 0, 0, 12, 0, + 4, 11, 0, 0, 0, 12, 14, 13, + 13, 13, 15, 14, 16, 16, 16, 15, + 16, 17, 18, 16, 16, 16, 17, 19, + 20, 16, 16, 16, 21, 22, 16, 16, + 16, 23, 16, 17, 22, 16, 16, 16, + 23, 24, 16, 16, 16, 25, 16, 17, + 24, 16, 16, 16, 25, 14, 16, 16, + 26, 15, 16, 17, 28, 27, 29, 2, + 30, 27, 15, 19, 17, 23, 25, 21, + 32, 31, 33, 2, 3, 6, 4, 10, + 12, 8, 34, 31, 35, 31, 3, 6, + 4, 10, 12, 8, 5, 31, 35, 31, + 4, 6, 31, 31, 31, 8, 6, 7, + 31, 35, 31, 8, 6, 36, 31, 35, + 31, 10, 6, 4, 31, 31, 8, 37, + 31, 35, 31, 12, 6, 4, 10, 31, + 8, 34, 31, 33, 31, 3, 6, 4, + 10, 12, 8, 28, 14, 38, 38, 38, + 15, 38, 17, 40, 39, 41, 39, 15, + 19, 17, 23, 25, 21, 18, 39, 41, + 39, 17, 19, 39, 39, 39, 21, 19, + 20, 39, 41, 39, 21, 19, 42, 39, + 41, 39, 23, 19, 17, 39, 39, 21, + 43, 39, 41, 39, 25, 19, 17, 23, + 39, 21, 44, 45, 39, 30, 26, 15, + 19, 17, 23, 25, 21, 40, 39, 30, + 39, 15, 19, 17, 23, 25, 21, 0 +}; + +static const char _khmer_syllable_machine_index_defaults[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 27, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 38, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 0 }; @@ -101,202 +111,25 @@ static const char _khmer_syllable_machine_trans_cond_spaces[] = { -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, -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, -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, -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, - -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, -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, -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, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0 -}; - -static const short _khmer_syllable_machine_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 0 -}; - -static const char _khmer_syllable_machine_trans_lengths[] = { - 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, 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, 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, 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, - 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, 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, 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, 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, - 1, 1, 1, 0 -}; - -static const char _khmer_syllable_machine_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + -1, -1, -1, -1, -1, -1, 0 }; static const char _khmer_syllable_machine_cond_targs[] = { - 28, 22, 23, 1, 20, 22, 1, 20, - 22, 23, 1, 20, 23, 3, 20, 24, - 24, 20, 25, 5, 20, 26, 23, 7, - 20, 26, 7, 20, 27, 23, 9, 20, - 27, 9, 20, 31, 10, 20, 31, 32, - 10, 20, 32, 12, 20, 33, 33, 20, - 34, 14, 20, 35, 32, 16, 20, 35, - 16, 20, 36, 32, 18, 20, 36, 18, - 20, 39, 31, 32, 10, 20, 37, 21, - 31, 33, 32, 35, 36, 34, 21, 30, - 28, 20, 29, 28, 22, 24, 23, 26, - 27, 25, 0, 20, 4, 22, 24, 23, - 26, 27, 25, 2, 20, 4, 23, 24, - 25, 3, 20, 24, 20, 4, 25, 24, - 5, 20, 4, 26, 24, 23, 25, 6, - 20, 4, 27, 24, 23, 26, 25, 8, - 20, 29, 22, 24, 23, 26, 27, 25, - 2, 20, 21, 21, 20, 31, 32, 10, - 20, 13, 31, 33, 32, 35, 36, 34, - 11, 20, 13, 32, 33, 34, 12, 20, - 33, 20, 13, 34, 33, 14, 20, 13, - 35, 33, 32, 34, 15, 20, 13, 36, - 33, 32, 35, 34, 17, 20, 38, 38, - 20, 37, 39, 31, 33, 32, 35, 36, - 34, 19, 20, 37, 31, 33, 32, 35, - 36, 34, 11, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 0 + 20, 1, 28, 22, 23, 3, 24, 5, + 25, 7, 26, 9, 27, 20, 10, 31, + 20, 32, 12, 33, 14, 34, 16, 35, + 18, 36, 39, 20, 21, 30, 37, 20, + 0, 29, 2, 4, 6, 8, 20, 20, + 11, 13, 15, 17, 38, 19, 0 }; static const char _khmer_syllable_machine_cond_actions[] = { - 2, 2, 2, 0, 1, 2, 0, 1, - 2, 2, 0, 1, 2, 0, 1, 0, - 0, 1, 2, 0, 1, 2, 2, 0, - 1, 2, 0, 1, 2, 2, 0, 1, - 2, 0, 1, 4, 0, 3, 4, 2, - 0, 5, 2, 0, 5, 0, 0, 5, - 2, 0, 5, 2, 2, 0, 5, 2, - 0, 5, 2, 2, 0, 5, 2, 0, - 5, 4, 4, 2, 0, 5, 0, 2, - 4, 0, 2, 2, 2, 2, 2, 9, - 2, 8, 0, 2, 2, 0, 2, 2, - 2, 2, 0, 10, 0, 2, 0, 2, - 2, 2, 2, 0, 10, 0, 2, 0, - 2, 0, 10, 0, 10, 0, 2, 0, - 0, 10, 0, 2, 0, 2, 2, 0, - 10, 0, 2, 0, 2, 2, 2, 0, - 10, 0, 2, 0, 2, 2, 2, 2, - 0, 10, 2, 2, 10, 4, 2, 0, - 11, 0, 4, 0, 2, 2, 2, 2, - 0, 12, 0, 2, 0, 2, 0, 12, - 0, 12, 0, 2, 0, 0, 12, 0, - 2, 0, 2, 2, 0, 12, 0, 2, - 0, 2, 2, 2, 0, 12, 4, 4, - 12, 0, 4, 4, 0, 2, 2, 2, - 2, 0, 12, 0, 4, 0, 2, 2, - 2, 2, 0, 12, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 11, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 0 + 1, 0, 2, 2, 2, 0, 0, 0, + 2, 0, 2, 0, 2, 3, 0, 4, + 5, 2, 0, 0, 0, 2, 0, 2, + 0, 2, 4, 8, 2, 9, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, + 0, 0, 0, 0, 4, 0, 0 }; static const char _khmer_syllable_machine_to_state_actions[] = { @@ -318,12 +151,12 @@ static const char _khmer_syllable_machine_from_state_actions[] = { }; static const char _khmer_syllable_machine_eof_cond_spaces[] = { - -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, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0 + -1, -1, -1, -1, -1, -1, 0 }; static const char _khmer_syllable_machine_eof_cond_key_offs[] = { @@ -348,12 +181,12 @@ static const char _khmer_syllable_machine_eof_cond_keys[] = { 0 }; -static const short _khmer_syllable_machine_eof_trans[] = { - 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 0, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, +static const char _khmer_syllable_machine_eof_trans[] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 14, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 39, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 0 }; @@ -419,7 +252,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { if ( p == pe ) goto _test_eof; _resume: { @@ -432,57 +265,22 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _khmer_syllable_machine_trans_keys + (_khmer_syllable_machine_key_offsets[cs])); - _trans = (unsigned int)_khmer_syllable_machine_index_offsets[cs]; + _keys = ( _khmer_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _khmer_syllable_machine_indicies + (_khmer_syllable_machine_index_offsets[cs])); - _klen = (int)_khmer_syllable_machine_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (info[p].khmer_category()) < (*( _mid)) ) - _upper = _mid - 1; - else if ( (info[p].khmer_category()) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( (info[p].khmer_category()) <= 29 && (info[p].khmer_category()) >= 1 ) + { + int _ic = (int)_khmer_syllable_machine_char_class[(int)(info[p].khmer_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; } - _klen = (int)_khmer_syllable_machine_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (info[p].khmer_category()) < (*( _mid)) ) - _upper = _mid - 2; - else if ( (info[p].khmer_category()) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_khmer_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index 75247d8c4..f40a47999 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -30,109 +30,157 @@ #include "hb.hh" -static const short _myanmar_syllable_machine_key_offsets[] = { - 0, 24, 41, 47, 50, 55, 62, 67, - 71, 81, 88, 97, 105, 108, 123, 134, - 144, 153, 161, 172, 185, 197, 211, 227, - 233, 236, 241, 248, 253, 257, 267, 274, - 283, 291, 294, 311, 326, 337, 347, 356, - 364, 375, 388, 400, 414, 430, 447, 463, - 485, 490, 0 -}; - static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 3u, 4u, 8u, 10u, 11u, 16u, 18u, 19u, - 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, - 29u, 30u, 31u, 32u, 1u, 2u, 5u, 6u, - 3u, 4u, 8u, 10u, 18u, 21u, 22u, 23u, - 24u, 25u, 26u, 27u, 28u, 29u, 30u, 5u, - 6u, 8u, 18u, 25u, 29u, 5u, 6u, 8u, - 5u, 6u, 8u, 25u, 29u, 5u, 6u, 3u, - 8u, 10u, 18u, 25u, 5u, 6u, 8u, 18u, - 25u, 5u, 6u, 8u, 25u, 5u, 6u, 3u, - 8u, 10u, 18u, 21u, 25u, 26u, 29u, 5u, - 6u, 3u, 8u, 10u, 25u, 29u, 5u, 6u, - 3u, 8u, 10u, 18u, 25u, 26u, 29u, 5u, - 6u, 3u, 8u, 10u, 25u, 26u, 29u, 5u, - 6u, 16u, 1u, 2u, 3u, 8u, 10u, 18u, - 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, - 29u, 5u, 6u, 3u, 8u, 10u, 18u, 25u, - 26u, 27u, 28u, 29u, 5u, 6u, 3u, 8u, - 10u, 25u, 26u, 27u, 28u, 29u, 5u, 6u, - 3u, 8u, 10u, 25u, 26u, 27u, 29u, 5u, - 6u, 3u, 8u, 10u, 25u, 27u, 29u, 5u, - 6u, 3u, 8u, 10u, 25u, 26u, 27u, 28u, - 29u, 30u, 5u, 6u, 3u, 8u, 10u, 18u, - 21u, 23u, 25u, 26u, 27u, 28u, 29u, 5u, - 6u, 3u, 8u, 10u, 18u, 21u, 25u, 26u, - 27u, 28u, 29u, 5u, 6u, 3u, 8u, 10u, - 18u, 21u, 22u, 23u, 25u, 26u, 27u, 28u, - 29u, 5u, 6u, 3u, 4u, 8u, 10u, 18u, - 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, - 29u, 5u, 6u, 8u, 18u, 25u, 29u, 5u, - 6u, 8u, 5u, 6u, 8u, 25u, 29u, 5u, - 6u, 3u, 8u, 10u, 18u, 25u, 5u, 6u, - 8u, 18u, 25u, 5u, 6u, 8u, 25u, 5u, - 6u, 3u, 8u, 10u, 18u, 21u, 25u, 26u, - 29u, 5u, 6u, 3u, 8u, 10u, 25u, 29u, - 5u, 6u, 3u, 8u, 10u, 18u, 25u, 26u, - 29u, 5u, 6u, 3u, 8u, 10u, 25u, 26u, - 29u, 5u, 6u, 16u, 1u, 2u, 3u, 4u, - 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, - 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, - 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, - 26u, 27u, 28u, 29u, 5u, 6u, 3u, 8u, - 10u, 18u, 25u, 26u, 27u, 28u, 29u, 5u, - 6u, 3u, 8u, 10u, 25u, 26u, 27u, 28u, - 29u, 5u, 6u, 3u, 8u, 10u, 25u, 26u, - 27u, 29u, 5u, 6u, 3u, 8u, 10u, 25u, - 27u, 29u, 5u, 6u, 3u, 8u, 10u, 25u, - 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, - 8u, 10u, 18u, 21u, 23u, 25u, 26u, 27u, - 28u, 29u, 5u, 6u, 3u, 8u, 10u, 18u, - 21u, 25u, 26u, 27u, 28u, 29u, 5u, 6u, - 3u, 8u, 10u, 18u, 21u, 22u, 23u, 25u, - 26u, 27u, 28u, 29u, 5u, 6u, 3u, 4u, - 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, - 26u, 27u, 28u, 29u, 5u, 6u, 3u, 4u, - 8u, 10u, 18u, 21u, 22u, 23u, 24u, 25u, - 26u, 27u, 28u, 29u, 30u, 5u, 6u, 3u, - 4u, 8u, 10u, 18u, 21u, 22u, 23u, 24u, - 25u, 26u, 27u, 28u, 29u, 5u, 6u, 3u, - 4u, 8u, 10u, 11u, 16u, 18u, 21u, 22u, - 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, - 32u, 1u, 2u, 5u, 6u, 11u, 16u, 32u, - 1u, 2u, 8u, 0u + 0u, 21u, 1u, 20u, 3u, 19u, 3u, 5u, + 3u, 19u, 1u, 15u, 3u, 15u, 3u, 15u, + 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, + 0u, 8u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 20u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 19u, 3u, 19u, + 3u, 5u, 3u, 19u, 1u, 15u, 3u, 15u, + 3u, 15u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 0u, 8u, 1u, 20u, 1u, 19u, + 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 20u, 1u, 19u, 1u, 19u, 1u, 19u, + 1u, 19u, 1u, 20u, 1u, 19u, 0u, 20u, + 0u, 8u, 5u, 5u, 0u }; -static const char _myanmar_syllable_machine_single_lengths[] = { - 20, 15, 4, 1, 3, 5, 3, 2, - 8, 5, 7, 6, 1, 13, 9, 8, - 7, 6, 9, 11, 10, 12, 14, 4, - 1, 3, 5, 3, 2, 8, 5, 7, - 6, 1, 15, 13, 9, 8, 7, 6, - 9, 11, 10, 12, 14, 15, 14, 18, - 3, 1, 0 -}; - -static const char _myanmar_syllable_machine_range_lengths[] = { - 2, 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, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 0, 0 +static const char _myanmar_syllable_machine_char_class[] = { + 0, 0, 1, 2, 3, 3, 4, 5, + 4, 6, 7, 4, 4, 4, 4, 8, + 4, 9, 10, 4, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 7, + 0 }; static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 23, 40, 46, 49, 54, 61, 66, - 70, 80, 87, 96, 104, 107, 122, 133, - 143, 152, 160, 171, 184, 196, 210, 226, - 232, 235, 240, 247, 252, 256, 266, 273, - 282, 290, 293, 310, 325, 336, 346, 355, - 363, 374, 387, 399, 413, 429, 446, 462, - 483, 488, 0 + 0, 22, 42, 59, 62, 79, 94, 107, + 120, 139, 158, 177, 196, 205, 224, 243, + 262, 281, 300, 320, 339, 358, 377, 396, + 413, 416, 433, 448, 461, 474, 493, 512, + 531, 550, 559, 579, 598, 617, 636, 655, + 674, 694, 713, 732, 751, 770, 790, 809, + 830, 839, 0 +}; + +static const char _myanmar_syllable_machine_indicies[] = { + 1, 2, 3, 4, 0, 5, 6, 1, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 22, 23, + 24, 21, 25, 26, 21, 21, 27, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 24, 21, 25, 21, 21, 21, + 38, 21, 21, 21, 21, 21, 32, 21, + 21, 21, 36, 24, 21, 25, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 21, 21, 21, 36, 39, + 21, 24, 21, 25, 32, 21, 21, 40, + 21, 21, 21, 21, 21, 32, 24, 21, + 25, 21, 21, 21, 40, 21, 21, 21, + 21, 21, 32, 24, 21, 25, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 22, 21, 24, 21, 25, 26, 21, 21, + 41, 21, 41, 21, 21, 21, 32, 42, + 21, 21, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 21, 21, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 41, 21, + 21, 21, 21, 21, 32, 42, 21, 21, + 36, 22, 21, 24, 21, 25, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 42, 21, 21, 36, 1, 21, 21, 21, + 21, 21, 21, 21, 1, 22, 21, 24, + 21, 25, 26, 21, 21, 27, 21, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 22, 21, 24, 21, 25, 26, 21, 21, + 43, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 33, 34, 35, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 32, 33, 34, 21, + 36, 22, 21, 24, 21, 25, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 32, + 21, 34, 21, 36, 22, 21, 24, 21, + 25, 26, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 33, 34, 35, 36, 43, + 22, 21, 24, 21, 25, 26, 21, 21, + 43, 21, 28, 21, 30, 21, 32, 33, + 34, 35, 36, 22, 21, 24, 21, 25, + 26, 21, 21, 43, 21, 28, 21, 21, + 21, 32, 33, 34, 35, 36, 22, 21, + 24, 21, 25, 26, 21, 21, 43, 21, + 28, 29, 30, 21, 32, 33, 34, 35, + 36, 22, 23, 24, 21, 25, 26, 21, + 21, 27, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 45, 44, 5, 44, + 44, 44, 46, 44, 44, 44, 44, 44, + 14, 44, 44, 44, 18, 45, 44, 5, + 45, 44, 5, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 44, 44, 44, + 18, 47, 44, 45, 44, 5, 14, 44, + 44, 48, 44, 44, 44, 44, 44, 14, + 45, 44, 5, 44, 44, 44, 48, 44, + 44, 44, 44, 44, 14, 45, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 14, 2, 44, 45, 44, 5, 6, + 44, 44, 49, 44, 49, 44, 44, 44, + 14, 50, 44, 44, 18, 2, 44, 45, + 44, 5, 6, 44, 44, 44, 44, 44, + 44, 44, 44, 14, 44, 44, 44, 18, + 2, 44, 45, 44, 5, 6, 44, 44, + 49, 44, 44, 44, 44, 44, 14, 50, + 44, 44, 18, 2, 44, 45, 44, 5, + 6, 44, 44, 44, 44, 44, 44, 44, + 44, 14, 50, 44, 44, 18, 51, 44, + 44, 44, 44, 44, 44, 44, 51, 2, + 3, 45, 44, 5, 6, 44, 44, 8, + 44, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 2, 44, 45, 44, 5, + 6, 44, 44, 8, 44, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 2, 44, + 45, 44, 5, 6, 44, 44, 52, 44, + 44, 44, 44, 44, 14, 15, 16, 17, + 18, 2, 44, 45, 44, 5, 6, 44, + 44, 44, 44, 44, 44, 44, 44, 14, + 15, 16, 17, 18, 2, 44, 45, 44, + 5, 6, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 44, 18, 2, + 44, 45, 44, 5, 6, 44, 44, 44, + 44, 44, 44, 44, 44, 14, 44, 16, + 44, 18, 2, 44, 45, 44, 5, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 15, 16, 17, 18, 52, 2, 44, + 45, 44, 5, 6, 44, 44, 52, 44, + 10, 44, 12, 44, 14, 15, 16, 17, + 18, 2, 44, 45, 44, 5, 6, 44, + 44, 52, 44, 10, 44, 44, 44, 14, + 15, 16, 17, 18, 2, 44, 45, 44, + 5, 6, 44, 44, 52, 44, 10, 11, + 12, 44, 14, 15, 16, 17, 18, 2, + 3, 45, 44, 5, 6, 44, 44, 8, + 44, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 22, 23, 24, 21, 25, 26, + 21, 21, 53, 21, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 22, 54, + 24, 21, 25, 26, 21, 21, 27, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 1, 2, 3, 45, 44, 5, 6, + 1, 1, 8, 44, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 1, 55, + 55, 55, 55, 55, 55, 1, 1, 56, + 0 +}; + +static const char _myanmar_syllable_machine_index_defaults[] = { + 0, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 21, 21, 44, + 55, 55, 0 }; static const char _myanmar_syllable_machine_trans_cond_spaces[] = { @@ -143,422 +191,29 @@ static const char _myanmar_syllable_machine_trans_cond_spaces[] = { -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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 -}; - -static const short _myanmar_syllable_machine_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 0 -}; - -static const char _myanmar_syllable_machine_trans_lengths[] = { - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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 -}; - -static const char _myanmar_syllable_machine_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + -1, 0 }; static const char _myanmar_syllable_machine_cond_targs[] = { - 23, 33, 24, 30, 1, 45, 35, 48, - 36, 41, 42, 43, 26, 38, 39, 40, - 29, 44, 49, 1, 1, 0, 0, 2, - 12, 3, 9, 13, 14, 19, 20, 21, - 5, 16, 17, 18, 8, 22, 0, 0, - 3, 4, 5, 8, 0, 0, 3, 0, - 0, 3, 5, 8, 0, 0, 6, 3, - 5, 7, 5, 0, 0, 3, 7, 5, - 0, 0, 3, 5, 0, 0, 2, 3, - 9, 10, 10, 5, 11, 8, 0, 0, - 2, 3, 9, 5, 8, 0, 0, 2, - 3, 9, 10, 5, 11, 8, 0, 0, - 2, 3, 9, 5, 11, 8, 0, 0, - 1, 1, 0, 2, 3, 9, 13, 14, - 19, 20, 21, 5, 16, 17, 18, 8, - 0, 0, 2, 3, 9, 15, 5, 16, - 17, 18, 8, 0, 0, 2, 3, 9, - 5, 16, 17, 18, 8, 0, 0, 2, - 3, 9, 5, 16, 17, 8, 0, 0, - 2, 3, 9, 5, 17, 8, 0, 0, - 2, 3, 9, 5, 16, 17, 18, 8, - 15, 0, 0, 2, 3, 9, 15, 14, - 20, 5, 16, 17, 18, 8, 0, 0, - 2, 3, 9, 15, 14, 5, 16, 17, - 18, 8, 0, 0, 2, 3, 9, 15, - 14, 19, 20, 5, 16, 17, 18, 8, - 0, 0, 2, 12, 3, 9, 13, 14, - 19, 20, 21, 5, 16, 17, 18, 8, - 0, 0, 24, 25, 26, 29, 0, 0, - 24, 0, 0, 24, 26, 29, 0, 0, - 27, 24, 26, 28, 26, 0, 0, 24, - 28, 26, 0, 0, 24, 26, 0, 0, - 23, 24, 30, 31, 31, 26, 32, 29, - 0, 0, 23, 24, 30, 26, 29, 0, - 0, 23, 24, 30, 31, 26, 32, 29, - 0, 0, 23, 24, 30, 26, 32, 29, - 0, 0, 34, 34, 0, 23, 33, 24, - 30, 35, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 44, 0, 0, 23, 24, - 30, 35, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 0, 0, 23, 24, 30, - 37, 26, 38, 39, 40, 29, 0, 0, - 23, 24, 30, 26, 38, 39, 40, 29, - 0, 0, 23, 24, 30, 26, 38, 39, - 29, 0, 0, 23, 24, 30, 26, 39, - 29, 0, 0, 23, 24, 30, 26, 38, - 39, 40, 29, 37, 0, 0, 23, 24, - 30, 37, 36, 42, 26, 38, 39, 40, - 29, 0, 0, 23, 24, 30, 37, 36, - 26, 38, 39, 40, 29, 0, 0, 23, - 24, 30, 37, 36, 41, 42, 26, 38, - 39, 40, 29, 0, 0, 23, 33, 24, - 30, 35, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 0, 0, 2, 12, 3, - 9, 46, 14, 19, 20, 21, 5, 16, - 17, 18, 8, 22, 0, 0, 2, 47, - 3, 9, 13, 14, 19, 20, 21, 5, - 16, 17, 18, 8, 0, 0, 23, 33, - 24, 30, 1, 1, 35, 36, 41, 42, - 43, 26, 38, 39, 40, 29, 44, 1, - 1, 0, 0, 1, 1, 1, 1, 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, 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, 1, 23, 33, 0, 24, 30, 45, + 35, 48, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 49, 0, 2, 12, + 0, 3, 9, 13, 14, 19, 20, 21, + 5, 16, 17, 18, 8, 22, 4, 6, + 7, 10, 11, 15, 0, 0, 25, 27, + 28, 31, 32, 34, 37, 46, 47, 0, + 0, 0 }; static const char _myanmar_syllable_machine_cond_actions[] = { + 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 6, 5, 0, 6, - 5, 0, 0, 0, 6, 5, 0, 0, - 0, 0, 0, 6, 5, 0, 0, 0, - 6, 5, 0, 0, 6, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 0, 6, 5, 0, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 5, 0, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 5, 0, 0, 0, 0, 8, 7, - 0, 8, 7, 0, 0, 0, 8, 7, - 0, 0, 0, 0, 0, 8, 7, 0, - 0, 0, 8, 7, 0, 0, 8, 7, - 0, 0, 0, 0, 0, 0, 0, 0, - 8, 7, 0, 0, 0, 0, 0, 8, - 7, 0, 0, 0, 0, 0, 0, 0, - 8, 7, 0, 0, 0, 0, 0, 0, - 8, 7, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 7, - 0, 0, 0, 0, 0, 0, 0, 0, - 8, 7, 0, 0, 0, 0, 0, 0, - 0, 8, 7, 0, 0, 0, 0, 0, - 0, 8, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 7, 0, 0, 0, 0, 9, - 10, 9, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 5, - 7, 9, 9, 0 + 0, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 10, 0 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -582,13 +237,13 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { }; static const char _myanmar_syllable_machine_eof_cond_spaces[] = { - -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, -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 + -1, -1, -1, 0 }; static const char _myanmar_syllable_machine_eof_cond_key_offs[] = { @@ -615,14 +270,14 @@ static const char _myanmar_syllable_machine_eof_cond_keys[] = { 0 }; -static const short _myanmar_syllable_machine_eof_trans[] = { - 0, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, - 538, 539, 0 +static const char _myanmar_syllable_machine_eof_trans[] = { + 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 22, 22, 45, + 56, 56, 0 }; static const char _myanmar_syllable_machine_nfa_targs[] = { @@ -687,7 +342,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { if ( p == pe ) goto _test_eof; _resume: { @@ -700,57 +355,22 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _myanmar_syllable_machine_trans_keys + (_myanmar_syllable_machine_key_offsets[cs])); - _trans = (unsigned int)_myanmar_syllable_machine_index_offsets[cs]; + _keys = ( _myanmar_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _myanmar_syllable_machine_indicies + (_myanmar_syllable_machine_index_offsets[cs])); - _klen = (int)_myanmar_syllable_machine_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (info[p].myanmar_category()) < (*( _mid)) ) - _upper = _mid - 1; - else if ( (info[p].myanmar_category()) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( (info[p].myanmar_category()) <= 32 && (info[p].myanmar_category()) >= 1 ) + { + int _ic = (int)_myanmar_syllable_machine_char_class[(int)(info[p].myanmar_category()) - 1]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; } - _klen = (int)_myanmar_syllable_machine_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (info[p].myanmar_category()) < (*( _mid)) ) - _upper = _mid - 2; - else if ( (info[p].myanmar_category()) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_myanmar_syllable_machine_cond_targs[_trans]; diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index 607922e61..e4b1884cf 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -32,136 +32,228 @@ #include "hb.hh" -static const short _use_syllable_machine_key_offsets[] = { - 0, 2, 4, 5, 7, 42, 43, 66, - 89, 91, 92, 114, 127, 135, 139, 142, - 144, 151, 157, 162, 174, 185, 195, 210, - 225, 239, 255, 276, 286, 308, 310, 311, - 312, 337, 361, 363, 364, 387, 409, 422, - 430, 434, 437, 439, 446, 452, 457, 469, - 480, 490, 505, 520, 534, 550, 571, 581, - 583, 584, 586, 587, 589, 616, 638, 640, - 641, 644, 0 -}; - static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 12u, 44u, 0u, - 1u, 3u, 4u, 5u, 8u, 11u, 12u, 13u, - 15u, 18u, 19u, 23u, 24u, 25u, 26u, 27u, - 28u, 30u, 31u, 32u, 33u, 34u, 35u, 37u, - 38u, 39u, 41u, 42u, 43u, 44u, 16u, 17u, - 22u, 29u, 21u, 8u, 11u, 12u, 15u, 22u, - 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, - 32u, 33u, 34u, 35u, 37u, 38u, 39u, 44u, - 21u, 31u, 8u, 11u, 12u, 15u, 21u, 23u, - 24u, 25u, 26u, 27u, 28u, 30u, 33u, 34u, - 35u, 37u, 38u, 39u, 44u, 22u, 29u, 31u, - 32u, 1u, 15u, 1u, 8u, 11u, 12u, 15u, - 23u, 24u, 25u, 26u, 27u, 28u, 30u, 33u, - 34u, 35u, 37u, 38u, 39u, 44u, 22u, 29u, - 31u, 32u, 8u, 22u, 23u, 24u, 25u, 26u, - 33u, 34u, 35u, 37u, 38u, 39u, 44u, 8u, - 23u, 24u, 25u, 26u, 37u, 38u, 39u, 8u, - 24u, 25u, 26u, 8u, 25u, 26u, 8u, 26u, - 8u, 24u, 25u, 26u, 37u, 38u, 39u, 8u, - 24u, 25u, 26u, 38u, 39u, 8u, 24u, 25u, - 26u, 39u, 8u, 23u, 24u, 25u, 26u, 33u, - 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, - 24u, 25u, 26u, 34u, 35u, 37u, 38u, 39u, - 44u, 8u, 23u, 24u, 25u, 26u, 35u, 37u, - 38u, 39u, 44u, 8u, 22u, 23u, 24u, 25u, - 26u, 28u, 29u, 33u, 34u, 35u, 37u, 38u, - 39u, 44u, 8u, 22u, 23u, 24u, 25u, 26u, - 28u, 29u, 33u, 34u, 35u, 37u, 38u, 39u, - 44u, 8u, 22u, 23u, 24u, 25u, 26u, 29u, - 33u, 34u, 35u, 37u, 38u, 39u, 44u, 8u, - 23u, 24u, 25u, 26u, 27u, 28u, 33u, 34u, - 35u, 37u, 38u, 39u, 44u, 22u, 29u, 8u, - 11u, 12u, 15u, 23u, 24u, 25u, 26u, 27u, - 28u, 30u, 32u, 33u, 34u, 35u, 37u, 38u, - 39u, 44u, 22u, 29u, 1u, 8u, 15u, 23u, - 24u, 25u, 26u, 37u, 38u, 39u, 8u, 11u, - 12u, 15u, 23u, 24u, 25u, 26u, 27u, 28u, - 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, - 39u, 44u, 22u, 29u, 13u, 21u, 4u, 13u, - 8u, 11u, 12u, 15u, 21u, 23u, 24u, 25u, - 26u, 27u, 28u, 30u, 31u, 32u, 33u, 34u, - 35u, 37u, 38u, 39u, 41u, 42u, 44u, 22u, - 29u, 8u, 11u, 12u, 15u, 23u, 24u, 25u, - 26u, 27u, 28u, 30u, 31u, 32u, 33u, 34u, - 35u, 37u, 38u, 39u, 41u, 42u, 44u, 22u, - 29u, 41u, 42u, 42u, 8u, 11u, 12u, 15u, - 21u, 23u, 24u, 25u, 26u, 27u, 28u, 30u, - 33u, 34u, 35u, 37u, 38u, 39u, 44u, 22u, - 29u, 31u, 32u, 8u, 11u, 12u, 15u, 23u, - 24u, 25u, 26u, 27u, 28u, 30u, 33u, 34u, - 35u, 37u, 38u, 39u, 44u, 22u, 29u, 31u, - 32u, 8u, 22u, 23u, 24u, 25u, 26u, 33u, - 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, - 24u, 25u, 26u, 37u, 38u, 39u, 8u, 24u, - 25u, 26u, 8u, 25u, 26u, 8u, 26u, 8u, - 24u, 25u, 26u, 37u, 38u, 39u, 8u, 24u, - 25u, 26u, 38u, 39u, 8u, 24u, 25u, 26u, - 39u, 8u, 23u, 24u, 25u, 26u, 33u, 34u, - 35u, 37u, 38u, 39u, 44u, 8u, 23u, 24u, - 25u, 26u, 34u, 35u, 37u, 38u, 39u, 44u, - 8u, 23u, 24u, 25u, 26u, 35u, 37u, 38u, - 39u, 44u, 8u, 22u, 23u, 24u, 25u, 26u, - 28u, 29u, 33u, 34u, 35u, 37u, 38u, 39u, - 44u, 8u, 22u, 23u, 24u, 25u, 26u, 28u, - 29u, 33u, 34u, 35u, 37u, 38u, 39u, 44u, - 8u, 22u, 23u, 24u, 25u, 26u, 29u, 33u, - 34u, 35u, 37u, 38u, 39u, 44u, 8u, 23u, - 24u, 25u, 26u, 27u, 28u, 33u, 34u, 35u, - 37u, 38u, 39u, 44u, 22u, 29u, 8u, 11u, - 12u, 15u, 23u, 24u, 25u, 26u, 27u, 28u, - 30u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, - 44u, 22u, 29u, 1u, 8u, 15u, 23u, 24u, - 25u, 26u, 37u, 38u, 39u, 1u, 15u, 4u, - 13u, 21u, 13u, 12u, 44u, 1u, 5u, 8u, - 11u, 12u, 13u, 15u, 23u, 24u, 25u, 26u, - 27u, 28u, 30u, 31u, 32u, 33u, 34u, 35u, - 37u, 38u, 39u, 41u, 42u, 44u, 22u, 29u, - 8u, 11u, 12u, 15u, 23u, 24u, 25u, 26u, - 27u, 28u, 30u, 31u, 32u, 33u, 34u, 35u, - 37u, 38u, 39u, 44u, 22u, 29u, 41u, 42u, - 42u, 21u, 41u, 42u, 1u, 5u, 0u + 7u, 33u, 1u, 9u, 1u, 1u, 7u, 33u, + 0u, 33u, 12u, 12u, 5u, 33u, 5u, 33u, + 1u, 9u, 1u, 1u, 5u, 33u, 5u, 33u, + 5u, 29u, 5u, 17u, 5u, 17u, 5u, 17u, + 5u, 29u, 5u, 29u, 5u, 29u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 1u, 29u, + 5u, 33u, 8u, 12u, 3u, 3u, 8u, 8u, + 5u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 29u, + 5u, 17u, 5u, 17u, 5u, 17u, 5u, 29u, + 5u, 29u, 5u, 29u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, + 5u, 33u, 5u, 33u, 1u, 29u, 1u, 9u, + 3u, 3u, 8u, 12u, 8u, 8u, 7u, 33u, + 1u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, + 12u, 31u, 1u, 4u, 0u }; -static const char _use_syllable_machine_single_lengths[] = { - 2, 2, 1, 2, 31, 1, 21, 19, - 2, 1, 18, 13, 8, 4, 3, 2, - 7, 6, 5, 12, 11, 10, 15, 15, - 14, 14, 19, 10, 20, 2, 1, 1, - 23, 22, 2, 1, 19, 18, 13, 8, - 4, 3, 2, 7, 6, 5, 12, 11, - 10, 15, 15, 14, 14, 19, 10, 2, - 1, 2, 1, 2, 25, 20, 2, 1, - 3, 2, 0 -}; - -static const char _use_syllable_machine_range_lengths[] = { - 0, 0, 0, 0, 2, 0, 1, 2, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 0, 0, 0, - 1, 1, 0, 0, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0 +static const char _use_syllable_machine_char_class[] = { + 0, 1, 2, 0, 3, 4, 2, 2, + 5, 2, 2, 6, 7, 8, 2, 9, + 0, 0, 10, 11, 2, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 2, 27, 28, 29, + 2, 30, 31, 32, 33, 0 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 3, 6, 8, 11, 45, 47, 70, - 92, 95, 97, 118, 132, 141, 146, 150, - 153, 161, 168, 174, 187, 199, 210, 226, - 242, 257, 273, 294, 305, 327, 330, 332, - 334, 359, 383, 386, 388, 410, 431, 445, - 454, 459, 463, 466, 474, 481, 487, 500, - 512, 523, 539, 555, 570, 586, 607, 618, - 621, 623, 626, 628, 631, 658, 680, 683, - 685, 689, 0 + 0, 27, 36, 37, 64, 98, 99, 128, + 157, 166, 167, 196, 225, 250, 263, 276, + 289, 314, 339, 364, 393, 422, 451, 480, + 509, 538, 567, 596, 625, 654, 659, 660, + 661, 690, 719, 721, 722, 751, 780, 809, + 834, 847, 860, 873, 898, 923, 948, 977, + 1006, 1035, 1064, 1093, 1122, 1151, 1180, 1209, + 1218, 1219, 1224, 1225, 1252, 1285, 1314, 1316, + 1317, 1337, 0 +}; + +static const char _use_syllable_machine_indicies[] = { + 1, 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, 1, 3, 2, 2, 2, 2, + 2, 2, 2, 4, 3, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 6, + 7, 8, 9, 10, 11, 12, 3, 13, + 14, 15, 16, 17, 9, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 39, 41, 42, 1, 40, 43, + 40, 40, 44, 45, 46, 47, 48, 49, + 50, 51, 45, 52, 44, 53, 54, 55, + 56, 57, 58, 59, 40, 40, 40, 60, + 41, 42, 1, 40, 43, 40, 40, 61, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 53, 53, 54, 55, 56, 57, 58, + 59, 40, 40, 40, 60, 42, 62, 62, + 62, 62, 62, 62, 62, 63, 42, 41, + 42, 1, 40, 43, 40, 40, 40, 45, + 46, 47, 48, 49, 50, 51, 45, 52, + 53, 53, 54, 55, 56, 57, 58, 59, + 40, 40, 40, 60, 41, 40, 40, 40, + 40, 40, 40, 40, 45, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 54, + 55, 56, 57, 58, 59, 40, 40, 40, + 46, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 46, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 57, + 58, 59, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 47, 48, 49, 41, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 48, 49, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 49, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 57, + 58, 59, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 47, 48, 49, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 58, 59, 41, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 47, 48, 49, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 59, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 54, + 55, 56, 57, 58, 59, 40, 40, 40, + 46, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 46, 47, 48, 49, 40, 40, + 40, 40, 40, 40, 40, 55, 56, 57, + 58, 59, 40, 40, 40, 46, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 40, 40, 56, 57, 58, 59, 40, + 40, 40, 46, 41, 40, 40, 40, 40, + 40, 40, 40, 45, 46, 47, 48, 49, + 40, 51, 45, 40, 40, 40, 54, 55, + 56, 57, 58, 59, 40, 40, 40, 46, + 41, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 64, 45, + 40, 40, 40, 54, 55, 56, 57, 58, + 59, 40, 40, 40, 46, 41, 40, 40, + 40, 40, 40, 40, 40, 45, 46, 47, + 48, 49, 40, 40, 45, 40, 40, 40, + 54, 55, 56, 57, 58, 59, 40, 40, + 40, 46, 41, 40, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 40, 40, 40, 54, 55, 56, + 57, 58, 59, 40, 40, 40, 46, 41, + 42, 1, 40, 43, 40, 40, 40, 45, + 46, 47, 48, 49, 50, 51, 45, 52, + 40, 53, 54, 55, 56, 57, 58, 59, + 40, 40, 40, 60, 42, 62, 62, 62, + 41, 62, 62, 62, 63, 62, 62, 62, + 62, 46, 47, 48, 49, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 57, 58, + 59, 41, 42, 1, 40, 43, 40, 40, + 40, 45, 46, 47, 48, 49, 50, 51, + 45, 52, 44, 53, 54, 55, 56, 57, + 58, 59, 40, 40, 40, 60, 66, 65, + 65, 65, 67, 10, 66, 41, 42, 1, + 40, 43, 40, 40, 69, 45, 46, 47, + 48, 49, 50, 51, 45, 52, 44, 53, + 54, 55, 56, 57, 58, 59, 70, 71, + 40, 60, 41, 42, 1, 40, 43, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 44, 53, 54, 55, 56, + 57, 58, 59, 70, 71, 40, 60, 70, + 71, 71, 12, 3, 6, 73, 74, 73, + 73, 75, 18, 19, 20, 21, 22, 23, + 24, 18, 25, 27, 27, 28, 29, 30, + 31, 32, 33, 73, 73, 73, 37, 12, + 3, 6, 73, 74, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 27, 27, 28, 29, 30, 31, 32, 33, + 73, 73, 73, 37, 12, 73, 73, 73, + 73, 73, 73, 73, 18, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 28, + 29, 30, 31, 32, 33, 73, 73, 73, + 19, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 31, + 32, 33, 12, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 21, 22, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 22, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 31, + 32, 33, 12, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 32, 33, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 33, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 28, + 29, 30, 31, 32, 33, 73, 73, 73, + 19, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 29, 30, 31, + 32, 33, 73, 73, 73, 19, 12, 73, + 73, 73, 73, 73, 73, 73, 73, 19, + 20, 21, 22, 73, 73, 73, 73, 73, + 73, 73, 73, 30, 31, 32, 33, 73, + 73, 73, 19, 12, 73, 73, 73, 73, + 73, 73, 73, 18, 19, 20, 21, 22, + 73, 24, 18, 73, 73, 73, 28, 29, + 30, 31, 32, 33, 73, 73, 73, 19, + 12, 73, 73, 73, 73, 73, 73, 73, + 18, 19, 20, 21, 22, 73, 76, 18, + 73, 73, 73, 28, 29, 30, 31, 32, + 33, 73, 73, 73, 19, 12, 73, 73, + 73, 73, 73, 73, 73, 18, 19, 20, + 21, 22, 73, 73, 18, 73, 73, 73, + 28, 29, 30, 31, 32, 33, 73, 73, + 73, 19, 12, 73, 73, 73, 73, 73, + 73, 73, 18, 19, 20, 21, 22, 23, + 24, 18, 73, 73, 73, 28, 29, 30, + 31, 32, 33, 73, 73, 73, 19, 12, + 3, 6, 73, 74, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 73, 27, 28, 29, 30, 31, 32, 33, + 73, 73, 73, 37, 3, 73, 73, 73, + 12, 73, 73, 73, 4, 73, 73, 73, + 73, 19, 20, 21, 22, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 31, 32, + 33, 3, 77, 77, 77, 77, 77, 77, + 77, 4, 78, 14, 73, 73, 73, 79, + 14, 6, 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, 6, 8, 73, 73, 8, + 12, 3, 6, 14, 74, 73, 73, 73, + 18, 19, 20, 21, 22, 23, 24, 18, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 73, 37, 12, 3, 6, + 73, 74, 73, 73, 73, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 73, 73, + 73, 37, 34, 35, 35, 70, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 70, + 71, 8, 77, 77, 8, 0 +}; + +static const char _use_syllable_machine_index_defaults[] = { + 0, 2, 2, 5, 9, 38, 40, 40, + 62, 62, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 62, 40, 65, 68, 65, + 40, 40, 72, 72, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 77, + 73, 73, 73, 77, 73, 73, 73, 73, + 72, 77, 0 }; static const char _use_syllable_machine_trans_cond_spaces[] = { @@ -175,581 +267,35 @@ static const char _use_syllable_machine_trans_cond_spaces[] = { -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 0 -}; - -static const short _use_syllable_machine_trans_offsets[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 559, - 560, 561, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 591, - 592, 593, 594, 595, 596, 597, 598, 599, - 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, - 616, 617, 618, 619, 620, 621, 622, 623, - 624, 625, 626, 627, 628, 629, 630, 631, - 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, - 688, 689, 690, 691, 692, 693, 694, 695, - 696, 697, 698, 699, 700, 701, 702, 703, - 704, 705, 706, 707, 708, 709, 710, 711, - 712, 713, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 0 -}; - -static const char _use_syllable_machine_trans_lengths[] = { - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 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, 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, 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, - 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, 1, 1, - 1, 1, 1, 1, 1, 0 -}; - -static const char _use_syllable_machine_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 0, 0, 0, 0 + 0 }; static const char _use_syllable_machine_cond_targs[] = { - 8, 8, 4, 36, 2, 4, 36, 4, - 1, 1, 4, 5, 6, 5, 29, 32, - 4, 36, 55, 56, 59, 60, 64, 39, - 40, 41, 42, 49, 50, 52, 61, 53, - 46, 47, 48, 43, 44, 45, 62, 63, - 65, 54, 5, 38, 4, 4, 4, 4, - 7, 8, 0, 11, 12, 13, 14, 15, - 22, 23, 11, 25, 26, 19, 20, 21, - 16, 17, 18, 27, 28, 4, 4, 7, - 8, 0, 10, 12, 13, 14, 15, 22, - 23, 25, 19, 20, 21, 16, 17, 18, - 27, 11, 26, 4, 7, 9, 4, 7, - 4, 4, 7, 8, 0, 12, 13, 14, - 15, 22, 23, 25, 19, 20, 21, 16, - 17, 18, 27, 11, 26, 4, 4, 11, - 12, 13, 14, 15, 19, 20, 21, 16, - 17, 18, 12, 4, 4, 12, 13, 14, - 15, 16, 17, 18, 4, 4, 13, 14, - 15, 4, 4, 14, 15, 4, 4, 15, - 4, 4, 13, 14, 15, 16, 17, 18, - 4, 4, 13, 14, 15, 17, 18, 4, - 4, 13, 14, 15, 18, 4, 4, 12, - 13, 14, 15, 19, 20, 21, 16, 17, - 18, 12, 4, 4, 12, 13, 14, 15, - 20, 21, 16, 17, 18, 12, 4, 4, - 12, 13, 14, 15, 21, 16, 17, 18, - 12, 4, 4, 11, 12, 13, 14, 15, - 23, 11, 19, 20, 21, 16, 17, 18, - 12, 4, 4, 11, 12, 13, 14, 15, - 24, 11, 19, 20, 21, 16, 17, 18, - 12, 4, 4, 11, 12, 13, 14, 15, - 11, 19, 20, 21, 16, 17, 18, 12, - 4, 4, 12, 13, 14, 15, 22, 23, - 19, 20, 21, 16, 17, 18, 12, 11, - 4, 4, 7, 8, 0, 12, 13, 14, - 15, 22, 23, 25, 26, 19, 20, 21, - 16, 17, 18, 27, 11, 4, 7, 4, - 9, 12, 13, 14, 15, 16, 17, 18, - 4, 4, 7, 8, 0, 12, 13, 14, - 15, 22, 23, 25, 28, 26, 19, 20, - 21, 16, 17, 18, 27, 11, 4, 30, - 31, 4, 29, 4, 30, 4, 4, 7, - 8, 0, 33, 12, 13, 14, 15, 22, - 23, 25, 28, 26, 19, 20, 21, 16, - 17, 18, 34, 35, 27, 11, 4, 4, - 7, 8, 0, 12, 13, 14, 15, 22, - 23, 25, 28, 26, 19, 20, 21, 16, - 17, 18, 34, 35, 27, 11, 4, 34, - 35, 4, 35, 4, 4, 36, 1, 3, - 37, 39, 40, 41, 42, 49, 50, 52, - 46, 47, 48, 43, 44, 45, 54, 38, - 53, 4, 4, 36, 1, 3, 39, 40, - 41, 42, 49, 50, 52, 46, 47, 48, - 43, 44, 45, 54, 38, 53, 4, 4, - 38, 39, 40, 41, 42, 46, 47, 48, - 43, 44, 45, 39, 4, 4, 39, 40, - 41, 42, 43, 44, 45, 4, 4, 40, - 41, 42, 4, 4, 41, 42, 4, 4, - 42, 4, 4, 40, 41, 42, 43, 44, - 45, 4, 4, 40, 41, 42, 44, 45, - 4, 4, 40, 41, 42, 45, 4, 4, - 39, 40, 41, 42, 46, 47, 48, 43, - 44, 45, 39, 4, 4, 39, 40, 41, - 42, 47, 48, 43, 44, 45, 39, 4, - 4, 39, 40, 41, 42, 48, 43, 44, - 45, 39, 4, 4, 38, 39, 40, 41, - 42, 50, 38, 46, 47, 48, 43, 44, - 45, 39, 4, 4, 38, 39, 40, 41, - 42, 51, 38, 46, 47, 48, 43, 44, - 45, 39, 4, 4, 38, 39, 40, 41, - 42, 38, 46, 47, 48, 43, 44, 45, - 39, 4, 4, 39, 40, 41, 42, 49, - 50, 46, 47, 48, 43, 44, 45, 39, - 38, 4, 4, 36, 1, 3, 39, 40, - 41, 42, 49, 50, 52, 53, 46, 47, - 48, 43, 44, 45, 54, 38, 4, 36, - 4, 2, 39, 40, 41, 42, 43, 44, - 45, 4, 36, 2, 4, 57, 4, 56, - 58, 4, 56, 4, 1, 1, 4, 6, - 6, 4, 36, 1, 56, 3, 39, 40, - 41, 42, 49, 50, 52, 61, 53, 46, - 47, 48, 43, 44, 45, 62, 63, 54, - 38, 4, 4, 36, 1, 3, 39, 40, - 41, 42, 49, 50, 52, 61, 53, 46, - 47, 48, 43, 44, 45, 54, 38, 4, - 62, 63, 4, 63, 4, 34, 34, 35, - 4, 6, 6, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 0 + 4, 8, 4, 36, 2, 4, 1, 5, + 6, 4, 29, 32, 4, 55, 56, 59, + 60, 64, 38, 39, 40, 41, 42, 49, + 50, 52, 61, 53, 46, 47, 48, 43, + 44, 45, 62, 63, 65, 54, 4, 4, + 4, 4, 7, 0, 28, 11, 12, 13, + 14, 15, 22, 23, 25, 26, 19, 20, + 21, 16, 17, 18, 27, 10, 4, 9, + 24, 4, 30, 31, 4, 33, 34, 35, + 4, 4, 3, 37, 51, 4, 57, 58, + 0 }; static const char _use_syllable_machine_cond_actions[] = { - 0, 0, 1, 3, 0, 2, 3, 2, - 0, 0, 4, 0, 7, 0, 0, 7, - 9, 3, 10, 0, 10, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 8, 12, 11, 14, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 13, 14, 7, - 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 13, 7, 0, 15, 7, - 15, 14, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 13, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 14, 0, 0, 0, - 0, 0, 0, 0, 13, 14, 0, 0, - 0, 13, 14, 0, 0, 13, 14, 0, - 13, 14, 0, 0, 0, 0, 0, 0, - 13, 14, 0, 0, 0, 0, 0, 13, - 14, 0, 0, 0, 0, 13, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 14, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 13, 14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 13, 14, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 13, 7, 14, - 0, 0, 0, 0, 0, 0, 0, 0, - 15, 14, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, - 0, 16, 0, 17, 0, 16, 14, 7, - 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 7, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 14, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, - 0, 18, 0, 18, 9, 3, 0, 0, + 1, 0, 2, 3, 0, 4, 0, 0, + 7, 8, 0, 7, 9, 10, 0, 10, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, - 3, 19, 9, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 3, 19, 9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 9, 0, 0, - 0, 0, 0, 0, 0, 19, 9, 0, - 0, 0, 19, 9, 0, 0, 19, 9, - 0, 19, 9, 0, 0, 0, 0, 0, - 0, 19, 9, 0, 0, 0, 0, 0, - 19, 9, 0, 0, 0, 0, 19, 9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, - 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 9, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 3, 0, 19, 3, - 9, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 3, 0, 20, 0, 19, 0, - 0, 19, 0, 19, 0, 0, 20, 7, - 7, 9, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 0, 19, 9, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 0, - 0, 0, 0, 0, 0, 3, 0, 19, - 0, 0, 19, 0, 19, 0, 0, 0, - 18, 7, 7, 20, 1, 2, 2, 4, - 11, 13, 13, 15, 15, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 15, 13, - 16, 17, 16, 13, 13, 18, 18, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 20, 19, 19, 19, 20, 19, - 19, 19, 19, 18, 20, 0 + 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 11, 12, + 13, 14, 7, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, 15, 0, + 0, 16, 0, 0, 17, 7, 0, 0, + 18, 19, 0, 3, 0, 20, 0, 0, + 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -777,7 +323,6 @@ static const char _use_syllable_machine_from_state_actions[] = { }; static const char _use_syllable_machine_eof_cond_spaces[] = { - -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, @@ -785,7 +330,8 @@ static const char _use_syllable_machine_eof_cond_spaces[] = { -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, -1, 0 + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0 }; static const char _use_syllable_machine_eof_cond_key_offs[] = { @@ -816,16 +362,16 @@ static const char _use_syllable_machine_eof_cond_keys[] = { 0 }; -static const short _use_syllable_machine_eof_trans[] = { - 693, 694, 695, 696, 0, 697, 698, 699, - 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 713, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, - 740, 741, 742, 743, 744, 745, 746, 747, - 748, 749, 750, 751, 752, 753, 754, 755, - 756, 757, 0 +static const char _use_syllable_machine_eof_trans[] = { + 1, 3, 3, 6, 0, 39, 41, 41, + 63, 63, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 63, 41, 66, 69, 66, + 41, 41, 73, 73, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 78, + 74, 74, 74, 78, 74, 74, 74, 74, + 73, 78, 0 }; static const char _use_syllable_machine_nfa_targs[] = { @@ -893,7 +439,7 @@ find_syllables (hb_buffer_t *buffer) { int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys; { + int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { if ( p == pe ) goto _test_eof; _resume: { @@ -906,57 +452,22 @@ find_syllables (hb_buffer_t *buffer) break; } } - _keys = ( _use_syllable_machine_trans_keys + (_use_syllable_machine_key_offsets[cs])); - _trans = (unsigned int)_use_syllable_machine_index_offsets[cs]; + _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); - _klen = (int)_use_syllable_machine_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + _klen - 1; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (info[p].use_category()) < (*( _mid)) ) - _upper = _mid - 1; - else if ( (info[p].use_category()) > (*( _mid)) ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += (unsigned int)_klen; + if ( (info[p].use_category()) <= 44 ) + { + int _ic = (int)_use_syllable_machine_char_class[(int)(info[p].use_category()) - 0]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; } - _klen = (int)_use_syllable_machine_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - const unsigned char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (info[p].use_category()) < (*( _mid)) ) - _upper = _mid - 2; - else if ( (info[p].use_category()) > (*( _mid + 1)) ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += (unsigned int)_klen; - } - - _match: { - goto _match_cond; - } + goto _match_cond; } _match_cond: { cs = (int)_use_syllable_machine_cond_targs[_trans]; From 8461ade7832110d28001dc641342d3f9461e03b0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:10:48 -0700 Subject: [PATCH 259/617] Revert "[ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018" This reverts commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b. Fixes https://github.com/harfbuzz/harfbuzz/issues/1708 --- src/hb-buffer-deserialize-json.hh | 1053 ++++---- src/hb-buffer-deserialize-text.hh | 1011 ++++---- src/hb-ot-shape-complex-indic-machine.hh | 2678 +++++++++----------- src/hb-ot-shape-complex-khmer-machine.hh | 709 +++--- src/hb-ot-shape-complex-myanmar-machine.hh | 822 +++--- src/hb-ot-shape-complex-use-machine.hh | 1144 ++++----- 6 files changed, 3455 insertions(+), 3962 deletions(-) diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 8631d52e8..1f9e2e91d 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -1,28 +1,30 @@ + +#line 1 "hb-buffer-deserialize-json.rl" /* -* Copyright © 2013 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2013 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_BUFFER_DESERIALIZE_JSON_HH #define HB_BUFFER_DESERIALIZE_JSON_HH @@ -30,208 +32,400 @@ #include "hb.hh" +#line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { - 1u, 0u, 0u, 18u, 0u, 2u, 11u, 14u, - 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, - 6u, 7u, 0u, 19u, 0u, 19u, 0u, 19u, - 2u, 2u, 0u, 8u, 0u, 7u, 6u, 7u, - 0u, 19u, 0u, 19u, 15u, 15u, 2u, 2u, - 0u, 8u, 0u, 7u, 0u, 19u, 0u, 19u, - 16u, 17u, 2u, 2u, 0u, 8u, 0u, 7u, - 6u, 7u, 0u, 19u, 0u, 19u, 2u, 2u, - 0u, 8u, 0u, 7u, 6u, 7u, 0u, 19u, - 0u, 19u, 2u, 2u, 0u, 8u, 0u, 7u, - 9u, 17u, 2u, 17u, 0u, 19u, 0u, 19u, - 0u, 10u, 0u, 18u, 1u, 0u, 0u + 0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, + 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, + 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, + 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, + 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, + 65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0 }; -static const char _deserialize_json_char_class[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 5, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 1, 1, 1, 1, 1, 1, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 1, 1, 10, 1, 5, 1, - 11, 9, 12, 13, 9, 9, 14, 9, - 9, 9, 9, 15, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 16, - 17, 9, 18, 1, 19, 0 +static const char _deserialize_json_key_spans[] = { + 0, 115, 26, 7, 2, 1, 50, 49, + 10, 117, 117, 117, 1, 50, 49, 10, + 117, 117, 1, 1, 50, 49, 117, 117, + 2, 1, 50, 49, 10, 117, 117, 1, + 50, 49, 10, 117, 117, 1, 50, 49, + 58, 89, 117, 117, 85, 115, 0 }; static const short _deserialize_json_index_offsets[] = { - 0, 0, 19, 22, 26, 28, 29, 38, - 46, 48, 68, 88, 108, 109, 118, 126, - 128, 148, 168, 169, 170, 179, 187, 207, - 227, 229, 230, 239, 247, 249, 269, 289, - 290, 299, 307, 309, 329, 349, 350, 359, - 367, 376, 392, 412, 432, 443, 462, 0 + 0, 0, 116, 143, 151, 154, 156, 207, + 257, 268, 386, 504, 622, 624, 675, 725, + 736, 854, 972, 974, 976, 1027, 1077, 1195, + 1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, + 1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, + 2119, 2178, 2268, 2386, 2504, 2590, 2706 }; static const char _deserialize_json_indicies[] = { - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 1, 4, 5, 6, - 7, 8, 9, 10, 11, 11, 1, 1, - 1, 1, 1, 1, 1, 12, 12, 1, - 1, 1, 13, 1, 14, 15, 16, 17, - 18, 1, 1, 19, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 20, 21, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 22, - 18, 1, 1, 19, 1, 1, 17, 17, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 20, 23, 23, 1, 1, - 1, 1, 1, 1, 1, 24, 24, 1, - 1, 1, 25, 1, 26, 27, 28, 29, - 30, 1, 1, 31, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 32, 30, 1, 1, 31, - 1, 1, 29, 29, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 32, - 33, 34, 34, 1, 1, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, - 1, 36, 37, 38, 1, 1, 39, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 40, 38, - 1, 1, 39, 1, 1, 41, 41, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 40, 42, 43, 44, 44, 1, - 1, 1, 1, 1, 1, 1, 45, 45, - 1, 1, 1, 46, 1, 47, 48, 49, - 50, 51, 1, 1, 52, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 53, 51, 1, 1, - 52, 1, 1, 50, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 53, 54, 54, 1, 1, 1, 1, 1, - 1, 1, 55, 55, 1, 1, 1, 56, - 1, 57, 58, 59, 60, 61, 1, 1, - 62, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 63, 61, 1, 1, 62, 1, 1, 60, - 60, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 63, 64, 64, 1, - 1, 1, 1, 1, 1, 1, 65, 65, - 1, 66, 1, 1, 1, 67, 68, 69, - 1, 69, 69, 69, 69, 69, 69, 69, - 70, 1, 71, 71, 71, 71, 1, 71, - 1, 71, 71, 71, 71, 71, 71, 71, - 72, 1, 1, 73, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 74, 72, 1, 1, 73, - 1, 1, 75, 75, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 74, - 76, 1, 1, 77, 1, 1, 1, 1, - 1, 1, 78, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 0 + 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 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, 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, 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, 2, 1, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 4, 1, + 5, 1, 6, 7, 1, 1, 8, 1, + 9, 10, 1, 11, 1, 11, 11, 11, + 11, 11, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 11, 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, 12, 1, + 12, 12, 12, 12, 12, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 12, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 13, 1, 1, 14, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 1, 16, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 1, 18, 18, 18, + 18, 18, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 18, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 19, 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, 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, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 20, 1, 21, 21, 21, 21, 21, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 21, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 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, 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, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 22, + 1, 18, 18, 18, 18, 18, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 18, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 19, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 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, + 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, 1, 1, + 1, 1, 1, 1, 1, 20, 1, 23, + 1, 23, 23, 23, 23, 23, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 23, 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, 24, 1, 24, 24, 24, 24, + 24, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 24, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 25, 1, 1, 26, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 1, 28, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 1, 30, 30, 30, 30, 30, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 30, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 31, 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, 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, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 32, 1, 30, + 30, 30, 30, 30, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 30, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 31, 1, 1, 1, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 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, 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, 1, 1, 1, 1, + 1, 1, 1, 32, 1, 33, 1, 34, + 1, 34, 34, 34, 34, 34, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 34, 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, 35, 1, 35, 35, 35, 35, + 35, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 35, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 36, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 1, 38, 38, + 38, 38, 38, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 38, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 39, 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, + 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, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 40, 1, 38, 38, 38, 38, + 38, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 38, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 39, + 1, 1, 1, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 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, 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, 1, 1, 1, 1, 1, 1, 1, + 40, 1, 42, 43, 1, 44, 1, 44, + 44, 44, 44, 44, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 44, 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, + 45, 1, 45, 45, 45, 45, 45, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 46, 1, + 1, 47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 1, 49, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 1, 51, + 51, 51, 51, 51, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 51, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 52, 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, 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, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 53, 1, 51, 51, 51, + 51, 51, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 51, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 52, 1, 1, 1, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 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, 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, 1, 1, 1, 1, 1, 1, + 1, 53, 1, 54, 1, 54, 54, 54, + 54, 54, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 54, 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, 55, 1, + 55, 55, 55, 55, 55, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 55, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 56, 1, 1, 57, + 58, 58, 58, 58, 58, 58, 58, 58, + 58, 1, 59, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 1, 61, 61, 61, + 61, 61, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 61, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 62, 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, 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, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 63, 1, 61, 61, 61, 61, 61, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 61, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 62, 1, + 1, 1, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 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, 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, + 1, 1, 1, 1, 1, 1, 1, 63, + 1, 64, 1, 64, 64, 64, 64, 64, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 64, 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, 65, 1, 65, 65, + 65, 65, 65, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 65, 1, 66, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 67, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 1, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 1, 1, 1, 1, 1, 1, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 1, 70, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 71, 71, + 1, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 1, 1, 1, 1, 1, + 1, 1, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 1, 1, 1, 1, + 71, 1, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 1, 72, 72, 72, + 72, 72, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 72, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 73, 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, 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, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 74, 1, 72, 72, 72, 72, 72, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 72, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 73, 1, + 1, 1, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 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, 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, + 1, 1, 1, 1, 1, 1, 1, 74, + 1, 76, 76, 76, 76, 76, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 76, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 77, 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, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 78, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 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, 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, 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, 2, 1, 1, 0 }; -static const char _deserialize_json_index_defaults[] = { - 0, 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, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0 +static const char _deserialize_json_trans_targs[] = { + 1, 0, 2, 2, 3, 4, 18, 24, + 37, 5, 12, 6, 7, 8, 9, 11, + 9, 11, 10, 2, 44, 10, 44, 13, + 14, 15, 16, 17, 16, 17, 10, 2, + 44, 19, 20, 21, 22, 23, 10, 2, + 44, 23, 25, 31, 26, 27, 28, 29, + 30, 29, 30, 10, 2, 44, 32, 33, + 34, 35, 36, 35, 36, 10, 2, 44, + 38, 39, 40, 42, 43, 41, 10, 41, + 10, 2, 44, 43, 44, 45, 46 }; -static const char _deserialize_json_trans_cond_spaces[] = { - -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, -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, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 0 -}; - -static const char _deserialize_json_cond_targs[] = { - 1, 0, 2, 2, 3, 4, 18, 24, - 37, 5, 12, 6, 7, 8, 9, 11, - 9, 11, 10, 2, 44, 10, 44, 13, - 14, 15, 16, 17, 16, 17, 10, 2, - 44, 19, 20, 21, 22, 23, 10, 2, - 44, 23, 25, 31, 26, 27, 28, 29, - 30, 29, 30, 10, 2, 44, 32, 33, - 34, 35, 36, 35, 36, 10, 2, 44, - 38, 39, 40, 42, 43, 41, 10, 41, - 10, 2, 44, 43, 44, 45, 46, 0 -}; - -static const char _deserialize_json_cond_actions[] = { - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 2, - 0, 0, 3, 3, 4, 0, 5, 0, - 0, 2, 2, 2, 0, 0, 6, 6, - 7, 0, 0, 0, 2, 2, 8, 8, - 9, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 10, 10, 11, 0, 0, - 2, 2, 2, 0, 0, 12, 12, 13, - 0, 0, 0, 2, 2, 2, 14, 0, - 15, 15, 16, 0, 0, 0, 0, 0 -}; - -static const char _deserialize_json_eof_cond_spaces[] = { - -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, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0 -}; - -static const char _deserialize_json_eof_cond_key_offs[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const char _deserialize_json_eof_cond_key_lens[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const char _deserialize_json_eof_cond_keys[] = { - 0 -}; - -static const char _deserialize_json_nfa_targs[] = { - 0, 0 -}; - -static const char _deserialize_json_nfa_offsets[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const char _deserialize_json_nfa_push_actions[] = { - 0, 0 -}; - -static const char _deserialize_json_nfa_pop_trans[] = { - 0, 0 +static const char _deserialize_json_trans_actions[] = { + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, + 0, 0, 3, 3, 4, 0, 5, 0, + 0, 2, 2, 2, 0, 0, 6, 6, + 7, 0, 0, 0, 2, 2, 8, 8, + 9, 0, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 10, 10, 11, 0, 0, + 2, 2, 2, 0, 0, 12, 12, 13, + 0, 0, 0, 2, 2, 2, 14, 0, + 15, 15, 16, 0, 0, 0, 0 }; static const int deserialize_json_start = 1; @@ -241,254 +435,209 @@ static const int deserialize_json_error = 0; static const int deserialize_json_en_main = 1; +#line 97 "hb-buffer-deserialize-json.rl" + static hb_bool_t _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, -const char *buf, -unsigned int buf_len, -const char **end_ptr, -hb_font_t *font) + const char *buf, + unsigned int buf_len, + const char **end_ptr, + hb_font_t *font) { - const char *p = buf, *pe = buf + buf_len; - - /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, nullptr); - - while (p < pe && ISSPACE (*p)) - p++; - if (p < pe && *p == (buffer->len ? ',' : '[')) + const char *p = buf, *pe = buf + buf_len; + + /* Ensure we have positions. */ + (void) hb_buffer_get_glyph_positions (buffer, nullptr); + + while (p < pe && ISSPACE (*p)) + p++; + if (p < pe && *p == (buffer->len ? ',' : '[')) + { + *end_ptr = ++p; + } + + const char *tok = nullptr; + int cs; + hb_glyph_info_t info = {0}; + hb_glyph_position_t pos = {0}; + +#line 466 "hb-buffer-deserialize-json.hh" { - *end_ptr = ++p; + cs = deserialize_json_start; } - - const char *tok = nullptr; - int cs; - hb_glyph_info_t info = {0}; - hb_glyph_position_t pos = {0}; - + +#line 471 "hb-buffer-deserialize-json.hh" { - cs = (int)deserialize_json_start; - } - + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _deserialize_json_trans_keys + (cs<<1); + _inds = _deserialize_json_indicies + _deserialize_json_index_offsets[cs]; + + _slen = _deserialize_json_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=(*p) && + (*p) <= _keys[1] ? + (*p) - _keys[0] : _slen ]; + + cs = _deserialize_json_trans_targs[_trans]; + + if ( _deserialize_json_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _deserialize_json_trans_actions[_trans] ) { + case 1: +#line 38 "hb-buffer-deserialize-json.rl" { - unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; - _resume: { - _keys = ( _deserialize_json_trans_keys + ((cs<<1))); - _inds = ( _deserialize_json_indicies + (_deserialize_json_index_offsets[cs])); - - if ( ( (*( p))) <= 125 && ( (*( p))) >= 9 ) - { - int _ic = (int)_deserialize_json_char_class[(int)( (*( p))) - 9]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_deserialize_json_index_defaults[cs]; - } - else { - _trans = (unsigned int)_deserialize_json_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_deserialize_json_cond_targs[_trans]; - - if ( _deserialize_json_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _deserialize_json_cond_actions[_trans] ) { - case 1: { - { - #line 38 "hb-buffer-deserialize-json.rl" - - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); - } - - break; } - case 5: { - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 2: { - { - #line 51 "hb-buffer-deserialize-json.rl" - - tok = p; - } - - break; } - case 14: { - { - #line 55 "hb-buffer-deserialize-json.rl" - - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; - } - - break; } - case 15: { - { - #line 62 "hb-buffer-deserialize-json.rl" - if (!parse_uint (tok, p, &info.codepoint)) return false; } - - break; } - case 8: { - { - #line 63 "hb-buffer-deserialize-json.rl" - if (!parse_uint (tok, p, &info.cluster )) return false; } - - break; } - case 10: { - { - #line 64 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.x_offset )) return false; } - - break; } - case 12: { - { - #line 65 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.y_offset )) return false; } - - break; } - case 3: { - { - #line 66 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.x_advance)) return false; } - - break; } - case 6: { - { - #line 67 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.y_advance)) return false; } - - break; } - case 16: { - { - #line 62 "hb-buffer-deserialize-json.rl" - if (!parse_uint (tok, p, &info.codepoint)) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 9: { - { - #line 63 "hb-buffer-deserialize-json.rl" - if (!parse_uint (tok, p, &info.cluster )) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 11: { - { - #line 64 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.x_offset )) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 13: { - { - #line 65 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.y_offset )) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 4: { - { - #line 66 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.x_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 7: { - { - #line 67 "hb-buffer-deserialize-json.rl" - if (!parse_int (tok, p, &pos.y_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-json.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - } - - - } - _again: { - if ( cs == 0 ) - goto _out; - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - } - _out: { {} - } - } - } - - + memset (&info, 0, sizeof (info)); + memset (&pos , 0, sizeof (pos )); +} + break; + case 5: +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; *end_ptr = p; - - return p == pe && *(p-1) != ']'; +} + break; + case 2: +#line 51 "hb-buffer-deserialize-json.rl" + { + tok = p; +} + break; + case 14: +#line 55 "hb-buffer-deserialize-json.rl" + { + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} + break; + case 15: +#line 62 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.codepoint)) return false; } + break; + case 8: +#line 63 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.cluster )) return false; } + break; + case 10: +#line 64 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.x_offset )) return false; } + break; + case 12: +#line 65 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.y_offset )) return false; } + break; + case 3: +#line 66 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.x_advance)) return false; } + break; + case 6: +#line 67 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.y_advance)) return false; } + break; + case 16: +#line 62 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.codepoint)) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 9: +#line 63 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.cluster )) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 11: +#line 64 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.x_offset )) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 13: +#line 65 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.y_offset )) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 4: +#line 66 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.x_advance)) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 7: +#line 67 "hb-buffer-deserialize-json.rl" + { if (!parse_int (tok, p, &pos.y_advance)) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; +#line 624 "hb-buffer-deserialize-json.hh" + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + _out: {} + } + +#line 125 "hb-buffer-deserialize-json.rl" + + + *end_ptr = p; + + return p == pe && *(p-1) != ']'; } #endif /* HB_BUFFER_DESERIALIZE_JSON_HH */ diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index 28ab3f1cd..67f0a1252 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -1,28 +1,30 @@ + +#line 1 "hb-buffer-deserialize-text.rl" /* -* Copyright © 2013 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2013 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH #define HB_BUFFER_DESERIALIZE_TEXT_HH @@ -30,160 +32,277 @@ #include "hb.hh" +#line 36 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { - 1u, 0u, 0u, 10u, 4u, 7u, 6u, 7u, - 4u, 7u, 6u, 7u, 6u, 7u, 4u, 7u, - 6u, 7u, 3u, 3u, 4u, 7u, 6u, 7u, - 3u, 7u, 0u, 12u, 0u, 12u, 1u, 0u, - 0u, 10u, 0u, 12u, 0u, 12u, 0u, 12u, - 0u, 12u, 0u, 12u, 0u, 12u, 0u, 12u, - 0u, 12u, 0u, 12u, 0u, 12u, 0u + 0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, + 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, + 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, + 9u, 124u, 9u, 124u, 9u, 124u, 0 }; -static const char _deserialize_text_char_class[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 4, 5, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 1, 1, 8, 1, 1, 9, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 1, 1, 11, 1, 5, 1, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 1, 12, 0 +static const char _deserialize_text_key_spans[] = { + 0, 114, 13, 10, 13, 10, 10, 13, + 10, 1, 13, 10, 14, 116, 116, 0, + 114, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116 }; static const short _deserialize_text_index_offsets[] = { - 0, 0, 11, 15, 17, 21, 23, 25, - 29, 31, 32, 36, 38, 43, 56, 69, - 69, 80, 93, 106, 119, 132, 145, 158, - 171, 184, 197, 0 + 0, 0, 115, 129, 140, 154, 165, 176, + 190, 201, 203, 217, 228, 243, 360, 477, + 478, 593, 710, 827, 944, 1061, 1178, 1295, + 1412, 1529, 1646 }; static const char _deserialize_text_indicies[] = { - 0, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 5, 1, 6, 7, 8, - 9, 10, 1, 11, 12, 13, 14, 15, - 16, 17, 1, 18, 19, 20, 21, 22, - 23, 1, 24, 25, 26, 27, 22, 1, - 1, 21, 21, 28, 1, 29, 1, 1, - 1, 1, 1, 30, 31, 1, 32, 33, - 34, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 35, 36, 0, 1, 1, - 1, 1, 1, 2, 3, 1, 1, 4, - 28, 1, 29, 1, 1, 1, 37, 37, - 30, 31, 1, 32, 33, 38, 1, 1, - 39, 1, 1, 1, 1, 1, 1, 1, - 40, 41, 42, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 43, 44, 42, - 1, 1, 1, 1, 1, 14, 14, 1, - 1, 1, 43, 44, 38, 1, 1, 39, - 1, 1, 9, 9, 1, 1, 1, 40, - 41, 45, 1, 46, 1, 1, 1, 1, - 1, 1, 47, 1, 48, 49, 50, 1, - 51, 1, 1, 1, 1, 1, 1, 1, - 1, 52, 53, 50, 1, 51, 1, 1, - 1, 27, 27, 1, 1, 1, 52, 53, - 45, 1, 46, 1, 1, 1, 54, 54, - 1, 47, 1, 48, 49, 28, 1, 29, - 1, 55, 55, 55, 55, 30, 31, 55, - 32, 33, 0 + 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 5, 1, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 10, 1, 1, + 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 1, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 1, 17, 1, 1, 18, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 1, 20, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 1, 22, 1, 23, 1, 1, 24, + 25, 25, 25, 25, 25, 25, 25, 25, + 25, 1, 26, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 1, 22, 1, 1, + 1, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 1, 28, 28, 28, 28, + 28, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 28, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 29, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 30, 1, 1, 31, 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, + 32, 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, 33, + 1, 34, 34, 34, 34, 34, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 34, 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, 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, 35, 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, 36, 1, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 28, 28, 28, 28, 28, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 28, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 29, 1, 1, 1, + 1, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 1, 1, 1, 30, 1, + 1, 31, 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, 32, 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, 33, 1, 38, + 38, 38, 38, 38, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 38, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 39, 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, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 40, 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, 41, 1, 42, 42, 42, 42, + 42, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 42, 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, 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, + 43, 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, 44, + 1, 42, 42, 42, 42, 42, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 42, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 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, + 1, 1, 1, 1, 1, 43, 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, 44, 1, 38, 38, + 38, 38, 38, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 38, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 39, 1, 1, 1, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 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, 1, 1, 1, + 1, 1, 40, 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, 41, 1, 45, 45, 45, 45, 45, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 45, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 46, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 47, 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, 48, + 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, 49, 1, + 50, 50, 50, 50, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 50, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 51, 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, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 52, 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, 53, 1, 50, 50, 50, + 50, 50, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 51, + 1, 1, 1, 1, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 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, 1, 1, 1, 1, + 1, 52, 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, + 53, 1, 45, 45, 45, 45, 45, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 46, 1, 1, 1, + 1, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 1, 1, 1, 1, 1, + 1, 47, 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, 48, 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, 49, 1, 28, + 28, 28, 28, 28, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 28, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 29, 1, 55, 55, 1, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 1, 1, 1, 30, 1, 1, 31, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 1, 1, 32, 1, 55, 1, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 1, 33, 1, 0 }; -static const char _deserialize_text_index_defaults[] = { - 0, 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 +static const char _deserialize_text_trans_targs[] = { + 1, 0, 13, 17, 26, 3, 18, 21, + 18, 21, 5, 19, 20, 19, 20, 22, + 25, 8, 9, 12, 9, 12, 10, 11, + 23, 24, 23, 24, 14, 2, 6, 7, + 15, 16, 14, 15, 16, 17, 14, 4, + 15, 16, 14, 15, 16, 14, 2, 7, + 15, 16, 14, 2, 15, 16, 25, 26 }; -static const char _deserialize_text_trans_cond_spaces[] = { - -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, -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 -}; - -static const char _deserialize_text_cond_targs[] = { - 1, 0, 13, 17, 26, 3, 18, 21, - 18, 21, 5, 19, 20, 19, 20, 22, - 25, 8, 9, 12, 9, 12, 10, 11, - 23, 24, 23, 24, 14, 2, 6, 7, - 15, 16, 14, 15, 16, 17, 14, 4, - 15, 16, 14, 15, 16, 14, 2, 7, - 15, 16, 14, 2, 15, 16, 25, 26, - 0 -}; - -static const char _deserialize_text_cond_actions[] = { - 0, 0, 1, 1, 1, 2, 2, 2, - 0, 0, 2, 2, 2, 0, 0, 2, - 2, 2, 2, 2, 0, 0, 3, 2, - 2, 2, 0, 0, 4, 5, 5, 5, - 4, 4, 0, 0, 0, 0, 6, 7, - 6, 6, 8, 8, 8, 9, 10, 10, - 9, 9, 11, 12, 11, 11, 0, 0, - 0 -}; - -static const char _deserialize_text_eof_cond_spaces[] = { - -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 -}; - -static const char _deserialize_text_eof_cond_key_offs[] = { - 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 -}; - -static const char _deserialize_text_eof_cond_key_lens[] = { - 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 -}; - -static const char _deserialize_text_eof_cond_keys[] = { - 0 +static const char _deserialize_text_trans_actions[] = { + 0, 0, 1, 1, 1, 2, 2, 2, + 0, 0, 2, 2, 2, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 3, 2, + 2, 2, 0, 0, 4, 5, 5, 5, + 4, 4, 0, 0, 0, 0, 6, 7, + 6, 6, 8, 8, 8, 9, 10, 10, + 9, 9, 11, 12, 11, 11, 0, 0 }; static const char _deserialize_text_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 4, 6, 8, 8, 6, 9, 11, - 11, 9, 4, 0 -}; - -static const char _deserialize_text_nfa_targs[] = { - 0, 0 -}; - -static const char _deserialize_text_nfa_offsets[] = { - 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 -}; - -static const char _deserialize_text_nfa_push_actions[] = { - 0, 0 -}; - -static const char _deserialize_text_nfa_pop_trans[] = { - 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 4, 6, 8, 8, 6, 9, 11, + 11, 9, 4 }; static const int deserialize_text_start = 1; @@ -193,338 +312,260 @@ static const int deserialize_text_error = 0; static const int deserialize_text_en_main = 1; +#line 91 "hb-buffer-deserialize-text.rl" + static hb_bool_t _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer, -const char *buf, -unsigned int buf_len, -const char **end_ptr, -hb_font_t *font) + const char *buf, + unsigned int buf_len, + const char **end_ptr, + hb_font_t *font) { - const char *p = buf, *pe = buf + buf_len; - - /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, nullptr); - - while (p < pe && ISSPACE (*p)) - p++; - if (p < pe && *p == (buffer->len ? '|' : '[')) + const char *p = buf, *pe = buf + buf_len; + + /* Ensure we have positions. */ + (void) hb_buffer_get_glyph_positions (buffer, nullptr); + + while (p < pe && ISSPACE (*p)) + p++; + if (p < pe && *p == (buffer->len ? '|' : '[')) + { + *end_ptr = ++p; + } + + const char *eof = pe, *tok = nullptr; + int cs; + hb_glyph_info_t info = {0}; + hb_glyph_position_t pos = {0}; + +#line 343 "hb-buffer-deserialize-text.hh" { - *end_ptr = ++p; + cs = deserialize_text_start; } - - const char *eof = pe, *tok = nullptr; - int cs; - hb_glyph_info_t info = {0}; - hb_glyph_position_t pos = {0}; - + +#line 348 "hb-buffer-deserialize-text.hh" { - cs = (int)deserialize_text_start; - } - + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _deserialize_text_trans_keys + (cs<<1); + _inds = _deserialize_text_indicies + _deserialize_text_index_offsets[cs]; + + _slen = _deserialize_text_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=(*p) && + (*p) <= _keys[1] ? + (*p) - _keys[0] : _slen ]; + + cs = _deserialize_text_trans_targs[_trans]; + + if ( _deserialize_text_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _deserialize_text_trans_actions[_trans] ) { + case 2: +#line 51 "hb-buffer-deserialize-text.rl" { - int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; - _resume: { - _keys = ( _deserialize_text_trans_keys + ((cs<<1))); - _inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs])); - - if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) - { - int _ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_deserialize_text_index_defaults[cs]; - } - else { - _trans = (unsigned int)_deserialize_text_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_deserialize_text_cond_targs[_trans]; - - if ( _deserialize_text_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _deserialize_text_cond_actions[_trans] ) { - case 2: { - { - #line 51 "hb-buffer-deserialize-text.rl" - - tok = p; - } - - break; } - case 5: { - { - #line 55 "hb-buffer-deserialize-text.rl" - - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; - } - - break; } - case 10: { - { - #line 62 "hb-buffer-deserialize-text.rl" - if (!parse_uint (tok, p, &info.cluster )) return false; } - - break; } - case 3: { - { - #line 63 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.x_offset )) return false; } - - break; } - case 12: { - { - #line 64 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.y_offset )) return false; } - - break; } - case 7: { - { - #line 65 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.x_advance)) return false; } - - break; } - case 1: { - { - #line 38 "hb-buffer-deserialize-text.rl" - - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); - } - { - #line 51 "hb-buffer-deserialize-text.rl" - - tok = p; - } - - break; } - case 4: { - { - #line 55 "hb-buffer-deserialize-text.rl" - - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; - } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 9: { - { - #line 62 "hb-buffer-deserialize-text.rl" - if (!parse_uint (tok, p, &info.cluster )) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 11: { - { - #line 64 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.y_offset )) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 6: { - { - #line 65 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.x_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 8: { - { - #line 66 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.y_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - } - - - } - _again: { - if ( cs == 0 ) - goto _out; - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - if ( p == eof ) - { - if ( _deserialize_text_eof_cond_spaces[cs] != -1 ) { - _cekeys = ( _deserialize_text_eof_cond_keys + (_deserialize_text_eof_cond_key_offs[cs])); - _klen = (int)_deserialize_text_eof_cond_key_lens[cs]; - _cpc = 0; - { - const char *_lower = _cekeys; - const char *_upper = _cekeys + _klen - 1; - const char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _cpc < (int)(*( _mid)) ) - _upper = _mid - 1; - else if ( _cpc > (int)(*( _mid)) ) - _lower = _mid + 1; - else { - goto _ok; - } - } - cs = 0; - goto _out; - } - _ok: {} - } - switch ( _deserialize_text_eof_actions[cs] ) { - case 4: { - { - #line 55 "hb-buffer-deserialize-text.rl" - - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; - } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 9: { - { - #line 62 "hb-buffer-deserialize-text.rl" - if (!parse_uint (tok, p, &info.cluster )) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 11: { - { - #line 64 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.y_offset )) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 6: { - { - #line 65 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.x_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - case 8: { - { - #line 66 "hb-buffer-deserialize-text.rl" - if (!parse_int (tok, p, &pos.y_advance)) return false; } - { - #line 43 "hb-buffer-deserialize-text.rl" - - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; - } - - break; } - } - } - - } - _out: { {} - } - } - } - - + tok = p; +} + break; + case 5: +#line 55 "hb-buffer-deserialize-text.rl" + { + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} + break; + case 10: +#line 62 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.cluster )) return false; } + break; + case 3: +#line 63 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.x_offset )) return false; } + break; + case 12: +#line 64 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_offset )) return false; } + break; + case 7: +#line 65 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.x_advance)) return false; } + break; + case 1: +#line 38 "hb-buffer-deserialize-text.rl" + { + memset (&info, 0, sizeof (info)); + memset (&pos , 0, sizeof (pos )); +} +#line 51 "hb-buffer-deserialize-text.rl" + { + tok = p; +} + break; + case 4: +#line 55 "hb-buffer-deserialize-text.rl" + { + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; *end_ptr = p; - - return p == pe && *(p-1) != ']'; +} + break; + case 9: +#line 62 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.cluster )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 11: +#line 64 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_offset )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 6: +#line 65 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.x_advance)) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 8: +#line 66 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_advance)) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; +#line 480 "hb-buffer-deserialize-text.hh" + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + switch ( _deserialize_text_eof_actions[cs] ) { + case 4: +#line 55 "hb-buffer-deserialize-text.rl" + { + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 9: +#line 62 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.cluster )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 11: +#line 64 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_offset )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 6: +#line 65 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.x_advance)) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 8: +#line 66 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_advance)) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; +#line 557 "hb-buffer-deserialize-text.hh" + } + } + + _out: {} + } + +#line 119 "hb-buffer-deserialize-text.rl" + + + *end_ptr = p; + + return p == pe && *(p-1) != ']'; } #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */ diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index dbab7e042..08b90e913 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -1,28 +1,30 @@ + +#line 1 "hb-ot-shape-complex-indic-machine.rl" /* -* Copyright © 2011,2012 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH @@ -30,1226 +32,952 @@ #include "hb.hh" +#line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 7u, 7u, 3u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 7u, 7u, 3u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 4u, 7u, 4u, 6u, - 6u, 6u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 3u, 12u, 3u, 7u, 3u, 12u, - 3u, 7u, 7u, 7u, 3u, 7u, 4u, 6u, - 6u, 6u, 4u, 7u, 4u, 6u, 6u, 6u, - 4u, 7u, 4u, 6u, 6u, 6u, 4u, 7u, - 4u, 6u, 6u, 6u, 3u, 7u, 5u, 5u, - 14u, 14u, 3u, 7u, 5u, 5u, 14u, 14u, - 3u, 7u, 5u, 5u, 14u, 14u, 3u, 7u, - 5u, 5u, 14u, 14u, 3u, 12u, 3u, 7u, - 3u, 12u, 3u, 7u, 3u, 12u, 3u, 7u, - 3u, 12u, 3u, 7u, 3u, 12u, 3u, 12u, - 4u, 7u, 7u, 7u, 0u, 17u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 0u, 14u, 2u, 15u, - 2u, 15u, 3u, 15u, 4u, 9u, 4u, 9u, - 4u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, - 4u, 9u, 2u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 3u, 9u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 3u, 7u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 0u, 14u, 2u, 15u, 2u, 15u, - 3u, 15u, 4u, 9u, 4u, 9u, 4u, 9u, - 9u, 9u, 9u, 9u, 9u, 9u, 4u, 9u, - 2u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 3u, 9u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 3u, 12u, 2u, 15u, - 3u, 7u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 0u, 14u, 2u, 15u, 2u, 15u, 3u, 15u, - 4u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 2u, 9u, - 4u, 9u, 2u, 9u, 3u, 9u, 4u, 9u, - 2u, 9u, 3u, 9u, 4u, 9u, 2u, 9u, - 3u, 9u, 4u, 9u, 2u, 9u, 3u, 9u, - 3u, 9u, 2u, 15u, 2u, 15u, 0u, 14u, - 0u, 14u, 0u, 14u, 2u, 15u, 2u, 15u, - 0u, 14u, 0u, 14u, 0u, 14u, 2u, 15u, - 2u, 15u, 0u, 14u, 0u, 14u, 0u, 14u, - 2u, 15u, 2u, 15u, 0u, 14u, 0u, 14u, - 0u, 14u, 2u, 15u, 0u, 15u, 2u, 15u, - 0u, 15u, 3u, 12u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, - 2u, 9u, 4u, 9u, 4u, 9u, 9u, 9u, - 9u, 9u, 9u, 9u, 4u, 9u, 0u, 14u, - 0u + 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, + 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, + 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, + 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 8u, 8u, 4u, 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, 13u, 4u, 8u, + 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, + 5u, 8u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, + 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, + 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, + 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, + 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, + 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, + 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, + 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, + 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, + 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, + 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, + 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, + 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, + 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, + 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, + 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 }; -static const char _indic_syllable_machine_char_class[] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 8, 13, 14, - 15, 16, 17, 0 +static const char _indic_syllable_machine_key_spans[] = { + 1, 5, 3, 1, 4, 3, 1, 4, + 3, 1, 4, 3, 1, 5, 1, 1, + 5, 1, 1, 5, 1, 1, 5, 1, + 1, 10, 5, 10, 5, 10, 5, 10, + 5, 10, 1, 5, 3, 1, 4, 3, + 1, 4, 3, 1, 4, 3, 1, 5, + 1, 1, 5, 1, 1, 5, 1, 1, + 5, 1, 1, 10, 5, 10, 5, 10, + 5, 10, 5, 10, 1, 5, 3, 1, + 4, 3, 1, 4, 3, 1, 4, 3, + 1, 5, 1, 1, 5, 1, 1, 5, + 1, 1, 5, 1, 1, 10, 5, 10, + 5, 10, 5, 10, 5, 1, 5, 3, + 1, 4, 3, 1, 4, 3, 1, 4, + 3, 1, 5, 1, 1, 5, 1, 1, + 5, 1, 1, 5, 1, 1, 10, 5, + 10, 5, 10, 5, 10, 5, 10, 10, + 4, 1, 19, 15, 15, 14, 16, 15, + 15, 14, 16, 15, 15, 14, 16, 15, + 15, 14, 16, 15, 15, 14, 6, 6, + 6, 1, 1, 1, 6, 8, 6, 8, + 7, 6, 8, 7, 6, 8, 7, 6, + 8, 7, 7, 15, 15, 16, 16, 16, + 15, 15, 16, 16, 16, 15, 15, 16, + 16, 16, 15, 15, 16, 16, 16, 15, + 15, 15, 15, 14, 16, 15, 15, 14, + 16, 15, 15, 14, 16, 15, 15, 14, + 16, 15, 15, 14, 6, 6, 6, 1, + 1, 1, 6, 8, 6, 8, 7, 6, + 8, 7, 6, 8, 7, 6, 8, 7, + 7, 15, 15, 16, 16, 16, 15, 15, + 16, 16, 16, 15, 15, 16, 16, 16, + 15, 15, 16, 16, 16, 5, 15, 15, + 14, 16, 15, 15, 14, 16, 15, 15, + 14, 16, 15, 15, 14, 16, 15, 15, + 14, 6, 6, 6, 1, 1, 1, 6, + 8, 6, 8, 7, 6, 8, 7, 6, + 8, 7, 6, 8, 7, 7, 15, 15, + 16, 16, 16, 15, 15, 16, 16, 16, + 15, 15, 16, 16, 16, 15, 15, 16, + 16, 16, 10, 15, 5, 15, 15, 14, + 16, 15, 15, 14, 16, 15, 15, 14, + 16, 15, 15, 14, 16, 15, 15, 14, + 6, 6, 6, 1, 1, 1, 6, 8, + 6, 8, 7, 6, 8, 7, 6, 8, + 7, 6, 8, 7, 7, 15, 15, 16, + 16, 16, 15, 15, 16, 16, 16, 15, + 15, 16, 16, 16, 15, 15, 16, 16, + 16, 15, 17, 15, 17, 10, 6, 1, + 1, 1, 6, 16, 8, 6, 6, 1, + 1, 1, 6, 16 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 1, 6, 9, 10, 14, 17, 18, - 22, 25, 26, 30, 33, 34, 39, 40, - 41, 46, 47, 48, 53, 54, 55, 60, - 61, 62, 72, 77, 87, 92, 102, 107, - 117, 122, 132, 133, 138, 141, 142, 146, - 149, 150, 154, 157, 158, 162, 165, 166, - 171, 172, 173, 178, 179, 180, 185, 186, - 187, 192, 193, 194, 204, 209, 219, 224, - 234, 239, 249, 254, 264, 265, 270, 273, - 274, 278, 281, 282, 286, 289, 290, 294, - 297, 298, 303, 304, 305, 310, 311, 312, - 317, 318, 319, 324, 325, 326, 336, 341, - 351, 356, 366, 371, 381, 386, 387, 392, - 395, 396, 400, 403, 404, 408, 411, 412, - 416, 419, 420, 425, 426, 427, 432, 433, - 434, 439, 440, 441, 446, 447, 448, 458, - 463, 473, 478, 488, 493, 503, 508, 518, - 528, 532, 533, 551, 565, 579, 592, 607, - 621, 635, 648, 663, 677, 691, 704, 719, - 733, 747, 760, 775, 789, 803, 816, 822, - 828, 834, 835, 836, 837, 843, 851, 857, - 865, 872, 878, 886, 893, 899, 907, 914, - 920, 928, 935, 942, 956, 970, 985, 1000, - 1015, 1029, 1043, 1058, 1073, 1088, 1102, 1116, - 1131, 1146, 1161, 1175, 1189, 1204, 1219, 1234, - 1248, 1262, 1276, 1290, 1303, 1318, 1332, 1346, - 1359, 1374, 1388, 1402, 1415, 1430, 1444, 1458, - 1471, 1486, 1500, 1514, 1527, 1533, 1539, 1545, - 1546, 1547, 1548, 1554, 1562, 1568, 1576, 1583, - 1589, 1597, 1604, 1610, 1618, 1625, 1631, 1639, - 1646, 1653, 1667, 1681, 1696, 1711, 1726, 1740, - 1754, 1769, 1784, 1799, 1813, 1827, 1842, 1857, - 1872, 1886, 1900, 1915, 1930, 1945, 1950, 1964, - 1978, 1991, 2006, 2020, 2034, 2047, 2062, 2076, - 2090, 2103, 2118, 2132, 2146, 2159, 2174, 2188, - 2202, 2215, 2221, 2227, 2233, 2234, 2235, 2236, - 2242, 2250, 2256, 2264, 2271, 2277, 2285, 2292, - 2298, 2306, 2313, 2319, 2327, 2334, 2341, 2355, - 2369, 2384, 2399, 2414, 2428, 2442, 2457, 2472, - 2487, 2501, 2515, 2530, 2545, 2560, 2574, 2588, - 2603, 2618, 2633, 2643, 2657, 2662, 2676, 2690, - 2703, 2718, 2732, 2746, 2759, 2774, 2788, 2802, - 2815, 2830, 2844, 2858, 2871, 2886, 2900, 2914, - 2927, 2933, 2939, 2945, 2946, 2947, 2948, 2954, - 2962, 2968, 2976, 2983, 2989, 2997, 3004, 3010, - 3018, 3025, 3031, 3039, 3046, 3053, 3067, 3081, - 3096, 3111, 3126, 3140, 3154, 3169, 3184, 3199, - 3213, 3227, 3242, 3257, 3272, 3286, 3300, 3315, - 3330, 3345, 3359, 3375, 3389, 3405, 3415, 3421, - 3422, 3423, 3424, 3430, 3445, 3453, 3459, 3465, - 3466, 3467, 3468, 3474, 0 + 0, 2, 8, 12, 14, 19, 23, 25, + 30, 34, 36, 41, 45, 47, 53, 55, + 57, 63, 65, 67, 73, 75, 77, 83, + 85, 87, 98, 104, 115, 121, 132, 138, + 149, 155, 166, 168, 174, 178, 180, 185, + 189, 191, 196, 200, 202, 207, 211, 213, + 219, 221, 223, 229, 231, 233, 239, 241, + 243, 249, 251, 253, 264, 270, 281, 287, + 298, 304, 315, 321, 332, 334, 340, 344, + 346, 351, 355, 357, 362, 366, 368, 373, + 377, 379, 385, 387, 389, 395, 397, 399, + 405, 407, 409, 415, 417, 419, 430, 436, + 447, 453, 464, 470, 481, 487, 489, 495, + 499, 501, 506, 510, 512, 517, 521, 523, + 528, 532, 534, 540, 542, 544, 550, 552, + 554, 560, 562, 564, 570, 572, 574, 585, + 591, 602, 608, 619, 625, 636, 642, 653, + 664, 669, 671, 691, 707, 723, 738, 755, + 771, 787, 802, 819, 835, 851, 866, 883, + 899, 915, 930, 947, 963, 979, 994, 1001, + 1008, 1015, 1017, 1019, 1021, 1028, 1037, 1044, + 1053, 1061, 1068, 1077, 1085, 1092, 1101, 1109, + 1116, 1125, 1133, 1141, 1157, 1173, 1190, 1207, + 1224, 1240, 1256, 1273, 1290, 1307, 1323, 1339, + 1356, 1373, 1390, 1406, 1422, 1439, 1456, 1473, + 1489, 1505, 1521, 1537, 1552, 1569, 1585, 1601, + 1616, 1633, 1649, 1665, 1680, 1697, 1713, 1729, + 1744, 1761, 1777, 1793, 1808, 1815, 1822, 1829, + 1831, 1833, 1835, 1842, 1851, 1858, 1867, 1875, + 1882, 1891, 1899, 1906, 1915, 1923, 1930, 1939, + 1947, 1955, 1971, 1987, 2004, 2021, 2038, 2054, + 2070, 2087, 2104, 2121, 2137, 2153, 2170, 2187, + 2204, 2220, 2236, 2253, 2270, 2287, 2293, 2309, + 2325, 2340, 2357, 2373, 2389, 2404, 2421, 2437, + 2453, 2468, 2485, 2501, 2517, 2532, 2549, 2565, + 2581, 2596, 2603, 2610, 2617, 2619, 2621, 2623, + 2630, 2639, 2646, 2655, 2663, 2670, 2679, 2687, + 2694, 2703, 2711, 2718, 2727, 2735, 2743, 2759, + 2775, 2792, 2809, 2826, 2842, 2858, 2875, 2892, + 2909, 2925, 2941, 2958, 2975, 2992, 3008, 3024, + 3041, 3058, 3075, 3086, 3102, 3108, 3124, 3140, + 3155, 3172, 3188, 3204, 3219, 3236, 3252, 3268, + 3283, 3300, 3316, 3332, 3347, 3364, 3380, 3396, + 3411, 3418, 3425, 3432, 3434, 3436, 3438, 3445, + 3454, 3461, 3470, 3478, 3485, 3494, 3502, 3509, + 3518, 3526, 3533, 3542, 3550, 3558, 3574, 3590, + 3607, 3624, 3641, 3657, 3673, 3690, 3707, 3724, + 3740, 3756, 3773, 3790, 3807, 3823, 3839, 3856, + 3873, 3890, 3906, 3924, 3940, 3958, 3969, 3976, + 3978, 3980, 3982, 3989, 4006, 4015, 4022, 4029, + 4031, 4033, 4035, 4042 }; static const short _indic_syllable_machine_indicies[] = { - 1, 2, 3, 3, 4, 1, 5, 5, - 4, 4, 6, 6, 7, 1, 8, 8, - 7, 7, 9, 9, 10, 1, 11, 11, - 10, 10, 12, 12, 13, 1, 14, 14, - 13, 13, 15, 0, 0, 0, 1, 16, - 17, 18, 12, 12, 13, 1, 19, 20, - 21, 9, 9, 10, 1, 22, 23, 24, - 6, 6, 7, 1, 25, 26, 2, 3, - 3, 4, 1, 0, 0, 0, 0, 27, - 28, 3, 3, 4, 1, 28, 3, 3, - 4, 1, 0, 0, 0, 0, 29, 30, - 3, 3, 4, 1, 30, 3, 3, 4, - 1, 0, 0, 0, 0, 31, 32, 3, - 3, 4, 1, 32, 3, 3, 4, 1, - 0, 0, 0, 0, 33, 34, 3, 3, - 4, 1, 34, 3, 3, 4, 1, 0, - 0, 0, 0, 35, 37, 38, 39, 39, - 40, 37, 41, 41, 40, 40, 42, 42, - 43, 37, 44, 44, 43, 43, 45, 45, - 46, 37, 47, 47, 46, 46, 48, 48, - 49, 37, 50, 50, 49, 49, 51, 36, - 36, 36, 37, 52, 53, 54, 48, 48, - 49, 37, 55, 56, 57, 45, 45, 46, - 37, 58, 59, 60, 42, 42, 43, 37, - 61, 62, 38, 39, 39, 40, 37, 36, - 36, 36, 36, 63, 64, 39, 39, 40, - 37, 64, 39, 39, 40, 37, 36, 36, - 36, 36, 65, 66, 39, 39, 40, 37, - 66, 39, 39, 40, 37, 36, 36, 36, - 36, 67, 68, 39, 39, 40, 37, 68, - 39, 39, 40, 37, 36, 36, 36, 36, - 69, 70, 39, 39, 40, 37, 70, 39, - 39, 40, 37, 36, 36, 36, 36, 71, - 73, 74, 75, 75, 76, 73, 78, 78, - 76, 76, 79, 79, 80, 73, 81, 81, - 80, 80, 82, 82, 83, 73, 84, 84, - 83, 83, 85, 85, 86, 73, 87, 87, - 86, 86, 88, 72, 72, 72, 73, 89, - 90, 91, 85, 85, 86, 73, 92, 93, - 94, 82, 82, 83, 73, 95, 96, 97, - 79, 79, 80, 73, 98, 99, 74, 75, - 75, 76, 73, 72, 72, 72, 72, 100, - 101, 75, 75, 76, 73, 101, 75, 75, - 76, 73, 72, 72, 72, 72, 102, 103, - 75, 75, 76, 73, 103, 75, 75, 76, - 73, 72, 72, 72, 72, 104, 105, 75, - 75, 76, 73, 105, 75, 75, 76, 73, - 72, 72, 72, 72, 106, 107, 75, 75, - 76, 73, 109, 110, 111, 111, 112, 109, - 113, 113, 112, 112, 114, 114, 115, 109, - 116, 116, 115, 115, 117, 117, 118, 109, - 119, 119, 118, 118, 120, 120, 121, 109, - 122, 122, 121, 121, 123, 108, 108, 108, - 109, 124, 125, 126, 120, 120, 121, 109, - 127, 128, 129, 117, 117, 118, 109, 130, - 131, 132, 114, 114, 115, 109, 133, 134, - 110, 111, 111, 112, 109, 108, 108, 108, - 108, 135, 136, 111, 111, 112, 109, 136, - 111, 111, 112, 109, 108, 108, 108, 108, - 137, 138, 111, 111, 112, 109, 138, 111, - 111, 112, 109, 108, 108, 108, 108, 139, - 140, 111, 111, 112, 109, 140, 111, 111, - 112, 109, 108, 108, 108, 108, 141, 142, - 111, 111, 112, 109, 142, 111, 111, 112, - 109, 108, 108, 108, 108, 143, 107, 75, - 75, 76, 73, 72, 72, 72, 72, 144, - 78, 78, 76, 1, 146, 148, 149, 150, - 151, 152, 153, 76, 73, 147, 154, 155, - 155, 144, 156, 157, 158, 159, 160, 162, - 163, 164, 165, 4, 1, 161, 166, 161, - 161, 35, 161, 161, 167, 168, 163, 169, - 169, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 170, 161, 161, 161, 17, 171, 161, 1, - 161, 166, 161, 161, 161, 161, 170, 172, - 173, 174, 175, 4, 1, 161, 166, 161, - 161, 33, 161, 161, 167, 176, 173, 177, - 177, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 173, 177, 177, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 178, 161, 161, 161, 17, 179, 161, 1, - 161, 166, 161, 161, 161, 161, 178, 180, - 181, 182, 183, 4, 1, 161, 166, 161, - 161, 31, 161, 161, 167, 184, 181, 185, - 185, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 181, 185, 185, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 186, 161, 161, 161, 17, 187, 161, 1, - 161, 166, 161, 161, 161, 161, 186, 188, - 189, 190, 191, 4, 1, 161, 166, 161, - 161, 29, 161, 161, 167, 192, 189, 193, - 193, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 189, 193, 193, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 194, 161, 161, 161, 17, 195, 161, 1, - 161, 166, 161, 161, 161, 161, 194, 196, - 197, 198, 199, 4, 1, 161, 166, 161, - 161, 27, 161, 161, 167, 200, 197, 201, - 201, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 167, 197, 201, 201, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 17, 202, 161, 1, 161, 166, 203, 203, - 161, 1, 161, 166, 204, 161, 161, 205, - 161, 166, 166, 206, 207, 204, 161, 161, - 161, 161, 166, 17, 161, 203, 203, 161, - 1, 161, 166, 203, 202, 161, 1, 161, - 166, 208, 26, 209, 210, 7, 1, 161, - 166, 26, 209, 210, 7, 1, 161, 166, - 209, 209, 7, 1, 161, 166, 211, 23, - 212, 213, 10, 1, 161, 166, 23, 212, - 213, 10, 1, 161, 166, 212, 212, 10, - 1, 161, 166, 214, 20, 215, 216, 13, - 1, 161, 166, 20, 215, 216, 13, 1, - 161, 166, 215, 215, 13, 1, 161, 166, - 217, 17, 203, 218, 161, 1, 161, 166, - 17, 203, 218, 161, 1, 161, 166, 197, - 201, 201, 4, 1, 161, 166, 196, 197, - 201, 201, 4, 1, 161, 166, 161, 161, - 161, 161, 161, 167, 196, 197, 198, 201, - 4, 1, 161, 166, 161, 161, 27, 161, - 161, 167, 194, 161, 219, 161, 203, 203, - 161, 1, 161, 166, 161, 161, 161, 161, - 194, 194, 161, 161, 161, 203, 203, 161, - 1, 161, 166, 161, 161, 161, 161, 194, - 194, 161, 161, 161, 203, 195, 161, 1, - 161, 166, 161, 161, 161, 161, 194, 188, - 189, 193, 193, 4, 1, 161, 166, 161, - 161, 161, 161, 161, 167, 188, 189, 190, - 193, 4, 1, 161, 166, 161, 161, 29, - 161, 161, 167, 186, 161, 220, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 186, 186, 161, 161, 161, 203, 203, - 161, 1, 161, 166, 161, 161, 161, 161, - 186, 186, 161, 161, 161, 203, 187, 161, - 1, 161, 166, 161, 161, 161, 161, 186, - 180, 181, 185, 185, 4, 1, 161, 166, - 161, 161, 161, 161, 161, 167, 180, 181, - 182, 185, 4, 1, 161, 166, 161, 161, - 31, 161, 161, 167, 178, 161, 221, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 178, 178, 161, 161, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 178, 178, 161, 161, 161, 203, 179, - 161, 1, 161, 166, 161, 161, 161, 161, - 178, 172, 173, 177, 177, 4, 1, 161, - 166, 161, 161, 161, 161, 161, 167, 172, - 173, 174, 177, 4, 1, 161, 166, 161, - 161, 33, 161, 161, 167, 170, 161, 222, - 161, 203, 203, 161, 1, 161, 166, 161, - 161, 161, 161, 170, 170, 161, 161, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 170, 170, 161, 161, 161, 203, - 171, 161, 1, 161, 166, 161, 161, 161, - 161, 170, 162, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 167, - 162, 163, 164, 169, 4, 1, 161, 166, - 161, 161, 35, 161, 161, 167, 224, 225, - 226, 227, 40, 37, 223, 228, 223, 223, - 71, 223, 223, 229, 230, 225, 231, 227, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 225, 231, 227, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 232, - 223, 223, 223, 53, 233, 223, 37, 223, - 228, 223, 223, 223, 223, 232, 234, 235, - 236, 237, 40, 37, 223, 228, 223, 223, - 69, 223, 223, 229, 238, 235, 239, 239, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 235, 239, 239, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 240, - 223, 223, 223, 53, 241, 223, 37, 223, - 228, 223, 223, 223, 223, 240, 242, 243, - 244, 245, 40, 37, 223, 228, 223, 223, - 67, 223, 223, 229, 246, 243, 247, 247, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 248, - 223, 223, 223, 53, 249, 223, 37, 223, - 228, 223, 223, 223, 223, 248, 250, 251, - 252, 253, 40, 37, 223, 228, 223, 223, - 65, 223, 223, 229, 254, 251, 255, 255, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 251, 255, 255, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 256, - 223, 223, 223, 53, 257, 223, 37, 223, - 228, 223, 223, 223, 223, 256, 258, 259, - 260, 261, 40, 37, 223, 228, 223, 223, - 63, 223, 223, 229, 262, 259, 263, 263, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 229, 259, 263, 263, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 229, 53, - 264, 223, 37, 223, 228, 265, 265, 223, - 37, 223, 228, 266, 223, 223, 267, 223, - 228, 228, 268, 269, 266, 223, 223, 223, - 223, 228, 53, 223, 265, 265, 223, 37, - 223, 228, 265, 264, 223, 37, 223, 228, - 270, 62, 271, 272, 43, 37, 223, 228, - 62, 271, 272, 43, 37, 223, 228, 271, - 271, 43, 37, 223, 228, 273, 59, 274, - 275, 46, 37, 223, 228, 59, 274, 275, - 46, 37, 223, 228, 274, 274, 46, 37, - 223, 228, 276, 56, 277, 278, 49, 37, - 223, 228, 56, 277, 278, 49, 37, 223, - 228, 277, 277, 49, 37, 223, 228, 279, - 53, 265, 280, 223, 37, 223, 228, 53, - 265, 280, 223, 37, 223, 228, 259, 263, - 263, 40, 37, 223, 228, 258, 259, 263, - 263, 40, 37, 223, 228, 223, 223, 223, - 223, 223, 229, 258, 259, 260, 263, 40, - 37, 223, 228, 223, 223, 63, 223, 223, - 229, 256, 223, 281, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 256, - 256, 223, 223, 223, 265, 265, 223, 37, - 223, 228, 223, 223, 223, 223, 256, 256, - 223, 223, 223, 265, 257, 223, 37, 223, - 228, 223, 223, 223, 223, 256, 250, 251, - 255, 255, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 229, 250, 251, 252, 255, - 40, 37, 223, 228, 223, 223, 65, 223, - 223, 229, 248, 223, 282, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 248, 248, 223, 223, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 248, - 248, 223, 223, 223, 265, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 248, 242, - 243, 247, 247, 40, 37, 223, 228, 223, - 223, 223, 223, 223, 229, 242, 243, 244, - 247, 40, 37, 223, 228, 223, 223, 67, - 223, 223, 229, 240, 223, 283, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 240, 240, 223, 223, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 240, 240, 223, 223, 223, 265, 241, 223, - 37, 223, 228, 223, 223, 223, 223, 240, - 234, 235, 239, 239, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 229, 234, 235, - 236, 239, 40, 37, 223, 228, 223, 223, - 69, 223, 223, 229, 232, 223, 284, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 232, 232, 223, 223, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 232, 232, 223, 223, 223, 265, 233, - 223, 37, 223, 228, 223, 223, 223, 223, - 232, 70, 39, 39, 40, 37, 224, 225, - 231, 227, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 229, 286, 151, 287, 287, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 151, 287, 287, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 288, - 285, 285, 285, 90, 289, 285, 73, 285, - 154, 285, 285, 285, 285, 288, 290, 291, - 292, 293, 76, 73, 285, 154, 285, 285, - 106, 285, 285, 158, 294, 291, 295, 295, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 291, 295, 295, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 296, - 285, 285, 285, 90, 297, 285, 73, 285, - 154, 285, 285, 285, 285, 296, 298, 299, - 300, 301, 76, 73, 285, 154, 285, 285, - 104, 285, 285, 158, 302, 299, 303, 303, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 299, 303, 303, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 304, - 285, 285, 285, 90, 305, 285, 73, 285, - 154, 285, 285, 285, 285, 304, 306, 307, - 308, 309, 76, 73, 285, 154, 285, 285, - 102, 285, 285, 158, 310, 307, 311, 311, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 307, 311, 311, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 312, - 285, 285, 285, 90, 313, 285, 73, 285, - 154, 285, 285, 285, 285, 312, 314, 315, - 316, 317, 76, 73, 285, 154, 285, 285, - 100, 285, 285, 158, 318, 315, 319, 319, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 158, 315, 319, 319, 76, 73, 285, - 154, 285, 285, 285, 285, 285, 158, 90, - 320, 285, 73, 285, 154, 321, 321, 285, - 73, 285, 154, 322, 285, 285, 323, 285, - 154, 154, 324, 325, 322, 285, 285, 285, - 285, 154, 90, 285, 321, 321, 285, 73, - 285, 154, 321, 320, 285, 73, 285, 154, - 326, 99, 327, 328, 80, 73, 285, 154, - 99, 327, 328, 80, 73, 285, 154, 327, - 327, 80, 73, 285, 154, 329, 96, 330, - 331, 83, 73, 285, 154, 96, 330, 331, - 83, 73, 285, 154, 330, 330, 83, 73, - 285, 154, 332, 93, 333, 334, 86, 73, - 285, 154, 93, 333, 334, 86, 73, 285, - 154, 333, 333, 86, 73, 285, 154, 335, - 90, 321, 336, 285, 73, 285, 154, 90, - 321, 336, 285, 73, 285, 154, 315, 319, - 319, 76, 73, 285, 154, 314, 315, 319, - 319, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 158, 314, 315, 316, 319, 76, - 73, 285, 154, 285, 285, 100, 285, 285, - 158, 312, 285, 337, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 312, - 312, 285, 285, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 312, 312, - 285, 285, 285, 321, 313, 285, 73, 285, - 154, 285, 285, 285, 285, 312, 306, 307, - 311, 311, 76, 73, 285, 154, 285, 285, - 285, 285, 285, 158, 306, 307, 308, 311, - 76, 73, 285, 154, 285, 285, 102, 285, - 285, 158, 304, 285, 338, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 304, 304, 285, 285, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 304, - 304, 285, 285, 285, 321, 305, 285, 73, - 285, 154, 285, 285, 285, 285, 304, 298, - 299, 303, 303, 76, 73, 285, 154, 285, - 285, 285, 285, 285, 158, 298, 299, 300, - 303, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 158, 296, 285, 339, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 296, 296, 285, 285, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 296, 296, 285, 285, 285, 321, 297, 285, - 73, 285, 154, 285, 285, 285, 285, 296, - 290, 291, 295, 295, 76, 73, 285, 154, - 285, 285, 285, 285, 285, 158, 290, 291, - 292, 295, 76, 73, 285, 154, 285, 285, - 106, 285, 285, 158, 288, 285, 340, 285, - 321, 321, 285, 73, 285, 154, 285, 285, - 285, 285, 288, 288, 285, 285, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 288, 288, 285, 285, 285, 321, 289, - 285, 73, 285, 154, 285, 285, 285, 285, - 288, 107, 75, 75, 76, 73, 341, 341, - 341, 341, 144, 150, 151, 287, 287, 76, - 73, 285, 154, 285, 285, 285, 285, 285, - 158, 107, 75, 75, 76, 73, 343, 344, - 345, 346, 112, 109, 342, 347, 342, 342, - 143, 342, 342, 348, 349, 344, 346, 346, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 344, 346, 346, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 350, - 342, 342, 342, 125, 351, 342, 109, 342, - 347, 342, 342, 342, 342, 350, 352, 353, - 354, 355, 112, 109, 342, 347, 342, 342, - 141, 342, 342, 348, 356, 353, 357, 357, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 353, 357, 357, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 358, - 342, 342, 342, 125, 359, 342, 109, 342, - 347, 342, 342, 342, 342, 358, 360, 361, - 362, 363, 112, 109, 342, 347, 342, 342, - 139, 342, 342, 348, 364, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 361, 365, 365, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 366, - 342, 342, 342, 125, 367, 342, 109, 342, - 347, 342, 342, 342, 342, 366, 368, 369, - 370, 371, 112, 109, 342, 347, 342, 342, - 137, 342, 342, 348, 372, 369, 373, 373, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 369, 373, 373, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 374, - 342, 342, 342, 125, 375, 342, 109, 342, - 347, 342, 342, 342, 342, 374, 376, 377, - 378, 379, 112, 109, 342, 347, 342, 342, - 135, 342, 342, 348, 380, 377, 381, 381, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 348, 377, 381, 381, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 125, - 382, 342, 109, 342, 347, 383, 383, 342, - 109, 342, 347, 384, 342, 342, 385, 342, - 347, 347, 386, 387, 384, 342, 342, 342, - 342, 347, 125, 342, 383, 383, 342, 109, - 342, 347, 383, 382, 342, 109, 342, 347, - 388, 134, 389, 390, 115, 109, 342, 347, - 134, 389, 390, 115, 109, 342, 347, 389, - 389, 115, 109, 342, 347, 391, 131, 392, - 393, 118, 109, 342, 347, 131, 392, 393, - 118, 109, 342, 347, 392, 392, 118, 109, - 342, 347, 394, 128, 395, 396, 121, 109, - 342, 347, 128, 395, 396, 121, 109, 342, - 347, 395, 395, 121, 109, 342, 347, 397, - 125, 383, 398, 342, 109, 342, 347, 125, - 383, 398, 342, 109, 342, 347, 377, 381, - 381, 112, 109, 342, 347, 376, 377, 381, - 381, 112, 109, 342, 347, 342, 342, 342, - 342, 342, 348, 376, 377, 378, 381, 112, - 109, 342, 347, 342, 342, 135, 342, 342, - 348, 374, 342, 399, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 374, - 374, 342, 342, 342, 383, 383, 342, 109, - 342, 347, 342, 342, 342, 342, 374, 374, - 342, 342, 342, 383, 375, 342, 109, 342, - 347, 342, 342, 342, 342, 374, 368, 369, - 373, 373, 112, 109, 342, 347, 342, 342, - 342, 342, 342, 348, 368, 369, 370, 373, - 112, 109, 342, 347, 342, 342, 137, 342, - 342, 348, 366, 342, 400, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 366, 366, 342, 342, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 366, - 366, 342, 342, 342, 383, 367, 342, 109, - 342, 347, 342, 342, 342, 342, 366, 360, - 361, 365, 365, 112, 109, 342, 347, 342, - 342, 342, 342, 342, 348, 360, 361, 362, - 365, 112, 109, 342, 347, 342, 342, 139, - 342, 342, 348, 358, 342, 401, 342, 383, - 383, 342, 109, 342, 347, 342, 342, 342, - 342, 358, 358, 342, 342, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 358, 358, 342, 342, 342, 383, 359, 342, - 109, 342, 347, 342, 342, 342, 342, 358, - 352, 353, 357, 357, 112, 109, 342, 347, - 342, 342, 342, 342, 342, 348, 352, 353, - 354, 357, 112, 109, 342, 347, 342, 342, - 141, 342, 342, 348, 350, 342, 402, 342, - 383, 383, 342, 109, 342, 347, 342, 342, - 342, 342, 350, 350, 342, 342, 342, 383, - 383, 342, 109, 342, 347, 342, 342, 342, - 342, 350, 350, 342, 342, 342, 383, 351, - 342, 109, 342, 347, 342, 342, 342, 342, - 350, 343, 344, 346, 346, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 348, 148, - 149, 150, 151, 403, 287, 76, 73, 285, - 154, 155, 155, 144, 285, 148, 158, 162, - 404, 164, 165, 4, 1, 161, 166, 161, - 161, 35, 161, 161, 167, 170, 149, 150, - 151, 405, 406, 76, 407, 161, 408, 161, - 155, 144, 161, 170, 158, 107, 409, 409, - 76, 407, 161, 166, 161, 161, 144, 410, - 161, 161, 411, 161, 408, 408, 412, 207, - 410, 161, 161, 161, 161, 408, 170, 161, - 222, 107, 409, 409, 76, 407, 161, 166, - 161, 161, 161, 161, 170, 414, 413, 415, - 415, 413, 146, 413, 416, 415, 415, 413, - 146, 413, 416, 417, 413, 413, 418, 413, - 416, 416, 419, 420, 417, 413, 413, 413, - 413, 416, 148, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 155, 341, 341, 341, - 148, 0 + 1, 0, 2, 3, 3, 4, 1, 0, + 5, 5, 4, 0, 4, 0, 6, 6, + 7, 1, 0, 8, 8, 7, 0, 7, + 0, 9, 9, 10, 1, 0, 11, 11, + 10, 0, 10, 0, 12, 12, 13, 1, + 0, 14, 14, 13, 0, 13, 0, 15, + 0, 0, 0, 1, 0, 16, 0, 17, + 0, 18, 12, 12, 13, 1, 0, 19, + 0, 20, 0, 21, 9, 9, 10, 1, + 0, 22, 0, 23, 0, 24, 6, 6, + 7, 1, 0, 25, 0, 26, 0, 2, + 3, 3, 4, 1, 0, 0, 0, 0, + 27, 0, 28, 3, 3, 4, 1, 0, + 28, 3, 3, 4, 1, 0, 0, 0, + 0, 29, 0, 30, 3, 3, 4, 1, + 0, 30, 3, 3, 4, 1, 0, 0, + 0, 0, 31, 0, 32, 3, 3, 4, + 1, 0, 32, 3, 3, 4, 1, 0, + 0, 0, 0, 33, 0, 34, 3, 3, + 4, 1, 0, 34, 3, 3, 4, 1, + 0, 0, 0, 0, 35, 0, 37, 36, + 38, 39, 39, 40, 37, 36, 41, 41, + 40, 36, 40, 36, 42, 42, 43, 37, + 36, 44, 44, 43, 36, 43, 36, 45, + 45, 46, 37, 36, 47, 47, 46, 36, + 46, 36, 48, 48, 49, 37, 36, 50, + 50, 49, 36, 49, 36, 51, 36, 36, + 36, 37, 36, 52, 36, 53, 36, 54, + 48, 48, 49, 37, 36, 55, 36, 56, + 36, 57, 45, 45, 46, 37, 36, 58, + 36, 59, 36, 60, 42, 42, 43, 37, + 36, 61, 36, 62, 36, 38, 39, 39, + 40, 37, 36, 36, 36, 36, 63, 36, + 64, 39, 39, 40, 37, 36, 64, 39, + 39, 40, 37, 36, 36, 36, 36, 65, + 36, 66, 39, 39, 40, 37, 36, 66, + 39, 39, 40, 37, 36, 36, 36, 36, + 67, 36, 68, 39, 39, 40, 37, 36, + 68, 39, 39, 40, 37, 36, 36, 36, + 36, 69, 36, 70, 39, 39, 40, 37, + 36, 70, 39, 39, 40, 37, 36, 36, + 36, 36, 71, 36, 73, 72, 74, 75, + 75, 76, 73, 72, 78, 78, 76, 77, + 76, 77, 79, 79, 80, 73, 72, 81, + 81, 80, 72, 80, 72, 82, 82, 83, + 73, 72, 84, 84, 83, 72, 83, 72, + 85, 85, 86, 73, 72, 87, 87, 86, + 72, 86, 72, 88, 72, 72, 72, 73, + 72, 89, 72, 90, 72, 91, 85, 85, + 86, 73, 72, 92, 72, 93, 72, 94, + 82, 82, 83, 73, 72, 95, 72, 96, + 72, 97, 79, 79, 80, 73, 72, 98, + 72, 99, 72, 74, 75, 75, 76, 73, + 72, 72, 72, 72, 100, 72, 101, 75, + 75, 76, 73, 72, 101, 75, 75, 76, + 73, 72, 72, 72, 72, 102, 72, 103, + 75, 75, 76, 73, 72, 103, 75, 75, + 76, 73, 72, 72, 72, 72, 104, 72, + 105, 75, 75, 76, 73, 72, 105, 75, + 75, 76, 73, 72, 72, 72, 72, 106, + 72, 107, 75, 75, 76, 73, 72, 109, + 108, 110, 111, 111, 112, 109, 108, 113, + 113, 112, 108, 112, 108, 114, 114, 115, + 109, 108, 116, 116, 115, 108, 115, 108, + 117, 117, 118, 109, 108, 119, 119, 118, + 108, 118, 108, 120, 120, 121, 109, 108, + 122, 122, 121, 108, 121, 108, 123, 108, + 108, 108, 109, 108, 124, 108, 125, 108, + 126, 120, 120, 121, 109, 108, 127, 108, + 128, 108, 129, 117, 117, 118, 109, 108, + 130, 108, 131, 108, 132, 114, 114, 115, + 109, 108, 133, 108, 134, 108, 110, 111, + 111, 112, 109, 108, 108, 108, 108, 135, + 108, 136, 111, 111, 112, 109, 108, 136, + 111, 111, 112, 109, 108, 108, 108, 108, + 137, 108, 138, 111, 111, 112, 109, 108, + 138, 111, 111, 112, 109, 108, 108, 108, + 108, 139, 108, 140, 111, 111, 112, 109, + 108, 140, 111, 111, 112, 109, 108, 108, + 108, 108, 141, 108, 142, 111, 111, 112, + 109, 108, 142, 111, 111, 112, 109, 108, + 108, 108, 108, 143, 108, 107, 75, 75, + 76, 73, 72, 72, 72, 72, 144, 72, + 78, 78, 76, 1, 0, 146, 145, 148, + 149, 150, 151, 152, 153, 76, 73, 147, + 154, 155, 155, 144, 147, 156, 157, 158, + 159, 160, 147, 162, 163, 164, 165, 4, + 1, 161, 166, 161, 161, 35, 161, 161, + 161, 167, 161, 168, 163, 169, 169, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 163, 169, 169, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 161, + 167, 161, 170, 161, 161, 161, 17, 171, + 161, 1, 161, 166, 161, 161, 161, 161, + 161, 170, 161, 172, 173, 174, 175, 4, + 1, 161, 166, 161, 161, 33, 161, 161, + 161, 167, 161, 176, 173, 177, 177, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 173, 177, 177, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 161, + 167, 161, 178, 161, 161, 161, 17, 179, + 161, 1, 161, 166, 161, 161, 161, 161, + 161, 178, 161, 180, 181, 182, 183, 4, + 1, 161, 166, 161, 161, 31, 161, 161, + 161, 167, 161, 184, 181, 185, 185, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 181, 185, 185, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 161, + 167, 161, 186, 161, 161, 161, 17, 187, + 161, 1, 161, 166, 161, 161, 161, 161, + 161, 186, 161, 188, 189, 190, 191, 4, + 1, 161, 166, 161, 161, 29, 161, 161, + 161, 167, 161, 192, 189, 193, 193, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 189, 193, 193, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 161, + 167, 161, 194, 161, 161, 161, 17, 195, + 161, 1, 161, 166, 161, 161, 161, 161, + 161, 194, 161, 196, 197, 198, 199, 4, + 1, 161, 166, 161, 161, 27, 161, 161, + 161, 167, 161, 200, 197, 201, 201, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 197, 201, 201, 4, 1, + 161, 166, 161, 161, 161, 161, 161, 161, + 167, 161, 17, 202, 161, 1, 161, 166, + 161, 203, 203, 161, 1, 161, 166, 161, + 204, 161, 161, 205, 161, 166, 161, 166, + 161, 206, 161, 207, 161, 204, 161, 161, + 161, 161, 166, 161, 17, 161, 203, 203, + 161, 1, 161, 166, 161, 203, 202, 161, + 1, 161, 166, 161, 208, 26, 209, 210, + 7, 1, 161, 166, 161, 26, 209, 210, + 7, 1, 161, 166, 161, 209, 209, 7, + 1, 161, 166, 161, 211, 23, 212, 213, + 10, 1, 161, 166, 161, 23, 212, 213, + 10, 1, 161, 166, 161, 212, 212, 10, + 1, 161, 166, 161, 214, 20, 215, 216, + 13, 1, 161, 166, 161, 20, 215, 216, + 13, 1, 161, 166, 161, 215, 215, 13, + 1, 161, 166, 161, 217, 17, 203, 218, + 161, 1, 161, 166, 161, 17, 203, 218, + 161, 1, 161, 166, 161, 197, 201, 201, + 4, 1, 161, 166, 161, 196, 197, 201, + 201, 4, 1, 161, 166, 161, 161, 161, + 161, 161, 161, 167, 161, 196, 197, 198, + 201, 4, 1, 161, 166, 161, 161, 27, + 161, 161, 161, 167, 161, 194, 161, 219, + 161, 203, 203, 161, 1, 161, 166, 161, + 161, 161, 161, 161, 194, 161, 194, 161, + 161, 161, 203, 203, 161, 1, 161, 166, + 161, 161, 161, 161, 161, 194, 161, 194, + 161, 161, 161, 203, 195, 161, 1, 161, + 166, 161, 161, 161, 161, 161, 194, 161, + 188, 189, 193, 193, 4, 1, 161, 166, + 161, 161, 161, 161, 161, 161, 167, 161, + 188, 189, 190, 193, 4, 1, 161, 166, + 161, 161, 29, 161, 161, 161, 167, 161, + 186, 161, 220, 161, 203, 203, 161, 1, + 161, 166, 161, 161, 161, 161, 161, 186, + 161, 186, 161, 161, 161, 203, 203, 161, + 1, 161, 166, 161, 161, 161, 161, 161, + 186, 161, 186, 161, 161, 161, 203, 187, + 161, 1, 161, 166, 161, 161, 161, 161, + 161, 186, 161, 180, 181, 185, 185, 4, + 1, 161, 166, 161, 161, 161, 161, 161, + 161, 167, 161, 180, 181, 182, 185, 4, + 1, 161, 166, 161, 161, 31, 161, 161, + 161, 167, 161, 178, 161, 221, 161, 203, + 203, 161, 1, 161, 166, 161, 161, 161, + 161, 161, 178, 161, 178, 161, 161, 161, + 203, 203, 161, 1, 161, 166, 161, 161, + 161, 161, 161, 178, 161, 178, 161, 161, + 161, 203, 179, 161, 1, 161, 166, 161, + 161, 161, 161, 161, 178, 161, 172, 173, + 177, 177, 4, 1, 161, 166, 161, 161, + 161, 161, 161, 161, 167, 161, 172, 173, + 174, 177, 4, 1, 161, 166, 161, 161, + 33, 161, 161, 161, 167, 161, 170, 161, + 222, 161, 203, 203, 161, 1, 161, 166, + 161, 161, 161, 161, 161, 170, 161, 170, + 161, 161, 161, 203, 203, 161, 1, 161, + 166, 161, 161, 161, 161, 161, 170, 161, + 170, 161, 161, 161, 203, 171, 161, 1, + 161, 166, 161, 161, 161, 161, 161, 170, + 161, 162, 163, 169, 169, 4, 1, 161, + 166, 161, 161, 161, 161, 161, 161, 167, + 161, 162, 163, 164, 169, 4, 1, 161, + 166, 161, 161, 35, 161, 161, 161, 167, + 161, 224, 225, 226, 227, 40, 37, 223, + 228, 223, 223, 71, 223, 223, 223, 229, + 223, 230, 225, 231, 227, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 225, 231, 227, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 223, 229, 223, + 232, 223, 223, 223, 53, 233, 223, 37, + 223, 228, 223, 223, 223, 223, 223, 232, + 223, 234, 235, 236, 237, 40, 37, 223, + 228, 223, 223, 69, 223, 223, 223, 229, + 223, 238, 235, 239, 239, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 235, 239, 239, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 223, 229, 223, + 240, 223, 223, 223, 53, 241, 223, 37, + 223, 228, 223, 223, 223, 223, 223, 240, + 223, 242, 243, 244, 245, 40, 37, 223, + 228, 223, 223, 67, 223, 223, 223, 229, + 223, 246, 243, 247, 247, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 243, 247, 247, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 223, 229, 223, + 248, 223, 223, 223, 53, 249, 223, 37, + 223, 228, 223, 223, 223, 223, 223, 248, + 223, 250, 251, 252, 253, 40, 37, 223, + 228, 223, 223, 65, 223, 223, 223, 229, + 223, 254, 251, 255, 255, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 251, 255, 255, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 223, 229, 223, + 256, 223, 223, 223, 53, 257, 223, 37, + 223, 228, 223, 223, 223, 223, 223, 256, + 223, 258, 259, 260, 261, 40, 37, 223, + 228, 223, 223, 63, 223, 223, 223, 229, + 223, 262, 259, 263, 263, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 259, 263, 263, 40, 37, 223, 228, + 223, 223, 223, 223, 223, 223, 229, 223, + 53, 264, 223, 37, 223, 228, 223, 265, + 265, 223, 37, 223, 228, 223, 266, 223, + 223, 267, 223, 228, 223, 228, 223, 268, + 223, 269, 223, 266, 223, 223, 223, 223, + 228, 223, 53, 223, 265, 265, 223, 37, + 223, 228, 223, 265, 264, 223, 37, 223, + 228, 223, 270, 62, 271, 272, 43, 37, + 223, 228, 223, 62, 271, 272, 43, 37, + 223, 228, 223, 271, 271, 43, 37, 223, + 228, 223, 273, 59, 274, 275, 46, 37, + 223, 228, 223, 59, 274, 275, 46, 37, + 223, 228, 223, 274, 274, 46, 37, 223, + 228, 223, 276, 56, 277, 278, 49, 37, + 223, 228, 223, 56, 277, 278, 49, 37, + 223, 228, 223, 277, 277, 49, 37, 223, + 228, 223, 279, 53, 265, 280, 223, 37, + 223, 228, 223, 53, 265, 280, 223, 37, + 223, 228, 223, 259, 263, 263, 40, 37, + 223, 228, 223, 258, 259, 263, 263, 40, + 37, 223, 228, 223, 223, 223, 223, 223, + 223, 229, 223, 258, 259, 260, 263, 40, + 37, 223, 228, 223, 223, 63, 223, 223, + 223, 229, 223, 256, 223, 281, 223, 265, + 265, 223, 37, 223, 228, 223, 223, 223, + 223, 223, 256, 223, 256, 223, 223, 223, + 265, 265, 223, 37, 223, 228, 223, 223, + 223, 223, 223, 256, 223, 256, 223, 223, + 223, 265, 257, 223, 37, 223, 228, 223, + 223, 223, 223, 223, 256, 223, 250, 251, + 255, 255, 40, 37, 223, 228, 223, 223, + 223, 223, 223, 223, 229, 223, 250, 251, + 252, 255, 40, 37, 223, 228, 223, 223, + 65, 223, 223, 223, 229, 223, 248, 223, + 282, 223, 265, 265, 223, 37, 223, 228, + 223, 223, 223, 223, 223, 248, 223, 248, + 223, 223, 223, 265, 265, 223, 37, 223, + 228, 223, 223, 223, 223, 223, 248, 223, + 248, 223, 223, 223, 265, 249, 223, 37, + 223, 228, 223, 223, 223, 223, 223, 248, + 223, 242, 243, 247, 247, 40, 37, 223, + 228, 223, 223, 223, 223, 223, 223, 229, + 223, 242, 243, 244, 247, 40, 37, 223, + 228, 223, 223, 67, 223, 223, 223, 229, + 223, 240, 223, 283, 223, 265, 265, 223, + 37, 223, 228, 223, 223, 223, 223, 223, + 240, 223, 240, 223, 223, 223, 265, 265, + 223, 37, 223, 228, 223, 223, 223, 223, + 223, 240, 223, 240, 223, 223, 223, 265, + 241, 223, 37, 223, 228, 223, 223, 223, + 223, 223, 240, 223, 234, 235, 239, 239, + 40, 37, 223, 228, 223, 223, 223, 223, + 223, 223, 229, 223, 234, 235, 236, 239, + 40, 37, 223, 228, 223, 223, 69, 223, + 223, 223, 229, 223, 232, 223, 284, 223, + 265, 265, 223, 37, 223, 228, 223, 223, + 223, 223, 223, 232, 223, 232, 223, 223, + 223, 265, 265, 223, 37, 223, 228, 223, + 223, 223, 223, 223, 232, 223, 232, 223, + 223, 223, 265, 233, 223, 37, 223, 228, + 223, 223, 223, 223, 223, 232, 223, 70, + 39, 39, 40, 37, 223, 224, 225, 231, + 227, 40, 37, 223, 228, 223, 223, 223, + 223, 223, 223, 229, 223, 286, 151, 287, + 287, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 151, 287, 287, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 285, 158, 285, 288, 285, 285, 285, + 90, 289, 285, 73, 285, 154, 285, 285, + 285, 285, 285, 288, 285, 290, 291, 292, + 293, 76, 73, 285, 154, 285, 285, 106, + 285, 285, 285, 158, 285, 294, 291, 295, + 295, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 291, 295, 295, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 285, 158, 285, 296, 285, 285, 285, + 90, 297, 285, 73, 285, 154, 285, 285, + 285, 285, 285, 296, 285, 298, 299, 300, + 301, 76, 73, 285, 154, 285, 285, 104, + 285, 285, 285, 158, 285, 302, 299, 303, + 303, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 299, 303, 303, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 285, 158, 285, 304, 285, 285, 285, + 90, 305, 285, 73, 285, 154, 285, 285, + 285, 285, 285, 304, 285, 306, 307, 308, + 309, 76, 73, 285, 154, 285, 285, 102, + 285, 285, 285, 158, 285, 310, 307, 311, + 311, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 307, 311, 311, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 285, 158, 285, 312, 285, 285, 285, + 90, 313, 285, 73, 285, 154, 285, 285, + 285, 285, 285, 312, 285, 314, 315, 316, + 317, 76, 73, 285, 154, 285, 285, 100, + 285, 285, 285, 158, 285, 318, 315, 319, + 319, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 315, 319, 319, + 76, 73, 285, 154, 285, 285, 285, 285, + 285, 285, 158, 285, 90, 320, 285, 73, + 285, 154, 285, 321, 321, 285, 73, 285, + 154, 285, 322, 285, 285, 323, 285, 154, + 285, 154, 285, 324, 285, 325, 285, 322, + 285, 285, 285, 285, 154, 285, 90, 285, + 321, 321, 285, 73, 285, 154, 285, 321, + 320, 285, 73, 285, 154, 285, 326, 99, + 327, 328, 80, 73, 285, 154, 285, 99, + 327, 328, 80, 73, 285, 154, 285, 327, + 327, 80, 73, 285, 154, 285, 329, 96, + 330, 331, 83, 73, 285, 154, 285, 96, + 330, 331, 83, 73, 285, 154, 285, 330, + 330, 83, 73, 285, 154, 285, 332, 93, + 333, 334, 86, 73, 285, 154, 285, 93, + 333, 334, 86, 73, 285, 154, 285, 333, + 333, 86, 73, 285, 154, 285, 335, 90, + 321, 336, 285, 73, 285, 154, 285, 90, + 321, 336, 285, 73, 285, 154, 285, 315, + 319, 319, 76, 73, 285, 154, 285, 314, + 315, 319, 319, 76, 73, 285, 154, 285, + 285, 285, 285, 285, 285, 158, 285, 314, + 315, 316, 319, 76, 73, 285, 154, 285, + 285, 100, 285, 285, 285, 158, 285, 312, + 285, 337, 285, 321, 321, 285, 73, 285, + 154, 285, 285, 285, 285, 285, 312, 285, + 312, 285, 285, 285, 321, 321, 285, 73, + 285, 154, 285, 285, 285, 285, 285, 312, + 285, 312, 285, 285, 285, 321, 313, 285, + 73, 285, 154, 285, 285, 285, 285, 285, + 312, 285, 306, 307, 311, 311, 76, 73, + 285, 154, 285, 285, 285, 285, 285, 285, + 158, 285, 306, 307, 308, 311, 76, 73, + 285, 154, 285, 285, 102, 285, 285, 285, + 158, 285, 304, 285, 338, 285, 321, 321, + 285, 73, 285, 154, 285, 285, 285, 285, + 285, 304, 285, 304, 285, 285, 285, 321, + 321, 285, 73, 285, 154, 285, 285, 285, + 285, 285, 304, 285, 304, 285, 285, 285, + 321, 305, 285, 73, 285, 154, 285, 285, + 285, 285, 285, 304, 285, 298, 299, 303, + 303, 76, 73, 285, 154, 285, 285, 285, + 285, 285, 285, 158, 285, 298, 299, 300, + 303, 76, 73, 285, 154, 285, 285, 104, + 285, 285, 285, 158, 285, 296, 285, 339, + 285, 321, 321, 285, 73, 285, 154, 285, + 285, 285, 285, 285, 296, 285, 296, 285, + 285, 285, 321, 321, 285, 73, 285, 154, + 285, 285, 285, 285, 285, 296, 285, 296, + 285, 285, 285, 321, 297, 285, 73, 285, + 154, 285, 285, 285, 285, 285, 296, 285, + 290, 291, 295, 295, 76, 73, 285, 154, + 285, 285, 285, 285, 285, 285, 158, 285, + 290, 291, 292, 295, 76, 73, 285, 154, + 285, 285, 106, 285, 285, 285, 158, 285, + 288, 285, 340, 285, 321, 321, 285, 73, + 285, 154, 285, 285, 285, 285, 285, 288, + 285, 288, 285, 285, 285, 321, 321, 285, + 73, 285, 154, 285, 285, 285, 285, 285, + 288, 285, 288, 285, 285, 285, 321, 289, + 285, 73, 285, 154, 285, 285, 285, 285, + 285, 288, 285, 107, 75, 75, 76, 73, + 341, 341, 341, 341, 144, 341, 150, 151, + 287, 287, 76, 73, 285, 154, 285, 285, + 285, 285, 285, 285, 158, 285, 107, 75, + 75, 76, 73, 341, 343, 344, 345, 346, + 112, 109, 342, 347, 342, 342, 143, 342, + 342, 342, 348, 342, 349, 344, 346, 346, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 344, 346, 346, 112, + 109, 342, 347, 342, 342, 342, 342, 342, + 342, 348, 342, 350, 342, 342, 342, 125, + 351, 342, 109, 342, 347, 342, 342, 342, + 342, 342, 350, 342, 352, 353, 354, 355, + 112, 109, 342, 347, 342, 342, 141, 342, + 342, 342, 348, 342, 356, 353, 357, 357, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 353, 357, 357, 112, + 109, 342, 347, 342, 342, 342, 342, 342, + 342, 348, 342, 358, 342, 342, 342, 125, + 359, 342, 109, 342, 347, 342, 342, 342, + 342, 342, 358, 342, 360, 361, 362, 363, + 112, 109, 342, 347, 342, 342, 139, 342, + 342, 342, 348, 342, 364, 361, 365, 365, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 361, 365, 365, 112, + 109, 342, 347, 342, 342, 342, 342, 342, + 342, 348, 342, 366, 342, 342, 342, 125, + 367, 342, 109, 342, 347, 342, 342, 342, + 342, 342, 366, 342, 368, 369, 370, 371, + 112, 109, 342, 347, 342, 342, 137, 342, + 342, 342, 348, 342, 372, 369, 373, 373, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 369, 373, 373, 112, + 109, 342, 347, 342, 342, 342, 342, 342, + 342, 348, 342, 374, 342, 342, 342, 125, + 375, 342, 109, 342, 347, 342, 342, 342, + 342, 342, 374, 342, 376, 377, 378, 379, + 112, 109, 342, 347, 342, 342, 135, 342, + 342, 342, 348, 342, 380, 377, 381, 381, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 377, 381, 381, 112, + 109, 342, 347, 342, 342, 342, 342, 342, + 342, 348, 342, 125, 382, 342, 109, 342, + 347, 342, 383, 383, 342, 109, 342, 347, + 342, 384, 342, 342, 385, 342, 347, 342, + 347, 342, 386, 342, 387, 342, 384, 342, + 342, 342, 342, 347, 342, 125, 342, 383, + 383, 342, 109, 342, 347, 342, 383, 382, + 342, 109, 342, 347, 342, 388, 134, 389, + 390, 115, 109, 342, 347, 342, 134, 389, + 390, 115, 109, 342, 347, 342, 389, 389, + 115, 109, 342, 347, 342, 391, 131, 392, + 393, 118, 109, 342, 347, 342, 131, 392, + 393, 118, 109, 342, 347, 342, 392, 392, + 118, 109, 342, 347, 342, 394, 128, 395, + 396, 121, 109, 342, 347, 342, 128, 395, + 396, 121, 109, 342, 347, 342, 395, 395, + 121, 109, 342, 347, 342, 397, 125, 383, + 398, 342, 109, 342, 347, 342, 125, 383, + 398, 342, 109, 342, 347, 342, 377, 381, + 381, 112, 109, 342, 347, 342, 376, 377, + 381, 381, 112, 109, 342, 347, 342, 342, + 342, 342, 342, 342, 348, 342, 376, 377, + 378, 381, 112, 109, 342, 347, 342, 342, + 135, 342, 342, 342, 348, 342, 374, 342, + 399, 342, 383, 383, 342, 109, 342, 347, + 342, 342, 342, 342, 342, 374, 342, 374, + 342, 342, 342, 383, 383, 342, 109, 342, + 347, 342, 342, 342, 342, 342, 374, 342, + 374, 342, 342, 342, 383, 375, 342, 109, + 342, 347, 342, 342, 342, 342, 342, 374, + 342, 368, 369, 373, 373, 112, 109, 342, + 347, 342, 342, 342, 342, 342, 342, 348, + 342, 368, 369, 370, 373, 112, 109, 342, + 347, 342, 342, 137, 342, 342, 342, 348, + 342, 366, 342, 400, 342, 383, 383, 342, + 109, 342, 347, 342, 342, 342, 342, 342, + 366, 342, 366, 342, 342, 342, 383, 383, + 342, 109, 342, 347, 342, 342, 342, 342, + 342, 366, 342, 366, 342, 342, 342, 383, + 367, 342, 109, 342, 347, 342, 342, 342, + 342, 342, 366, 342, 360, 361, 365, 365, + 112, 109, 342, 347, 342, 342, 342, 342, + 342, 342, 348, 342, 360, 361, 362, 365, + 112, 109, 342, 347, 342, 342, 139, 342, + 342, 342, 348, 342, 358, 342, 401, 342, + 383, 383, 342, 109, 342, 347, 342, 342, + 342, 342, 342, 358, 342, 358, 342, 342, + 342, 383, 383, 342, 109, 342, 347, 342, + 342, 342, 342, 342, 358, 342, 358, 342, + 342, 342, 383, 359, 342, 109, 342, 347, + 342, 342, 342, 342, 342, 358, 342, 352, + 353, 357, 357, 112, 109, 342, 347, 342, + 342, 342, 342, 342, 342, 348, 342, 352, + 353, 354, 357, 112, 109, 342, 347, 342, + 342, 141, 342, 342, 342, 348, 342, 350, + 342, 402, 342, 383, 383, 342, 109, 342, + 347, 342, 342, 342, 342, 342, 350, 342, + 350, 342, 342, 342, 383, 383, 342, 109, + 342, 347, 342, 342, 342, 342, 342, 350, + 342, 350, 342, 342, 342, 383, 351, 342, + 109, 342, 347, 342, 342, 342, 342, 342, + 350, 342, 343, 344, 346, 346, 112, 109, + 342, 347, 342, 342, 342, 342, 342, 342, + 348, 342, 148, 149, 150, 151, 403, 287, + 76, 73, 285, 154, 155, 155, 144, 285, + 285, 148, 158, 285, 162, 404, 164, 165, + 4, 1, 161, 166, 161, 161, 35, 161, + 161, 161, 167, 161, 170, 149, 150, 151, + 405, 406, 76, 407, 161, 408, 161, 155, + 144, 161, 161, 170, 158, 161, 107, 409, + 409, 76, 407, 161, 166, 161, 161, 144, + 161, 410, 161, 161, 411, 161, 408, 161, + 408, 161, 412, 161, 207, 161, 410, 161, + 161, 161, 161, 408, 161, 170, 161, 222, + 107, 409, 409, 76, 407, 161, 166, 161, + 161, 161, 161, 161, 170, 161, 414, 413, + 415, 415, 413, 146, 413, 416, 413, 415, + 415, 413, 146, 413, 416, 413, 417, 413, + 413, 418, 413, 416, 413, 416, 413, 419, + 413, 420, 413, 417, 413, 413, 413, 413, + 416, 413, 148, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 155, 341, 341, 341, + 341, 148, 341, 0 }; -static const short _indic_syllable_machine_index_defaults[] = { - 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, 0, 0, 0, - 0, 0, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 72, 72, 77, 77, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 72, - 0, 145, 147, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, - 161, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 341, 285, 341, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 285, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 413, 413, 413, 413, - 413, 413, 413, 341, 0 +static const short _indic_syllable_machine_trans_targs[] = { + 138, 160, 166, 2, 167, 3, 5, 170, + 6, 8, 173, 9, 11, 176, 12, 14, + 15, 159, 17, 18, 175, 20, 21, 172, + 23, 24, 169, 179, 183, 184, 188, 189, + 193, 194, 198, 199, 138, 222, 228, 36, + 229, 37, 39, 232, 40, 42, 235, 43, + 45, 238, 46, 48, 49, 221, 51, 52, + 237, 54, 55, 234, 57, 58, 231, 241, + 245, 246, 250, 251, 255, 256, 260, 262, + 138, 283, 289, 70, 290, 138, 71, 73, + 293, 74, 76, 296, 77, 79, 299, 80, + 82, 83, 282, 85, 86, 298, 88, 89, + 295, 91, 92, 292, 302, 306, 307, 311, + 312, 316, 317, 321, 138, 346, 352, 103, + 353, 104, 106, 356, 107, 109, 359, 110, + 112, 362, 113, 115, 116, 345, 118, 119, + 361, 121, 122, 358, 124, 125, 355, 365, + 369, 370, 374, 375, 379, 380, 384, 385, + 323, 138, 398, 138, 139, 201, 263, 265, + 322, 324, 285, 325, 386, 387, 301, 396, + 403, 138, 140, 142, 33, 200, 162, 178, + 141, 32, 143, 196, 144, 146, 31, 195, + 145, 30, 147, 191, 148, 150, 29, 190, + 149, 28, 151, 186, 152, 154, 27, 185, + 153, 26, 155, 181, 156, 158, 25, 180, + 157, 1, 165, 0, 161, 164, 163, 138, + 168, 4, 22, 171, 7, 19, 174, 10, + 16, 177, 13, 182, 187, 192, 197, 138, + 202, 204, 67, 261, 224, 240, 203, 66, + 205, 258, 206, 208, 65, 257, 207, 64, + 209, 253, 210, 212, 63, 252, 211, 62, + 213, 248, 214, 216, 61, 247, 215, 60, + 217, 243, 218, 220, 59, 242, 219, 35, + 227, 34, 223, 226, 225, 138, 230, 38, + 56, 233, 41, 53, 236, 44, 50, 239, + 47, 244, 249, 254, 259, 138, 264, 100, + 266, 319, 267, 269, 99, 318, 268, 98, + 270, 314, 271, 273, 97, 313, 272, 96, + 274, 309, 275, 277, 95, 308, 276, 94, + 278, 304, 279, 281, 93, 303, 280, 69, + 288, 68, 284, 287, 286, 138, 291, 72, + 90, 294, 75, 87, 297, 78, 84, 300, + 81, 305, 310, 315, 320, 138, 138, 326, + 328, 134, 133, 348, 364, 327, 329, 382, + 330, 332, 132, 381, 331, 131, 333, 377, + 334, 336, 130, 376, 335, 129, 337, 372, + 338, 340, 128, 371, 339, 127, 341, 367, + 342, 344, 126, 366, 343, 102, 351, 101, + 347, 350, 349, 138, 354, 105, 123, 357, + 108, 120, 360, 111, 117, 363, 114, 368, + 373, 378, 383, 135, 388, 389, 395, 390, + 392, 136, 391, 394, 393, 138, 397, 137, + 400, 399, 402, 401, 138 }; -static const char _indic_syllable_machine_trans_cond_spaces[] = { - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -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, -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, - -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, -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, -1, 0 -}; - -static const short _indic_syllable_machine_cond_targs[] = { - 138, 160, 166, 2, 167, 3, 5, 170, - 6, 8, 173, 9, 11, 176, 12, 14, - 15, 159, 17, 18, 175, 20, 21, 172, - 23, 24, 169, 179, 183, 184, 188, 189, - 193, 194, 198, 199, 138, 222, 228, 36, - 229, 37, 39, 232, 40, 42, 235, 43, - 45, 238, 46, 48, 49, 221, 51, 52, - 237, 54, 55, 234, 57, 58, 231, 241, - 245, 246, 250, 251, 255, 256, 260, 262, - 138, 283, 289, 70, 290, 138, 71, 73, - 293, 74, 76, 296, 77, 79, 299, 80, - 82, 83, 282, 85, 86, 298, 88, 89, - 295, 91, 92, 292, 302, 306, 307, 311, - 312, 316, 317, 321, 138, 346, 352, 103, - 353, 104, 106, 356, 107, 109, 359, 110, - 112, 362, 113, 115, 116, 345, 118, 119, - 361, 121, 122, 358, 124, 125, 355, 365, - 369, 370, 374, 375, 379, 380, 384, 385, - 323, 138, 398, 138, 139, 201, 263, 265, - 322, 324, 285, 325, 386, 387, 301, 396, - 403, 138, 140, 142, 33, 200, 162, 178, - 141, 32, 143, 196, 144, 146, 31, 195, - 145, 30, 147, 191, 148, 150, 29, 190, - 149, 28, 151, 186, 152, 154, 27, 185, - 153, 26, 155, 181, 156, 158, 25, 180, - 157, 1, 165, 0, 161, 164, 163, 138, - 168, 4, 22, 171, 7, 19, 174, 10, - 16, 177, 13, 182, 187, 192, 197, 138, - 202, 204, 67, 261, 224, 240, 203, 66, - 205, 258, 206, 208, 65, 257, 207, 64, - 209, 253, 210, 212, 63, 252, 211, 62, - 213, 248, 214, 216, 61, 247, 215, 60, - 217, 243, 218, 220, 59, 242, 219, 35, - 227, 34, 223, 226, 225, 138, 230, 38, - 56, 233, 41, 53, 236, 44, 50, 239, - 47, 244, 249, 254, 259, 138, 264, 100, - 266, 319, 267, 269, 99, 318, 268, 98, - 270, 314, 271, 273, 97, 313, 272, 96, - 274, 309, 275, 277, 95, 308, 276, 94, - 278, 304, 279, 281, 93, 303, 280, 69, - 288, 68, 284, 287, 286, 138, 291, 72, - 90, 294, 75, 87, 297, 78, 84, 300, - 81, 305, 310, 315, 320, 138, 138, 326, - 328, 134, 133, 348, 364, 327, 329, 382, - 330, 332, 132, 381, 331, 131, 333, 377, - 334, 336, 130, 376, 335, 129, 337, 372, - 338, 340, 128, 371, 339, 127, 341, 367, - 342, 344, 126, 366, 343, 102, 351, 101, - 347, 350, 349, 138, 354, 105, 123, 357, - 108, 120, 360, 111, 117, 363, 114, 368, - 373, 378, 383, 135, 388, 389, 395, 390, - 392, 136, 391, 394, 393, 138, 397, 137, - 400, 399, 402, 401, 138, 0 -}; - -static const char _indic_syllable_machine_cond_actions[] = { - 1, 0, 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, 3, 0, 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, - 4, 0, 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, 6, 2, 6, 2, - 6, 2, 6, 2, 7, 0, 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, - 6, 8, 0, 11, 2, 2, 6, 0, - 12, 12, 0, 2, 6, 2, 6, 2, - 0, 13, 2, 0, 0, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 14, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 15, - 2, 0, 0, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 16, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 17, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 2, 0, 0, 0, 0, 18, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 19, 20, 2, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 21, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 0, 0, 22, 22, 0, - 0, 0, 0, 0, 0, 23, 2, 0, - 0, 0, 0, 0, 24, 0 +static const char _indic_syllable_machine_trans_actions[] = { + 1, 0, 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, 3, 0, 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, + 4, 0, 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, 6, 2, 6, 2, + 6, 2, 6, 2, 7, 0, 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, + 6, 8, 0, 11, 2, 2, 6, 0, + 12, 12, 0, 2, 6, 2, 6, 2, + 0, 13, 2, 0, 0, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 0, 0, 0, 0, 14, + 2, 0, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 2, 2, 2, 2, 15, + 2, 0, 0, 2, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 16, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 17, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 6, 2, 6, 0, 0, 6, 6, 0, + 2, 0, 0, 0, 0, 18, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 19, 20, 2, + 0, 0, 0, 0, 2, 2, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 0, + 0, 0, 0, 21, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 2, + 2, 2, 2, 0, 0, 22, 22, 0, + 0, 0, 0, 0, 0, 23, 2, 0, + 0, 0, 0, 0, 24 }; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -static const char _indic_syllable_machine_eof_cond_spaces[] = { - -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0 -}; - -static const char _indic_syllable_machine_eof_cond_key_offs[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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 -}; - -static const char _indic_syllable_machine_eof_cond_key_lens[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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 -}; - -static const char _indic_syllable_machine_eof_cond_keys[] = { - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 }; 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, 1, 1, 1, 1, - 1, 1, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 73, 73, 78, 78, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 73, - 1, 146, 0, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 342, 286, 342, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 286, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 414, 414, 414, 414, - 414, 414, 414, 342, 0 -}; - -static const char _indic_syllable_machine_nfa_targs[] = { - 0, 0 -}; - -static const char _indic_syllable_machine_nfa_offsets[] = { - 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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 -}; - -static const char _indic_syllable_machine_nfa_push_actions[] = { - 0, 0 -}; - -static const char _indic_syllable_machine_nfa_pop_trans[] = { - 0, 0 + 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, 1, 1, + 1, 1, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 73, 73, 78, 78, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 73, + 1, 146, 0, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 342, 286, 342, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 286, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 414, 414, 414, 414, + 414, 414, 414, 342 }; static const int indic_syllable_machine_start = 138; @@ -1259,333 +987,209 @@ static const int indic_syllable_machine_error = -1; static const int indic_syllable_machine_en_main = 138; +#line 36 "hb-ot-shape-complex-indic-machine.rl" +#line 93 "hb-ot-shape-complex-indic-machine.rl" + + #define found_syllable(syllable_type) \ -HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial=1; \ -} HB_STMT_END + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; - int cs; - hb_glyph_info_t *info = buffer->info; - + unsigned int p, pe, eof, ts, te, act; + int cs; + hb_glyph_info_t *info = buffer->info; + +#line 1014 "hb-ot-shape-complex-indic-machine.hh" { - cs = (int)indic_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = indic_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - - - p=0; - pe = eof = buffer->len; - - unsigned int syllable_serial=1; - + +#line 113 "hb-ot-shape-complex-indic-machine.rl" + + + p = 0; + pe = eof = buffer->len; + + unsigned int syllable_serial = 1; + +#line 1030 "hb-ot-shape-complex-indic-machine.hh" { - int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const short * _inds; { - if ( p == pe ) - goto _test_eof; - _resume: { - switch ( _indic_syllable_machine_from_state_actions[cs] ) { - case 10: { - { - #line 1 "NONE" - {ts = p;}} - - break; } - } - - _keys = ( _indic_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _indic_syllable_machine_indicies + (_indic_syllable_machine_index_offsets[cs])); - - if ( (info[p].indic_category()) <= 19 && (info[p].indic_category()) >= 1 ) - { - int _ic = (int)_indic_syllable_machine_char_class[(int)(info[p].indic_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_indic_syllable_machine_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_indic_syllable_machine_cond_targs[_trans]; - - if ( _indic_syllable_machine_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _indic_syllable_machine_cond_actions[_trans] ) { - case 2: { - { - #line 1 "NONE" - {te = p+1;}} - - break; } - case 14: { - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 84 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 16: { - { - #line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 85 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (vowel_syllable); }}} - - break; } - case 21: { - { - #line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 86 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (standalone_cluster); }}} - - break; } - case 24: { - { - #line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 87 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (symbol_cluster); }}} - - break; } - case 18: { - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 88 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 11: { - { - #line 89 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ - #line 89 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (non_indic_cluster); }}} - - break; } - case 13: { - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 84 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 15: { - { - #line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 85 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (vowel_syllable); }}} - - break; } - case 20: { - { - #line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 86 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (standalone_cluster); }}} - - break; } - case 23: { - { - #line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 87 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (symbol_cluster); }}} - - break; } - case 17: { - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 88 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 19: { - { - #line 89 "hb-ot-shape-complex-indic-machine.rl" - {te = p;p = p - 1;{ - #line 89 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (non_indic_cluster); }}} - - break; } - case 1: { - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - {p = ((te))-1; - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 3: { - { - #line 85 "hb-ot-shape-complex-indic-machine.rl" - {p = ((te))-1; - { - #line 85 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (vowel_syllable); }}} - - break; } - case 7: { - { - #line 86 "hb-ot-shape-complex-indic-machine.rl" - {p = ((te))-1; - { - #line 86 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (standalone_cluster); }}} - - break; } - case 8: { - { - #line 87 "hb-ot-shape-complex-indic-machine.rl" - {p = ((te))-1; - { - #line 87 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (symbol_cluster); }}} - - break; } - case 4: { - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - {p = ((te))-1; - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 5: { - { - #line 1 "NONE" - {switch( act ) { - case 1: { - p = ((te))-1; - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (consonant_syllable); } break; } - case 5: { - p = ((te))-1; - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (broken_cluster); } break; } - case 6: { - p = ((te))-1; - { - #line 89 "hb-ot-shape-complex-indic-machine.rl" - found_syllable (non_indic_cluster); } break; } - }} - } - - break; } - case 22: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 84 "hb-ot-shape-complex-indic-machine.rl" - {act = 1;}} - - break; } - case 6: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 88 "hb-ot-shape-complex-indic-machine.rl" - {act = 5;}} - - break; } - case 12: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 89 "hb-ot-shape-complex-indic-machine.rl" - {act = 6;}} - - break; } - } - - - } - _again: { - switch ( _indic_syllable_machine_to_state_actions[cs] ) { - case 9: { - { - #line 1 "NONE" - {ts = 0;}} - - break; } - } - - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - if ( p == eof ) - { - if ( _indic_syllable_machine_eof_cond_spaces[cs] != -1 ) { - _cekeys = ( _indic_syllable_machine_eof_cond_keys + (_indic_syllable_machine_eof_cond_key_offs[cs])); - _klen = (int)_indic_syllable_machine_eof_cond_key_lens[cs]; - _cpc = 0; - { - const char *_lower = _cekeys; - const char *_upper = _cekeys + _klen - 1; - const char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _cpc < (int)(*( _mid)) ) - _upper = _mid - 1; - else if ( _cpc > (int)(*( _mid)) ) - _lower = _mid + 1; - else { - goto _ok; - } - } - cs = -1; - goto _out; - } - _ok: {} - } - if ( _indic_syllable_machine_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_indic_syllable_machine_eof_trans[cs] - 1; - goto _match_cond; - } - } - - } - _out: { {} - } - } + int _slen; + int _trans; + const unsigned char *_keys; + const short *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _indic_syllable_machine_from_state_actions[cs] ) { + case 10: +#line 1 "NONE" + {ts = p;} + break; +#line 1044 "hb-ot-shape-complex-indic-machine.hh" } - + + _keys = _indic_syllable_machine_trans_keys + (cs<<1); + _inds = _indic_syllable_machine_indicies + _indic_syllable_machine_index_offsets[cs]; + + _slen = _indic_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].indic_category()) && + ( info[p].indic_category()) <= _keys[1] ? + ( info[p].indic_category()) - _keys[0] : _slen ]; + +_eof_trans: + cs = _indic_syllable_machine_trans_targs[_trans]; + + if ( _indic_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _indic_syllable_machine_trans_actions[_trans] ) { + case 2: +#line 1 "NONE" + {te = p+1;} + break; + case 14: +#line 84 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (consonant_syllable); }} + break; + case 16: +#line 85 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (vowel_syllable); }} + break; + case 21: +#line 86 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (standalone_cluster); }} + break; + case 24: +#line 87 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (symbol_cluster); }} + break; + case 18: +#line 88 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (broken_cluster); }} + break; + case 11: +#line 89 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (non_indic_cluster); }} + break; + case 13: +#line 84 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (consonant_syllable); }} + break; + case 15: +#line 85 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (vowel_syllable); }} + break; + case 20: +#line 86 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (standalone_cluster); }} + break; + case 23: +#line 87 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (symbol_cluster); }} + break; + case 17: +#line 88 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 19: +#line 89 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (non_indic_cluster); }} + break; + case 1: +#line 84 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} + break; + case 3: +#line 85 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} + break; + case 7: +#line 86 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} + break; + case 8: +#line 87 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} + break; + case 4: +#line 88 "hb-ot-shape-complex-indic-machine.rl" + {{p = ((te))-1;}{ found_syllable (broken_cluster); }} + break; + case 5: +#line 1 "NONE" + { switch( act ) { + case 1: + {{p = ((te))-1;} found_syllable (consonant_syllable); } + break; + case 5: + {{p = ((te))-1;} found_syllable (broken_cluster); } + break; + case 6: + {{p = ((te))-1;} found_syllable (non_indic_cluster); } + break; + } + } + break; + case 22: +#line 1 "NONE" + {te = p+1;} +#line 84 "hb-ot-shape-complex-indic-machine.rl" + {act = 1;} + break; + case 6: +#line 1 "NONE" + {te = p+1;} +#line 88 "hb-ot-shape-complex-indic-machine.rl" + {act = 5;} + break; + case 12: +#line 1 "NONE" + {te = p+1;} +#line 89 "hb-ot-shape-complex-indic-machine.rl" + {act = 6;} + break; +#line 1167 "hb-ot-shape-complex-indic-machine.hh" + } + +_again: + switch ( _indic_syllable_machine_to_state_actions[cs] ) { + case 9: +#line 1 "NONE" + {ts = 0;} + break; +#line 1176 "hb-ot-shape-complex-indic-machine.hh" + } + + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _indic_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _indic_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + } + +#line 121 "hb-ot-shape-complex-indic-machine.rl" + } #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 034b65750..65e0ffc85 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -1,28 +1,30 @@ + +#line 1 "hb-ot-shape-complex-khmer-machine.rl" /* -* Copyright © 2011,2012 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH @@ -30,185 +32,180 @@ #include "hb.hh" +#line 36 "hb-ot-shape-complex-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { - 2u, 8u, 2u, 6u, 2u, 8u, 2u, 6u, - 0u, 0u, 2u, 6u, 2u, 8u, 2u, 6u, - 2u, 8u, 2u, 6u, 2u, 6u, 2u, 8u, - 2u, 6u, 0u, 0u, 2u, 6u, 2u, 8u, - 2u, 6u, 2u, 8u, 2u, 6u, 2u, 8u, - 0u, 11u, 2u, 11u, 2u, 11u, 2u, 11u, - 7u, 7u, 2u, 7u, 2u, 11u, 2u, 11u, - 2u, 11u, 0u, 0u, 2u, 8u, 2u, 11u, - 2u, 11u, 7u, 7u, 2u, 7u, 2u, 11u, - 2u, 11u, 0u, 0u, 2u, 11u, 2u, 11u, - 0u + 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, + 5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, + 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u, + 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u, + 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u, + 0 }; -static const char _khmer_syllable_machine_char_class[] = { - 0, 0, 1, 1, 2, 2, 1, 1, - 1, 1, 3, 3, 1, 4, 1, 0, - 1, 1, 1, 5, 6, 7, 1, 1, - 1, 8, 9, 10, 11, 0 +static const char _khmer_syllable_machine_key_spans[] = { + 22, 17, 22, 17, 16, 17, 22, 17, + 22, 17, 17, 22, 17, 16, 17, 22, + 17, 22, 17, 22, 29, 25, 25, 25, + 1, 18, 25, 25, 25, 16, 22, 25, + 25, 1, 18, 25, 25, 16, 25, 25 }; static const short _khmer_syllable_machine_index_offsets[] = { - 0, 7, 12, 19, 24, 25, 30, 37, - 42, 49, 54, 59, 66, 71, 72, 77, - 84, 89, 96, 101, 108, 120, 130, 140, - 150, 151, 157, 167, 177, 187, 188, 195, - 205, 215, 216, 222, 232, 242, 243, 253, - 0 + 0, 23, 41, 64, 82, 99, 117, 140, + 158, 181, 199, 217, 240, 258, 275, 293, + 316, 334, 357, 375, 398, 428, 454, 480, + 506, 508, 527, 553, 579, 605, 622, 645, + 671, 697, 699, 718, 744, 770, 787, 813 }; static const char _khmer_syllable_machine_indicies[] = { - 1, 0, 0, 2, 3, 0, 4, 1, - 0, 0, 0, 3, 1, 0, 0, 0, - 3, 0, 4, 5, 0, 0, 0, 4, - 6, 7, 0, 0, 0, 8, 9, 0, - 0, 0, 10, 0, 4, 9, 0, 0, - 0, 10, 11, 0, 0, 0, 12, 0, - 4, 11, 0, 0, 0, 12, 14, 13, - 13, 13, 15, 14, 16, 16, 16, 15, - 16, 17, 18, 16, 16, 16, 17, 19, - 20, 16, 16, 16, 21, 22, 16, 16, - 16, 23, 16, 17, 22, 16, 16, 16, - 23, 24, 16, 16, 16, 25, 16, 17, - 24, 16, 16, 16, 25, 14, 16, 16, - 26, 15, 16, 17, 28, 27, 29, 2, - 30, 27, 15, 19, 17, 23, 25, 21, - 32, 31, 33, 2, 3, 6, 4, 10, - 12, 8, 34, 31, 35, 31, 3, 6, - 4, 10, 12, 8, 5, 31, 35, 31, - 4, 6, 31, 31, 31, 8, 6, 7, - 31, 35, 31, 8, 6, 36, 31, 35, - 31, 10, 6, 4, 31, 31, 8, 37, - 31, 35, 31, 12, 6, 4, 10, 31, - 8, 34, 31, 33, 31, 3, 6, 4, - 10, 12, 8, 28, 14, 38, 38, 38, - 15, 38, 17, 40, 39, 41, 39, 15, - 19, 17, 23, 25, 21, 18, 39, 41, - 39, 17, 19, 39, 39, 39, 21, 19, - 20, 39, 41, 39, 21, 19, 42, 39, - 41, 39, 23, 19, 17, 39, 39, 21, - 43, 39, 41, 39, 25, 19, 17, 23, - 39, 21, 44, 45, 39, 30, 26, 15, - 19, 17, 23, 25, 21, 40, 39, 30, - 39, 15, 19, 17, 23, 25, 21, 0 + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 3, 0, 0, 0, 0, 4, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 4, 0, + 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 6, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 7, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 4, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 4, 0, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 14, + 14, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, + 13, 14, 14, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 15, 16, 16, 16, 16, 17, 16, + 18, 18, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 17, 16, 19, 19, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 19, 16, 20, 20, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 21, 16, 22, 22, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 23, 16, 16, + 16, 16, 17, 16, 22, 22, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 23, 16, 24, 24, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 25, 16, + 16, 16, 16, 17, 16, 24, 24, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 25, 16, 14, + 14, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 26, 15, + 16, 16, 16, 16, 17, 16, 28, 28, + 27, 27, 29, 29, 27, 27, 27, 27, + 2, 2, 27, 30, 27, 28, 27, 27, + 27, 27, 15, 19, 27, 27, 27, 17, + 23, 25, 21, 27, 32, 32, 31, 31, + 31, 31, 31, 31, 31, 33, 31, 31, + 31, 31, 31, 2, 3, 6, 31, 31, + 31, 4, 10, 12, 8, 31, 34, 34, + 31, 31, 31, 31, 31, 31, 31, 35, + 31, 31, 31, 31, 31, 31, 3, 6, + 31, 31, 31, 4, 10, 12, 8, 31, + 5, 5, 31, 31, 31, 31, 31, 31, + 31, 35, 31, 31, 31, 31, 31, 31, + 4, 6, 31, 31, 31, 31, 31, 31, + 8, 31, 6, 31, 7, 7, 31, 31, + 31, 31, 31, 31, 31, 35, 31, 31, + 31, 31, 31, 31, 8, 6, 31, 36, + 36, 31, 31, 31, 31, 31, 31, 31, + 35, 31, 31, 31, 31, 31, 31, 10, + 6, 31, 31, 31, 4, 31, 31, 8, + 31, 37, 37, 31, 31, 31, 31, 31, + 31, 31, 35, 31, 31, 31, 31, 31, + 31, 12, 6, 31, 31, 31, 4, 10, + 31, 8, 31, 34, 34, 31, 31, 31, + 31, 31, 31, 31, 33, 31, 31, 31, + 31, 31, 31, 3, 6, 31, 31, 31, + 4, 10, 12, 8, 31, 28, 28, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 28, 31, 14, 14, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 15, 38, + 38, 38, 38, 17, 38, 40, 40, 39, + 39, 39, 39, 39, 39, 39, 41, 39, + 39, 39, 39, 39, 39, 15, 19, 39, + 39, 39, 17, 23, 25, 21, 39, 18, + 18, 39, 39, 39, 39, 39, 39, 39, + 41, 39, 39, 39, 39, 39, 39, 17, + 19, 39, 39, 39, 39, 39, 39, 21, + 39, 19, 39, 20, 20, 39, 39, 39, + 39, 39, 39, 39, 41, 39, 39, 39, + 39, 39, 39, 21, 19, 39, 42, 42, + 39, 39, 39, 39, 39, 39, 39, 41, + 39, 39, 39, 39, 39, 39, 23, 19, + 39, 39, 39, 17, 39, 39, 21, 39, + 43, 43, 39, 39, 39, 39, 39, 39, + 39, 41, 39, 39, 39, 39, 39, 39, + 25, 19, 39, 39, 39, 17, 23, 39, + 21, 39, 44, 44, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, + 39, 44, 39, 45, 45, 39, 39, 39, + 39, 39, 39, 39, 30, 39, 39, 39, + 39, 39, 26, 15, 19, 39, 39, 39, + 17, 23, 25, 21, 39, 40, 40, 39, + 39, 39, 39, 39, 39, 39, 30, 39, + 39, 39, 39, 39, 39, 15, 19, 39, + 39, 39, 17, 23, 25, 21, 39, 0 }; -static const char _khmer_syllable_machine_index_defaults[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 27, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 38, 39, - 39, 39, 39, 39, 39, 39, 39, 39, - 0 +static const char _khmer_syllable_machine_trans_targs[] = { + 20, 1, 28, 22, 23, 3, 24, 5, + 25, 7, 26, 9, 27, 20, 10, 31, + 20, 32, 12, 33, 14, 34, 16, 35, + 18, 36, 39, 20, 21, 30, 37, 20, + 0, 29, 2, 4, 6, 8, 20, 20, + 11, 13, 15, 17, 38, 19 }; -static const char _khmer_syllable_machine_trans_cond_spaces[] = { - -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, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0 -}; - -static const char _khmer_syllable_machine_cond_targs[] = { - 20, 1, 28, 22, 23, 3, 24, 5, - 25, 7, 26, 9, 27, 20, 10, 31, - 20, 32, 12, 33, 14, 34, 16, 35, - 18, 36, 39, 20, 21, 30, 37, 20, - 0, 29, 2, 4, 6, 8, 20, 20, - 11, 13, 15, 17, 38, 19, 0 -}; - -static const char _khmer_syllable_machine_cond_actions[] = { - 1, 0, 2, 2, 2, 0, 0, 0, - 2, 0, 2, 0, 2, 3, 0, 4, - 5, 2, 0, 0, 0, 2, 0, 2, - 0, 2, 4, 8, 2, 9, 0, 10, - 0, 0, 0, 0, 0, 0, 11, 12, - 0, 0, 0, 0, 4, 0, 0 +static const char _khmer_syllable_machine_trans_actions[] = { + 1, 0, 2, 2, 2, 0, 0, 0, + 2, 0, 2, 0, 2, 3, 0, 4, + 5, 2, 0, 0, 0, 2, 0, 2, + 0, 2, 4, 8, 2, 9, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, + 0, 0, 0, 0, 4, 0 }; static const char _khmer_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, 6, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; static const char _khmer_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, 7, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; -static const char _khmer_syllable_machine_eof_cond_spaces[] = { - -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, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0 -}; - -static const char _khmer_syllable_machine_eof_cond_key_offs[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0 -}; - -static const char _khmer_syllable_machine_eof_cond_key_lens[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0 -}; - -static const char _khmer_syllable_machine_eof_cond_keys[] = { - 0 -}; - -static const char _khmer_syllable_machine_eof_trans[] = { - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 14, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 39, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 0 -}; - -static const char _khmer_syllable_machine_nfa_targs[] = { - 0, 0 -}; - -static const char _khmer_syllable_machine_nfa_offsets[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0 -}; - -static const char _khmer_syllable_machine_nfa_push_actions[] = { - 0, 0 -}; - -static const char _khmer_syllable_machine_nfa_pop_trans[] = { - 0, 0 +static const unsigned char _khmer_syllable_machine_eof_trans[] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 14, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 39, 40, + 40, 40, 40, 40, 40, 40, 40, 40 }; static const int khmer_syllable_machine_start = 20; @@ -218,228 +215,156 @@ static const int khmer_syllable_machine_error = -1; static const int khmer_syllable_machine_en_main = 20; +#line 36 "hb-ot-shape-complex-khmer-machine.rl" +#line 80 "hb-ot-shape-complex-khmer-machine.rl" + + #define found_syllable(syllable_type) \ -HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial=1; \ -} HB_STMT_END + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act HB_UNUSED; - int cs; - hb_glyph_info_t *info = buffer->info; - + unsigned int p, pe, eof, ts, te, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + +#line 242 "hb-ot-shape-complex-khmer-machine.hh" { - cs = (int)khmer_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = khmer_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - - - p=0; - pe = eof = buffer->len; - - unsigned int syllable_serial=1; - + +#line 100 "hb-ot-shape-complex-khmer-machine.rl" + + + p = 0; + pe = eof = buffer->len; + + unsigned int syllable_serial = 1; + +#line 258 "hb-ot-shape-complex-khmer-machine.hh" { - int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { - if ( p == pe ) - goto _test_eof; - _resume: { - switch ( _khmer_syllable_machine_from_state_actions[cs] ) { - case 7: { - { - #line 1 "NONE" - {ts = p;}} - - break; } - } - - _keys = ( _khmer_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _khmer_syllable_machine_indicies + (_khmer_syllable_machine_index_offsets[cs])); - - if ( (info[p].khmer_category()) <= 29 && (info[p].khmer_category()) >= 1 ) - { - int _ic = (int)_khmer_syllable_machine_char_class[(int)(info[p].khmer_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_khmer_syllable_machine_cond_targs[_trans]; - - if ( _khmer_syllable_machine_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _khmer_syllable_machine_cond_actions[_trans] ) { - case 2: { - { - #line 1 "NONE" - {te = p+1;}} - - break; } - case 8: { - { - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - {te = p+1;{ - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (non_khmer_cluster); }}} - - break; } - case 10: { - { - #line 74 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p = p - 1;{ - #line 74 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 12: { - { - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p = p - 1;{ - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 11: { - { - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - {te = p;p = p - 1;{ - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (non_khmer_cluster); }}} - - break; } - case 1: { - { - #line 74 "hb-ot-shape-complex-khmer-machine.rl" - {p = ((te))-1; - { - #line 74 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 5: { - { - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - {p = ((te))-1; - { - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 3: { - { - #line 1 "NONE" - {switch( act ) { - case 2: { - p = ((te))-1; - { - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (broken_cluster); } break; } - case 3: { - p = ((te))-1; - { - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - found_syllable (non_khmer_cluster); } break; } - }} - } - - break; } - case 4: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 75 "hb-ot-shape-complex-khmer-machine.rl" - {act = 2;}} - - break; } - case 9: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 76 "hb-ot-shape-complex-khmer-machine.rl" - {act = 3;}} - - break; } - } - - - } - _again: { - switch ( _khmer_syllable_machine_to_state_actions[cs] ) { - case 6: { - { - #line 1 "NONE" - {ts = 0;}} - - break; } - } - - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - if ( p == eof ) - { - if ( _khmer_syllable_machine_eof_cond_spaces[cs] != -1 ) { - _cekeys = ( _khmer_syllable_machine_eof_cond_keys + (_khmer_syllable_machine_eof_cond_key_offs[cs])); - _klen = (int)_khmer_syllable_machine_eof_cond_key_lens[cs]; - _cpc = 0; - { - const char *_lower = _cekeys; - const char *_upper = _cekeys + _klen - 1; - const char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _cpc < (int)(*( _mid)) ) - _upper = _mid - 1; - else if ( _cpc > (int)(*( _mid)) ) - _lower = _mid + 1; - else { - goto _ok; - } - } - cs = -1; - goto _out; - } - _ok: {} - } - if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_khmer_syllable_machine_eof_trans[cs] - 1; - goto _match_cond; - } - } - - } - _out: { {} - } - } + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _khmer_syllable_machine_from_state_actions[cs] ) { + case 7: +#line 1 "NONE" + {ts = p;} + break; +#line 272 "hb-ot-shape-complex-khmer-machine.hh" } - + + _keys = _khmer_syllable_machine_trans_keys + (cs<<1); + _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs]; + + _slen = _khmer_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) && + ( info[p].khmer_category()) <= _keys[1] ? + ( info[p].khmer_category()) - _keys[0] : _slen ]; + +_eof_trans: + cs = _khmer_syllable_machine_trans_targs[_trans]; + + if ( _khmer_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _khmer_syllable_machine_trans_actions[_trans] ) { + case 2: +#line 1 "NONE" + {te = p+1;} + break; + case 8: +#line 76 "hb-ot-shape-complex-khmer-machine.rl" + {te = p+1;{ found_syllable (non_khmer_cluster); }} + break; + case 10: +#line 74 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (consonant_syllable); }} + break; + case 12: +#line 75 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 11: +#line 76 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (non_khmer_cluster); }} + break; + case 1: +#line 74 "hb-ot-shape-complex-khmer-machine.rl" + {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} + break; + case 5: +#line 75 "hb-ot-shape-complex-khmer-machine.rl" + {{p = ((te))-1;}{ found_syllable (broken_cluster); }} + break; + case 3: +#line 1 "NONE" + { switch( act ) { + case 2: + {{p = ((te))-1;} found_syllable (broken_cluster); } + break; + case 3: + {{p = ((te))-1;} found_syllable (non_khmer_cluster); } + break; + } + } + break; + case 4: +#line 1 "NONE" + {te = p+1;} +#line 75 "hb-ot-shape-complex-khmer-machine.rl" + {act = 2;} + break; + case 9: +#line 1 "NONE" + {te = p+1;} +#line 76 "hb-ot-shape-complex-khmer-machine.rl" + {act = 3;} + break; +#line 342 "hb-ot-shape-complex-khmer-machine.hh" + } + +_again: + switch ( _khmer_syllable_machine_to_state_actions[cs] ) { + case 6: +#line 1 "NONE" + {ts = 0;} + break; +#line 351 "hb-ot-shape-complex-khmer-machine.hh" + } + + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _khmer_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + } + +#line 108 "hb-ot-shape-complex-khmer-machine.rl" + } #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index f40a47999..d03832fa7 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -1,28 +1,30 @@ + +#line 1 "hb-ot-shape-complex-myanmar-machine.rl" /* -* Copyright © 2011,2012 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH @@ -30,276 +32,251 @@ #include "hb.hh" +#line 36 "hb-ot-shape-complex-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 0u, 21u, 1u, 20u, 3u, 19u, 3u, 5u, - 3u, 19u, 1u, 15u, 3u, 15u, 3u, 15u, - 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, - 0u, 8u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 20u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 19u, 3u, 19u, - 3u, 5u, 3u, 19u, 1u, 15u, 3u, 15u, - 3u, 15u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 0u, 8u, 1u, 20u, 1u, 19u, - 1u, 19u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 20u, 1u, 19u, 1u, 19u, 1u, 19u, - 1u, 19u, 1u, 20u, 1u, 19u, 0u, 20u, - 0u, 8u, 5u, 5u, 0u + 1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, + 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, + 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, + 1u, 32u, 8u, 8u, 0 }; -static const char _myanmar_syllable_machine_char_class[] = { - 0, 0, 1, 2, 3, 3, 4, 5, - 4, 6, 7, 4, 4, 4, 4, 8, - 4, 9, 10, 4, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 7, - 0 +static const char _myanmar_syllable_machine_key_spans[] = { + 32, 28, 25, 4, 25, 23, 21, 21, + 27, 27, 27, 27, 16, 27, 27, 27, + 27, 27, 28, 27, 27, 27, 27, 25, + 4, 25, 23, 21, 21, 27, 27, 27, + 27, 16, 28, 27, 27, 27, 27, 27, + 28, 27, 27, 27, 27, 28, 27, 32, + 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 22, 42, 59, 62, 79, 94, 107, - 120, 139, 158, 177, 196, 205, 224, 243, - 262, 281, 300, 320, 339, 358, 377, 396, - 413, 416, 433, 448, 461, 474, 493, 512, - 531, 550, 559, 579, 598, 617, 636, 655, - 674, 694, 713, 732, 751, 770, 790, 809, - 830, 839, 0 + 0, 33, 62, 88, 93, 119, 143, 165, + 187, 215, 243, 271, 299, 316, 344, 372, + 400, 428, 456, 485, 513, 541, 569, 597, + 623, 628, 654, 678, 700, 722, 750, 778, + 806, 834, 851, 880, 908, 936, 964, 992, + 1020, 1049, 1077, 1105, 1133, 1161, 1190, 1218, + 1251, 1284 }; static const char _myanmar_syllable_machine_indicies[] = { - 1, 2, 3, 4, 0, 5, 6, 1, - 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 22, 23, - 24, 21, 25, 26, 21, 21, 27, 21, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 24, 21, 25, 21, 21, 21, - 38, 21, 21, 21, 21, 21, 32, 21, - 21, 21, 36, 24, 21, 25, 24, 21, - 25, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 21, 21, 21, 36, 39, - 21, 24, 21, 25, 32, 21, 21, 40, - 21, 21, 21, 21, 21, 32, 24, 21, - 25, 21, 21, 21, 40, 21, 21, 21, - 21, 21, 32, 24, 21, 25, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 22, 21, 24, 21, 25, 26, 21, 21, - 41, 21, 41, 21, 21, 21, 32, 42, - 21, 21, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 21, 21, 21, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 41, 21, - 21, 21, 21, 21, 32, 42, 21, 21, - 36, 22, 21, 24, 21, 25, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 42, 21, 21, 36, 1, 21, 21, 21, - 21, 21, 21, 21, 1, 22, 21, 24, - 21, 25, 26, 21, 21, 27, 21, 28, - 29, 30, 31, 32, 33, 34, 35, 36, - 22, 21, 24, 21, 25, 26, 21, 21, - 43, 21, 21, 21, 21, 21, 32, 33, - 34, 35, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 21, 21, 21, 21, 21, - 21, 32, 33, 34, 35, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 21, 21, - 21, 21, 21, 21, 32, 33, 34, 21, - 36, 22, 21, 24, 21, 25, 26, 21, - 21, 21, 21, 21, 21, 21, 21, 32, - 21, 34, 21, 36, 22, 21, 24, 21, - 25, 26, 21, 21, 21, 21, 21, 21, - 21, 21, 32, 33, 34, 35, 36, 43, - 22, 21, 24, 21, 25, 26, 21, 21, - 43, 21, 28, 21, 30, 21, 32, 33, - 34, 35, 36, 22, 21, 24, 21, 25, - 26, 21, 21, 43, 21, 28, 21, 21, - 21, 32, 33, 34, 35, 36, 22, 21, - 24, 21, 25, 26, 21, 21, 43, 21, - 28, 29, 30, 21, 32, 33, 34, 35, - 36, 22, 23, 24, 21, 25, 26, 21, - 21, 27, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 45, 44, 5, 44, - 44, 44, 46, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 45, 44, 5, - 45, 44, 5, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 44, 44, 44, - 18, 47, 44, 45, 44, 5, 14, 44, - 44, 48, 44, 44, 44, 44, 44, 14, - 45, 44, 5, 44, 44, 44, 48, 44, - 44, 44, 44, 44, 14, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 14, 2, 44, 45, 44, 5, 6, - 44, 44, 49, 44, 49, 44, 44, 44, - 14, 50, 44, 44, 18, 2, 44, 45, - 44, 5, 6, 44, 44, 44, 44, 44, - 44, 44, 44, 14, 44, 44, 44, 18, - 2, 44, 45, 44, 5, 6, 44, 44, - 49, 44, 44, 44, 44, 44, 14, 50, - 44, 44, 18, 2, 44, 45, 44, 5, - 6, 44, 44, 44, 44, 44, 44, 44, - 44, 14, 50, 44, 44, 18, 51, 44, - 44, 44, 44, 44, 44, 44, 51, 2, - 3, 45, 44, 5, 6, 44, 44, 8, - 44, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 2, 44, 45, 44, 5, - 6, 44, 44, 8, 44, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 2, 44, - 45, 44, 5, 6, 44, 44, 52, 44, - 44, 44, 44, 44, 14, 15, 16, 17, - 18, 2, 44, 45, 44, 5, 6, 44, - 44, 44, 44, 44, 44, 44, 44, 14, - 15, 16, 17, 18, 2, 44, 45, 44, - 5, 6, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 44, 18, 2, - 44, 45, 44, 5, 6, 44, 44, 44, - 44, 44, 44, 44, 44, 14, 44, 16, - 44, 18, 2, 44, 45, 44, 5, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 15, 16, 17, 18, 52, 2, 44, - 45, 44, 5, 6, 44, 44, 52, 44, - 10, 44, 12, 44, 14, 15, 16, 17, - 18, 2, 44, 45, 44, 5, 6, 44, - 44, 52, 44, 10, 44, 44, 44, 14, - 15, 16, 17, 18, 2, 44, 45, 44, - 5, 6, 44, 44, 52, 44, 10, 11, - 12, 44, 14, 15, 16, 17, 18, 2, - 3, 45, 44, 5, 6, 44, 44, 8, - 44, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 22, 23, 24, 21, 25, 26, - 21, 21, 53, 21, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 22, 54, - 24, 21, 25, 26, 21, 21, 27, 21, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 1, 2, 3, 45, 44, 5, 6, - 1, 1, 8, 44, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 1, 55, - 55, 55, 55, 55, 55, 1, 1, 56, + 1, 1, 2, 3, 4, 4, 0, 5, + 0, 6, 1, 0, 0, 0, 0, 7, + 0, 8, 9, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 1, + 0, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 27, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 24, 24, + 21, 25, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 38, 21, 21, 21, 21, + 21, 21, 32, 21, 21, 21, 36, 21, + 24, 24, 21, 25, 21, 24, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 21, 21, 36, 21, 39, + 21, 24, 24, 21, 25, 21, 32, 21, + 21, 21, 21, 21, 21, 21, 40, 21, + 21, 21, 21, 21, 21, 32, 21, 24, + 24, 21, 25, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 40, 21, 21, 21, + 21, 21, 21, 32, 21, 24, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 22, 21, 24, 24, 21, + 25, 21, 26, 21, 21, 21, 21, 21, + 21, 21, 41, 21, 21, 41, 21, 21, + 21, 32, 42, 21, 21, 36, 21, 22, + 21, 24, 24, 21, 25, 21, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 32, 21, 21, + 21, 36, 21, 22, 21, 24, 24, 21, + 25, 21, 26, 21, 21, 21, 21, 21, + 21, 21, 41, 21, 21, 21, 21, 21, + 21, 32, 42, 21, 21, 36, 21, 22, + 21, 24, 24, 21, 25, 21, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 32, 42, 21, + 21, 36, 21, 1, 1, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 1, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 27, 21, 21, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 43, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 33, 34, 35, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 21, 36, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 21, 34, 21, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 43, 21, 22, 21, 24, + 24, 21, 25, 21, 26, 21, 21, 21, + 21, 21, 21, 21, 43, 21, 21, 28, + 21, 30, 21, 32, 33, 34, 35, 36, + 21, 22, 21, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 43, 21, 21, 28, 21, 21, 21, 32, + 33, 34, 35, 36, 21, 22, 21, 24, + 24, 21, 25, 21, 26, 21, 21, 21, + 21, 21, 21, 21, 43, 21, 21, 28, + 29, 30, 21, 32, 33, 34, 35, 36, + 21, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 27, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 21, 45, 45, 44, + 5, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 46, 44, 44, 44, 44, 44, + 44, 14, 44, 44, 44, 18, 44, 45, + 45, 44, 5, 44, 45, 45, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 44, 44, 44, 18, 44, 47, 44, + 45, 45, 44, 5, 44, 14, 44, 44, + 44, 44, 44, 44, 44, 48, 44, 44, + 44, 44, 44, 44, 14, 44, 45, 45, + 44, 5, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 48, 44, 44, 44, 44, + 44, 44, 14, 44, 45, 45, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 44, 2, 44, 45, 45, 44, 5, + 44, 6, 44, 44, 44, 44, 44, 44, + 44, 49, 44, 44, 49, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 44, 44, 44, + 18, 44, 2, 44, 45, 45, 44, 5, + 44, 6, 44, 44, 44, 44, 44, 44, + 44, 49, 44, 44, 44, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 50, 44, 44, + 18, 44, 51, 51, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 51, 44, 2, 3, 45, 45, 44, + 5, 44, 6, 44, 44, 44, 44, 44, + 44, 44, 8, 44, 44, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 44, + 2, 44, 45, 45, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 8, + 44, 44, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 52, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 17, 18, 44, + 2, 44, 45, 45, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 14, 15, + 16, 17, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 44, 18, 44, + 2, 44, 45, 45, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 14, 44, + 16, 44, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 17, 18, 52, + 44, 2, 44, 45, 45, 44, 5, 44, + 6, 44, 44, 44, 44, 44, 44, 44, + 52, 44, 44, 10, 44, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 44, 45, + 45, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 52, 44, 44, 10, + 44, 44, 44, 14, 15, 16, 17, 18, + 44, 2, 44, 45, 45, 44, 5, 44, + 6, 44, 44, 44, 44, 44, 44, 44, + 52, 44, 44, 10, 11, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 3, 45, + 45, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 8, 44, 44, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 44, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 53, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 22, 54, + 24, 24, 21, 25, 21, 26, 21, 21, + 21, 21, 21, 21, 21, 27, 21, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 21, 1, 1, 2, 3, 45, 45, + 44, 5, 44, 6, 1, 44, 44, 44, + 44, 1, 44, 8, 44, 44, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 44, 1, 44, 1, 1, 55, 55, 55, + 55, 55, 55, 55, 55, 1, 55, 55, + 55, 55, 1, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 1, 55, 56, 55, 0 +}; + +static const char _myanmar_syllable_machine_trans_targs[] = { + 0, 1, 23, 33, 0, 24, 30, 45, + 35, 48, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 49, 0, 2, 12, + 0, 3, 9, 13, 14, 19, 20, 21, + 5, 16, 17, 18, 8, 22, 4, 6, + 7, 10, 11, 15, 0, 0, 25, 27, + 28, 31, 32, 34, 37, 46, 47, 0, 0 }; -static const char _myanmar_syllable_machine_index_defaults[] = { - 0, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 21, 21, 44, - 55, 55, 0 -}; - -static const char _myanmar_syllable_machine_trans_cond_spaces[] = { - -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, -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 -}; - -static const char _myanmar_syllable_machine_cond_targs[] = { - 0, 1, 23, 33, 0, 24, 30, 45, - 35, 48, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 44, 49, 0, 2, 12, - 0, 3, 9, 13, 14, 19, 20, 21, - 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 0, 25, 27, - 28, 31, 32, 34, 37, 46, 47, 0, - 0, 0 -}; - -static const char _myanmar_syllable_machine_cond_actions[] = { - 3, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 10, 0 +static const char _myanmar_syllable_machine_trans_actions[] = { + 3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { - 1, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 1, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { - 2, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _myanmar_syllable_machine_eof_cond_spaces[] = { - -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, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0 -}; - -static const char _myanmar_syllable_machine_eof_cond_key_offs[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _myanmar_syllable_machine_eof_cond_key_lens[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _myanmar_syllable_machine_eof_cond_keys[] = { - 0 -}; - -static const char _myanmar_syllable_machine_eof_trans[] = { - 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 22, 22, 45, - 56, 56, 0 -}; - -static const char _myanmar_syllable_machine_nfa_targs[] = { + 2, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const char _myanmar_syllable_machine_nfa_offsets[] = { - 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _myanmar_syllable_machine_nfa_push_actions[] = { - 0, 0 -}; - -static const char _myanmar_syllable_machine_nfa_pop_trans[] = { - 0, 0 +static const short _myanmar_syllable_machine_eof_trans[] = { + 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 22, 22, 45, + 56, 56 }; static const int myanmar_syllable_machine_start = 0; @@ -309,199 +286,136 @@ static const int myanmar_syllable_machine_error = -1; static const int myanmar_syllable_machine_en_main = 0; +#line 36 "hb-ot-shape-complex-myanmar-machine.rl" +#line 94 "hb-ot-shape-complex-myanmar-machine.rl" + + #define found_syllable(syllable_type) \ -HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial=1; \ -} HB_STMT_END + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act HB_UNUSED; - int cs; - hb_glyph_info_t *info = buffer->info; - + unsigned int p, pe, eof, ts, te, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + +#line 313 "hb-ot-shape-complex-myanmar-machine.hh" { - cs = (int)myanmar_syllable_machine_start; - ts = 0; - te = 0; + cs = myanmar_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - - - p=0; - pe = eof = buffer->len; - - unsigned int syllable_serial=1; - + +#line 114 "hb-ot-shape-complex-myanmar-machine.rl" + + + p = 0; + pe = eof = buffer->len; + + unsigned int syllable_serial = 1; + +#line 329 "hb-ot-shape-complex-myanmar-machine.hh" { - int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { - if ( p == pe ) - goto _test_eof; - _resume: { - switch ( _myanmar_syllable_machine_from_state_actions[cs] ) { - case 2: { - { - #line 1 "NONE" - {ts = p;}} - - break; } - } - - _keys = ( _myanmar_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _myanmar_syllable_machine_indicies + (_myanmar_syllable_machine_index_offsets[cs])); - - if ( (info[p].myanmar_category()) <= 32 && (info[p].myanmar_category()) >= 1 ) - { - int _ic = (int)_myanmar_syllable_machine_char_class[(int)(info[p].myanmar_category()) - 1]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_myanmar_syllable_machine_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_myanmar_syllable_machine_cond_targs[_trans]; - - if ( _myanmar_syllable_machine_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _myanmar_syllable_machine_cond_actions[_trans] ) { - case 6: { - { - #line 86 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ - #line 86 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 4: { - { - #line 87 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ - #line 87 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (non_myanmar_cluster); }}} - - break; } - case 10: { - { - #line 88 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ - #line 88 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (punctuation_cluster); }}} - - break; } - case 8: { - { - #line 89 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ - #line 89 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 3: { - { - #line 90 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p+1;{ - #line 90 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (non_myanmar_cluster); }}} - - break; } - case 5: { - { - #line 86 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p = p - 1;{ - #line 86 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (consonant_syllable); }}} - - break; } - case 7: { - { - #line 89 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p = p - 1;{ - #line 89 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 9: { - { - #line 90 "hb-ot-shape-complex-myanmar-machine.rl" - {te = p;p = p - 1;{ - #line 90 "hb-ot-shape-complex-myanmar-machine.rl" - found_syllable (non_myanmar_cluster); }}} - - break; } - } - - - } - _again: { - switch ( _myanmar_syllable_machine_to_state_actions[cs] ) { - case 1: { - { - #line 1 "NONE" - {ts = 0;}} - - break; } - } - - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - if ( p == eof ) - { - if ( _myanmar_syllable_machine_eof_cond_spaces[cs] != -1 ) { - _cekeys = ( _myanmar_syllable_machine_eof_cond_keys + (_myanmar_syllable_machine_eof_cond_key_offs[cs])); - _klen = (int)_myanmar_syllable_machine_eof_cond_key_lens[cs]; - _cpc = 0; - { - const char *_lower = _cekeys; - const char *_upper = _cekeys + _klen - 1; - const char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _cpc < (int)(*( _mid)) ) - _upper = _mid - 1; - else if ( _cpc > (int)(*( _mid)) ) - _lower = _mid + 1; - else { - goto _ok; - } - } - cs = -1; - goto _out; - } - _ok: {} - } - if ( _myanmar_syllable_machine_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_myanmar_syllable_machine_eof_trans[cs] - 1; - goto _match_cond; - } - } - - } - _out: { {} - } - } + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _myanmar_syllable_machine_from_state_actions[cs] ) { + case 2: +#line 1 "NONE" + {ts = p;} + break; +#line 343 "hb-ot-shape-complex-myanmar-machine.hh" } - + + _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); + _inds = _myanmar_syllable_machine_indicies + _myanmar_syllable_machine_index_offsets[cs]; + + _slen = _myanmar_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].myanmar_category()) && + ( info[p].myanmar_category()) <= _keys[1] ? + ( info[p].myanmar_category()) - _keys[0] : _slen ]; + +_eof_trans: + cs = _myanmar_syllable_machine_trans_targs[_trans]; + + if ( _myanmar_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { + case 6: +#line 86 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (consonant_syllable); }} + break; + case 4: +#line 87 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (non_myanmar_cluster); }} + break; + case 10: +#line 88 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (punctuation_cluster); }} + break; + case 8: +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (broken_cluster); }} + break; + case 3: +#line 90 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (non_myanmar_cluster); }} + break; + case 5: +#line 86 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p--;{ found_syllable (consonant_syllable); }} + break; + case 7: +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 9: +#line 90 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p--;{ found_syllable (non_myanmar_cluster); }} + break; +#line 393 "hb-ot-shape-complex-myanmar-machine.hh" + } + +_again: + switch ( _myanmar_syllable_machine_to_state_actions[cs] ) { + case 1: +#line 1 "NONE" + {ts = 0;} + break; +#line 402 "hb-ot-shape-complex-myanmar-machine.hh" + } + + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _myanmar_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _myanmar_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + } + +#line 122 "hb-ot-shape-complex-myanmar-machine.rl" + } #undef found_syllable diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index e4b1884cf..f83e09fbc 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -1,30 +1,32 @@ + +#line 1 "hb-ot-shape-complex-use-machine.rl" /* -* Copyright © 2015 Mozilla Foundation. -* Copyright © 2015 Google, Inc. -* -* This is part of HarfBuzz, a text shaping library. -* -* Permission is hereby granted, without written agreement and without -* license or royalty fees, to use, copy, modify, and distribute this -* software and its documentation for any purpose, provided that the -* above copyright notice and the following two paragraphs appear in -* all copies of this software. -* -* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -* -* Mozilla Author(s): Jonathan Kew -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2015 Mozilla Foundation. + * Copyright © 2015 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Mozilla Author(s): Jonathan Kew + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH @@ -32,370 +34,332 @@ #include "hb.hh" +#line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 7u, 33u, 1u, 9u, 1u, 1u, 7u, 33u, - 0u, 33u, 12u, 12u, 5u, 33u, 5u, 33u, - 1u, 9u, 1u, 1u, 5u, 33u, 5u, 33u, - 5u, 29u, 5u, 17u, 5u, 17u, 5u, 17u, - 5u, 29u, 5u, 29u, 5u, 29u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 1u, 29u, - 5u, 33u, 8u, 12u, 3u, 3u, 8u, 8u, - 5u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 29u, - 5u, 17u, 5u, 17u, 5u, 17u, 5u, 29u, - 5u, 29u, 5u, 29u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 5u, 33u, 5u, 33u, - 5u, 33u, 5u, 33u, 1u, 29u, 1u, 9u, - 3u, 3u, 8u, 12u, 8u, 8u, 7u, 33u, - 1u, 33u, 5u, 33u, 30u, 31u, 31u, 31u, - 12u, 31u, 1u, 4u, 0u + 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, + 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, + 8u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, + 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, + 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, + 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, 1u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, + 21u, 42u, 1u, 5u, 0 }; -static const char _use_syllable_machine_char_class[] = { - 0, 1, 2, 0, 3, 4, 2, 2, - 5, 2, 2, 6, 7, 8, 2, 9, - 0, 0, 10, 11, 2, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 2, 27, 28, 29, - 2, 30, 31, 32, 33, 0 +static const char _use_syllable_machine_key_spans[] = { + 33, 15, 1, 33, 45, 1, 37, 37, + 15, 1, 37, 37, 32, 19, 19, 19, + 32, 32, 32, 37, 37, 37, 37, 37, + 37, 37, 37, 39, 37, 9, 1, 1, + 37, 37, 2, 1, 37, 37, 37, 32, + 19, 19, 19, 32, 32, 32, 37, 37, + 37, 37, 37, 37, 37, 37, 39, 15, + 1, 9, 1, 33, 44, 37, 2, 1, + 22, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 27, 36, 37, 64, 98, 99, 128, - 157, 166, 167, 196, 225, 250, 263, 276, - 289, 314, 339, 364, 393, 422, 451, 480, - 509, 538, 567, 596, 625, 654, 659, 660, - 661, 690, 719, 721, 722, 751, 780, 809, - 834, 847, 860, 873, 898, 923, 948, 977, - 1006, 1035, 1064, 1093, 1122, 1151, 1180, 1209, - 1218, 1219, 1224, 1225, 1252, 1285, 1314, 1316, - 1317, 1337, 0 + 0, 34, 50, 52, 86, 132, 134, 172, + 210, 226, 228, 266, 304, 337, 357, 377, + 397, 430, 463, 496, 534, 572, 610, 648, + 686, 724, 762, 800, 840, 878, 888, 890, + 892, 930, 968, 971, 973, 1011, 1049, 1087, + 1120, 1140, 1160, 1180, 1213, 1246, 1279, 1317, + 1355, 1393, 1431, 1469, 1507, 1545, 1583, 1623, + 1639, 1641, 1651, 1653, 1687, 1732, 1770, 1773, + 1775, 1798 }; static const char _use_syllable_machine_indicies[] = { - 1, 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, 1, 3, 2, 2, 2, 2, - 2, 2, 2, 4, 3, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 6, - 7, 8, 9, 10, 11, 12, 3, 13, - 14, 15, 16, 17, 9, 18, 19, 20, - 21, 22, 23, 24, 18, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 39, 41, 42, 1, 40, 43, - 40, 40, 44, 45, 46, 47, 48, 49, - 50, 51, 45, 52, 44, 53, 54, 55, - 56, 57, 58, 59, 40, 40, 40, 60, - 41, 42, 1, 40, 43, 40, 40, 61, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 53, 53, 54, 55, 56, 57, 58, - 59, 40, 40, 40, 60, 42, 62, 62, - 62, 62, 62, 62, 62, 63, 42, 41, - 42, 1, 40, 43, 40, 40, 40, 45, - 46, 47, 48, 49, 50, 51, 45, 52, - 53, 53, 54, 55, 56, 57, 58, 59, - 40, 40, 40, 60, 41, 40, 40, 40, - 40, 40, 40, 40, 45, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 54, - 55, 56, 57, 58, 59, 40, 40, 40, - 46, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 46, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 57, - 58, 59, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 47, 48, 49, 41, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 48, 49, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 49, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 57, - 58, 59, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 47, 48, 49, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 58, 59, 41, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 47, 48, 49, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 59, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 54, - 55, 56, 57, 58, 59, 40, 40, 40, - 46, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 46, 47, 48, 49, 40, 40, - 40, 40, 40, 40, 40, 55, 56, 57, - 58, 59, 40, 40, 40, 46, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 40, 40, 56, 57, 58, 59, 40, - 40, 40, 46, 41, 40, 40, 40, 40, - 40, 40, 40, 45, 46, 47, 48, 49, - 40, 51, 45, 40, 40, 40, 54, 55, - 56, 57, 58, 59, 40, 40, 40, 46, - 41, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 64, 45, - 40, 40, 40, 54, 55, 56, 57, 58, - 59, 40, 40, 40, 46, 41, 40, 40, - 40, 40, 40, 40, 40, 45, 46, 47, - 48, 49, 40, 40, 45, 40, 40, 40, - 54, 55, 56, 57, 58, 59, 40, 40, - 40, 46, 41, 40, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 40, 40, 40, 54, 55, 56, - 57, 58, 59, 40, 40, 40, 46, 41, - 42, 1, 40, 43, 40, 40, 40, 45, - 46, 47, 48, 49, 50, 51, 45, 52, - 40, 53, 54, 55, 56, 57, 58, 59, - 40, 40, 40, 60, 42, 62, 62, 62, - 41, 62, 62, 62, 63, 62, 62, 62, - 62, 46, 47, 48, 49, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 57, 58, - 59, 41, 42, 1, 40, 43, 40, 40, - 40, 45, 46, 47, 48, 49, 50, 51, - 45, 52, 44, 53, 54, 55, 56, 57, - 58, 59, 40, 40, 40, 60, 66, 65, - 65, 65, 67, 10, 66, 41, 42, 1, - 40, 43, 40, 40, 69, 45, 46, 47, - 48, 49, 50, 51, 45, 52, 44, 53, - 54, 55, 56, 57, 58, 59, 70, 71, - 40, 60, 41, 42, 1, 40, 43, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 44, 53, 54, 55, 56, - 57, 58, 59, 70, 71, 40, 60, 70, - 71, 71, 12, 3, 6, 73, 74, 73, - 73, 75, 18, 19, 20, 21, 22, 23, - 24, 18, 25, 27, 27, 28, 29, 30, - 31, 32, 33, 73, 73, 73, 37, 12, - 3, 6, 73, 74, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 27, 27, 28, 29, 30, 31, 32, 33, - 73, 73, 73, 37, 12, 73, 73, 73, - 73, 73, 73, 73, 18, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 28, - 29, 30, 31, 32, 33, 73, 73, 73, - 19, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 31, - 32, 33, 12, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 21, 22, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 22, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 31, - 32, 33, 12, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 32, 33, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 33, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 28, - 29, 30, 31, 32, 33, 73, 73, 73, - 19, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 29, 30, 31, - 32, 33, 73, 73, 73, 19, 12, 73, - 73, 73, 73, 73, 73, 73, 73, 19, - 20, 21, 22, 73, 73, 73, 73, 73, - 73, 73, 73, 30, 31, 32, 33, 73, - 73, 73, 19, 12, 73, 73, 73, 73, - 73, 73, 73, 18, 19, 20, 21, 22, - 73, 24, 18, 73, 73, 73, 28, 29, - 30, 31, 32, 33, 73, 73, 73, 19, - 12, 73, 73, 73, 73, 73, 73, 73, - 18, 19, 20, 21, 22, 73, 76, 18, - 73, 73, 73, 28, 29, 30, 31, 32, - 33, 73, 73, 73, 19, 12, 73, 73, - 73, 73, 73, 73, 73, 18, 19, 20, - 21, 22, 73, 73, 18, 73, 73, 73, - 28, 29, 30, 31, 32, 33, 73, 73, - 73, 19, 12, 73, 73, 73, 73, 73, - 73, 73, 18, 19, 20, 21, 22, 23, - 24, 18, 73, 73, 73, 28, 29, 30, - 31, 32, 33, 73, 73, 73, 19, 12, - 3, 6, 73, 74, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 73, 27, 28, 29, 30, 31, 32, 33, - 73, 73, 73, 37, 3, 73, 73, 73, - 12, 73, 73, 73, 4, 73, 73, 73, - 73, 19, 20, 21, 22, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 31, 32, - 33, 3, 77, 77, 77, 77, 77, 77, - 77, 4, 78, 14, 73, 73, 73, 79, - 14, 6, 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, 6, 8, 73, 73, 8, - 12, 3, 6, 14, 74, 73, 73, 73, - 18, 19, 20, 21, 22, 23, 24, 18, - 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 73, 37, 12, 3, 6, - 73, 74, 73, 73, 73, 18, 19, 20, - 21, 22, 23, 24, 18, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 73, 73, - 73, 37, 34, 35, 35, 70, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 70, - 71, 8, 77, 77, 8, 0 + 1, 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, 0, 0, + 1, 0, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 4, 2, 3, 2, 6, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 5, 7, 8, + 9, 7, 10, 11, 9, 9, 12, 9, + 9, 3, 13, 14, 9, 15, 7, 7, + 16, 17, 9, 9, 18, 19, 20, 21, + 22, 23, 24, 18, 25, 26, 27, 28, + 29, 30, 9, 31, 32, 33, 9, 34, + 35, 36, 37, 9, 39, 38, 41, 40, + 40, 42, 1, 40, 40, 43, 40, 40, + 40, 40, 40, 44, 45, 46, 47, 48, + 49, 50, 51, 45, 52, 44, 53, 54, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 60, 40, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 61, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 53, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 60, 40, 42, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, + 63, 62, 42, 62, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 53, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 60, 40, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 40, 40, + 40, 40, 40, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 46, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 57, 58, 59, + 40, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 47, 48, 49, 40, 41, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 48, 49, + 40, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 49, 40, 41, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 47, 48, 49, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 57, 58, 59, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 58, 59, 40, 41, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 47, + 48, 49, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 59, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 46, + 47, 48, 49, 40, 40, 40, 40, 40, + 40, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 46, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 46, 47, 48, + 49, 40, 40, 40, 40, 40, 40, 40, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 46, 40, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 46, 47, 48, 49, 40, + 40, 40, 40, 40, 40, 40, 40, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 46, 40, 41, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 40, 51, 45, + 40, 40, 40, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 46, 40, + 41, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 45, 46, + 47, 48, 49, 40, 64, 45, 40, 40, + 40, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 46, 40, 41, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 45, 46, 47, 48, + 49, 40, 40, 45, 40, 40, 40, 54, + 55, 56, 40, 57, 58, 59, 40, 40, + 40, 40, 46, 40, 41, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 45, 46, 47, 48, 49, 50, + 51, 45, 40, 40, 40, 54, 55, 56, + 40, 57, 58, 59, 40, 40, 40, 40, + 46, 40, 41, 40, 40, 42, 1, 40, + 40, 43, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 40, 53, 54, 55, 56, 40, 57, + 58, 59, 40, 40, 40, 40, 60, 40, + 42, 62, 62, 62, 62, 62, 62, 41, + 62, 62, 62, 62, 62, 62, 63, 62, + 62, 62, 62, 62, 62, 62, 46, 47, + 48, 49, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 57, 58, 59, 62, + 41, 40, 40, 42, 1, 40, 40, 43, + 40, 40, 40, 40, 40, 40, 45, 46, + 47, 48, 49, 50, 51, 45, 52, 44, + 53, 54, 55, 56, 40, 57, 58, 59, + 40, 40, 40, 40, 60, 40, 66, 65, + 65, 65, 65, 65, 65, 65, 67, 65, + 10, 68, 66, 65, 41, 40, 40, 42, + 1, 40, 40, 43, 40, 40, 40, 40, + 40, 69, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 44, 53, 54, 55, 56, + 40, 57, 58, 59, 40, 70, 71, 40, + 60, 40, 41, 40, 40, 42, 1, 40, + 40, 43, 40, 40, 40, 40, 40, 40, + 45, 46, 47, 48, 49, 50, 51, 45, + 52, 44, 53, 54, 55, 56, 40, 57, + 58, 59, 40, 70, 71, 40, 60, 40, + 70, 71, 72, 71, 72, 12, 73, 73, + 3, 6, 73, 73, 74, 73, 73, 73, + 73, 73, 75, 18, 19, 20, 21, 22, + 23, 24, 18, 25, 27, 27, 28, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 37, 73, 12, 73, 73, 3, 6, + 73, 73, 74, 73, 73, 73, 73, 73, + 73, 18, 19, 20, 21, 22, 23, 24, + 18, 25, 27, 27, 28, 29, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 37, + 73, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 73, 73, 73, 73, + 73, 73, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 19, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 19, 20, + 21, 22, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 31, 32, 33, 73, + 12, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 20, 21, 22, 73, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 21, 22, 73, + 12, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 22, 73, 12, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 20, 21, 22, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 31, 32, 33, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 32, 33, 73, 12, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 33, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 19, 20, + 21, 22, 73, 73, 73, 73, 73, 73, + 28, 29, 30, 73, 31, 32, 33, 73, + 73, 73, 73, 19, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 19, 20, 21, 22, + 73, 73, 73, 73, 73, 73, 73, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 19, 73, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 19, 20, 21, 22, 73, 73, + 73, 73, 73, 73, 73, 73, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 19, + 73, 12, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 73, 24, 18, 73, + 73, 73, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 19, 73, 12, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 18, 19, 20, + 21, 22, 73, 76, 18, 73, 73, 73, + 28, 29, 30, 73, 31, 32, 33, 73, + 73, 73, 73, 19, 73, 12, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 18, 19, 20, 21, 22, + 73, 73, 18, 73, 73, 73, 28, 29, + 30, 73, 31, 32, 33, 73, 73, 73, + 73, 19, 73, 12, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 18, 19, 20, 21, 22, 23, 24, + 18, 73, 73, 73, 28, 29, 30, 73, + 31, 32, 33, 73, 73, 73, 73, 19, + 73, 12, 73, 73, 3, 6, 73, 73, + 74, 73, 73, 73, 73, 73, 73, 18, + 19, 20, 21, 22, 23, 24, 18, 25, + 73, 27, 28, 29, 30, 73, 31, 32, + 33, 73, 73, 73, 73, 37, 73, 3, + 73, 73, 73, 73, 73, 73, 12, 73, + 73, 73, 73, 73, 73, 4, 73, 73, + 73, 73, 73, 73, 73, 19, 20, 21, + 22, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 31, 32, 33, 73, 3, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 4, 77, 78, + 73, 14, 73, 73, 73, 73, 73, 73, + 73, 79, 73, 14, 73, 6, 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, 77, 77, 77, 77, 6, 77, 8, + 73, 73, 73, 8, 73, 73, 12, 73, + 73, 3, 6, 14, 73, 74, 73, 73, + 73, 73, 73, 73, 18, 19, 20, 21, + 22, 23, 24, 18, 25, 26, 27, 28, + 29, 30, 73, 31, 32, 33, 73, 34, + 35, 73, 37, 73, 12, 73, 73, 3, + 6, 73, 73, 74, 73, 73, 73, 73, + 73, 73, 18, 19, 20, 21, 22, 23, + 24, 18, 25, 26, 27, 28, 29, 30, + 73, 31, 32, 33, 73, 73, 73, 73, + 37, 73, 34, 35, 73, 35, 73, 70, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 70, 71, 72, 8, 77, + 77, 77, 8, 77, 0 }; -static const char _use_syllable_machine_index_defaults[] = { - 0, 2, 2, 5, 9, 38, 40, 40, - 62, 62, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 62, 40, 65, 68, 65, - 40, 40, 72, 72, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 77, - 73, 73, 73, 77, 73, 73, 73, 73, - 72, 77, 0 +static const char _use_syllable_machine_trans_targs[] = { + 4, 8, 4, 36, 2, 4, 1, 5, + 6, 4, 29, 32, 4, 55, 56, 59, + 60, 64, 38, 39, 40, 41, 42, 49, + 50, 52, 61, 53, 46, 47, 48, 43, + 44, 45, 62, 63, 65, 54, 4, 4, + 4, 4, 7, 0, 28, 11, 12, 13, + 14, 15, 22, 23, 25, 26, 19, 20, + 21, 16, 17, 18, 27, 10, 4, 9, + 24, 4, 30, 31, 4, 33, 34, 35, + 4, 4, 3, 37, 51, 4, 57, 58 }; -static const char _use_syllable_machine_trans_cond_spaces[] = { - -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, -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, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0 -}; - -static const char _use_syllable_machine_cond_targs[] = { - 4, 8, 4, 36, 2, 4, 1, 5, - 6, 4, 29, 32, 4, 55, 56, 59, - 60, 64, 38, 39, 40, 41, 42, 49, - 50, 52, 61, 53, 46, 47, 48, 43, - 44, 45, 62, 63, 65, 54, 4, 4, - 4, 4, 7, 0, 28, 11, 12, 13, - 14, 15, 22, 23, 25, 26, 19, 20, - 21, 16, 17, 18, 27, 10, 4, 9, - 24, 4, 30, 31, 4, 33, 34, 35, - 4, 4, 3, 37, 51, 4, 57, 58, - 0 -}; - -static const char _use_syllable_machine_cond_actions[] = { - 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 7, 9, 10, 0, 10, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 11, 12, - 13, 14, 7, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, 15, 0, - 0, 16, 0, 0, 17, 7, 0, 0, - 18, 19, 0, 3, 0, 20, 0, 0, - 0 +static const char _use_syllable_machine_trans_actions[] = { + 1, 0, 2, 3, 0, 4, 0, 0, + 7, 8, 0, 7, 9, 10, 0, 10, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 11, 12, + 13, 14, 7, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, 15, 0, + 0, 16, 0, 0, 17, 7, 0, 0, + 18, 19, 0, 3, 0, 20, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 0, 0, 0, 5, 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, 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, 0, - 0, 0, 0 + 0, 0, 0, 0, 5, 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, 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, 0, + 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 0, 0, 0, 6, 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, 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, 0, - 0, 0, 0 -}; - -static const char _use_syllable_machine_eof_cond_spaces[] = { - -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, -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, -1, -1, -1, -1, - -1, -1, 0 -}; - -static const char _use_syllable_machine_eof_cond_key_offs[] = { - 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _use_syllable_machine_eof_cond_key_lens[] = { - 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _use_syllable_machine_eof_cond_keys[] = { - 0 -}; - -static const char _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 39, 41, 41, - 63, 63, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 63, 41, 66, 69, 66, - 41, 41, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 78, - 74, 74, 74, 78, 74, 74, 74, 74, - 73, 78, 0 -}; - -static const char _use_syllable_machine_nfa_targs[] = { + 0, 0, 0, 0, 6, 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, 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, 0, 0, 0 }; -static const char _use_syllable_machine_nfa_offsets[] = { - 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char _use_syllable_machine_nfa_push_actions[] = { - 0, 0 -}; - -static const char _use_syllable_machine_nfa_pop_trans[] = { - 0, 0 +static const short _use_syllable_machine_eof_trans[] = { + 1, 3, 3, 6, 0, 39, 41, 41, + 63, 63, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 63, 41, 66, 69, 66, + 41, 41, 73, 73, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 78, + 74, 74, 74, 78, 74, 74, 74, 74, + 73, 78 }; static const int use_syllable_machine_start = 4; @@ -405,292 +369,188 @@ static const int use_syllable_machine_error = -1; static const int use_syllable_machine_en_main = 4; +#line 38 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" + + #define found_syllable(syllable_type) \ -HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ - for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial=1; \ -} HB_STMT_END + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ + for (unsigned int i = ts; i < te; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END static void find_syllables (hb_buffer_t *buffer) { - unsigned int p, pe, eof, ts, te, act; - int cs; - hb_glyph_info_t *info = buffer->info; - + unsigned int p, pe, eof, ts, te, act; + int cs; + hb_glyph_info_t *info = buffer->info; + +#line 396 "hb-ot-shape-complex-use-machine.hh" { - cs = (int)use_syllable_machine_start; - ts = 0; - te = 0; - act = 0; + cs = use_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - - - p=0; - pe = eof = buffer->len; - - unsigned int syllable_serial=1; - + +#line 166 "hb-ot-shape-complex-use-machine.rl" + + + p = 0; + pe = eof = buffer->len; + + unsigned int syllable_serial = 1; + +#line 412 "hb-ot-shape-complex-use-machine.hh" { - int _cpc; - int _klen;const char * _cekeys;unsigned int _trans = 0;const unsigned char * _keys;const char * _inds; { - if ( p == pe ) - goto _test_eof; - _resume: { - switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 6: { - { - #line 1 "NONE" - {ts = p;}} - - break; } - } - - _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); - - if ( (info[p].use_category()) <= 44 ) - { - int _ic = (int)_use_syllable_machine_char_class[(int)(info[p].use_category()) - 0]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; - } - - goto _match_cond; - } - _match_cond: { - cs = (int)_use_syllable_machine_cond_targs[_trans]; - - if ( _use_syllable_machine_cond_actions[_trans] == 0 ) - goto _again; - - switch ( _use_syllable_machine_cond_actions[_trans] ) { - case 7: { - { - #line 1 "NONE" - {te = p+1;}} - - break; } - case 12: { - { - #line 135 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ - #line 135 "hb-ot-shape-complex-use-machine.rl" - found_syllable (independent_cluster); }}} - - break; } - case 14: { - { - #line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ - #line 137 "hb-ot-shape-complex-use-machine.rl" - found_syllable (standard_cluster); }}} - - break; } - case 9: { - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ - #line 141 "hb-ot-shape-complex-use-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 8: { - { - #line 142 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ - #line 142 "hb-ot-shape-complex-use-machine.rl" - found_syllable (non_cluster); }}} - - break; } - case 11: { - { - #line 135 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 135 "hb-ot-shape-complex-use-machine.rl" - found_syllable (independent_cluster); }}} - - break; } - case 15: { - { - #line 136 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 136 "hb-ot-shape-complex-use-machine.rl" - found_syllable (virama_terminated_cluster); }}} - - break; } - case 13: { - { - #line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 137 "hb-ot-shape-complex-use-machine.rl" - found_syllable (standard_cluster); }}} - - break; } - case 17: { - { - #line 138 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 138 "hb-ot-shape-complex-use-machine.rl" - found_syllable (number_joiner_terminated_cluster); }}} - - break; } - case 16: { - { - #line 139 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 139 "hb-ot-shape-complex-use-machine.rl" - found_syllable (numeral_cluster); }}} - - break; } - case 18: { - { - #line 140 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 140 "hb-ot-shape-complex-use-machine.rl" - found_syllable (symbol_cluster); }}} - - break; } - case 19: { - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 141 "hb-ot-shape-complex-use-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 20: { - { - #line 142 "hb-ot-shape-complex-use-machine.rl" - {te = p;p = p - 1;{ - #line 142 "hb-ot-shape-complex-use-machine.rl" - found_syllable (non_cluster); }}} - - break; } - case 1: { - { - #line 137 "hb-ot-shape-complex-use-machine.rl" - {p = ((te))-1; - { - #line 137 "hb-ot-shape-complex-use-machine.rl" - found_syllable (standard_cluster); }}} - - break; } - case 4: { - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - {p = ((te))-1; - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - found_syllable (broken_cluster); }}} - - break; } - case 2: { - { - #line 1 "NONE" - {switch( act ) { - case 7: { - p = ((te))-1; - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - found_syllable (broken_cluster); } break; } - case 8: { - p = ((te))-1; - { - #line 142 "hb-ot-shape-complex-use-machine.rl" - found_syllable (non_cluster); } break; } - }} - } - - break; } - case 3: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 141 "hb-ot-shape-complex-use-machine.rl" - {act = 7;}} - - break; } - case 10: { - { - #line 1 "NONE" - {te = p+1;}} - { - #line 142 "hb-ot-shape-complex-use-machine.rl" - {act = 8;}} - - break; } - } - - - } - _again: { - switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 5: { - { - #line 1 "NONE" - {ts = 0;}} - - break; } - } - - p += 1; - if ( p != pe ) - goto _resume; - } - _test_eof: { {} - if ( p == eof ) - { - if ( _use_syllable_machine_eof_cond_spaces[cs] != -1 ) { - _cekeys = ( _use_syllable_machine_eof_cond_keys + (_use_syllable_machine_eof_cond_key_offs[cs])); - _klen = (int)_use_syllable_machine_eof_cond_key_lens[cs]; - _cpc = 0; - { - const char *_lower = _cekeys; - const char *_upper = _cekeys + _klen - 1; - const char *_mid; - while ( 1 ) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _cpc < (int)(*( _mid)) ) - _upper = _mid - 1; - else if ( _cpc > (int)(*( _mid)) ) - _lower = _mid + 1; - else { - goto _ok; - } - } - cs = -1; - goto _out; - } - _ok: {} - } - if ( _use_syllable_machine_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_use_syllable_machine_eof_trans[cs] - 1; - goto _match_cond; - } - } - - } - _out: { {} - } - } + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _use_syllable_machine_from_state_actions[cs] ) { + case 6: +#line 1 "NONE" + {ts = p;} + break; +#line 426 "hb-ot-shape-complex-use-machine.hh" } - + + _keys = _use_syllable_machine_trans_keys + (cs<<1); + _inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs]; + + _slen = _use_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].use_category()) && + ( info[p].use_category()) <= _keys[1] ? + ( info[p].use_category()) - _keys[0] : _slen ]; + +_eof_trans: + cs = _use_syllable_machine_trans_targs[_trans]; + + if ( _use_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _use_syllable_machine_trans_actions[_trans] ) { + case 7: +#line 1 "NONE" + {te = p+1;} + break; + case 12: +#line 135 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (independent_cluster); }} + break; + case 14: +#line 137 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (standard_cluster); }} + break; + case 9: +#line 141 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (broken_cluster); }} + break; + case 8: +#line 142 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (non_cluster); }} + break; + case 11: +#line 135 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (independent_cluster); }} + break; + case 15: +#line 136 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (virama_terminated_cluster); }} + break; + case 13: +#line 137 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (standard_cluster); }} + break; + case 17: +#line 138 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} + break; + case 16: +#line 139 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (numeral_cluster); }} + break; + case 18: +#line 140 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (symbol_cluster); }} + break; + case 19: +#line 141 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 20: +#line 142 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (non_cluster); }} + break; + case 1: +#line 137 "hb-ot-shape-complex-use-machine.rl" + {{p = ((te))-1;}{ found_syllable (standard_cluster); }} + break; + case 4: +#line 141 "hb-ot-shape-complex-use-machine.rl" + {{p = ((te))-1;}{ found_syllable (broken_cluster); }} + break; + case 2: +#line 1 "NONE" + { switch( act ) { + case 7: + {{p = ((te))-1;} found_syllable (broken_cluster); } + break; + case 8: + {{p = ((te))-1;} found_syllable (non_cluster); } + break; + } + } + break; + case 3: +#line 1 "NONE" + {te = p+1;} +#line 141 "hb-ot-shape-complex-use-machine.rl" + {act = 7;} + break; + case 10: +#line 1 "NONE" + {te = p+1;} +#line 142 "hb-ot-shape-complex-use-machine.rl" + {act = 8;} + break; +#line 528 "hb-ot-shape-complex-use-machine.hh" + } + +_again: + switch ( _use_syllable_machine_to_state_actions[cs] ) { + case 5: +#line 1 "NONE" + {ts = 0;} + break; +#line 537 "hb-ot-shape-complex-use-machine.hh" + } + + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _use_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _use_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + } + +#line 174 "hb-ot-shape-complex-use-machine.rl" + } #undef found_syllable From a487fc33248ea2f934ff4cb857cb556065c11841 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:16:33 -0700 Subject: [PATCH 260/617] Another extra semi-colon --- src/hb-ot-layout-common.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 017895891..71c0ca4a9 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -226,7 +226,7 @@ struct LangSys { if (reqFeatureIndex == 0xFFFFu) return Index::NOT_FOUND_INDEX; - return reqFeatureIndex;; + return reqFeatureIndex; } LangSys* copy (hb_serialize_context_t *c) const From 148d88368013ba9bf70a7dd275b1a0f9c64fd45c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:33:06 -0700 Subject: [PATCH 261/617] [test] Don't call deprecated API --- test/api/test-font.c | 3 --- test/api/test-shape.c | 16 ++-------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/test/api/test-font.c b/test/api/test-font.c index 669019404..c6738b400 100644 --- a/test/api/test-font.c +++ b/test/api/test-font.c @@ -146,9 +146,6 @@ _test_font_nil_funcs (hb_font_t *font) glyph = 3; g_assert (!hb_font_get_glyph (font, 17, 2, &glyph)); g_assert_cmpint (glyph, ==, 0); - - x = hb_font_get_glyph_h_kerning (font, 17, 19); - g_assert_cmpint (x, ==, 0); } static void diff --git a/test/api/test-shape.c b/test/api/test-shape.c index 146cf0f4a..8fbe7f70c 100644 --- a/test/api/test-shape.c +++ b/test/api/test-shape.c @@ -67,17 +67,6 @@ glyph_func (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, return FALSE; } -static hb_position_t -glyph_h_kerning_func (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t left, hb_codepoint_t right, - void *user_data HB_UNUSED) -{ - if (left == 1 && right == 2) - return -2; - - return 0; -} - static const char TesT[] = "TesT"; static void @@ -102,7 +91,6 @@ test_shape (void) ffuncs = hb_font_funcs_create (); hb_font_funcs_set_glyph_h_advance_func (ffuncs, glyph_h_advance_func, NULL, NULL); hb_font_funcs_set_nominal_glyph_func (ffuncs, glyph_func, malloc (10), free); - hb_font_funcs_set_glyph_h_kerning_func (ffuncs, glyph_h_kerning_func, NULL, NULL); hb_font_set_funcs (font, ffuncs, NULL, NULL); hb_font_funcs_destroy (ffuncs); @@ -118,8 +106,8 @@ test_shape (void) { const hb_codepoint_t output_glyphs[] = {1, 2, 3, 1}; - const hb_position_t output_x_advances[] = {9, 5, 5, 10}; - const hb_position_t output_x_offsets[] = {0, -1, 0, 0}; + const hb_position_t output_x_advances[] = {10, 6, 5, 10}; + const hb_position_t output_x_offsets[] = {0, 0, 0, 0}; unsigned int i; g_assert_cmpint (len, ==, 4); for (i = 0; i < len; i++) { From b1d3e54bd3c881794b05831e811b1a77a7d427c5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:35:04 -0700 Subject: [PATCH 262/617] [indic] Don't constrain how many C, M, ... occur Fixes https://github.com/harfbuzz/harfbuzz/issues/1709 Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape-complex-indic-machine.hh | 1225 ++++++---------------- src/hb-ot-shape-complex-indic-machine.rl | 8 +- 2 files changed, 305 insertions(+), 928 deletions(-) diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index 08b90e913..ca26ecbae 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -34,788 +34,284 @@ #line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 8u, 8u, 4u, 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, 13u, 4u, 8u, - 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, - 5u, 8u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, - 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, - 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, - 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, - 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 + 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 5u, 8u, 8u, 8u, 1u, 19u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 5u, 10u, 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, + 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, + 5u, 10u, 3u, 17u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, + 3u, 17u, 4u, 13u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u, + 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 1u, 17u, + 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, + 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 }; static const char _indic_syllable_machine_key_spans[] = { - 1, 5, 3, 1, 4, 3, 1, 4, - 3, 1, 4, 3, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 5, 1, - 1, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 1, 5, 3, 1, 4, 3, - 1, 4, 3, 1, 4, 3, 1, 5, - 1, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 1, 5, 3, 1, - 4, 3, 1, 4, 3, 1, 4, 3, - 1, 5, 1, 1, 5, 1, 1, 5, - 1, 1, 5, 1, 1, 10, 5, 10, - 5, 10, 5, 10, 5, 1, 5, 3, - 1, 4, 3, 1, 4, 3, 1, 4, - 3, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 10, - 4, 1, 19, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 6, 6, - 6, 1, 1, 1, 6, 8, 6, 8, - 7, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 7, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 6, 6, 6, 1, - 1, 1, 6, 8, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 6, 8, 7, - 7, 15, 15, 16, 16, 16, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 5, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 6, 6, 6, 1, 1, 1, 6, - 8, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 7, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 10, 15, 5, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 6, 6, 6, 1, 1, 1, 6, 8, - 6, 8, 7, 6, 8, 7, 6, 8, - 7, 6, 8, 7, 7, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 16, 16, 16, 15, 15, 16, 16, - 16, 15, 17, 15, 17, 10, 6, 1, - 1, 1, 6, 16, 8, 6, 6, 1, - 1, 1, 6, 16 + 1, 5, 3, 4, 5, 1, 1, 5, + 10, 5, 1, 3, 4, 5, 1, 1, + 5, 10, 10, 10, 1, 3, 4, 5, + 1, 1, 5, 5, 10, 1, 3, 4, + 5, 1, 1, 5, 5, 4, 1, 19, + 15, 15, 14, 16, 6, 6, 1, 6, + 16, 16, 16, 8, 7, 6, 7, 6, + 8, 6, 15, 15, 15, 15, 14, 16, + 15, 15, 14, 16, 6, 1, 6, 16, + 16, 8, 7, 6, 7, 6, 6, 8, + 6, 15, 15, 5, 15, 15, 14, 16, + 15, 16, 6, 1, 6, 16, 16, 8, + 7, 6, 15, 7, 6, 6, 8, 6, + 15, 10, 5, 15, 15, 14, 16, 15, + 16, 6, 1, 6, 16, 16, 8, 7, + 6, 15, 7, 6, 6, 8, 6, 17, + 15, 17, 10, 6, 1, 6, 16, 8, + 6, 6, 1, 6, 16 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 8, 12, 14, 19, 23, 25, - 30, 34, 36, 41, 45, 47, 53, 55, - 57, 63, 65, 67, 73, 75, 77, 83, - 85, 87, 98, 104, 115, 121, 132, 138, - 149, 155, 166, 168, 174, 178, 180, 185, - 189, 191, 196, 200, 202, 207, 211, 213, - 219, 221, 223, 229, 231, 233, 239, 241, - 243, 249, 251, 253, 264, 270, 281, 287, - 298, 304, 315, 321, 332, 334, 340, 344, - 346, 351, 355, 357, 362, 366, 368, 373, - 377, 379, 385, 387, 389, 395, 397, 399, - 405, 407, 409, 415, 417, 419, 430, 436, - 447, 453, 464, 470, 481, 487, 489, 495, - 499, 501, 506, 510, 512, 517, 521, 523, - 528, 532, 534, 540, 542, 544, 550, 552, - 554, 560, 562, 564, 570, 572, 574, 585, - 591, 602, 608, 619, 625, 636, 642, 653, - 664, 669, 671, 691, 707, 723, 738, 755, - 771, 787, 802, 819, 835, 851, 866, 883, - 899, 915, 930, 947, 963, 979, 994, 1001, - 1008, 1015, 1017, 1019, 1021, 1028, 1037, 1044, - 1053, 1061, 1068, 1077, 1085, 1092, 1101, 1109, - 1116, 1125, 1133, 1141, 1157, 1173, 1190, 1207, - 1224, 1240, 1256, 1273, 1290, 1307, 1323, 1339, - 1356, 1373, 1390, 1406, 1422, 1439, 1456, 1473, - 1489, 1505, 1521, 1537, 1552, 1569, 1585, 1601, - 1616, 1633, 1649, 1665, 1680, 1697, 1713, 1729, - 1744, 1761, 1777, 1793, 1808, 1815, 1822, 1829, - 1831, 1833, 1835, 1842, 1851, 1858, 1867, 1875, - 1882, 1891, 1899, 1906, 1915, 1923, 1930, 1939, - 1947, 1955, 1971, 1987, 2004, 2021, 2038, 2054, - 2070, 2087, 2104, 2121, 2137, 2153, 2170, 2187, - 2204, 2220, 2236, 2253, 2270, 2287, 2293, 2309, - 2325, 2340, 2357, 2373, 2389, 2404, 2421, 2437, - 2453, 2468, 2485, 2501, 2517, 2532, 2549, 2565, - 2581, 2596, 2603, 2610, 2617, 2619, 2621, 2623, - 2630, 2639, 2646, 2655, 2663, 2670, 2679, 2687, - 2694, 2703, 2711, 2718, 2727, 2735, 2743, 2759, - 2775, 2792, 2809, 2826, 2842, 2858, 2875, 2892, - 2909, 2925, 2941, 2958, 2975, 2992, 3008, 3024, - 3041, 3058, 3075, 3086, 3102, 3108, 3124, 3140, - 3155, 3172, 3188, 3204, 3219, 3236, 3252, 3268, - 3283, 3300, 3316, 3332, 3347, 3364, 3380, 3396, - 3411, 3418, 3425, 3432, 3434, 3436, 3438, 3445, - 3454, 3461, 3470, 3478, 3485, 3494, 3502, 3509, - 3518, 3526, 3533, 3542, 3550, 3558, 3574, 3590, - 3607, 3624, 3641, 3657, 3673, 3690, 3707, 3724, - 3740, 3756, 3773, 3790, 3807, 3823, 3839, 3856, - 3873, 3890, 3906, 3924, 3940, 3958, 3969, 3976, - 3978, 3980, 3982, 3989, 4006, 4015, 4022, 4029, - 4031, 4033, 4035, 4042 + 0, 2, 8, 12, 17, 23, 25, 27, + 33, 44, 50, 52, 56, 61, 67, 69, + 71, 77, 88, 99, 110, 112, 116, 121, + 127, 129, 131, 137, 143, 154, 156, 160, + 165, 171, 173, 175, 181, 187, 192, 194, + 214, 230, 246, 261, 278, 285, 292, 294, + 301, 318, 335, 352, 361, 369, 376, 384, + 391, 400, 407, 423, 439, 455, 471, 486, + 503, 519, 535, 550, 567, 574, 576, 583, + 600, 617, 626, 634, 641, 649, 656, 663, + 672, 679, 695, 711, 717, 733, 749, 764, + 781, 797, 814, 821, 823, 830, 847, 864, + 873, 881, 888, 904, 912, 919, 926, 935, + 942, 958, 969, 975, 991, 1007, 1022, 1039, + 1055, 1072, 1079, 1081, 1088, 1105, 1122, 1131, + 1139, 1146, 1162, 1170, 1177, 1184, 1193, 1200, + 1218, 1234, 1252, 1263, 1270, 1272, 1279, 1296, + 1305, 1312, 1319, 1321, 1328 }; -static const short _indic_syllable_machine_indicies[] = { +static const unsigned char _indic_syllable_machine_indicies[] = { 1, 0, 2, 3, 3, 4, 1, 0, - 5, 5, 4, 0, 4, 0, 6, 6, - 7, 1, 0, 8, 8, 7, 0, 7, - 0, 9, 9, 10, 1, 0, 11, 11, - 10, 0, 10, 0, 12, 12, 13, 1, - 0, 14, 14, 13, 0, 13, 0, 15, - 0, 0, 0, 1, 0, 16, 0, 17, - 0, 18, 12, 12, 13, 1, 0, 19, - 0, 20, 0, 21, 9, 9, 10, 1, - 0, 22, 0, 23, 0, 24, 6, 6, - 7, 1, 0, 25, 0, 26, 0, 2, - 3, 3, 4, 1, 0, 0, 0, 0, - 27, 0, 28, 3, 3, 4, 1, 0, - 28, 3, 3, 4, 1, 0, 0, 0, - 0, 29, 0, 30, 3, 3, 4, 1, - 0, 30, 3, 3, 4, 1, 0, 0, - 0, 0, 31, 0, 32, 3, 3, 4, - 1, 0, 32, 3, 3, 4, 1, 0, - 0, 0, 0, 33, 0, 34, 3, 3, - 4, 1, 0, 34, 3, 3, 4, 1, - 0, 0, 0, 0, 35, 0, 37, 36, - 38, 39, 39, 40, 37, 36, 41, 41, - 40, 36, 40, 36, 42, 42, 43, 37, - 36, 44, 44, 43, 36, 43, 36, 45, - 45, 46, 37, 36, 47, 47, 46, 36, - 46, 36, 48, 48, 49, 37, 36, 50, - 50, 49, 36, 49, 36, 51, 36, 36, - 36, 37, 36, 52, 36, 53, 36, 54, - 48, 48, 49, 37, 36, 55, 36, 56, - 36, 57, 45, 45, 46, 37, 36, 58, - 36, 59, 36, 60, 42, 42, 43, 37, - 36, 61, 36, 62, 36, 38, 39, 39, - 40, 37, 36, 36, 36, 36, 63, 36, - 64, 39, 39, 40, 37, 36, 64, 39, - 39, 40, 37, 36, 36, 36, 36, 65, - 36, 66, 39, 39, 40, 37, 36, 66, - 39, 39, 40, 37, 36, 36, 36, 36, - 67, 36, 68, 39, 39, 40, 37, 36, - 68, 39, 39, 40, 37, 36, 36, 36, - 36, 69, 36, 70, 39, 39, 40, 37, - 36, 70, 39, 39, 40, 37, 36, 36, - 36, 36, 71, 36, 73, 72, 74, 75, - 75, 76, 73, 72, 78, 78, 76, 77, - 76, 77, 79, 79, 80, 73, 72, 81, - 81, 80, 72, 80, 72, 82, 82, 83, - 73, 72, 84, 84, 83, 72, 83, 72, - 85, 85, 86, 73, 72, 87, 87, 86, - 72, 86, 72, 88, 72, 72, 72, 73, - 72, 89, 72, 90, 72, 91, 85, 85, - 86, 73, 72, 92, 72, 93, 72, 94, - 82, 82, 83, 73, 72, 95, 72, 96, - 72, 97, 79, 79, 80, 73, 72, 98, - 72, 99, 72, 74, 75, 75, 76, 73, - 72, 72, 72, 72, 100, 72, 101, 75, - 75, 76, 73, 72, 101, 75, 75, 76, - 73, 72, 72, 72, 72, 102, 72, 103, - 75, 75, 76, 73, 72, 103, 75, 75, - 76, 73, 72, 72, 72, 72, 104, 72, - 105, 75, 75, 76, 73, 72, 105, 75, - 75, 76, 73, 72, 72, 72, 72, 106, - 72, 107, 75, 75, 76, 73, 72, 109, - 108, 110, 111, 111, 112, 109, 108, 113, - 113, 112, 108, 112, 108, 114, 114, 115, - 109, 108, 116, 116, 115, 108, 115, 108, - 117, 117, 118, 109, 108, 119, 119, 118, - 108, 118, 108, 120, 120, 121, 109, 108, - 122, 122, 121, 108, 121, 108, 123, 108, - 108, 108, 109, 108, 124, 108, 125, 108, - 126, 120, 120, 121, 109, 108, 127, 108, - 128, 108, 129, 117, 117, 118, 109, 108, - 130, 108, 131, 108, 132, 114, 114, 115, - 109, 108, 133, 108, 134, 108, 110, 111, - 111, 112, 109, 108, 108, 108, 108, 135, - 108, 136, 111, 111, 112, 109, 108, 136, - 111, 111, 112, 109, 108, 108, 108, 108, - 137, 108, 138, 111, 111, 112, 109, 108, - 138, 111, 111, 112, 109, 108, 108, 108, - 108, 139, 108, 140, 111, 111, 112, 109, - 108, 140, 111, 111, 112, 109, 108, 108, - 108, 108, 141, 108, 142, 111, 111, 112, - 109, 108, 142, 111, 111, 112, 109, 108, - 108, 108, 108, 143, 108, 107, 75, 75, - 76, 73, 72, 72, 72, 72, 144, 72, - 78, 78, 76, 1, 0, 146, 145, 148, - 149, 150, 151, 152, 153, 76, 73, 147, - 154, 155, 155, 144, 147, 156, 157, 158, - 159, 160, 147, 162, 163, 164, 165, 4, - 1, 161, 166, 161, 161, 35, 161, 161, - 161, 167, 161, 168, 163, 169, 169, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 170, 161, 161, 161, 17, 171, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 170, 161, 172, 173, 174, 175, 4, - 1, 161, 166, 161, 161, 33, 161, 161, - 161, 167, 161, 176, 173, 177, 177, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 173, 177, 177, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 178, 161, 161, 161, 17, 179, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 178, 161, 180, 181, 182, 183, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 184, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 181, 185, 185, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 186, 161, 161, 161, 17, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 188, 189, 190, 191, 4, - 1, 161, 166, 161, 161, 29, 161, 161, - 161, 167, 161, 192, 189, 193, 193, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 189, 193, 193, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 194, 161, 161, 161, 17, 195, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 194, 161, 196, 197, 198, 199, 4, - 1, 161, 166, 161, 161, 27, 161, 161, - 161, 167, 161, 200, 197, 201, 201, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 197, 201, 201, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 17, 202, 161, 1, 161, 166, - 161, 203, 203, 161, 1, 161, 166, 161, - 204, 161, 161, 205, 161, 166, 161, 166, - 161, 206, 161, 207, 161, 204, 161, 161, - 161, 161, 166, 161, 17, 161, 203, 203, - 161, 1, 161, 166, 161, 203, 202, 161, - 1, 161, 166, 161, 208, 26, 209, 210, - 7, 1, 161, 166, 161, 26, 209, 210, - 7, 1, 161, 166, 161, 209, 209, 7, - 1, 161, 166, 161, 211, 23, 212, 213, - 10, 1, 161, 166, 161, 23, 212, 213, - 10, 1, 161, 166, 161, 212, 212, 10, - 1, 161, 166, 161, 214, 20, 215, 216, - 13, 1, 161, 166, 161, 20, 215, 216, - 13, 1, 161, 166, 161, 215, 215, 13, - 1, 161, 166, 161, 217, 17, 203, 218, - 161, 1, 161, 166, 161, 17, 203, 218, - 161, 1, 161, 166, 161, 197, 201, 201, - 4, 1, 161, 166, 161, 196, 197, 201, - 201, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 161, 167, 161, 196, 197, 198, - 201, 4, 1, 161, 166, 161, 161, 27, - 161, 161, 161, 167, 161, 194, 161, 219, - 161, 203, 203, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 194, 161, 194, 161, - 161, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 194, 161, 194, - 161, 161, 161, 203, 195, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 194, 161, - 188, 189, 193, 193, 4, 1, 161, 166, - 161, 161, 161, 161, 161, 161, 167, 161, - 188, 189, 190, 193, 4, 1, 161, 166, - 161, 161, 29, 161, 161, 161, 167, 161, - 186, 161, 220, 161, 203, 203, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 186, - 161, 186, 161, 161, 161, 203, 203, 161, - 1, 161, 166, 161, 161, 161, 161, 161, - 186, 161, 186, 161, 161, 161, 203, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 180, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 180, 181, 182, 185, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 178, 161, 221, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 161, 178, 161, 178, 161, 161, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 161, 178, 161, 178, 161, 161, - 161, 203, 179, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 178, 161, 172, 173, - 177, 177, 4, 1, 161, 166, 161, 161, - 161, 161, 161, 161, 167, 161, 172, 173, - 174, 177, 4, 1, 161, 166, 161, 161, - 33, 161, 161, 161, 167, 161, 170, 161, - 222, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 170, 161, 170, - 161, 161, 161, 203, 203, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 170, 161, - 170, 161, 161, 161, 203, 171, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 170, - 161, 162, 163, 169, 169, 4, 1, 161, - 166, 161, 161, 161, 161, 161, 161, 167, - 161, 162, 163, 164, 169, 4, 1, 161, - 166, 161, 161, 35, 161, 161, 161, 167, - 161, 224, 225, 226, 227, 40, 37, 223, - 228, 223, 223, 71, 223, 223, 223, 229, - 223, 230, 225, 231, 227, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 225, 231, 227, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 232, 223, 223, 223, 53, 233, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 232, - 223, 234, 235, 236, 237, 40, 37, 223, - 228, 223, 223, 69, 223, 223, 223, 229, - 223, 238, 235, 239, 239, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 235, 239, 239, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 240, 223, 223, 223, 53, 241, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 240, - 223, 242, 243, 244, 245, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 246, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 243, 247, 247, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 248, 223, 223, 223, 53, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 250, 251, 252, 253, 40, 37, 223, - 228, 223, 223, 65, 223, 223, 223, 229, - 223, 254, 251, 255, 255, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 251, 255, 255, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 256, 223, 223, 223, 53, 257, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 256, - 223, 258, 259, 260, 261, 40, 37, 223, - 228, 223, 223, 63, 223, 223, 223, 229, - 223, 262, 259, 263, 263, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 259, 263, 263, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 53, 264, 223, 37, 223, 228, 223, 265, - 265, 223, 37, 223, 228, 223, 266, 223, - 223, 267, 223, 228, 223, 228, 223, 268, - 223, 269, 223, 266, 223, 223, 223, 223, - 228, 223, 53, 223, 265, 265, 223, 37, - 223, 228, 223, 265, 264, 223, 37, 223, - 228, 223, 270, 62, 271, 272, 43, 37, - 223, 228, 223, 62, 271, 272, 43, 37, - 223, 228, 223, 271, 271, 43, 37, 223, - 228, 223, 273, 59, 274, 275, 46, 37, - 223, 228, 223, 59, 274, 275, 46, 37, - 223, 228, 223, 274, 274, 46, 37, 223, - 228, 223, 276, 56, 277, 278, 49, 37, - 223, 228, 223, 56, 277, 278, 49, 37, - 223, 228, 223, 277, 277, 49, 37, 223, - 228, 223, 279, 53, 265, 280, 223, 37, - 223, 228, 223, 53, 265, 280, 223, 37, - 223, 228, 223, 259, 263, 263, 40, 37, - 223, 228, 223, 258, 259, 263, 263, 40, - 37, 223, 228, 223, 223, 223, 223, 223, - 223, 229, 223, 258, 259, 260, 263, 40, - 37, 223, 228, 223, 223, 63, 223, 223, - 223, 229, 223, 256, 223, 281, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 256, 223, 256, 223, 223, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 256, 223, 256, 223, 223, - 223, 265, 257, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 256, 223, 250, 251, - 255, 255, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 223, 229, 223, 250, 251, - 252, 255, 40, 37, 223, 228, 223, 223, - 65, 223, 223, 223, 229, 223, 248, 223, - 282, 223, 265, 265, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 248, 223, 248, - 223, 223, 223, 265, 265, 223, 37, 223, - 228, 223, 223, 223, 223, 223, 248, 223, - 248, 223, 223, 223, 265, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 242, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 242, 243, 244, 247, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 240, 223, 283, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 223, - 240, 223, 240, 223, 223, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 223, 240, 223, 240, 223, 223, 223, 265, - 241, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 240, 223, 234, 235, 239, 239, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 223, 229, 223, 234, 235, 236, 239, - 40, 37, 223, 228, 223, 223, 69, 223, - 223, 223, 229, 223, 232, 223, 284, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 232, 223, 232, 223, 223, - 223, 265, 265, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 232, 223, 232, 223, - 223, 223, 265, 233, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 232, 223, 70, - 39, 39, 40, 37, 223, 224, 225, 231, - 227, 40, 37, 223, 228, 223, 223, 223, - 223, 223, 223, 229, 223, 286, 151, 287, - 287, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 151, 287, 287, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 288, 285, 285, 285, - 90, 289, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 288, 285, 290, 291, 292, - 293, 76, 73, 285, 154, 285, 285, 106, - 285, 285, 285, 158, 285, 294, 291, 295, - 295, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 291, 295, 295, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 296, 285, 285, 285, - 90, 297, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 296, 285, 298, 299, 300, - 301, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 302, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 299, 303, 303, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 304, 285, 285, 285, - 90, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 306, 307, 308, - 309, 76, 73, 285, 154, 285, 285, 102, - 285, 285, 285, 158, 285, 310, 307, 311, - 311, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 307, 311, 311, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 312, 285, 285, 285, - 90, 313, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 312, 285, 314, 315, 316, - 317, 76, 73, 285, 154, 285, 285, 100, - 285, 285, 285, 158, 285, 318, 315, 319, - 319, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 315, 319, 319, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 90, 320, 285, 73, - 285, 154, 285, 321, 321, 285, 73, 285, - 154, 285, 322, 285, 285, 323, 285, 154, - 285, 154, 285, 324, 285, 325, 285, 322, - 285, 285, 285, 285, 154, 285, 90, 285, - 321, 321, 285, 73, 285, 154, 285, 321, - 320, 285, 73, 285, 154, 285, 326, 99, - 327, 328, 80, 73, 285, 154, 285, 99, - 327, 328, 80, 73, 285, 154, 285, 327, - 327, 80, 73, 285, 154, 285, 329, 96, - 330, 331, 83, 73, 285, 154, 285, 96, - 330, 331, 83, 73, 285, 154, 285, 330, - 330, 83, 73, 285, 154, 285, 332, 93, - 333, 334, 86, 73, 285, 154, 285, 93, - 333, 334, 86, 73, 285, 154, 285, 333, - 333, 86, 73, 285, 154, 285, 335, 90, - 321, 336, 285, 73, 285, 154, 285, 90, - 321, 336, 285, 73, 285, 154, 285, 315, - 319, 319, 76, 73, 285, 154, 285, 314, - 315, 319, 319, 76, 73, 285, 154, 285, - 285, 285, 285, 285, 285, 158, 285, 314, - 315, 316, 319, 76, 73, 285, 154, 285, - 285, 100, 285, 285, 285, 158, 285, 312, - 285, 337, 285, 321, 321, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 312, 285, - 312, 285, 285, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 312, - 285, 312, 285, 285, 285, 321, 313, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 312, 285, 306, 307, 311, 311, 76, 73, - 285, 154, 285, 285, 285, 285, 285, 285, - 158, 285, 306, 307, 308, 311, 76, 73, - 285, 154, 285, 285, 102, 285, 285, 285, - 158, 285, 304, 285, 338, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 304, 285, 304, 285, 285, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 285, 304, 285, 304, 285, 285, 285, - 321, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 298, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 298, 299, 300, - 303, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 296, 285, 339, - 285, 321, 321, 285, 73, 285, 154, 285, - 285, 285, 285, 285, 296, 285, 296, 285, - 285, 285, 321, 321, 285, 73, 285, 154, - 285, 285, 285, 285, 285, 296, 285, 296, - 285, 285, 285, 321, 297, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 296, 285, - 290, 291, 295, 295, 76, 73, 285, 154, - 285, 285, 285, 285, 285, 285, 158, 285, - 290, 291, 292, 295, 76, 73, 285, 154, - 285, 285, 106, 285, 285, 285, 158, 285, - 288, 285, 340, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 288, - 285, 288, 285, 285, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 288, 285, 288, 285, 285, 285, 321, 289, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 288, 285, 107, 75, 75, 76, 73, - 341, 341, 341, 341, 144, 341, 150, 151, - 287, 287, 76, 73, 285, 154, 285, 285, - 285, 285, 285, 285, 158, 285, 107, 75, - 75, 76, 73, 341, 343, 344, 345, 346, - 112, 109, 342, 347, 342, 342, 143, 342, - 342, 342, 348, 342, 349, 344, 346, 346, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 344, 346, 346, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 350, 342, 342, 342, 125, - 351, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 350, 342, 352, 353, 354, 355, - 112, 109, 342, 347, 342, 342, 141, 342, - 342, 342, 348, 342, 356, 353, 357, 357, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 353, 357, 357, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 358, 342, 342, 342, 125, - 359, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 358, 342, 360, 361, 362, 363, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 364, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 361, 365, 365, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 366, 342, 342, 342, 125, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 368, 369, 370, 371, - 112, 109, 342, 347, 342, 342, 137, 342, - 342, 342, 348, 342, 372, 369, 373, 373, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 369, 373, 373, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 374, 342, 342, 342, 125, - 375, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 374, 342, 376, 377, 378, 379, - 112, 109, 342, 347, 342, 342, 135, 342, - 342, 342, 348, 342, 380, 377, 381, 381, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 377, 381, 381, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 125, 382, 342, 109, 342, - 347, 342, 383, 383, 342, 109, 342, 347, - 342, 384, 342, 342, 385, 342, 347, 342, - 347, 342, 386, 342, 387, 342, 384, 342, - 342, 342, 342, 347, 342, 125, 342, 383, - 383, 342, 109, 342, 347, 342, 383, 382, - 342, 109, 342, 347, 342, 388, 134, 389, - 390, 115, 109, 342, 347, 342, 134, 389, - 390, 115, 109, 342, 347, 342, 389, 389, - 115, 109, 342, 347, 342, 391, 131, 392, - 393, 118, 109, 342, 347, 342, 131, 392, - 393, 118, 109, 342, 347, 342, 392, 392, - 118, 109, 342, 347, 342, 394, 128, 395, - 396, 121, 109, 342, 347, 342, 128, 395, - 396, 121, 109, 342, 347, 342, 395, 395, - 121, 109, 342, 347, 342, 397, 125, 383, - 398, 342, 109, 342, 347, 342, 125, 383, - 398, 342, 109, 342, 347, 342, 377, 381, - 381, 112, 109, 342, 347, 342, 376, 377, - 381, 381, 112, 109, 342, 347, 342, 342, - 342, 342, 342, 342, 348, 342, 376, 377, - 378, 381, 112, 109, 342, 347, 342, 342, - 135, 342, 342, 342, 348, 342, 374, 342, - 399, 342, 383, 383, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 374, 342, 374, - 342, 342, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 374, 342, - 374, 342, 342, 342, 383, 375, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 374, - 342, 368, 369, 373, 373, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 342, 348, - 342, 368, 369, 370, 373, 112, 109, 342, - 347, 342, 342, 137, 342, 342, 342, 348, - 342, 366, 342, 400, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 366, 342, 366, 342, 342, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 342, 366, 342, 366, 342, 342, 342, 383, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 360, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 360, 361, 362, 365, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 358, 342, 401, 342, - 383, 383, 342, 109, 342, 347, 342, 342, - 342, 342, 342, 358, 342, 358, 342, 342, - 342, 383, 383, 342, 109, 342, 347, 342, - 342, 342, 342, 342, 358, 342, 358, 342, - 342, 342, 383, 359, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 358, 342, 352, - 353, 357, 357, 112, 109, 342, 347, 342, - 342, 342, 342, 342, 342, 348, 342, 352, - 353, 354, 357, 112, 109, 342, 347, 342, - 342, 141, 342, 342, 342, 348, 342, 350, - 342, 402, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 350, 342, - 350, 342, 342, 342, 383, 383, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 350, - 342, 350, 342, 342, 342, 383, 351, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 350, 342, 343, 344, 346, 346, 112, 109, - 342, 347, 342, 342, 342, 342, 342, 342, - 348, 342, 148, 149, 150, 151, 403, 287, - 76, 73, 285, 154, 155, 155, 144, 285, - 285, 148, 158, 285, 162, 404, 164, 165, - 4, 1, 161, 166, 161, 161, 35, 161, - 161, 161, 167, 161, 170, 149, 150, 151, - 405, 406, 76, 407, 161, 408, 161, 155, - 144, 161, 161, 170, 158, 161, 107, 409, - 409, 76, 407, 161, 166, 161, 161, 144, - 161, 410, 161, 161, 411, 161, 408, 161, - 408, 161, 412, 161, 207, 161, 410, 161, - 161, 161, 161, 408, 161, 170, 161, 222, - 107, 409, 409, 76, 407, 161, 166, 161, - 161, 161, 161, 161, 170, 161, 414, 413, - 415, 415, 413, 146, 413, 416, 413, 415, - 415, 413, 146, 413, 416, 413, 417, 413, - 413, 418, 413, 416, 413, 416, 413, 419, - 413, 420, 413, 417, 413, 413, 413, 413, - 416, 413, 148, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 155, 341, 341, 341, - 341, 148, 341, 0 + 3, 3, 4, 0, 3, 3, 4, 1, + 0, 5, 3, 3, 4, 1, 0, 6, + 0, 7, 0, 8, 3, 3, 4, 1, + 0, 2, 3, 3, 4, 1, 0, 0, + 0, 0, 9, 0, 11, 12, 12, 13, + 14, 10, 14, 10, 12, 12, 13, 10, + 12, 12, 13, 14, 10, 15, 12, 12, + 13, 14, 10, 16, 10, 17, 10, 18, + 12, 12, 13, 14, 10, 11, 12, 12, + 13, 14, 10, 10, 10, 10, 19, 10, + 11, 12, 12, 13, 14, 10, 10, 10, + 10, 20, 10, 22, 23, 23, 24, 25, + 21, 21, 21, 21, 26, 21, 25, 21, + 23, 23, 24, 27, 23, 23, 24, 25, + 21, 28, 23, 23, 24, 25, 21, 29, + 21, 30, 21, 22, 23, 23, 24, 25, + 21, 31, 23, 23, 24, 25, 21, 33, + 34, 34, 35, 36, 32, 32, 32, 32, + 37, 32, 36, 32, 34, 34, 35, 32, + 34, 34, 35, 36, 32, 38, 34, 34, + 35, 36, 32, 39, 32, 40, 32, 33, + 34, 34, 35, 36, 32, 41, 34, 34, + 35, 36, 32, 23, 23, 24, 1, 0, + 43, 42, 45, 46, 47, 48, 49, 50, + 24, 25, 44, 51, 52, 52, 26, 44, + 53, 54, 55, 56, 57, 44, 59, 60, + 61, 62, 4, 1, 58, 63, 58, 58, + 9, 58, 58, 58, 64, 58, 65, 60, + 66, 66, 4, 1, 58, 63, 58, 58, + 58, 58, 58, 58, 64, 58, 60, 66, + 66, 4, 1, 58, 63, 58, 58, 58, + 58, 58, 58, 64, 58, 45, 58, 58, + 58, 67, 68, 58, 1, 58, 63, 58, + 58, 58, 58, 58, 45, 58, 69, 69, + 58, 1, 58, 63, 58, 63, 58, 58, + 70, 58, 63, 58, 63, 58, 63, 58, + 58, 58, 58, 63, 58, 45, 58, 71, + 58, 69, 69, 58, 1, 58, 63, 58, + 58, 58, 58, 58, 45, 58, 45, 58, + 58, 58, 69, 69, 58, 1, 58, 63, + 58, 58, 58, 58, 58, 45, 58, 45, + 58, 58, 58, 69, 68, 58, 1, 58, + 63, 58, 58, 58, 58, 58, 45, 58, + 72, 7, 73, 74, 4, 1, 58, 63, + 58, 7, 73, 74, 4, 1, 58, 63, + 58, 73, 73, 4, 1, 58, 63, 58, + 75, 76, 76, 4, 1, 58, 63, 58, + 67, 77, 58, 1, 58, 63, 58, 67, + 58, 69, 69, 58, 1, 58, 63, 58, + 69, 77, 58, 1, 58, 63, 58, 59, + 60, 66, 66, 4, 1, 58, 63, 58, + 58, 58, 58, 58, 58, 64, 58, 59, + 60, 61, 66, 4, 1, 58, 63, 58, + 58, 9, 58, 58, 58, 64, 58, 79, + 80, 81, 82, 13, 14, 78, 83, 78, + 78, 20, 78, 78, 78, 84, 78, 85, + 80, 86, 82, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 80, + 86, 82, 13, 14, 78, 83, 78, 78, + 78, 78, 78, 78, 84, 78, 87, 78, + 78, 78, 88, 89, 78, 14, 78, 83, + 78, 78, 78, 78, 78, 87, 78, 90, + 80, 91, 92, 13, 14, 78, 83, 78, + 78, 19, 78, 78, 78, 84, 78, 93, + 80, 86, 86, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 80, + 86, 86, 13, 14, 78, 83, 78, 78, + 78, 78, 78, 78, 84, 78, 87, 78, + 78, 78, 94, 89, 78, 14, 78, 83, + 78, 78, 78, 78, 78, 87, 78, 83, + 78, 78, 95, 78, 83, 78, 83, 78, + 83, 78, 78, 78, 78, 83, 78, 87, + 78, 96, 78, 94, 94, 78, 14, 78, + 83, 78, 78, 78, 78, 78, 87, 78, + 87, 78, 78, 78, 94, 94, 78, 14, + 78, 83, 78, 78, 78, 78, 78, 87, + 78, 97, 17, 98, 99, 13, 14, 78, + 83, 78, 17, 98, 99, 13, 14, 78, + 83, 78, 98, 98, 13, 14, 78, 83, + 78, 100, 101, 101, 13, 14, 78, 83, + 78, 88, 102, 78, 14, 78, 83, 78, + 94, 94, 78, 14, 78, 83, 78, 88, + 78, 94, 94, 78, 14, 78, 83, 78, + 94, 102, 78, 14, 78, 83, 78, 90, + 80, 86, 86, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 90, + 80, 91, 86, 13, 14, 78, 83, 78, + 78, 19, 78, 78, 78, 84, 78, 11, + 12, 12, 13, 14, 78, 79, 80, 86, + 82, 13, 14, 78, 83, 78, 78, 78, + 78, 78, 78, 84, 78, 104, 48, 105, + 105, 24, 25, 103, 51, 103, 103, 103, + 103, 103, 103, 55, 103, 48, 105, 105, + 24, 25, 103, 51, 103, 103, 103, 103, + 103, 103, 55, 103, 106, 103, 103, 103, + 107, 108, 103, 25, 103, 51, 103, 103, + 103, 103, 103, 106, 103, 47, 48, 109, + 110, 24, 25, 103, 51, 103, 103, 26, + 103, 103, 103, 55, 103, 106, 103, 103, + 103, 111, 108, 103, 25, 103, 51, 103, + 103, 103, 103, 103, 106, 103, 51, 103, + 103, 112, 103, 51, 103, 51, 103, 51, + 103, 103, 103, 103, 51, 103, 106, 103, + 113, 103, 111, 111, 103, 25, 103, 51, + 103, 103, 103, 103, 103, 106, 103, 106, + 103, 103, 103, 111, 111, 103, 25, 103, + 51, 103, 103, 103, 103, 103, 106, 103, + 114, 30, 115, 116, 24, 25, 103, 51, + 103, 30, 115, 116, 24, 25, 103, 51, + 103, 115, 115, 24, 25, 103, 51, 103, + 47, 48, 105, 105, 24, 25, 103, 51, + 103, 103, 103, 103, 103, 103, 55, 103, + 117, 118, 118, 24, 25, 103, 51, 103, + 107, 119, 103, 25, 103, 51, 103, 111, + 111, 103, 25, 103, 51, 103, 107, 103, + 111, 111, 103, 25, 103, 51, 103, 111, + 119, 103, 25, 103, 51, 103, 47, 48, + 109, 105, 24, 25, 103, 51, 103, 103, + 26, 103, 103, 103, 55, 103, 22, 23, + 23, 24, 25, 120, 120, 120, 120, 26, + 120, 22, 23, 23, 24, 25, 120, 122, + 123, 124, 125, 35, 36, 121, 126, 121, + 121, 37, 121, 121, 121, 127, 121, 128, + 123, 125, 125, 35, 36, 121, 126, 121, + 121, 121, 121, 121, 121, 127, 121, 123, + 125, 125, 35, 36, 121, 126, 121, 121, + 121, 121, 121, 121, 127, 121, 129, 121, + 121, 121, 130, 131, 121, 36, 121, 126, + 121, 121, 121, 121, 121, 129, 121, 122, + 123, 124, 52, 35, 36, 121, 126, 121, + 121, 37, 121, 121, 121, 127, 121, 129, + 121, 121, 121, 132, 131, 121, 36, 121, + 126, 121, 121, 121, 121, 121, 129, 121, + 126, 121, 121, 133, 121, 126, 121, 126, + 121, 126, 121, 121, 121, 121, 126, 121, + 129, 121, 134, 121, 132, 132, 121, 36, + 121, 126, 121, 121, 121, 121, 121, 129, + 121, 129, 121, 121, 121, 132, 132, 121, + 36, 121, 126, 121, 121, 121, 121, 121, + 129, 121, 135, 40, 136, 137, 35, 36, + 121, 126, 121, 40, 136, 137, 35, 36, + 121, 126, 121, 136, 136, 35, 36, 121, + 126, 121, 122, 123, 125, 125, 35, 36, + 121, 126, 121, 121, 121, 121, 121, 121, + 127, 121, 138, 139, 139, 35, 36, 121, + 126, 121, 130, 140, 121, 36, 121, 126, + 121, 132, 132, 121, 36, 121, 126, 121, + 130, 121, 132, 132, 121, 36, 121, 126, + 121, 132, 140, 121, 36, 121, 126, 121, + 45, 46, 47, 48, 109, 105, 24, 25, + 103, 51, 52, 52, 26, 103, 103, 45, + 55, 103, 59, 141, 61, 62, 4, 1, + 58, 63, 58, 58, 9, 58, 58, 58, + 64, 58, 45, 46, 47, 48, 142, 143, + 24, 144, 58, 145, 58, 52, 26, 58, + 58, 45, 55, 58, 22, 146, 146, 24, + 144, 58, 63, 58, 58, 26, 58, 145, + 58, 58, 147, 58, 145, 58, 145, 58, + 145, 58, 58, 58, 58, 145, 58, 45, + 58, 71, 22, 146, 146, 24, 144, 58, + 63, 58, 58, 58, 58, 58, 45, 58, + 149, 148, 150, 150, 148, 43, 148, 151, + 148, 150, 150, 148, 43, 148, 151, 148, + 151, 148, 148, 152, 148, 151, 148, 151, + 148, 151, 148, 148, 148, 148, 151, 148, + 45, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 52, 120, 120, 120, 120, 45, + 120, 0 }; -static const short _indic_syllable_machine_trans_targs[] = { - 138, 160, 166, 2, 167, 3, 5, 170, - 6, 8, 173, 9, 11, 176, 12, 14, - 15, 159, 17, 18, 175, 20, 21, 172, - 23, 24, 169, 179, 183, 184, 188, 189, - 193, 194, 198, 199, 138, 222, 228, 36, - 229, 37, 39, 232, 40, 42, 235, 43, - 45, 238, 46, 48, 49, 221, 51, 52, - 237, 54, 55, 234, 57, 58, 231, 241, - 245, 246, 250, 251, 255, 256, 260, 262, - 138, 283, 289, 70, 290, 138, 71, 73, - 293, 74, 76, 296, 77, 79, 299, 80, - 82, 83, 282, 85, 86, 298, 88, 89, - 295, 91, 92, 292, 302, 306, 307, 311, - 312, 316, 317, 321, 138, 346, 352, 103, - 353, 104, 106, 356, 107, 109, 359, 110, - 112, 362, 113, 115, 116, 345, 118, 119, - 361, 121, 122, 358, 124, 125, 355, 365, - 369, 370, 374, 375, 379, 380, 384, 385, - 323, 138, 398, 138, 139, 201, 263, 265, - 322, 324, 285, 325, 386, 387, 301, 396, - 403, 138, 140, 142, 33, 200, 162, 178, - 141, 32, 143, 196, 144, 146, 31, 195, - 145, 30, 147, 191, 148, 150, 29, 190, - 149, 28, 151, 186, 152, 154, 27, 185, - 153, 26, 155, 181, 156, 158, 25, 180, - 157, 1, 165, 0, 161, 164, 163, 138, - 168, 4, 22, 171, 7, 19, 174, 10, - 16, 177, 13, 182, 187, 192, 197, 138, - 202, 204, 67, 261, 224, 240, 203, 66, - 205, 258, 206, 208, 65, 257, 207, 64, - 209, 253, 210, 212, 63, 252, 211, 62, - 213, 248, 214, 216, 61, 247, 215, 60, - 217, 243, 218, 220, 59, 242, 219, 35, - 227, 34, 223, 226, 225, 138, 230, 38, - 56, 233, 41, 53, 236, 44, 50, 239, - 47, 244, 249, 254, 259, 138, 264, 100, - 266, 319, 267, 269, 99, 318, 268, 98, - 270, 314, 271, 273, 97, 313, 272, 96, - 274, 309, 275, 277, 95, 308, 276, 94, - 278, 304, 279, 281, 93, 303, 280, 69, - 288, 68, 284, 287, 286, 138, 291, 72, - 90, 294, 75, 87, 297, 78, 84, 300, - 81, 305, 310, 315, 320, 138, 138, 326, - 328, 134, 133, 348, 364, 327, 329, 382, - 330, 332, 132, 381, 331, 131, 333, 377, - 334, 336, 130, 376, 335, 129, 337, 372, - 338, 340, 128, 371, 339, 127, 341, 367, - 342, 344, 126, 366, 343, 102, 351, 101, - 347, 350, 349, 138, 354, 105, 123, 357, - 108, 120, 360, 111, 117, 363, 114, 368, - 373, 378, 383, 135, 388, 389, 395, 390, - 392, 136, 391, 394, 393, 138, 397, 137, - 400, 399, 402, 401, 138 +static const unsigned char _indic_syllable_machine_trans_targs[] = { + 39, 45, 50, 2, 51, 5, 6, 53, + 57, 58, 39, 67, 11, 73, 68, 14, + 15, 75, 80, 81, 84, 39, 89, 21, + 95, 90, 98, 39, 24, 25, 97, 103, + 39, 112, 30, 118, 113, 121, 33, 34, + 120, 126, 39, 137, 39, 40, 60, 85, + 87, 105, 106, 91, 107, 127, 128, 99, + 135, 140, 39, 41, 43, 8, 59, 46, + 54, 42, 1, 44, 48, 0, 47, 49, + 52, 3, 4, 55, 7, 56, 39, 61, + 63, 18, 83, 69, 76, 62, 9, 64, + 78, 71, 65, 17, 82, 66, 10, 70, + 72, 74, 12, 13, 77, 16, 79, 39, + 86, 26, 88, 101, 93, 19, 104, 20, + 92, 94, 96, 22, 23, 100, 27, 102, + 39, 39, 108, 110, 28, 35, 114, 122, + 109, 111, 124, 116, 29, 115, 117, 119, + 31, 32, 123, 36, 125, 129, 130, 134, + 131, 132, 37, 133, 39, 136, 38, 138, + 139 }; static const char _indic_syllable_machine_trans_actions[] = { 1, 0, 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, 3, 0, 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, - 4, 0, 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, 6, 2, 6, 2, - 6, 2, 6, 2, 7, 0, 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, - 6, 8, 0, 11, 2, 2, 6, 0, - 12, 12, 0, 2, 6, 2, 6, 2, - 0, 13, 2, 0, 0, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 14, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 15, - 2, 0, 0, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 16, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 17, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 2, 0, 0, 0, 0, 18, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 19, 20, 2, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 21, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 0, 0, 22, 22, 0, - 0, 0, 0, 0, 0, 23, 2, 0, - 0, 0, 0, 0, 24 + 2, 2, 3, 2, 0, 2, 0, 0, + 0, 2, 2, 2, 2, 4, 2, 0, + 5, 0, 5, 6, 0, 0, 5, 2, + 7, 2, 0, 2, 0, 2, 0, 0, + 2, 2, 8, 0, 11, 2, 2, 5, + 0, 12, 12, 0, 2, 5, 2, 5, + 2, 0, 13, 2, 0, 0, 2, 0, + 2, 2, 0, 2, 2, 0, 0, 2, + 2, 0, 0, 0, 0, 2, 14, 2, + 0, 0, 2, 0, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 0, 0, 2, 15, + 5, 0, 5, 2, 2, 0, 5, 0, + 0, 2, 5, 0, 0, 0, 0, 2, + 16, 17, 2, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 2, 2, + 0, 0, 0, 0, 2, 0, 18, 18, + 0, 0, 0, 0, 19, 2, 0, 0, + 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -823,6 +319,7 @@ 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, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -835,41 +332,7 @@ 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, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -877,6 +340,7 @@ 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, 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, @@ -889,102 +353,35 @@ 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; 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, 1, 1, 1, 1, - 1, 1, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 73, 73, 78, 78, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 73, - 1, 146, 0, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 342, 286, 342, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 286, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 414, 414, 414, 414, - 414, 414, 414, 342 + 1, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 22, 22, 28, 22, 22, + 22, 22, 22, 22, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 1, 43, 0, + 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 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, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 104, + 59, 59, 59, 59, 59, 59, 59, 149, + 149, 149, 149, 149, 121 }; -static const int indic_syllable_machine_start = 138; -static const int indic_syllable_machine_first_final = 138; +static const int indic_syllable_machine_start = 39; +static const int indic_syllable_machine_first_final = 39; static const int indic_syllable_machine_error = -1; -static const int indic_syllable_machine_en_main = 138; +static const int indic_syllable_machine_en_main = 39; #line 36 "hb-ot-shape-complex-indic-machine.rl" @@ -1010,7 +407,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1014 "hb-ot-shape-complex-indic-machine.hh" +#line 411 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1026,12 +423,12 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 1030 "hb-ot-shape-complex-indic-machine.hh" +#line 427 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; const unsigned char *_keys; - const short *_inds; + const unsigned char *_inds; if ( p == pe ) goto _test_eof; _resume: @@ -1040,7 +437,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 1044 "hb-ot-shape-complex-indic-machine.hh" +#line 441 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1062,26 +459,6 @@ _eof_trans: #line 1 "NONE" {te = p+1;} break; - case 14: -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (consonant_syllable); }} - break; - case 16: -#line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (vowel_syllable); }} - break; - case 21: -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (standalone_cluster); }} - break; - case 24: -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (symbol_cluster); }} - break; - case 18: -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; case 11: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} @@ -1090,23 +467,23 @@ _eof_trans: #line 84 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 15: + case 14: #line 85 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; - case 20: + case 17: #line 86 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; - case 23: + case 19: #line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 17: + case 15: #line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 19: + case 16: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; @@ -1130,7 +507,7 @@ _eof_trans: #line 88 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; - case 5: + case 6: #line 1 "NONE" { switch( act ) { case 1: @@ -1145,13 +522,13 @@ _eof_trans: } } break; - case 22: + case 18: #line 1 "NONE" {te = p+1;} #line 84 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; - case 6: + case 5: #line 1 "NONE" {te = p+1;} #line 88 "hb-ot-shape-complex-indic-machine.rl" @@ -1163,7 +540,7 @@ _eof_trans: #line 89 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1167 "hb-ot-shape-complex-indic-machine.hh" +#line 544 "hb-ot-shape-complex-indic-machine.hh" } _again: @@ -1172,7 +549,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 1176 "hb-ot-shape-complex-indic-machine.hh" +#line 553 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl index f7e022b98..a2a88af0d 100644 --- a/src/hb-ot-shape-complex-indic-machine.rl +++ b/src/hb-ot-shape-complex-indic-machine.rl @@ -64,14 +64,14 @@ reph = (Ra H | Repha); # possible reph cn = c.ZWJ?.n?; forced_rakar = ZWJ H ZWJ Ra; symbol = Symbol.N?; -matra_group = z{0,3}.M.N?.(H | forced_rakar)?; -syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?; +matra_group = z*.M.N?.(H | forced_rakar)?; +syllable_tail = (z?.SM.SM?.ZWNJ?)? A*; halant_group = (z?.H.(ZWJ.N?)?); final_halant_group = halant_group | H.ZWNJ; medial_group = CM?; -halant_or_matra_group = (final_halant_group | matra_group{0,4}); +halant_or_matra_group = (final_halant_group | matra_group*); -complex_syllable_tail = (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail; +complex_syllable_tail = (halant_group.cn)* medial_group halant_or_matra_group syllable_tail; consonant_syllable = (Repha|CS)? cn complex_syllable_tail; vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail); From 809c58708359bcc22bb1273069886f2cbf68be65 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:45:51 -0700 Subject: [PATCH 263/617] [config] Better compile away morx/kerx/trak Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape.cc | 38 ++++++++++++++------------------------ src/hb-ot-shape.hh | 12 +++++++++++- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 09b8a582a..89de00898 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -55,13 +55,9 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, const hb_feature_t *user_features, unsigned int num_user_features); -static bool +static inline bool _hb_apply_morx (hb_face_t *face) { -#ifdef HB_NO_SHAPE_AAT - return false; -#endif - if (hb_options ().aat && hb_aat_layout_has_substitution (face)) return true; @@ -79,18 +75,18 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac face (face), props (*props), map (face, props), - aat_map (face, props), - apply_morx (_hb_apply_morx (face)) + aat_map (face, props) +#ifndef HB_NO_SHAPE_AAT + , apply_morx (_hb_apply_morx (face)) +#endif { shaper = hb_ot_shape_complex_categorize (this); script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; script_fallback_mark_positioning = shaper->fallback_position; -#ifndef HB_NO_SHAPE_AAT if (apply_morx) shaper = &_hb_ot_complex_shaper_default; -#endif } void @@ -100,10 +96,8 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.props = props; plan.shaper = shaper; map.compile (plan.map, key); -#ifndef HB_NO_SHAPE_AAT if (apply_morx) aat_map.compile (plan.aat_map); -#endif plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c')); plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r')); @@ -132,7 +126,9 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, * Decide who does substitutions. GSUB, morx, or fallback. */ +#ifndef HB_NO_SHAPE_AAT plan.apply_morx = apply_morx; +#endif /* * Decide who does positioning. GPOS, kerx, kern, or fallback. @@ -154,8 +150,12 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (!plan.apply_kerx && !has_gpos_kern) { /* Apparently Apple applies kerx if GPOS kern was not applied. */ - if (hb_aat_layout_has_positioning (face)) + if (0) + ; +#ifndef HB_NO_SHAPE_AAT + else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif else if (hb_ot_layout_has_kerning (face)) plan.apply_kern = true; } @@ -172,8 +172,10 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing && script_fallback_mark_positioning; +#ifndef HB_NO_SHAPE_AAT /* Currently we always apply trak. */ plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face); +#endif } bool @@ -216,11 +218,9 @@ void hb_ot_shape_plan_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const { -#ifndef HB_NO_SHAPE_AAT if (unlikely (apply_morx)) hb_aat_layout_substitute (this, font, buffer); else -#endif map.substitute (this, font, buffer); } @@ -230,19 +230,15 @@ hb_ot_shape_plan_t::position (hb_font_t *font, { if (this->apply_gpos) map.position (this, font, buffer); -#ifndef HB_NO_SHAPE_AAT else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); -#endif else if (this->apply_kern) hb_ot_layout_kern (this, font, buffer); else _hb_ot_shape_fallback_kern (this, font, buffer); -#ifndef HB_NO_SHAPE_AAT if (this->apply_trak) hb_aat_layout_track (this, font, buffer); -#endif } @@ -338,7 +334,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, feature->value); } -#ifndef HB_NO_SHAPE_AAT if (planner->apply_morx) { hb_aat_map_builder_t *aat_map = &planner->aat_map; @@ -348,7 +343,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, aat_map->add_feature (feature->tag, feature->value); } } -#endif if (planner->shaper->override_features) planner->shaper->override_features (planner); @@ -783,10 +777,8 @@ static inline void hb_ot_substitute_post (const hb_ot_shape_context_t *c) { hb_ot_hide_default_ignorables (c->buffer, c->font); -#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_remove_deleted_glyphs (c->buffer); -#endif if (c->plan->shaper->postprocess_glyphs) c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font); @@ -920,10 +912,8 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) /* Finish off. Has to follow a certain order. */ hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c->buffer); -#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_zero_width_deleted_glyphs (c->buffer); -#endif hb_ot_layout_position_finish_offsets (c->font, c->buffer); /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index 73a11e1af..b7c0f1065 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -80,10 +80,16 @@ struct hb_ot_shape_plan_t bool adjust_mark_positioning_when_zeroing : 1; bool apply_gpos : 1; - bool apply_kerx : 1; bool apply_kern : 1; +#ifndef HB_NO_SHAPE_AAT + bool apply_kerx : 1; bool apply_morx : 1; bool apply_trak : 1; +#else + static constexpr bool apply_kerx = false; + static constexpr bool apply_morx = false; + static constexpr bool apply_trak = false; +#endif void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const { @@ -113,7 +119,11 @@ struct hb_ot_shape_planner_t hb_segment_properties_t props; hb_ot_map_builder_t map; hb_aat_map_builder_t aat_map; +#ifndef HB_NO_SHAPE_AAT bool apply_morx : 1; +#else + static constexpr bool apply_morx = false; +#endif bool script_zero_marks : 1; bool script_fallback_mark_positioning : 1; const struct hb_ot_complex_shaper_t *shaper; From 73943bdf21a96f4e12cb9efd8458a2711de0d870 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 14:48:31 -0700 Subject: [PATCH 264/617] Adjust uniscribe_bug_compatible mode More correct behavior. We were commenting out some legit conditions before. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape-complex-indic.cc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 37cd1ce8f..f8cb5741b 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -276,6 +276,8 @@ struct indic_shape_plan_t bool is_old_spec; #ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE bool uniscribe_bug_compatible; +#else + static constexpr bool uniscribe_bug_compatible = false; #endif mutable hb_atomic_int_t virama_glyph; @@ -925,7 +927,6 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, /* We treat placeholder/dotted-circle as if they are consonants, so we * should just chain. Only if not in compatibility mode that is... */ -#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; if (indic_plan->uniscribe_bug_compatible) { @@ -935,7 +936,6 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, if (buffer->info[end - 1].indic_category() == OT_DOTTEDCIRCLE) return; } -#endif initial_reordering_consonant_syllable (plan, face, buffer, start, end); } @@ -1375,7 +1375,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * Uniscribe doesn't do this. * TEST: U+0930,U+094D,U+0915,U+094B,U+094D */ -#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE if (!indic_plan->uniscribe_bug_compatible && unlikely (is_halant (info[new_reph_pos]))) { @@ -1385,7 +1384,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, new_reph_pos--; } } -#endif goto reph_move; } @@ -1485,7 +1483,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* * Finish off the clusters and go home! */ -#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE if (indic_plan->uniscribe_bug_compatible) { switch ((hb_tag_t) plan->props.script) @@ -1503,7 +1500,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, break; } } -#endif } @@ -1602,7 +1598,6 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, */ -#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data; hb_codepoint_t glyph; if (indic_plan->uniscribe_bug_compatible || @@ -1614,7 +1609,6 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, *b = ab; return true; } -#endif } return (bool) c->unicode->decompose (ab, a, b); From a5fb44a8cbbaad194ddf6d02a6b6c98b0b637149 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 13 May 2019 14:57:40 -0700 Subject: [PATCH 265/617] [subset] Fix shadowed 'groups' param in cmap. --- src/hb-ot-cmap-table.hh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index cec78d77c..ffa767dab 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -518,25 +518,25 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented bool serialize (hb_serialize_context_t *c, - const hb_sorted_vector_t &groups) + const hb_sorted_vector_t &groups_data) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); this->format = 12; this->reserved = 0; - this->length = get_sub_table_size (groups); + this->length = get_sub_table_size (groups_data); - return_trace (CmapSubtableLongSegmented::serialize (c, groups)); + return_trace (CmapSubtableLongSegmented::serialize (c, groups_data)); } - static size_t get_sub_table_size (const hb_sorted_vector_t &groups) + static size_t get_sub_table_size (const hb_sorted_vector_t &groups_data) { - return 16 + 12 * groups.length; + return 16 + 12 * groups_data.length; } static bool create_sub_table_plan (const hb_subset_plan_t *plan, - hb_sorted_vector_t *groups) + hb_sorted_vector_t *groups_out) { CmapSubtableLongGroup *group = nullptr; @@ -551,7 +551,7 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented if (!group || !_is_gid_consecutive (group, cp, new_gid)) { - group = groups->push (); + group = groups_out->push (); group->startCharCode = cp; group->endCharCode = cp; group->glyphID = new_gid; @@ -560,8 +560,8 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented } DEBUG_MSG(SUBSET, nullptr, "cmap"); - for (unsigned int i = 0; i < groups->length; i++) { - CmapSubtableLongGroup& group = (*groups)[i]; + for (unsigned int i = 0; i < groups_out->length; i++) { + CmapSubtableLongGroup& group = (*groups_out)[i]; DEBUG_MSG(SUBSET, nullptr, " %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode)); } From 7e02063f3202712b4e5fbddac0354adadb924f72 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 15:26:00 -0700 Subject: [PATCH 266/617] [iter] Minor --- src/hb-iter.hh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index cf3e1fe9d..d749d4aac 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -345,13 +345,13 @@ operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward (rhs) (hb_forw /* hb_map(), hb_filter(), hb_reduce() */ -enum sorted_t { +enum class hb_function_sortedness_t { NOT_SORTED, RETAINS_SORTING, SORTED, }; -template struct hb_map_iter_t : hb_iter_t, @@ -362,7 +362,8 @@ struct hb_map_iter_t : typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; static constexpr bool is_sorted_iterator = - Sorted == SORTED ? true : Sorted == RETAINS_SORTING ? Iter::is_sorted_iterator : false; + Sorted == hb_function_sortedness_t::SORTED ? true + : Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : false; __item_t__ __item__ () const { return hb_get (f.get (), *it); } __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } bool __more__ () const { return bool (it); } @@ -380,7 +381,7 @@ struct hb_map_iter_t : hb_reference_wrapper f; }; -template +template struct hb_map_iter_factory_t { hb_map_iter_factory_t (Proj f) : f (f) {} @@ -397,25 +398,25 @@ struct hb_map_iter_factory_t struct { template - hb_map_iter_factory_t + hb_map_iter_factory_t operator () (Proj&& f) const - { return hb_map_iter_factory_t (f); } + { return hb_map_iter_factory_t (f); } } HB_FUNCOBJ (hb_map); struct { template - hb_map_iter_factory_t + hb_map_iter_factory_t operator () (Proj&& f) const - { return hb_map_iter_factory_t (f); } + { return hb_map_iter_factory_t (f); } } HB_FUNCOBJ (hb_map_retains_sorting); struct { template - hb_map_iter_factory_t + hb_map_iter_factory_t operator () (Proj&& f) const - { return hb_map_iter_factory_t (f); } + { return hb_map_iter_factory_t (f); } } HB_FUNCOBJ (hb_map_sorted); From 513762849a683914fc266a17ddf38f133cccf072 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 15:36:14 -0700 Subject: [PATCH 267/617] [iter] Track strictly-sorted iterators This make output of hb_enumerate() sorted regardless of input iterator. --- src/hb-array.hh | 2 +- src/hb-iter.hh | 30 +++++++++++++++++++++--------- src/hb-ot-layout-common.hh | 2 +- src/hb-set.hh | 2 +- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 705bc6a46..6f6fd7fb1 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -226,7 +226,7 @@ struct hb_sorted_array_t : typedef hb_iter_t, Type&> iter_base_t; HB_ITER_USING (iter_base_t); static constexpr bool is_random_access_iterator = true; - static constexpr bool is_sorted_iterator = true; + static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::SORTED; hb_sorted_array_t () : hb_array_t () {} hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t (array_, length_) {} diff --git a/src/hb-iter.hh b/src/hb-iter.hh index d749d4aac..a1fe90420 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -55,6 +55,12 @@ * type of .end()? */ +enum hb_sortedness_t +{ + NOT_SORTED = 0, + SORTED, + STRICTLY_SORTED, +}; /* * Base classes for iterators. @@ -68,7 +74,7 @@ struct hb_iter_t static constexpr unsigned item_size = hb_static_size (Item); static constexpr bool is_iterator = true; static constexpr bool is_random_access_iterator = false; - static constexpr bool is_sorted_iterator = false; + static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::NOT_SORTED; private: /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -361,9 +367,9 @@ struct hb_map_iter_t : typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - static constexpr bool is_sorted_iterator = - Sorted == hb_function_sortedness_t::SORTED ? true - : Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : false; + static constexpr hb_sortedness_t is_sorted_iterator = + Sorted == hb_function_sortedness_t::SORTED ? hb_sortedness_t::SORTED + : Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : hb_sortedness_t::NOT_SORTED; __item_t__ __item__ () const { return hb_get (f.get (), *it); } __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } bool __more__ () const { return bool (it); } @@ -430,7 +436,7 @@ struct hb_filter_iter_t : { while (it && !hb_has (p.get (), hb_get (f.get (), *it))) ++it; } typedef typename Iter::item_t __item_t__; - static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; + static constexpr hb_sortedness_t is_sorted_iterator = Iter::is_sorted_iterator; __item_t__ __item__ () const { return *it; } bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } @@ -514,9 +520,15 @@ struct hb_zip_iter_t : static constexpr bool is_random_access_iterator = A::is_random_access_iterator && B::is_random_access_iterator; - static constexpr bool is_sorted_iterator = - A::is_sorted_iterator && - B::is_sorted_iterator; + static constexpr hb_sortedness_t is_sorted_iterator = + (A::is_sorted_iterator == hb_sortedness_t::NOT_SORTED || + B::is_sorted_iterator == hb_sortedness_t::NOT_SORTED) ? + hb_sortedness_t::NOT_SORTED : + (A::is_sorted_iterator == hb_sortedness_t::STRICTLY_SORTED || + B::is_sorted_iterator == hb_sortedness_t::STRICTLY_SORTED) ? + hb_sortedness_t::STRICTLY_SORTED : + hb_sortedness_t::SORTED; + __item_t__ __item__ () const { return __item_t__ (*a, *b); } __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } bool __more__ () const { return bool (a) && bool (b); } @@ -583,7 +595,7 @@ struct hb_counter_iter_t : typedef T __item_t__; static constexpr bool is_random_access_iterator = true; - static constexpr bool is_sorted_iterator = true; + static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; __item_t__ __item__ () const { return +v; } __item_t__ __item_at__ (unsigned j) const { return v + j * step; } bool __more__ () const { return v != end_; } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 71c0ca4a9..67f2617fe 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1115,7 +1115,7 @@ struct Coverage struct iter_t : hb_iter_with_fallback_t { - static constexpr bool is_sorted_iterator = true; + static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; iter_t (const Coverage &c_ = Null(Coverage)) { memset (this, 0, sizeof (*this)); diff --git a/src/hb-set.hh b/src/hb-set.hh index 332e07bd0..d9ffded57 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -691,7 +691,7 @@ struct hb_set_t */ struct iter_t : hb_iter_with_fallback_t { - static constexpr bool is_sorted_iterator = true; + static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; iter_t (const hb_set_t &s_ = Null(hb_set_t)) : s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); } From c572732f29787d1cf7ff39b8160b3935d4b13ba4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 15:41:09 -0700 Subject: [PATCH 268/617] Fix more excess semi-colon errors --- src/hb-common.cc | 2 +- src/hb-ot-name.cc | 4 ++-- src/hb-ot-shape-complex-indic.hh | 2 +- src/hb-ot-shape-complex-khmer.hh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index 70be6939b..6429b8347 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -67,7 +67,7 @@ _hb_options_init () p = c + strlen (c); #define OPTION(name, symbol) \ - if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) u.opts.symbol = true; + if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) do { u.opts.symbol = true; } while (0) OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible); OPTION ("aat", aat); diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc index f7cd427ac..5cd1cc118 100644 --- a/src/hb-ot-name.cc +++ b/src/hb-ot-name.cc @@ -98,7 +98,7 @@ hb_ot_name_convert_utf (hb_bytes_t bytes, dst = dst_next; src = src_next; - }; + } *text_size = dst - text; *dst = 0; /* NUL-terminate. */ @@ -110,7 +110,7 @@ hb_ot_name_convert_utf (hb_bytes_t bytes, { src = in_utf_t::next (src, src_end, &unicode, replacement); dst_len += out_utf_t::encode_len (unicode); - }; + } return dst_len; } diff --git a/src/hb-ot-shape-complex-indic.hh b/src/hb-ot-shape-complex-indic.hh index 13ab51679..dc8f8c7ce 100644 --- a/src/hb-ot-shape-complex-indic.hh +++ b/src/hb-ot-shape-complex-indic.hh @@ -278,7 +278,7 @@ matra_position_indic (hb_codepoint_t u, indic_position_t side) case POS_POST_C: return MATRA_POS_RIGHT (u); case POS_ABOVE_C: return MATRA_POS_TOP (u); case POS_BELOW_C: return MATRA_POS_BOTTOM (u); - }; + } return side; } diff --git a/src/hb-ot-shape-complex-khmer.hh b/src/hb-ot-shape-complex-khmer.hh index 622294588..21015c730 100644 --- a/src/hb-ot-shape-complex-khmer.hh +++ b/src/hb-ot-shape-complex-khmer.hh @@ -105,7 +105,7 @@ set_khmer_properties (hb_glyph_info_t &info) case POS_ABOVE_C: cat = OT_VAbv; break; case POS_POST_C: cat = OT_VPst; break; default: assert (0); - }; + } info.khmer_category() = cat; } From 4d3cf2adb669c345cc43832d11689271995e160a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 17:25:07 -0700 Subject: [PATCH 269/617] [iter] Fix zip iterator sortedness classification logic --- src/hb-iter.hh | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index a1fe90420..906d54e33 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -521,13 +521,8 @@ struct hb_zip_iter_t : A::is_random_access_iterator && B::is_random_access_iterator; static constexpr hb_sortedness_t is_sorted_iterator = - (A::is_sorted_iterator == hb_sortedness_t::NOT_SORTED || - B::is_sorted_iterator == hb_sortedness_t::NOT_SORTED) ? - hb_sortedness_t::NOT_SORTED : - (A::is_sorted_iterator == hb_sortedness_t::STRICTLY_SORTED || - B::is_sorted_iterator == hb_sortedness_t::STRICTLY_SORTED) ? - hb_sortedness_t::STRICTLY_SORTED : - hb_sortedness_t::SORTED; + A::is_sorted_iterator == hb_sortedness_t::SORTED ? + B::is_sorted_iterator : A::is_sorted_iterator; __item_t__ __item__ () const { return __item_t__ (*a, *b); } __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } From 68e12e68f813bfd22dda040463d042cc06b958ec Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 17:28:59 -0700 Subject: [PATCH 270/617] Fix more semi-colon issues --- src/hb-coretext.cc | 4 ++-- src/hb-directwrite.cc | 4 ++-- src/hb-graphite2.cc | 4 ++-- src/hb-uniscribe.cc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 383428570..85993d196 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -608,7 +608,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, #define ALLOCATE_ARRAY(Type, name, len, on_no_room) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ if (unlikely (_consumed > scratch_size)) \ { \ @@ -617,7 +617,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, /*nothing*/); unsigned int chars_len = 0; diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 6b2761e83..057ae3305 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -530,12 +530,12 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size); #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) #define utf16_index() var1.u32 diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index 5b1ba4515..f799f8b22 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -310,12 +310,12 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) ALLOCATE_ARRAY (hb_graphite2_cluster_t, clusters, buffer->len); ALLOCATE_ARRAY (hb_codepoint_t, gids, glyph_count); diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 4e004416b..f97ed91fc 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -728,12 +728,12 @@ retry: #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) #define utf16_index() var1.u32 From 70fe9e73555f3354238f7cda5ff0f0c0b75e1d62 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 17:35:02 -0700 Subject: [PATCH 271/617] Fix moreeeeeeeeeee --- src/hb-icu.cc | 28 +++++++++++++++------------- src/hb-subset-plan.cc | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/hb-icu.cc b/src/hb-icu.cc index 99305ae55..d6e8ec7b6 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -49,6 +49,8 @@ * Functions for using HarfBuzz with the ICU library to provide Unicode data. **/ +/* ICU doesn't do-while(0) around their statements. Ouch! */ +#define HB_ICU_STMT(S) do { S } while (0) hb_script_t hb_icu_script_to_script (UScriptCode script) @@ -183,9 +185,9 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = 0; err = false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err)); if (err) return false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err)); if (err) return false; icu_err = U_ZERO_ERROR; @@ -193,7 +195,7 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (U_FAILURE (icu_err)) return false; if (u_countChar32 (normalized, len) == 1) { - U16_GET_UNSAFE (normalized, 0, *ab); + HB_ICU_STMT (U16_GET_UNSAFE (normalized, 0, *ab)); ret = true; } else { ret = false; @@ -221,13 +223,13 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = u_countChar32 (decomposed, len); if (len == 1) { - U16_GET_UNSAFE (decomposed, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (decomposed, 0, *a)); *b = 0; return *a != ab; } else if (len == 2) { len =0; - U16_NEXT_UNSAFE (decomposed, len, *a); - U16_NEXT_UNSAFE (decomposed, len, *b); + HB_ICU_STMT (U16_NEXT_UNSAFE (decomposed, len, *a)); + HB_ICU_STMT (U16_NEXT_UNSAFE (decomposed, len, *b)); } return true; } @@ -247,7 +249,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = 0; err = false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err)); if (err) return false; icu_err = U_ZERO_ERROR; @@ -258,13 +260,13 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = u_countChar32 (normalized, len); if (len == 1) { - U16_GET_UNSAFE (normalized, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (normalized, 0, *a)); *b = 0; ret = *a != ab; } else if (len == 2) { len =0; - U16_NEXT_UNSAFE (normalized, len, *a); - U16_NEXT_UNSAFE (normalized, len, *b); + HB_ICU_STMT (U16_NEXT_UNSAFE (normalized, len, *a)); + HB_ICU_STMT (U16_NEXT_UNSAFE (normalized, len, *b)); /* Here's the ugly part: if ab decomposes to a single character and * that character decomposes again, we have to detect that and undo @@ -275,7 +277,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (U_FAILURE (icu_err)) return false; hb_codepoint_t c; - U16_GET_UNSAFE (recomposed, 0, c); + HB_ICU_STMT (U16_GET_UNSAFE (recomposed, 0, c)); if (c != *a && c != ab) { *a = c; *b = 0; @@ -284,7 +286,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } else { /* If decomposed to more than two characters, take the last one, * and recompose the rest to get the first component. */ - U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */ + HB_ICU_STMT (U16_PREV_UNSAFE (normalized, len, *b)); /* Changes len in-place. */ UChar recomposed[18 * 2]; icu_err = U_ZERO_ERROR; len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err); @@ -293,7 +295,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, /* We expect that recomposed has exactly one character now. */ if (unlikely (u_countChar32 (recomposed, len) != 1)) return false; - U16_GET_UNSAFE (recomposed, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (recomposed, 0, *a)); ret = true; } diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index bbbfacb38..6eb78916f 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -176,7 +176,7 @@ _create_old_gid_to_new_gid_map (const hb_face_t *face, | hb_map ([=] (hb_codepoint_t _) { return hb_pair_t (_, _); }) - | hb_sink (reverse_glyph_map); + | hb_sink (reverse_glyph_map) ; // TODO(grieger): Should we discard glyphs past the max glyph to keep? From f76e9f2ede76a189d48ddd4f2275442d8e849815 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 17:39:46 -0700 Subject: [PATCH 272/617] [icu] Comment --- src/hb-icu.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-icu.cc b/src/hb-icu.cc index d6e8ec7b6..399829a81 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -49,7 +49,8 @@ * Functions for using HarfBuzz with the ICU library to provide Unicode data. **/ -/* ICU doesn't do-while(0) around their statements. Ouch! */ +/* ICU doesn't do-while(0) around their statements. Ugh! + * https://unicode-org.atlassian.net/browse/CLDR-13027 */ #define HB_ICU_STMT(S) do { S } while (0) hb_script_t From 0a01deb76fa582afa83da70a09478299d8080827 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 18:04:09 -0700 Subject: [PATCH 273/617] One more warning fix No idea where these appear from... --- src/hb-ot-cff-common.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index 5d80943b7..ef72feddd 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -97,12 +97,12 @@ struct CFFIndex unsigned int offset_array_size () const { return calculate_offset_array_size (offSize, count); } - static unsigned int calculate_serialized_size (unsigned int offSize, unsigned int count, unsigned int dataSize) + static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count, unsigned int dataSize) { if (count == 0) return COUNT::static_size; else - return min_size + calculate_offset_array_size (offSize, count) + dataSize; + return min_size + calculate_offset_array_size (offSize_, count) + dataSize; } bool serialize (hb_serialize_context_t *c, const CFFIndex &src) From 42ae468a8a76e1e4e6a8121eec5dc118f52086ee Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 23:43:45 -0700 Subject: [PATCH 274/617] [config] Add NDEBUG and HB_NDEBUG Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 10 ++++++++++ src/hb.hh | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index c34d7fbcb..caff9d83e 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -40,10 +40,14 @@ #define HB_LEAN #define HB_MINI #define HB_NO_MT +#ifndef NDEBUG +#define NDEBUG +#endif #endif #ifdef HB_LEAN #define HB_DISABLE_DEPRECATED +#define HB_NDEBUG #define HB_NO_ATEXIT #define HB_NO_BUFFER_SERIALIZE #define HB_NO_BITMAP @@ -103,6 +107,12 @@ #define HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS #endif +#ifdef NDEBUG +#ifndef HB_NDEBUG +#define HB_NDEBUG +#endif +#endif + #ifdef HAVE_CONFIG_OVERRIDE_H #include "config-override.h" diff --git a/src/hb.hh b/src/hb.hh index 47f24af1e..e6d22fe3b 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -468,16 +468,6 @@ typedef uint64_t hb_vector_size_impl_t; #endif -/* HB_NDEBUG disables some sanity checks that are very safe to disable and - * should be disabled in production systems. If NDEBUG is defined, enable - * HB_NDEBUG; but if it's desirable that normal assert()s (which are very - * light-weight) to be enabled, then HB_DEBUG can be defined to disable - * the costlier checks. */ -#ifdef NDEBUG -#define HB_NDEBUG 1 -#endif - - /* Flags */ /* Enable bitwise ops on enums marked as flags_t */ From b2ab15a78c219016e20389582716e0ac0ee8aeb5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 13 May 2019 23:47:28 -0700 Subject: [PATCH 275/617] Fix more warnings --- src/hb-ot-cff1-table.hh | 8 ++++---- src/hb-subset-cff1.cc | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh index f7ec00c34..8aac5486c 100644 --- a/src/hb-ot-cff1-table.hh +++ b/src/hb-ot-cff1-table.hh @@ -599,9 +599,9 @@ struct CFF1StringIndex : CFF1Index } /* in parallel to above */ - unsigned int calculate_serialized_size (unsigned int &offSize /*OUT*/, const remap_t &sidmap) const + unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const remap_t &sidmap) const { - offSize = 0; + offSize_ = 0; if ((count == 0) || (sidmap.get_count () == 0)) return count.static_size; @@ -610,8 +610,8 @@ struct CFF1StringIndex : CFF1Index if (sidmap[i] != CFF_UNDEF_CODE) dataSize += length_at (i); - offSize = calcOffSize(dataSize); - return CFF1Index::calculate_serialized_size (offSize, sidmap.get_count (), dataSize); + offSize_ = calcOffSize(dataSize); + return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_count (), dataSize); } }; diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index 64b8b151b..cfecab6ba 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -396,8 +396,8 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t { - cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc, const hb_subset_plan_t *plan) - : subr_subsetter_t (acc, plan) {} + cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_) + : subr_subsetter_t (acc_, plan_) {} static void finalize_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring) { From f39934983f459c992e27075cd2c45ac0025183d0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 00:13:21 -0700 Subject: [PATCH 276/617] [ucdn] Fix Hangul composition https://github.com/grigorig/ucdn/issues/23 --- src/hb-ucdn/ucdn.c | 3 ++- test/api/test-unicode.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-ucdn/ucdn.c b/src/hb-ucdn/ucdn.c index 30747fea2..f7b33d645 100644 --- a/src/hb-ucdn/ucdn.c +++ b/src/hb-ucdn/ucdn.c @@ -163,7 +163,8 @@ static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b) static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b) { - if (a >= SBASE && a < (SBASE + SCOUNT) && b >= TBASE && b < (TBASE + TCOUNT)) { + if (a >= SBASE && a < (SBASE + SCOUNT) && b > TBASE && b < (TBASE + TCOUNT) && + !((a - SBASE) % TCOUNT)) { /* LV,T */ *code = a + (b - TBASE); return 3; diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c index 6195bb286..0587c6e7f 100644 --- a/test/api/test-unicode.c +++ b/test/api/test-unicode.c @@ -755,6 +755,10 @@ test_unicode_normalization (gconstpointer user_data) g_assert (hb_unicode_compose (uf, 0xCE20, 0x11B8, &ab) && ab == 0xCE31); g_assert (hb_unicode_compose (uf, 0x110E, 0x1173, &ab) && ab == 0xCE20); + g_assert (!hb_unicode_compose (uf, 0xAC00, 0x11A7, &ab)); + g_assert (hb_unicode_compose (uf, 0xAC00, 0x11A8, &ab) && ab == 0xAC01); + g_assert (!hb_unicode_compose (uf, 0xAC01, 0x11A8, &ab)); + /* Test decompose() */ From c73d7ba75d4556d9b8e05b10d6572f74f4814f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Tue, 14 May 2019 13:26:18 +0300 Subject: [PATCH 277/617] Fix building with HB_NO_SUBSET_LAYOUT Fixes an unused function warning when building with HB_NO_SUBSET_LAYOUT as part of the Chrome build. --- src/hb-subset-plan.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 6eb78916f..e475676a5 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -68,6 +68,7 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff, } #endif +#ifndef HB_NO_SUBSET_LAYOUT static inline void _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) { @@ -82,6 +83,7 @@ _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) &lookup_indices, gids_to_retain); } +#endif static inline void _remove_invalid_gids (hb_set_t *glyphs, From 9e7c9c3adb33b06610951be38f3c820342333092 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 14 May 2019 15:58:51 +0430 Subject: [PATCH 278/617] Fix -Wunused-function on HB_NO_SHAPE_AAT We should add a bot for it Part of #1652 --- src/hb-ot-shape.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 89de00898..c63c3adee 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -55,6 +55,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, const hb_feature_t *user_features, unsigned int num_user_features); +#ifndef HB_NO_SHAPE_AAT static inline bool _hb_apply_morx (hb_face_t *face) { @@ -69,6 +70,7 @@ _hb_apply_morx (hb_face_t *face) 0, nullptr, nullptr)) && hb_aat_layout_has_substitution (face); } +#endif hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *face, const hb_segment_properties_t *props) : From d1baf99697d215584b2ecb8d2d38ba5b9045955c Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 14 May 2019 16:16:46 +0430 Subject: [PATCH 279/617] [ci] add HB_TINY to asmjs builder --- .circleci/config.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 87d752589..e70d36d9c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -213,17 +213,17 @@ jobs: - run: CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test - run: ninja -Cbuild install - cmake-oracledeveloperstudio: - docker: - - image: fedora - steps: - - checkout - - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python libnsl || true - - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner - - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H. - - run: make -Cbuild -j32 - - run: CTEST_OUTPUT_ON_FAILURE=1 make -Cbuild test - - run: make -Cbuild install + #cmake-oracledeveloperstudio: + # docker: + # - image: fedora + # steps: + # - checkout + # - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python libnsl || true + # - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner + # - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H. + # - run: make -Cbuild -j32 + # - run: CTEST_OUTPUT_ON_FAILURE=1 make -Cbuild test + # - run: make -Cbuild install crosscompile-notest-djgpp: docker: @@ -253,12 +253,12 @@ jobs: - run: cmake -Bbuild -H. -GNinja - run: ninja -Cbuild - crosscompile-cmake-notest-browser-asmjs: + crosscompile-cmake-notest-browser-asmjs-hb_tiny: docker: - image: dockcross/browser-asmjs steps: - checkout - - run: cmake -Bbuild -H. -GNinja + - run: cmake -Bbuild -H. -GNinja -DCMAKE_CXX_FLAGS="-DHB_TINY" - run: ninja -Cbuild crosscompile-cmake-notest-linux-arm64: @@ -322,7 +322,7 @@ workflows: ## cmake - crosscompile-cmake-notest-android-arm - - crosscompile-cmake-notest-browser-asmjs + - crosscompile-cmake-notest-browser-asmjs-hb_tiny - crosscompile-cmake-notest-linux-arm64 - crosscompile-cmake-notest-linux-mips #- crosscompile-cmake-notest-windows-x64 From ff7995200e706f3161b9fc5c27bb950e3d87e8e2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 07:44:03 -0700 Subject: [PATCH 280/617] Hopefully last warning fix --- src/hb-subset-cff2.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 729457889..5977b5669 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -227,8 +227,8 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t { - cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc, const hb_subset_plan_t *plan) - : subr_subsetter_t (acc, plan) {} + cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_) + : subr_subsetter_t (acc_, plan_) {} static void finalize_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring) { From 02e5e5d939be36d8f108029601a1ce1f533e5ccb Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 13 May 2019 09:38:42 -0700 Subject: [PATCH 281/617] [subset] retian nameids from STAT and fvar tables --- src/hb-ot-stat-table.hh | 76 ++++++++++++++++++++++++++++++++++--- src/hb-ot-var-fvar-table.hh | 21 ++++++++++ src/hb-subset-plan.cc | 26 +++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index e29d1ced7..0f75cd329 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -65,6 +65,8 @@ struct AxisValueFormat1 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 1. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -88,6 +90,8 @@ struct AxisValueFormat2 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 2. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -115,6 +119,8 @@ struct AxisValueFormat3 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 3. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -157,6 +163,8 @@ struct AxisValueFormat4 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 4. */ HBUINT16 axisCount; /* The total number of axes contributing to @@ -191,6 +199,18 @@ struct AxisValue } } + hb_ot_name_id_t get_value_name_id () const + { + switch (u.format) + { + case 1: return u.format1.get_value_name_id (); + case 2: return u.format2.get_value_name_id (); + case 3: return u.format3.get_value_name_id (); + case 4: return u.format4.get_value_name_id (); + default: return HB_OT_NAME_ID_INVALID; + } + } + protected: union { @@ -212,6 +232,8 @@ struct StatAxisRecord return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_name_id () const { return nameID; } + protected: Tag tag; /* A tag identifying the axis of design variation. */ NameID nameID; /* The name ID for entries in the 'name' table that @@ -231,17 +253,59 @@ struct STAT { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - majorVersion == 1 && - minorVersion > 0 && + version.major == 1 && + version.minor > 0 && designAxesOffset.sanitize (c, this, designAxisCount) && offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); } + + bool has_data () const { return version.to_int (); } + + unsigned get_design_axis_count () const { return designAxisCount; } + + hb_ot_name_id_t get_axis_record_name_id (unsigned axis_record_index) const + { + if (unlikely (axis_record_index >= designAxisCount)) return HB_OT_NAME_ID_INVALID; + const StatAxisRecord &axis_record = get_design_axes ()[axis_record_index]; + return axis_record.get_name_id (); + } + + unsigned get_axis_value_count () const { return axisValueCount; } + + hb_ot_name_id_t get_axis_value_name_id (unsigned axis_value_index) const + { + if (unlikely (axis_value_index >= axisValueCount)) return HB_OT_NAME_ID_INVALID; + const AxisValue &axis_value = (this + get_axis_value_offsets ()[axis_value_index]); + return axis_value.get_value_name_id (); + } + + void collect_name_ids (hb_set_t *nameids_to_retain) const + { + if (!has_data ()) return; + + + get_design_axes () + | hb_map (&StatAxisRecord::get_name_id) + | hb_sink (nameids_to_retain) + ; + + + get_axis_value_offsets () + | hb_map ([&] (const OffsetTo& _) -> const AxisValue* { return hb_addressof (this + _); }) + | hb_map (&AxisValue::get_value_name_id) + | hb_sink (nameids_to_retain) + ; + } protected: - HBUINT16 majorVersion; /* Major version number of the style attributes - * table — set to 1. */ - HBUINT16 minorVersion; /* Minor version number of the style attributes - * table — set to 2. */ + hb_array_t const get_design_axes () const + { return (this+designAxesOffset).as_array (designAxisCount); } + + hb_array_t> const get_axis_value_offsets () const + { return (this+offsetToAxisValueOffsets).as_array (axisValueCount); } + + + protected: + FixedVersion<>version; /* Version of the stat table + * initially set to 0x00010002u */ HBUINT16 designAxisSize; /* The size in bytes of each axis record. */ HBUINT16 designAxisCount;/* The number of design axis records. In a * font with an 'fvar' table, this value must be diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index aa89dce26..3c6a95aa6 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -280,6 +280,27 @@ struct fvar return axisCount; } + void collect_name_ids (hb_set_t *nameids) const + { + if (!has_data ()) return; + + + get_axes () + | hb_map (&AxisRecord::axisNameID) + | hb_sink (nameids) + ; + + + hb_range ((unsigned) instanceCount) + | hb_map ([&] (const unsigned _) -> unsigned { return get_instance_subfamily_name_id (_); }) + | hb_sink (nameids) + ; + + + hb_range ((unsigned) instanceCount) + | hb_map ([&] (const unsigned _) -> unsigned { return get_instance_postscript_name_id (_); }) + | hb_sink (nameids) + ; + } + + protected: hb_array_t get_axes () const { return hb_array (&(this+firstAxis), axisCount); } diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index e475676a5..0c1c7a254 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -31,6 +31,8 @@ #include "hb-ot-cmap-table.hh" #include "hb-ot-glyf-table.hh" #include "hb-ot-cff1-table.hh" +#include "hb-ot-var-fvar-table.hh" +#include "hb-ot-stat-table.hh" static inline void _add_gid_and_children (const OT::glyf::accelerator_t &glyf, @@ -192,6 +194,29 @@ _create_old_gid_to_new_gid_map (const hb_face_t *face, ; } +static void +_nameid_closure (hb_face_t *face, + hb_set_t *nameids) +{ + hb_tag_t table_tags[32]; + unsigned count = ARRAY_LENGTH (table_tags); + hb_face_get_table_tags (face, 0, &count, table_tags); + for (unsigned int i = 0; i < count; i++) + { + hb_tag_t tag = table_tags[i]; + switch (tag) { + case HB_OT_TAG_STAT: + face->table.STAT->collect_name_ids (nameids); + break; + case HB_OT_TAG_fvar: + face->table.fvar->collect_name_ids (nameids); + break; + default: + break; + } + } +} + /** * hb_subset_plan_create: * Computes a plan for subsetting the supplied face according @@ -217,6 +242,7 @@ hb_subset_plan_create (hb_face_t *face, /* TODO Clean this up... */ if (hb_set_is_empty (plan->name_ids)) hb_set_add_range (plan->name_ids, 0, 0x7FFF); + _nameid_closure (face, plan->name_ids); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); plan->codepoint_to_glyph = hb_map_create (); From b4eff38397c2a4e475f426df38e040dddf94a4fa Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 09:07:20 -0700 Subject: [PATCH 282/617] Start of gen-ucd.py, to replace UCDN --- src/gen-ucd.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 src/gen-ucd.py diff --git a/src/gen-ucd.py b/src/gen-ucd.py new file mode 100755 index 000000000..d97085e69 --- /dev/null +++ b/src/gen-ucd.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +from __future__ import print_function, division, absolute_import + +import io, os.path, sys + +if len (sys.argv) != 2: + print ("usage: ./gen-ucd ucdxml-file", file=sys.stderr) + sys.exit (1) + +import youseedy, packTab + +ucd = youseedy.load_ucdxml (sys.argv[1]) + +gc = [u['gc'] for u in ucd] +ccc = [int(u['ccc']) for u in ucd] +sc = [u['sc'] for u in ucd] +bmg = [int(v, 16) - int(u) if v else 0 for u,v in enumerate(u['bmg'] for u in ucd)] +dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd) + if u['dm'] != '#' and u['dt'] == 'can' and not (0xAC00 <= i < 0xAC00+11172)} + +gc_set = set(gc) +gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass) +gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr) +sc_set = set(sc) +dm2 = set(v for v in dm.values() if len(v) == 2) +dm2diff = set(v[1] - v[0] for v in dm2) +dm1 = set(v[0] for i,v in dm.items() if len(v) == 1) +dmx = set(v for v in dm.values() if len(v) not in (1,2)) +assert not dmx + +print(len(sorted(gc_set))) +print(len(sorted(gc_ccc_non0))) +print(len(sorted(gc_bmg_non0))) +print("GC, CCC, and BMG fit in one byte. Compress together.") +print() + +print(len(sorted(sc_set))) +print("SC fits in one byte. Compress separately.") +print() + +print(len(dm)) +print(len(dm1), min(dm1), max(dm1)) +print(len(dm2)) +#print(sorted(dm2diff)) +print(len(sorted(set(v // 512 for v in dm1)))) From 889dc1eb06a80ea9be4223a19011e47a52abebdd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 22:28:07 -0700 Subject: [PATCH 283/617] [iter] Remove sort categorization See comments. --- src/hb-array.hh | 2 +- src/hb-iter.hh | 48 +++++++++++++++++++++++++------------- src/hb-ot-layout-common.hh | 2 +- src/hb-set.hh | 2 +- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 6f6fd7fb1..705bc6a46 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -226,7 +226,7 @@ struct hb_sorted_array_t : typedef hb_iter_t, Type&> iter_base_t; HB_ITER_USING (iter_base_t); static constexpr bool is_random_access_iterator = true; - static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::SORTED; + static constexpr bool is_sorted_iterator = true; hb_sorted_array_t () : hb_array_t () {} hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t (array_, length_) {} diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 906d54e33..2448e1944 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -55,13 +55,6 @@ * type of .end()? */ -enum hb_sortedness_t -{ - NOT_SORTED = 0, - SORTED, - STRICTLY_SORTED, -}; - /* * Base classes for iterators. */ @@ -74,7 +67,7 @@ struct hb_iter_t static constexpr unsigned item_size = hb_static_size (Item); static constexpr bool is_iterator = true; static constexpr bool is_random_access_iterator = false; - static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::NOT_SORTED; + static constexpr bool is_sorted_iterator = false; private: /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -367,9 +360,10 @@ struct hb_map_iter_t : typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - static constexpr hb_sortedness_t is_sorted_iterator = - Sorted == hb_function_sortedness_t::SORTED ? hb_sortedness_t::SORTED - : Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : hb_sortedness_t::NOT_SORTED; + static constexpr bool is_sorted_iterator = + Sorted == hb_function_sortedness_t::SORTED ? true : + Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : + false; __item_t__ __item__ () const { return hb_get (f.get (), *it); } __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } bool __more__ () const { return bool (it); } @@ -436,7 +430,7 @@ struct hb_filter_iter_t : { while (it && !hb_has (p.get (), hb_get (f.get (), *it))) ++it; } typedef typename Iter::item_t __item_t__; - static constexpr hb_sortedness_t is_sorted_iterator = Iter::is_sorted_iterator; + static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; __item_t__ __item__ () const { return *it; } bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } @@ -520,9 +514,31 @@ struct hb_zip_iter_t : static constexpr bool is_random_access_iterator = A::is_random_access_iterator && B::is_random_access_iterator; - static constexpr hb_sortedness_t is_sorted_iterator = - A::is_sorted_iterator == hb_sortedness_t::SORTED ? - B::is_sorted_iterator : A::is_sorted_iterator; + /* Note. The following categorization is only valid if A is strictly sorted, + * ie. does NOT have duplicates. Previously I tried to categorize sortedness + * more granularly, see commits: + * + * 513762849a683914fc266a17ddf38f133cccf072 + * 4d3cf2adb669c345cc43832d11689271995e160a + * + * However, that was not enough, since hb_sorted_array_t, hb_sorted_vector_t, + * SortedArrayOf, etc all needed to be updated to add more variants. At that + * point I saw it not worth the effort, and instead we now deem all sorted + * collections as essentially strictly-sorted for the purposes of zip. + * + * The above assumption is not as bad as it sounds. Our "sorted" comes with + * no guarantees. It's just a contract, put in place to help you remember, + * and think about, whether an iterator you receive is expected to be + * sorted or not. As such, it's not perfect by definition, and should not + * be treated so. The inaccuracy here just errs in the direction of being + * more permissive, so your code compiles instead of erring on the side of + * marking your zipped iterator unsorted in which case your code won't + * compile. + * + * This semantical limitation does NOT affect logic in any other place I + * know of as of this writing. + */ + static constexpr bool is_sorted_iterator = A::is_sorted_iterator; __item_t__ __item__ () const { return __item_t__ (*a, *b); } __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } @@ -590,7 +606,7 @@ struct hb_counter_iter_t : typedef T __item_t__; static constexpr bool is_random_access_iterator = true; - static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; + static constexpr bool is_sorted_iterator = true; __item_t__ __item__ () const { return +v; } __item_t__ __item_at__ (unsigned j) const { return v + j * step; } bool __more__ () const { return v != end_; } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 67f2617fe..71c0ca4a9 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1115,7 +1115,7 @@ struct Coverage struct iter_t : hb_iter_with_fallback_t { - static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; + static constexpr bool is_sorted_iterator = true; iter_t (const Coverage &c_ = Null(Coverage)) { memset (this, 0, sizeof (*this)); diff --git a/src/hb-set.hh b/src/hb-set.hh index d9ffded57..332e07bd0 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -691,7 +691,7 @@ struct hb_set_t */ struct iter_t : hb_iter_with_fallback_t { - static constexpr hb_sortedness_t is_sorted_iterator = hb_sortedness_t::STRICTLY_SORTED; + static constexpr bool is_sorted_iterator = true; iter_t (const hb_set_t &s_ = Null(hb_set_t)) : s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); } From e6d6f4b96dd5517406265093cd57834c00850d41 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 22:45:03 -0700 Subject: [PATCH 284/617] Whitespace --- src/hb-ot-stat-table.hh | 2 +- src/hb-ot-var-fvar-table.hh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 0f75cd329..e6fa9b0bc 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -258,7 +258,7 @@ struct STAT designAxesOffset.sanitize (c, this, designAxisCount) && offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); } - + bool has_data () const { return version.to_int (); } unsigned get_design_axis_count () const { return designAxisCount; } diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 3c6a95aa6..3cdf61405 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -259,8 +259,8 @@ struct fvar } unsigned int get_instance_coords (unsigned int instance_index, - unsigned int *coords_length, /* IN/OUT */ - float *coords /* OUT */) const + unsigned int *coords_length, /* IN/OUT */ + float *coords /* OUT */) const { const InstanceRecord *instance = get_instance (instance_index); if (unlikely (!instance)) From 71208e5047c71108dec7361fd7c3e594c8b6c2d8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 22:51:59 -0700 Subject: [PATCH 285/617] Move OffsetTo<> deref operators in-class as friends --- src/hb-open-type.hh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 57b22a8e3..6c888f6bb 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,6 +279,11 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } + template + friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } + template + friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } + Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset::serialize (c, base); @@ -357,11 +362,6 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; -template -static inline const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } -template -static inline Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } - /* * Array Types From 57f65ae9355004044325dd6441cde761bca5e0a3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 May 2019 22:52:59 -0700 Subject: [PATCH 286/617] Add symmetric friend operator+ for OffsetTo --- src/hb-open-type.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 6c888f6bb..fcf1047b9 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -282,7 +282,11 @@ struct OffsetTo : Offset template friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } template + friend const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } + template friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } + template + friend Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } Type& serialize (hb_serialize_context_t *c, const void *base) { From d0df996cdc249a245c9dad1fa6503213c84dbcd2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 00:32:41 -0700 Subject: [PATCH 287/617] Use implicit lambda return type --- src/hb-array.hh | 4 ++-- src/hb-ot-layout-gsub-table.hh | 8 ++++---- src/hb-ot-layout-gsubgpos.hh | 18 +++++++++--------- src/hb-ot-stat-table.hh | 2 +- src/hb-ot-var-fvar-table.hh | 4 ++-- src/test-iter.cc | 8 ++++---- src/test-meta.cc | 1 - 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index 705bc6a46..ae0d16684 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -319,7 +319,7 @@ bool hb_array_t::operator == (const hb_array_t &o) const { return length == o.length && + hb_zip (*this, o) - | hb_map ([] (hb_pair_t &&_) -> bool { return _.first == _.second; }) + | hb_map ([] (hb_pair_t &&_) { return _.first == _.second; }) | hb_all ; } @@ -329,7 +329,7 @@ uint32_t hb_array_t::hash () const return + hb_iter (*this) | hb_map (hb_hash) - | hb_reduce ([] (uint32_t a, uint32_t b) -> uint32_t { return a * 31 + b; }, 0) + | hb_reduce ([] (uint32_t a, uint32_t b) { return a * 31 + b; }, 0) ; } diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index a6e9a7534..6937e8a72 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -48,7 +48,7 @@ struct SingleSubstFormat1 { + hb_iter (this+coverage) | hb_filter (*c->glyphs) - | hb_map ([&] (hb_codepoint_t g) -> hb_codepoint_t { return (g + deltaGlyphID) & 0xFFFFu; }) + | hb_map ([&] (hb_codepoint_t g) { return (g + deltaGlyphID) & 0xFFFFu; }) | hb_sink (c->output) ; } @@ -58,7 +58,7 @@ struct SingleSubstFormat1 if (unlikely (!(this+coverage).add_coverage (c->input))) return; + hb_iter (this+coverage) - | hb_map ([&] (hb_codepoint_t g) -> hb_codepoint_t { return (g + deltaGlyphID) & 0xFFFFu; }) + | hb_map ([&] (hb_codepoint_t g) { return (g + deltaGlyphID) & 0xFFFFu; }) | hb_sink (c->output) ; } @@ -741,7 +741,7 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).intersects (glyphs); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs); }) | hb_any ; } @@ -764,7 +764,7 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).would_apply (c); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c); }) | hb_any ; } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 5946db7c4..a8deb70d4 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -708,7 +708,7 @@ static inline bool intersects_array (const hb_set_t *glyphs, { return + hb_iter (values, count) - | hb_map ([&] (const HBUINT16 &_) -> bool { return intersects_func (glyphs, _, intersects_data); }) + | hb_map ([&] (const HBUINT16 &_) { return intersects_func (glyphs, _, intersects_data); }) | hb_any ; } @@ -1371,7 +1371,7 @@ struct RuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) | hb_any ; } @@ -1399,7 +1399,7 @@ struct RuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).would_apply (c, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c, lookup_context); }) | hb_any ; } @@ -1410,7 +1410,7 @@ struct RuleSet TRACE_APPLY (this); return_trace ( + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).apply (c, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).apply (c, lookup_context); }) | hb_any ) ; @@ -1444,7 +1444,7 @@ struct ContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) | hb_any ; } @@ -2022,7 +2022,7 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) | hb_any ; } @@ -2046,7 +2046,7 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).would_apply (c, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c, lookup_context); }) | hb_any ; } @@ -2056,7 +2056,7 @@ struct ChainRuleSet TRACE_APPLY (this); return_trace ( + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).apply (c, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).apply (c, lookup_context); }) | hb_any ) ; @@ -2089,7 +2089,7 @@ struct ChainContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) -> bool { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) | hb_any ; } diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index e6fa9b0bc..72d377281 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -289,7 +289,7 @@ struct STAT ; + get_axis_value_offsets () - | hb_map ([&] (const OffsetTo& _) -> const AxisValue* { return hb_addressof (this + _); }) + | hb_map ([&] (const OffsetTo& _) { return hb_addressof (this + _); }) | hb_map (&AxisValue::get_value_name_id) | hb_sink (nameids_to_retain) ; diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 3cdf61405..8b3b38ce9 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -290,12 +290,12 @@ struct fvar ; + hb_range ((unsigned) instanceCount) - | hb_map ([&] (const unsigned _) -> unsigned { return get_instance_subfamily_name_id (_); }) + | hb_map ([&] (const unsigned _) { return get_instance_subfamily_name_id (_); }) | hb_sink (nameids) ; + hb_range ((unsigned) instanceCount) - | hb_map ([&] (const unsigned _) -> unsigned { return get_instance_postscript_name_id (_); }) + | hb_map ([&] (const unsigned _) { return get_instance_postscript_name_id (_); }) | hb_sink (nameids) ; } diff --git a/src/test-iter.cc b/src/test-iter.cc index f834640ff..c36453d1f 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -203,8 +203,8 @@ main (int argc, char **argv) ; + hb_iter (src) - | hb_map ([&] (int i) -> int { return 1; }) - | hb_reduce ([&] (int acc, int value) -> int { return acc; }, 2) + | hb_map ([&] (int i) { return 1; }) + | hb_reduce ([&] (int acc, int value) { return acc; }, 2) ; using map_pair_t = hb_item_type; @@ -251,8 +251,8 @@ main (int argc, char **argv) unsigned int temp3 = 0; + hb_iter(src) - | hb_map([&] (int i) -> int { return ++temp3; }) - | hb_reduce([&] (float acc, int value) -> float { return acc + value; }, 0) + | hb_map([&] (int i) { return ++temp3; }) + | hb_reduce([&] (float acc, int value) { return acc + value; }, 0) ; hb_map_destroy (result); diff --git a/src/test-meta.cc b/src/test-meta.cc index ffd360b0d..0b6e02c26 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -32,7 +32,6 @@ int main (int argc, char **argv) { - static_assert (hb_is_convertible (void, void), ""); static_assert (hb_is_convertible (void, const void), ""); static_assert (hb_is_convertible (const void, void), ""); From 01912efb74fc554a81c8cfe572145ce45b8fa58b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 00:42:47 -0700 Subject: [PATCH 288/617] Revert symmetric OffsetTo overloads Reverts 57f65ae9355004044325dd6441cde761bca5e0a3 Caused ambiguous-overload on some gcc... --- src/hb-open-type.hh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index fcf1047b9..6c888f6bb 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -282,11 +282,7 @@ struct OffsetTo : Offset template friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } template - friend const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } - template friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } - template - friend Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } Type& serialize (hb_serialize_context_t *c, const void *base) { From b213042f87dd736bad7a852fe98269f84cbff493 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 00:50:48 -0700 Subject: [PATCH 289/617] Revert "Revert symmetric OffsetTo overloads" This reverts commit 01912efb74fc554a81c8cfe572145ce45b8fa58b. Actually this didn't break things. Fixing --- src/hb-open-type.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 6c888f6bb..fcf1047b9 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -282,7 +282,11 @@ struct OffsetTo : Offset template friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } template + friend const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } + template friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } + template + friend Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } Type& serialize (hb_serialize_context_t *c, const void *base) { From e01c7b1648dbbb76966b3bd4437bcf7699e77c35 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 00:52:17 -0700 Subject: [PATCH 290/617] Move OffsetTo operator+ back out of class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apparently there's different overload resolution rules that apply, at least with some (older?) version of gcc. hb-ot-name-table.hh: In member function ‘void OT::name::accelerator_t::init(hb_face_t*)’: hb-ot-name-table.hh:244:62: error: ambiguous overload for ‘operator+’ (operand types are ‘hb_blob_ptr_t’ and ‘OT::NNOffsetTo > > {aka const OT::OffsetTo >, OT::IntType, false>}’) this->pool = (const char *) (const void *) (this->table+this->table->stringOffset); ^ hb-ot-name-table.hh:244:62: note: candidates are: hb-ot-name-table.hh:244:62: note: operator+(const C*, long int) hb-ot-name-table.hh:244:62: note: operator+(const char*, long int) --- src/hb-open-type.hh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index fcf1047b9..c150fe2a3 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,15 +279,6 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } - template - friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } - template - friend const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } - template - friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } - template - friend Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } - Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset::serialize (c, base); @@ -366,6 +357,15 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; +template +static inline const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } +template +static inline const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } +template +static inline Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } +template +static inline Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } + /* * Array Types From 004edf3bdac77564d39516b51b0666de60e65ece Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 01:02:50 -0700 Subject: [PATCH 291/617] Ugh. How was the Travis bot happy before, but isn't now?! :( --- src/hb-open-type.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index c150fe2a3..9d6e1e51f 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -357,13 +357,13 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; -template +template static inline const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } -template +template static inline const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } -template +template static inline Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } -template +template static inline Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } From c58eeb5fb35ec6a8d0a4394fd83cb2571cd5af4f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 01:10:31 -0700 Subject: [PATCH 292/617] Another try at fix Fails locally. Trying to understand. Sigh --- src/hb-open-type.hh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 9d6e1e51f..1471f5120 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,6 +279,15 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } + template + friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } + template + friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset (base); } + template + friend Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } + template + friend Type& operator + (OffsetTo &offset, Base &base) { return offset (base); } + Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset::serialize (c, base); @@ -357,15 +366,6 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; -template -static inline const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); } -template -static inline const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); } -template -static inline Type& operator + (Base *base, OffsetTo &offset) { return offset (base); } -template -static inline Type& operator + (OffsetTo &offset, Base *base) { return offset (base); } - /* * Array Types From e1b2edb04af7bd2b4eecb59392f75abcc72cd8a6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 01:12:04 -0700 Subject: [PATCH 293/617] Completely revert the thing back --- src/hb-open-type.hh | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 1471f5120..57b22a8e3 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,15 +279,6 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } - template - friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } - template - friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset (base); } - template - friend Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } - template - friend Type& operator + (OffsetTo &offset, Base &base) { return offset (base); } - Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset::serialize (c, base); @@ -366,6 +357,11 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; +template +static inline const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } +template +static inline Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } + /* * Array Types From 763ea4224bf612f3efb80d5744d1e8852682683e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 01:15:11 -0700 Subject: [PATCH 294/617] Another try --- src/hb-open-type.hh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 57b22a8e3..ec7b5db89 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,6 +279,11 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } + template + friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } + template + friend Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } + Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset::serialize (c, base); @@ -357,11 +362,6 @@ using NNOffsetTo = OffsetTo; template using LNNOffsetTo = LOffsetTo; -template -static inline const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } -template -static inline Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } - /* * Array Types From 397cbbd5ff25c9796ecd56b8270e83de1eb322ac Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 15 May 2019 13:03:28 +0430 Subject: [PATCH 295/617] [ci][travis] Update its distribution It may break things, lets see --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 703fac25c..d788263ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ # Build Configuration for Travis -dist: trusty +dist: xenial language: cpp From e2767e438c56b8ee0bc2f2040c10b13b34d37f95 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 15 May 2019 13:14:09 +0430 Subject: [PATCH 296/617] [ci][test] Ignore other gcov symbols also To fix https://travis-ci.org/harfbuzz/harfbuzz/jobs/532693197 --- src/check-symbols.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check-symbols.sh b/src/check-symbols.sh index 423d18613..f181b6312 100755 --- a/src/check-symbols.sh +++ b/src/check-symbols.sh @@ -7,7 +7,7 @@ test -z "$srcdir" && srcdir=. test -z "$libs" && libs=.libs stat=0 -IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*' +IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_.*\|llvm_.*' if which nm 2>/dev/null >/dev/null; then : From 99ca956c131563b57d490b1ec3c8de920645e53f Mon Sep 17 00:00:00 2001 From: David Corbett Date: Wed, 15 May 2019 16:29:51 -0400 Subject: [PATCH 297/617] Fix record-test.sh on machines without sha1sum --- test/shaping/record-test.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/shaping/record-test.sh b/test/shaping/record-test.sh index 4ab74f0f9..7f24354c1 100755 --- a/test/shaping/record-test.sh +++ b/test/shaping/record-test.sh @@ -2,6 +2,17 @@ dir=`mktemp -d` +if which sha1sum 2>/dev/null >/dev/null; then + SHA1SUM=sha1sum +elif which shasum 2>/dev/null >/dev/null; then + SHA1SUM='shasum -a 1' +elif which digest 2>/dev/null >/dev/null; then + SHA1SUM='digest -a sha1' +else + echo "'sha1sum' not found" + exit 2 +fi + out=/dev/stdout if test "x$1" == 'x-o'; then shift @@ -90,7 +101,7 @@ if ! test "x$glyphs" = "x$glyphs_subset"; then glyphs=$glyphs_subset fi -sha1sum=`sha1sum "$dir/font.subset.ttf" | cut -d' ' -f1` +sha1sum=`$SHA1SUM "$dir/font.subset.ttf" | cut -d' ' -f1` subset="data/in-house/fonts/$sha1sum.ttf" mv "$dir/font.subset.ttf" "$subset" From 125c45ed368ae61a74e2c558b9c884cfde6295e1 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Wed, 15 May 2019 17:02:32 -0400 Subject: [PATCH 298/617] Convert Consonant_Initial_Postfixed to CONS_MED --- src/gen-use-table.py | 6 +++--- src/hb-ot-shape-complex-use-table.cc | 2 +- .../fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf | Bin 0 -> 1056 bytes .../data/in-house/tests/use-syllable.tests | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 test/shaping/data/in-house/fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 9b1a00a68..164f8027f 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -197,15 +197,15 @@ def is_BASE_OTHER(U, UISC, UGC): def is_CGJ(U, UISC, UGC): return U == 0x034F def is_CONS_FINAL(U, UISC, UGC): - # Consonant_Initial_Postfixed is new in Unicode 11; not in the spec. return ((UISC == Consonant_Final and UGC != Lo) or - UISC == Consonant_Initial_Postfixed or UISC == Consonant_Succeeding_Repha) def is_CONS_FINAL_MOD(U, UISC, UGC): #SPEC-DRAFT return UISC in [Consonant_Final_Modifier, Syllable_Modifier] return UISC == Syllable_Modifier def is_CONS_MED(U, UISC, UGC): - return UISC == Consonant_Medial and UGC != Lo + # Consonant_Initial_Postfixed is new in Unicode 11; not in the spec. + return (UISC == Consonant_Medial and UGC != Lo or + UISC == Consonant_Initial_Postfixed) def is_CONS_MOD(U, UISC, UGC): return UISC in [Nukta, Gemination_Mark, Consonant_Killer] def is_CONS_SUB(U, UISC, UGC): diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index f47d5e847..c065ff289 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -302,7 +302,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, FAbv, SUB, SUB, SUB, SUB, O, + /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O, /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FM, FM, O, O, FBlw, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, diff --git a/test/shaping/data/in-house/fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf b/test/shaping/data/in-house/fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4ec847c5acf440fe9e3002dd2c8559518bfd6a12 GIT binary patch literal 1056 zcmZ`&O-~a+7=C7U3s|wD)Q0&*O7o+|pcl=B$^p@}JG7&D62`PdDhFB_GOCp*?~{UL)_#=Bta^V{3(cjr@47m^5(- z*U9gYcjnE-5;|~*e1zO6nEAA4rtdxT(+A&5#Y(lg`m(|Ni{w!V_(c>OVn@|clDZau;fqW2^k|$K9hN z-*H&`s!SWQoBdGOGi3#6a*kE8cTP-*9D1+|KfqOmlvEtsDuLaW&p)|!=-3sjtPb*- zd`F+>Efil66s%Xm#h&ba#&0n;cQu7&-)Nw&8P+focBa2~XW04Fu2l>#XSF*obEV5bqVsGq#?g`m%N%oL2@fV5SwjdhN7nza zak1A=9DSRupF|NQETN2fWROJ_2KtahKQY8p3F0!P2uwVnMT)ZWDB~W|w5>ABO-dOo zAV-@ru5qMWo&8yFSjYc9o}7?E z6S{D Date: Wed, 15 May 2019 14:19:20 -0700 Subject: [PATCH 299/617] [iter] Use default operators instead of redefining empty ones --- src/hb-iter.hh | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 2448e1944..140e55365 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -119,9 +119,11 @@ struct hb_iter_t iter_t operator << (const T v) && { **thiz() = v; ++*thiz(); return *thiz(); } protected: - hb_iter_t () {} - hb_iter_t (const hb_iter_t &o HB_UNUSED) {} - void operator = (const hb_iter_t &o HB_UNUSED) {} + hb_iter_t () = default; + hb_iter_t (const hb_iter_t &o HB_UNUSED) = default; + hb_iter_t (hb_iter_t &&o HB_UNUSED) = default; + hb_iter_t& operator = (const hb_iter_t &o HB_UNUSED) = default; + hb_iter_t& operator = (hb_iter_t &&o HB_UNUSED) = default; }; #define HB_ITER_USING(Name) \ @@ -214,9 +216,11 @@ struct hb_iter_fallback_mixin_t } protected: - hb_iter_fallback_mixin_t () {} - hb_iter_fallback_mixin_t (const hb_iter_fallback_mixin_t &o HB_UNUSED) {} - void operator = (const hb_iter_fallback_mixin_t &o HB_UNUSED) {} + hb_iter_fallback_mixin_t () = default; + hb_iter_fallback_mixin_t (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default; + hb_iter_fallback_mixin_t (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default; + hb_iter_fallback_mixin_t& operator = (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default; + hb_iter_fallback_mixin_t& operator = (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default; }; template @@ -225,11 +229,11 @@ struct hb_iter_with_fallback_t : hb_iter_fallback_mixin_t { protected: - hb_iter_with_fallback_t () {} - hb_iter_with_fallback_t (const hb_iter_with_fallback_t &o HB_UNUSED) : - hb_iter_t (o), - hb_iter_fallback_mixin_t (o) {} - void operator = (const hb_iter_with_fallback_t &o HB_UNUSED) {} + hb_iter_with_fallback_t () = default; + hb_iter_with_fallback_t (const hb_iter_with_fallback_t &o HB_UNUSED) = default; + hb_iter_with_fallback_t (hb_iter_with_fallback_t &&o HB_UNUSED) = default; + hb_iter_with_fallback_t& operator = (const hb_iter_with_fallback_t &o HB_UNUSED) = default; + hb_iter_with_fallback_t& operator = (hb_iter_with_fallback_t &&o HB_UNUSED) = default; }; /* From d3e1d5044f23a2dc910f4253c3f4976bf08f93ab Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 14:25:54 -0700 Subject: [PATCH 300/617] Add all pair_t comparison operators --- src/hb-algs.hh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 24bdeb190..a10e82e9e 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -226,6 +226,11 @@ struct hb_pair_t { return hb_pair_t (second, first); } bool operator == (const pair_t& o) const { return first == o.first && second == o.second; } + bool operator != (const pair_t& o) const { return !(*this == o); } + bool operator < (const pair_t& o) const { return first < o.first || (first == o.first && second < o.second); } + bool operator >= (const pair_t& o) const { return !(*this < o); } + bool operator > (const pair_t& o) const { return first > o.first || (first == o.first && second > o.second); } + bool operator <= (const pair_t& o) const { return !(*this > o); } T1 first; T2 second; From ebf47a95f29dd959319feb7f8728f7c0162a181e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 15:14:26 -0700 Subject: [PATCH 301/617] [iter] Simplify operator!= of iterator filters Both to save ops, and also because lambdas don't implement operator!=, so this was failing in range-based for loop if a lambda was passed to hb_map() or hb_filter(). Just check end-condition assuming that we are comparing to .end() or iterators that are otherwise derived from current iterator. Ie. don't compare things that are expected to be in common. --- src/hb-iter.hh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index 140e55365..5df433375 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -378,7 +378,7 @@ struct hb_map_iter_t : void __rewind__ (unsigned n) { it -= n; } hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); } bool operator != (const hb_map_iter_t& o) const - { return it != o.it || f != o.f; } + { return it != o.it; } private: Iter it; @@ -441,7 +441,7 @@ struct hb_filter_iter_t : void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); } bool operator != (const hb_filter_iter_t& o) const - { return it != o.it || p != o.p || f != o.f; } + { return it != o.it; } private: Iter it; @@ -553,6 +553,8 @@ struct hb_zip_iter_t : void __prev__ () { --a; --b; } void __rewind__ (unsigned n) { a -= n; b -= n; } hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); } + /* Note, we should stop if ANY of the iters reaches end. As such two compare + * unequal if both items are unequal, NOT if either is unequal. */ bool operator != (const hb_zip_iter_t& o) const { return a != o.a && b != o.b; } @@ -621,7 +623,7 @@ struct hb_counter_iter_t : void __rewind__ (unsigned n) { v -= n * step; } hb_counter_iter_t __end__ () const { return hb_counter_iter_t (end_, end_, step); } bool operator != (const hb_counter_iter_t& o) const - { return v != o.v || end_ != o.end_ || step != o.step; } + { return v != o.v; } private: static inline T end_for (T start, T end_, S step) From 203ea58bf67b3df3e376f94cdfb37382dd3858a0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 16:14:40 -0700 Subject: [PATCH 302/617] More adjustment to OffsetTo<>::friend opeator+ Let's see if I break any bots. But yeah, it wasn't accepting a non-const pointer. It just happens that we don't use that in the code it seems. --- src/hb-open-type.hh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index ec7b5db89..ee2723aad 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -279,10 +279,12 @@ struct OffsetTo : Offset return StructAtOffset (base, *this); } - template - friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } - template - friend Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } + template + friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); } + template + friend Type& operator + (Base &&base, OffsetTo &offset) { return offset ((void *) base); } Type& serialize (hb_serialize_context_t *c, const void *base) { From d822e0a16f914ec6a7e629d21ed972d009a88561 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 16:30:08 -0700 Subject: [PATCH 303/617] [array] Adjust operator!= See comments. --- src/hb-array.hh | 7 ++++++- src/hb-vector.hh | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hb-array.hh b/src/hb-array.hh index ae0d16684..587000cd4 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -84,8 +84,13 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> arrayZ -= n; } unsigned __len__ () const { return length; } + /* Ouch. The operator== compares the contents of the array. For range-based for loops, + * it's best if we can just compare arrayZ, though comparing contents is still fast, + * but also would require that Type has operator==. As such, we optimize this operator + * for range-based for loop and just compare arrayZ. No need to compare length, as we + * assume we're only compared to .end(). */ bool operator != (const hb_array_t& o) const - { return arrayZ != o.arrayZ || length != o.length || backwards_length != o.backwards_length; } + { return arrayZ != o.arrayZ; } /* Extra operators. */ diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 3c6347b3f..de16c97dd 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -103,6 +103,7 @@ struct hb_vector_t { return hb_bytes_t ((const char *) arrayZ, length * item_size); } bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); } + bool operator != (const hb_vector_t &o) const { return !(*this == o); } uint32_t hash () const { return as_array ().hash (); } Type& operator [] (int i_) From f7a458510d9c34d1c52579985ded5082ad0f3458 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 16:49:35 -0700 Subject: [PATCH 304/617] Add hb_bitwise_* ops --- src/hb-algs.hh | 58 +++++++++++++++++++++++++++++++------------------- src/hb-set.hh | 14 ++++++------ 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index a10e82e9e..44104715c 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -765,30 +765,44 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o } -struct HbOpOr +struct hb_bitwise_or { static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template static void process (T &o, const T &a, const T &b) { o = a | b; } -}; -struct HbOpAnd + template + auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) +} +HB_FUNCOBJ (hb_bitwise_or); +struct hb_bitwise_and { static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; - template static void process (T &o, const T &a, const T &b) { o = a & b; } -}; -struct HbOpMinus -{ - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = false; - template static void process (T &o, const T &a, const T &b) { o = a & ~b; } -}; -struct HbOpXor + template + auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) +} +HB_FUNCOBJ (hb_bitwise_and); +struct hb_bitwise_xor { static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template static void process (T &o, const T &a, const T &b) { o = a ^ b; } -}; + template + auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) +} +HB_FUNCOBJ (hb_bitwise_xor); +struct hb_bitwise_sub +{ + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = false; + template + auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) +} +HB_FUNCOBJ (hb_bitwise_sub); +struct hb_bitwise_neg +{ + template + auto operator () (const T &a) const HB_AUTO_RETURN (~a) +} +HB_FUNCOBJ (hb_bitwise_neg); /* Compiler-assisted vectorization. */ @@ -804,26 +818,26 @@ struct hb_vector_size_t void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } - template - hb_vector_size_t process (const hb_vector_size_t &o) const + template + hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const { hb_vector_size_t r; #if HB_VECTOR_SIZE if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) - Op::process (r.u.vec[i], u.vec[i], o.u.vec[i]); + r.u.vec[i] = op (u.vec[i], o.u.vec[i]); else #endif for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) - Op::process (r.u.v[i], u.v[i], o.u.v[i]); + r.u.v[i] = op (u.v[i], o.u.v[i]); return r; } hb_vector_size_t operator | (const hb_vector_size_t &o) const - { return process (o); } + { return process (hb_bitwise_or, o); } hb_vector_size_t operator & (const hb_vector_size_t &o) const - { return process (o); } + { return process (hb_bitwise_and, o); } hb_vector_size_t operator ^ (const hb_vector_size_t &o) const - { return process (o); } + { return process (hb_bitwise_xor, o); } hb_vector_size_t operator ~ () const { hb_vector_size_t r; diff --git a/src/hb-set.hh b/src/hb-set.hh index 332e07bd0..3b30fa4d4 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -440,8 +440,8 @@ struct hb_set_t return true; } - template - void process (const hb_set_t *other) + template + void process (const Op& op, const hb_set_t *other) { if (unlikely (!successful)) return; @@ -495,7 +495,7 @@ struct hb_set_t b--; count--; page_map[count] = page_map[a]; - Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v); + page_at (count).v = op (page_at (a).v, other->page_at (b).v); } else if (page_map[a - 1].major > other->page_map[b - 1].major) { @@ -541,19 +541,19 @@ struct hb_set_t void union_ (const hb_set_t *other) { - process (other); + process (hb_bitwise_or, other); } void intersect (const hb_set_t *other) { - process (other); + process (hb_bitwise_and, other); } void subtract (const hb_set_t *other) { - process (other); + process (hb_bitwise_sub, other); } void symmetric_difference (const hb_set_t *other) { - process (other); + process (hb_bitwise_xor, other); } bool next (hb_codepoint_t *codepoint) const { From e5cfe9d582d86281eda2bcb85d3d1cbd4afbb5bb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 16:59:36 -0700 Subject: [PATCH 305/617] Add arithmetic operators --- src/hb-algs.hh | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 44104715c..4120251a3 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -765,14 +765,6 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o } -struct hb_bitwise_or -{ - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = true; - template - auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) -} -HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_and { static constexpr bool passthru_left = false; @@ -781,6 +773,14 @@ struct hb_bitwise_and auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); +struct hb_bitwise_or +{ + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = true; + template + auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) +} +HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor { static constexpr bool passthru_left = true; @@ -797,12 +797,28 @@ struct hb_bitwise_sub auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } HB_FUNCOBJ (hb_bitwise_sub); -struct hb_bitwise_neg -{ - template - auto operator () (const T &a) const HB_AUTO_RETURN (~a) -} -HB_FUNCOBJ (hb_bitwise_neg); + +struct +{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) } +HB_FUNCOBJ (hb_add); +struct +{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) } +HB_FUNCOBJ (hb_sub); +struct +{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) } +HB_FUNCOBJ (hb_mul); +struct +{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) } +HB_FUNCOBJ (hb_div); +struct +{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) } +HB_FUNCOBJ (hb_mod); +struct +{ template auto operator () (const T &a) const HB_AUTO_RETURN (+a) } +HB_FUNCOBJ (hb_pos); +struct +{ template auto operator () (const T &a) const HB_AUTO_RETURN (-a) } +HB_FUNCOBJ (hb_neg); /* Compiler-assisted vectorization. */ From 5da8a3a90db5e5ccaaf68de2ac312108af911821 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 17:11:18 -0700 Subject: [PATCH 306/617] Remove variadic form of hb_min/hb_max Unused, and why here and not in other functions... --- src/hb-algs.hh | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 4120251a3..f0f13302a 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -259,34 +259,16 @@ HB_FUNCOBJ (hb_second); * comparing integers of different signedness. */ struct { - private: template auto - impl (T&& a, T2&& b) const HB_AUTO_RETURN + operator () (T&& a, T2&& b) const HB_AUTO_RETURN (hb_forward (a) <= hb_forward (b) ? hb_forward (a) : hb_forward (b)) - - public: - template auto - operator () (T&& a) const HB_AUTO_RETURN (hb_forward (a)) - - template auto - operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN - (impl (hb_forward (a), (*this) (hb_forward (ds)...))) } HB_FUNCOBJ (hb_min); struct { - private: template auto - impl (T&& a, T2&& b) const HB_AUTO_RETURN + operator () (T&& a, T2&& b) const HB_AUTO_RETURN (hb_forward (a) >= hb_forward (b) ? hb_forward (a) : hb_forward (b)) - - public: - template auto - operator () (T&& a) const HB_AUTO_RETURN (hb_forward (a)) - - template auto - operator () (T&& a, Ts&& ...ds) const HB_AUTO_RETURN - (impl (hb_forward (a), (*this) (hb_forward (ds)...))) } HB_FUNCOBJ (hb_max); From 5266ca86b633b84850492b7982334fb63271ccbc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 17:59:00 -0700 Subject: [PATCH 307/617] Fix tests Oops. --- src/test-algs.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test-algs.cc b/src/test-algs.cc index 774414ad1..cef2b51c4 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -62,13 +62,13 @@ main (int argc, char **argv) A a; hb_invoke (&A::a, a); - assert (1 == hb_min (3, 8, 1, 2)); - assert (8 == hb_max (3, 8, 1, 2)); + assert (1 == hb_min (8, 1)); + assert (8 == hb_max (8, 1)); int x = 1, y = 2; hb_min (x, 3); - hb_min (3, x, 4); - hb_min (3, x, 4 + 3); + hb_min (3, x); + hb_min (x, 4 + 3); int &z = hb_min (x, y); z = 3; assert (x == 3); From 78d35f0e780dd811ae103c96f3b1060d49046a7a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 18:15:05 -0700 Subject: [PATCH 308/617] Reduce captures of lambdas --- src/hb-ot-hdmx-table.hh | 4 ++-- src/hb-ot-layout-gpos-table.hh | 2 +- src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++-------------- src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ src/hb-ot-name-table.hh | 2 +- src/hb-ot-stat-table.hh | 2 +- src/hb-ot-var-fvar-table.hh | 4 ++-- src/hb-subset-plan.cc | 2 +- src/test-iter.cc | 4 ++-- 9 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index dc36d0ab5..96c1d1f63 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -108,7 +108,7 @@ struct hdmx this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0); + it - | hb_apply ([&] (const hb_item_type& _) { + | hb_apply ([c] (const hb_item_type& _) { c->start_embed ()->serialize (c, _.first, _.second); }) ; @@ -126,7 +126,7 @@ struct hdmx auto it = + hb_range ((unsigned) numRecords) - | hb_map ([&] (unsigned _) + | hb_map ([c, this] (unsigned _) { const DeviceRecord *device_record = &StructAtOffset (&firstDeviceRecord, diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 45de78138..86c45be29 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -726,7 +726,7 @@ struct PairPosFormat1 + hb_zip (this+coverage, pairSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) -> bool + | hb_map ([=] (const OffsetTo &_) { return (this+_).intersects (glyphs, valueFormat); }) | hb_any ; diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 6937e8a72..fb18ce92a 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -46,9 +46,10 @@ struct SingleSubstFormat1 void closure (hb_closure_context_t *c) const { + unsigned d = deltaGlyphID; + hb_iter (this+coverage) | hb_filter (*c->glyphs) - | hb_map ([&] (hb_codepoint_t g) { return (g + deltaGlyphID) & 0xFFFFu; }) + | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) | hb_sink (c->output) ; } @@ -56,9 +57,9 @@ struct SingleSubstFormat1 void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - + unsigned d = deltaGlyphID; + hb_iter (this+coverage) - | hb_map ([&] (hb_codepoint_t g) { return (g + deltaGlyphID) & 0xFFFFu; }) + | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) | hb_sink (c->output) ; } @@ -351,7 +352,7 @@ struct MultipleSubstFormat1 + hb_zip (this+coverage, sequence) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_apply ([c, this] (const OffsetTo &_) { (this+_).closure (c); }) ; } @@ -360,7 +361,7 @@ struct MultipleSubstFormat1 if (unlikely (!(this+coverage).add_coverage (c->input))) return; + hb_zip (this+coverage, sequence) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_apply ([c, this] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) ; } @@ -525,7 +526,7 @@ struct AlternateSubstFormat1 { + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_apply ([c, this] (const OffsetTo &_) { (this+_).closure (c); }) ; } @@ -534,7 +535,7 @@ struct AlternateSubstFormat1 if (unlikely (!(this+coverage).add_coverage (c->input))) return; + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_apply ([c, this] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) ; } @@ -741,7 +742,7 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs); }) + | hb_map ([this, glyphs] (const OffsetTo &_) { return (this+_).intersects (glyphs); }) | hb_any ; } @@ -749,14 +750,14 @@ struct LigatureSet void closure (hb_closure_context_t *c) const { + hb_iter (ligature) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_apply ([this, c] (const OffsetTo &_) { (this+_).closure (c); }) ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { + hb_iter (ligature) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_apply ([this, c] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) ; } @@ -764,7 +765,7 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c); }) + | hb_map ([this, c] (const OffsetTo &_) { return (this+_).would_apply (c); }) | hb_any ; } @@ -825,7 +826,7 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) -> bool + | hb_map ([this, glyphs] (const OffsetTo &_) { return (this+_).intersects (glyphs); }) | hb_any ; @@ -836,7 +837,7 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_apply ([this, c] (const OffsetTo &_) { (this+_).closure (c); }) ; } @@ -846,7 +847,7 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_apply ([this, c] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) ; } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index a8deb70d4..091930cc2 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1546,7 +1546,7 @@ struct ContextFormat2 return + hb_enumerate (ruleSet) - | hb_map ([&] (const hb_pair_t &> p) -> bool + | hb_map ([&] (const hb_pair_t &> p) { return class_def.intersects_class (glyphs, p.first) && (this+p.second).intersects (glyphs, lookup_context); }) | hb_any @@ -1567,7 +1567,7 @@ struct ContextFormat2 return + hb_enumerate (ruleSet) - | hb_filter ([&] (unsigned _) -> bool + | hb_filter ([&] (unsigned _) { return class_def.intersects_class (c->glyphs, _); }, hb_first) | hb_map (hb_second) @@ -2193,9 +2193,9 @@ struct ChainContextFormat2 return + hb_enumerate (ruleSet) - | hb_map ([&] (const hb_pair_t &> p) -> bool - { return input_class_def.intersects_class (glyphs, p.first) && - (this+p.second).intersects (glyphs, lookup_context); }) + | hb_map ([&] (const hb_pair_t &> p) + { return input_class_def.intersects_class (glyphs, p.first) && + (this+p.second).intersects (glyphs, lookup_context); }) | hb_any ; } @@ -2217,7 +2217,7 @@ struct ChainContextFormat2 return + hb_enumerate (ruleSet) - | hb_filter ([&] (unsigned _) -> bool + | hb_filter ([&] (unsigned _) { return input_class_def.intersects_class (c->glyphs, _); }, hb_first) | hb_map (hb_second) diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 332f48533..6c75cc398 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -192,7 +192,7 @@ struct name const void *dst_string_pool = &(this + this->stringOffset); + it - | hb_apply ([&] (const NameRecord& _) { c->copy (_, src_string_pool, dst_string_pool); }) + | hb_apply ([=] (const NameRecord& _) { c->copy (_, src_string_pool, dst_string_pool); }) ; if (unlikely (c->ran_out_of_room)) return_trace (false); diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 72d377281..228c3ecc1 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -289,7 +289,7 @@ struct STAT ; + get_axis_value_offsets () - | hb_map ([&] (const OffsetTo& _) { return hb_addressof (this + _); }) + | hb_map ([this] (const OffsetTo& _) { return hb_addressof (this + _); }) | hb_map (&AxisValue::get_value_name_id) | hb_sink (nameids_to_retain) ; diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index 8b3b38ce9..7df81428f 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -290,12 +290,12 @@ struct fvar ; + hb_range ((unsigned) instanceCount) - | hb_map ([&] (const unsigned _) { return get_instance_subfamily_name_id (_); }) + | hb_map ([this] (const unsigned _) { return get_instance_subfamily_name_id (_); }) | hb_sink (nameids) ; + hb_range ((unsigned) instanceCount) - | hb_map ([&] (const unsigned _) { return get_instance_postscript_name_id (_); }) + | hb_map ([this] (const unsigned _) { return get_instance_postscript_name_id (_); }) | hb_sink (nameids) ; } diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 0c1c7a254..fad75d0b3 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -177,7 +177,7 @@ _create_old_gid_to_new_gid_map (const hb_face_t *face, *num_glyphs = reverse_glyph_map->get_population (); } else { + hb_iter (all_gids_to_retain) - | hb_map ([=] (hb_codepoint_t _) { + | hb_map ([] (hb_codepoint_t _) { return hb_pair_t (_, _); }) | hb_sink (reverse_glyph_map) diff --git a/src/test-iter.cc b/src/test-iter.cc index c36453d1f..156a5fcad 100644 --- a/src/test-iter.cc +++ b/src/test-iter.cc @@ -203,8 +203,8 @@ main (int argc, char **argv) ; + hb_iter (src) - | hb_map ([&] (int i) { return 1; }) - | hb_reduce ([&] (int acc, int value) { return acc; }, 2) + | hb_map ([] (int i) { return 1; }) + | hb_reduce ([=] (int acc, int value) { return acc; }, 2) ; using map_pair_t = hb_item_type; From 962f95cf802404dafadf2f999772d3f9fc949d63 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 9 May 2019 13:04:11 -0700 Subject: [PATCH 309/617] [subset] Switch SingleSubst to use iterators in serialize. --- src/hb-ot-layout-common.hh | 6 +-- src/hb-ot-layout-gsub-table.hh | 97 +++++++++++++++++++++------------- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 71c0ca4a9..bd728ecad 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -804,7 +804,7 @@ struct CoverageFormat1 } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -873,7 +873,7 @@ struct CoverageFormat2 } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); @@ -1043,7 +1043,7 @@ struct Coverage } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index fb18ce92a..0babb3b24 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -34,10 +34,14 @@ namespace OT { +typedef hb_pair_t hb_codepoint_pair_t; +template static inline void SingleSubst_serialize (hb_serialize_context_t *c, - hb_sorted_array_t glyphs, - hb_array_t substitutes); + Iterator it); + struct SingleSubstFormat1 { @@ -84,8 +88,11 @@ struct SingleSubstFormat1 return_trace (true); } + template bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t glyphs, + Iterator glyphs, unsigned delta) { TRACE_SERIALIZE (this); @@ -101,20 +108,18 @@ struct SingleSubstFormat1 const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_sorted_vector_t from; - hb_vector_t to; hb_codepoint_t delta = deltaGlyphID; + auto it = + hb_iter (this+coverage) | hb_filter (glyphset) - | hb_map ([&] (hb_codepoint_t g) -> hb_pair_t - { return hb_pair (glyph_map[g], - glyph_map[(g + delta) & 0xFFFF]); }) - | hb_unzip (from, to); + | hb_map_retains_sorting ([&] (hb_codepoint_t g) { + return hb_codepoint_pair_t (glyph_map[g], + glyph_map[(g + delta) & 0xFFFF]); }) + ; - c->serializer->propagate_error (from, to); - SingleSubst_serialize (c->serializer, from, to); - return_trace (from.length); + SingleSubst_serialize (c->serializer, it); + return_trace (it.len ()); } bool sanitize (hb_sanitize_context_t *c) const @@ -175,11 +180,21 @@ struct SingleSubstFormat2 return_trace (true); } + template bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t glyphs, - hb_array_t substitutes) + Iterator it) { TRACE_SERIALIZE (this); + auto substitutes = + + it + | hb_map (hb_second) + ; + auto glyphs = + + it + | hb_map_retains_sorting (hb_first) + ; if (unlikely (!c->extend_min (*this))) return_trace (false); if (unlikely (!substitute.serialize (c, substitutes))) return_trace (false); if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false); @@ -192,18 +207,15 @@ struct SingleSubstFormat2 const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_sorted_vector_t from; - hb_vector_t to; - + auto it = + hb_zip (this+coverage, substitute) | hb_filter (glyphset, hb_first) - | hb_map ([&] (hb_pair_t p) -> hb_pair_t - { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) - | hb_unzip (from, to); + | hb_map_retains_sorting ([&] (hb_pair_t p) -> hb_codepoint_pair_t + { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) + ; - c->serializer->propagate_error (from, to); - SingleSubst_serialize (c->serializer, from, to); - return_trace (from.length); + SingleSubst_serialize (c->serializer, it); + return_trace (it.len ()); } bool sanitize (hb_sanitize_context_t *c) const @@ -226,28 +238,33 @@ struct SingleSubstFormat2 struct SingleSubst { + + template bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t glyphs, - hb_array_t substitutes) + Iterator glyphs) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned format = 2; unsigned delta = 0; - if (glyphs.length) + if (glyphs.len ()) { format = 1; - delta = (unsigned) (substitutes[0] - glyphs[0]) & 0xFFFF; - for (unsigned int i = 1; i < glyphs.length; i++) - if (delta != ((unsigned) (substitutes[i] - glyphs[i]) & 0xFFFF)) { - format = 2; - break; - } + auto get_delta = [=] (hb_codepoint_pair_t _) { + return (unsigned) (_.second - _.first) & 0xFFFF; + }; + delta = get_delta (*glyphs); + if (!hb_all (++(+glyphs), delta, get_delta)) format = 2; } u.format = format; switch (u.format) { - case 1: return_trace (u.format1.serialize (c, glyphs, delta)); - case 2: return_trace (u.format2.serialize (c, glyphs, substitutes)); + case 1: return_trace (u.format1.serialize (c, + + glyphs + | hb_map_retains_sorting (hb_first), + delta)); + case 2: return_trace (u.format2.serialize (c, glyphs)); default:return_trace (false); } } @@ -272,11 +289,13 @@ struct SingleSubst } u; }; +template static inline void SingleSubst_serialize (hb_serialize_context_t *c, - hb_sorted_array_t glyphs, - hb_array_t substitutes) -{ c->start_embed ()->serialize (c, glyphs, substitutes); } + Iterator it) +{ c->start_embed ()->serialize (c, it); } struct Sequence { @@ -1265,7 +1284,9 @@ struct SubstLookup : Lookup { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false); - return_trace (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes)); + + return_trace (serialize_subtable (c, 0).u.single + .serialize (c, hb_zip (glyphs, substitutes))); } bool serialize_multiple (hb_serialize_context_t *c, From f92d188d7703184d04e8f205ae46ca3081d3e048 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 18:52:57 -0700 Subject: [PATCH 310/617] Whitespace --- src/hb-ot-layout-gsub-table.hh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 0babb3b24..25b61176b 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -37,8 +37,8 @@ namespace OT { typedef hb_pair_t hb_codepoint_pair_t; template + hb_requires (hb_is_sorted_source_of (Iterator, + const hb_codepoint_pair_t))> static inline void SingleSubst_serialize (hb_serialize_context_t *c, Iterator it); @@ -89,8 +89,8 @@ struct SingleSubstFormat1 } template + hb_requires (hb_is_sorted_source_of (Iterator, + hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs, unsigned delta) @@ -181,8 +181,8 @@ struct SingleSubstFormat2 } template + hb_requires (hb_is_sorted_source_of (Iterator, + const hb_codepoint_pair_t))> bool serialize (hb_serialize_context_t *c, Iterator it) { @@ -240,8 +240,8 @@ struct SingleSubst { template + hb_requires (hb_is_sorted_source_of (Iterator, + const hb_codepoint_pair_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs) { From 243a5a6af2565937705d6bc20e65a62b686bb664 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 19:03:59 -0700 Subject: [PATCH 311/617] [algs] Remove pair copy constructor Use default. --- src/hb-algs.hh | 1 - src/test-algs.cc | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index f0f13302a..f10e27939 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -215,7 +215,6 @@ struct hb_pair_t typedef hb_pair_t pair_t; hb_pair_t (T1 a, T2 b) : first (a), second (b) {} - hb_pair_t (const pair_t& o) : first (o.first), second (o.second) {} template xp = hb_pair_t (nullptr, 0); xp = hb_pair_t (nullptr, 1); + xp = hb_pair_t (nullptr, 1); return 0; } From 371b55c7a0c718fcaca0330edfeacf610797cf7a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 18:54:07 -0700 Subject: [PATCH 312/617] Fix clang build In file included from hb-ot-face.cc:41: ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument hb_requires (hb_is_sorted_source_of (Iterator, ^ ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' define hb_requires(Cond) hb_enable_if((Cond)) ^ ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr ^ ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here hb_requires (hb_is_sorted_source_of (Iterator, ^ ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' define hb_requires(Cond) hb_enable_if((Cond)) ^ ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr ^ 1 error generated. --- src/hb-ot-layout-gsub-table.hh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 25b61176b..25656c951 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -289,9 +289,7 @@ struct SingleSubst } u; }; -template +template static inline void SingleSubst_serialize (hb_serialize_context_t *c, Iterator it) From d214b07883a626f3ecebb027797e8bb994e174a4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 19:07:39 -0700 Subject: [PATCH 313/617] Fix clang build Ugh. In file included from hb-ot-face.cc:41: ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument hb_requires (hb_is_sorted_source_of (Iterator, ^ ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' define hb_requires(Cond) hb_enable_if((Cond)) ^ ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr ^ ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here hb_requires (hb_is_sorted_source_of (Iterator, ^ ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' define hb_requires(Cond) hb_enable_if((Cond)) ^ ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr ^ --- src/hb-ot-layout-gsub-table.hh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 25656c951..15cd44904 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -36,9 +36,7 @@ namespace OT { typedef hb_pair_t hb_codepoint_pair_t; -template +template static inline void SingleSubst_serialize (hb_serialize_context_t *c, Iterator it); From 16a3540ea4257a19b9bfd9d5300a280e18b423a1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 20:48:20 -0700 Subject: [PATCH 314/617] [algs] Add hb_bind0 and hb_bind1 --- src/hb-algs.hh | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ src/test-algs.cc | 7 +++++++ 2 files changed, 61 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index f10e27939..17296e17e 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -119,6 +119,60 @@ struct } HB_FUNCOBJ (hb_invoke); +enum class hb_bind_pos_t +{ + _0, + _1, +}; +template +struct hb_binder_t +{ + hb_binder_t (Appl a, V v) : a (a), v (v) {} + + template auto + operator () (Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), + hb_declval (V), + hb_declval (Ts)...)) + { + return hb_invoke (hb_forward (a), + hb_forward (v), + hb_forward (ds)...); + } + template auto + operator () (T0&& d0, Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), + hb_declval (T0), + hb_declval (V), + hb_declval (Ts)...)) + { + return hb_invoke (hb_forward (a), + hb_forward (d0), + hb_forward (v), + hb_forward (ds)...); + } + + private: + hb_reference_wrapper a; + V v; +}; +struct +{ + template auto + operator () (Appl&& a, V&& v) const HB_AUTO_RETURN + (( hb_binder_t (a, v) )) +} +HB_FUNCOBJ (hb_bind0); +struct +{ + template auto + operator () (Appl&& a, V&& v) const HB_AUTO_RETURN + (( hb_binder_t (a, v) )) +} +HB_FUNCOBJ (hb_bind1); + struct { private: diff --git a/src/test-algs.cc b/src/test-algs.cc index c4610d9e7..de96bde14 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -77,5 +77,12 @@ main (int argc, char **argv) xp = hb_pair_t (nullptr, 1); xp = hb_pair_t (nullptr, 1); + assert (3 == hb_bind0 (hb_min, 3) (4)); + assert (3 == hb_bind0 (hb_min, 4) (3)); + + auto M0 = hb_bind1 (hb_max, 0); + assert (M0 (-2) == 0); + assert (M0 (+2) == 2); + return 0; } From edc69ec935511d1993240fb68b54b2cfd6afa888 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:09:56 -0700 Subject: [PATCH 315/617] [algs] Rewrite bind API And add a partialization API use example to hb_add() --- src/hb-algs.hh | 45 ++++++++++++++++++++------------------------- src/test-algs.cc | 9 ++++++--- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 17296e17e..2420311ef 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -119,19 +119,14 @@ struct } HB_FUNCOBJ (hb_invoke); -enum class hb_bind_pos_t -{ - _0, - _1, -}; -template +template struct hb_binder_t { hb_binder_t (Appl a, V v) : a (a), v (v) {} template auto + unsigned P = Pos, + hb_enable_if (P == 0)> auto operator () (Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), hb_declval (V), hb_declval (Ts)...)) @@ -141,8 +136,8 @@ struct hb_binder_t hb_forward (ds)...); } template auto + unsigned P = Pos, + hb_enable_if (P == 1)> auto operator () (T0&& d0, Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), hb_declval (T0), hb_declval (V), @@ -158,20 +153,15 @@ struct hb_binder_t hb_reference_wrapper a; V v; }; -struct -{ - template auto - operator () (Appl&& a, V&& v) const HB_AUTO_RETURN - (( hb_binder_t (a, v) )) -} -HB_FUNCOBJ (hb_bind0); -struct -{ - template auto - operator () (Appl&& a, V&& v) const HB_AUTO_RETURN - (( hb_binder_t (a, v) )) -} -HB_FUNCOBJ (hb_bind1); +template +auto hb_bind (Appl&& a, V&& v) HB_AUTO_RETURN +(( hb_binder_t (a, v) )) + +#define HB_PARTIALIZE(Pos) \ + template \ + auto operator () (_T&& _v) const HB_AUTO_RETURN (hb_bind (this, hb_forward<_T> (_v))) \ + static_assert (true, "") + struct { @@ -834,7 +824,12 @@ struct hb_bitwise_sub HB_FUNCOBJ (hb_bitwise_sub); struct -{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) } +{ + HB_PARTIALIZE(0); + + template + auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) +} HB_FUNCOBJ (hb_add); struct { template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) } diff --git a/src/test-algs.cc b/src/test-algs.cc index de96bde14..6906d9361 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -77,12 +77,15 @@ main (int argc, char **argv) xp = hb_pair_t (nullptr, 1); xp = hb_pair_t (nullptr, 1); - assert (3 == hb_bind0 (hb_min, 3) (4)); - assert (3 == hb_bind0 (hb_min, 4) (3)); + assert (3 == hb_bind (hb_min, 3) (4)); + assert (3 == hb_bind (hb_min, 4) (3)); - auto M0 = hb_bind1 (hb_max, 0); + auto M0 = hb_bind<1> (hb_max, 0); assert (M0 (-2) == 0); assert (M0 (+2) == 2); + assert (hb_add (2) (5) == 7); + assert (hb_add (5) (2) == 7); + return 0; } From a06a236891611da9db601ddbc2b1513380ad12e6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:12:22 -0700 Subject: [PATCH 316/617] [algs] Partialize all operators --- src/hb-algs.hh | 66 ++++++++++++++++++++++++++++++------------------ src/test-algs.cc | 4 +-- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 2420311ef..856972db7 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -153,7 +153,7 @@ struct hb_binder_t hb_reference_wrapper a; V v; }; -template +template auto hb_bind (Appl&& a, V&& v) HB_AUTO_RETURN (( hb_binder_t (a, v) )) @@ -790,64 +790,82 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o } +/* Operators. */ + struct hb_bitwise_and -{ +{ HB_PARTIALIZE(1); static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; - template - auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) + template auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); struct hb_bitwise_or -{ +{ HB_PARTIALIZE(1); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template - auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) + template auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) } HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor -{ +{ HB_PARTIALIZE(1); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template - auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) + template auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) } HB_FUNCOBJ (hb_bitwise_xor); struct hb_bitwise_sub -{ +{ HB_PARTIALIZE(1); static constexpr bool passthru_left = true; static constexpr bool passthru_right = false; - template - auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) + template auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } HB_FUNCOBJ (hb_bitwise_sub); struct -{ - HB_PARTIALIZE(0); - - template - auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) +{ HB_PARTIALIZE(1); + template auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) } HB_FUNCOBJ (hb_add); struct -{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) } +{ HB_PARTIALIZE(1); + template auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) +} HB_FUNCOBJ (hb_sub); struct -{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) } +{ HB_PARTIALIZE(1); + template auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) +} HB_FUNCOBJ (hb_mul); struct -{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) } +{ HB_PARTIALIZE(1); + template auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) +} HB_FUNCOBJ (hb_div); struct -{ template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) } +{ HB_PARTIALIZE(1); + template auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) +} HB_FUNCOBJ (hb_mod); struct -{ template auto operator () (const T &a) const HB_AUTO_RETURN (+a) } +{ + template auto + operator () (const T &a) const HB_AUTO_RETURN (+a) +} HB_FUNCOBJ (hb_pos); struct -{ template auto operator () (const T &a) const HB_AUTO_RETURN (-a) } +{ + template auto + operator () (const T &a) const HB_AUTO_RETURN (-a) +} HB_FUNCOBJ (hb_neg); diff --git a/src/test-algs.cc b/src/test-algs.cc index 6906d9361..c34334ddd 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -77,8 +77,8 @@ main (int argc, char **argv) xp = hb_pair_t (nullptr, 1); xp = hb_pair_t (nullptr, 1); - assert (3 == hb_bind (hb_min, 3) (4)); - assert (3 == hb_bind (hb_min, 4) (3)); + assert (3 == hb_bind<0> (hb_min, 3) (4)); + assert (3 == hb_bind<0> (hb_min, 4) (3)); auto M0 = hb_bind<1> (hb_max, 0); assert (M0 (-2) == 0); From dfa5e4297147b52f0ed2f569c9b90a0c68c003c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:18:14 -0700 Subject: [PATCH 317/617] Add back symmetric OffsetTo<>::friend operator+ Finally seems to be working now. --- src/hb-open-type.hh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index ee2723aad..896f7a015 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -282,9 +282,15 @@ struct OffsetTo : Offset template friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); } + template + friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset ((const void *) base); } template friend Type& operator + (Base &&base, OffsetTo &offset) { return offset ((void *) base); } + template + friend Type& operator + (OffsetTo &offset, Base &&base) { return offset ((void *) base); } Type& serialize (hb_serialize_context_t *c, const void *base) { From 0888e7bc86454020db45f78ee1136d6f3a1b9527 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:36:42 -0700 Subject: [PATCH 318/617] [algs] Change hb_bind parameter number to be from one To match std:;bind, even though our interfaces are very different. --- src/hb-algs.hh | 24 +++++++++++++----------- src/test-algs.cc | 6 +++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 856972db7..691edcd48 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -124,9 +124,11 @@ struct hb_binder_t { hb_binder_t (Appl a, V v) : a (a), v (v) {} + static_assert (Pos > 0, ""); + template auto + hb_enable_if (P == 1)> auto operator () (Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), hb_declval (V), hb_declval (Ts)...)) @@ -137,7 +139,7 @@ struct hb_binder_t } template auto + hb_enable_if (P == 2)> auto operator () (T0&& d0, Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), hb_declval (T0), hb_declval (V), @@ -793,7 +795,7 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o /* Operators. */ struct hb_bitwise_and -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; template auto @@ -801,7 +803,7 @@ struct hb_bitwise_and } HB_FUNCOBJ (hb_bitwise_and); struct hb_bitwise_or -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; template auto @@ -809,7 +811,7 @@ struct hb_bitwise_or } HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; template auto @@ -817,7 +819,7 @@ struct hb_bitwise_xor } HB_FUNCOBJ (hb_bitwise_xor); struct hb_bitwise_sub -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = false; template auto @@ -826,31 +828,31 @@ struct hb_bitwise_sub HB_FUNCOBJ (hb_bitwise_sub); struct -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) } HB_FUNCOBJ (hb_add); struct -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) } HB_FUNCOBJ (hb_sub); struct -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) } HB_FUNCOBJ (hb_mul); struct -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) } HB_FUNCOBJ (hb_div); struct -{ HB_PARTIALIZE(1); +{ HB_PARTIALIZE(2); template auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) } diff --git a/src/test-algs.cc b/src/test-algs.cc index c34334ddd..02b3d3a0a 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -77,10 +77,10 @@ main (int argc, char **argv) xp = hb_pair_t (nullptr, 1); xp = hb_pair_t (nullptr, 1); - assert (3 == hb_bind<0> (hb_min, 3) (4)); - assert (3 == hb_bind<0> (hb_min, 4) (3)); + assert (3 == hb_bind<1> (hb_min, 3) (4)); + assert (3 == hb_bind<2> (hb_min, 4) (3)); - auto M0 = hb_bind<1> (hb_max, 0); + auto M0 = hb_bind<2> (hb_max, 0); assert (M0 (-2) == 0); assert (M0 (+2) == 2); From 6f51e5552477125480f764a6af763dad9f8e3e1b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:41:12 -0700 Subject: [PATCH 319/617] [algs] Rename hb_bind to hb_partial Since our API is the invers of what std::bind is, and closer to Python functools.partial(). --- src/hb-algs.hh | 12 ++++++------ src/test-algs.cc | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 691edcd48..523629aab 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -120,9 +120,9 @@ struct HB_FUNCOBJ (hb_invoke); template -struct hb_binder_t +struct hb_partial_t { - hb_binder_t (Appl a, V v) : a (a), v (v) {} + hb_partial_t (Appl a, V v) : a (a), v (v) {} static_assert (Pos > 0, ""); @@ -155,13 +155,13 @@ struct hb_binder_t hb_reference_wrapper a; V v; }; -template -auto hb_bind (Appl&& a, V&& v) HB_AUTO_RETURN -(( hb_binder_t (a, v) )) +template +auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN +(( hb_partial_t (a, v) )) #define HB_PARTIALIZE(Pos) \ template \ - auto operator () (_T&& _v) const HB_AUTO_RETURN (hb_bind (this, hb_forward<_T> (_v))) \ + auto operator () (_T&& _v) const HB_AUTO_RETURN (hb_partial (this, hb_forward<_T> (_v))) \ static_assert (true, "") diff --git a/src/test-algs.cc b/src/test-algs.cc index 02b3d3a0a..333a89242 100644 --- a/src/test-algs.cc +++ b/src/test-algs.cc @@ -77,10 +77,10 @@ main (int argc, char **argv) xp = hb_pair_t (nullptr, 1); xp = hb_pair_t (nullptr, 1); - assert (3 == hb_bind<1> (hb_min, 3) (4)); - assert (3 == hb_bind<2> (hb_min, 4) (3)); + assert (3 == hb_partial (hb_min, 3) (4)); + assert (3 == hb_partial<1> (hb_min, 4) (3)); - auto M0 = hb_bind<2> (hb_max, 0); + auto M0 = hb_partial<2> (hb_max, 0); assert (M0 (-2) == 0); assert (M0 (+2) == 2); From 2376867649f97d25e4319f45845525ec207887f7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 15 May 2019 21:57:26 -0700 Subject: [PATCH 320/617] Use hb_map(hb_add(this)) to dereference OffsetTo<>'s --- src/hb-ot-layout-gsub-table.hh | 30 +++++++++++------ src/hb-ot-layout-gsubgpos.hh | 60 ++++++++++++++++++++++------------ src/hb-ot-stat-table.hh | 2 +- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 15cd44904..a8ac0b803 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -367,7 +367,8 @@ struct MultipleSubstFormat1 + hb_zip (this+coverage, sequence) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([c, this] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Sequence &_) { _.closure (c); }) ; } @@ -376,7 +377,8 @@ struct MultipleSubstFormat1 if (unlikely (!(this+coverage).add_coverage (c->input))) return; + hb_zip (this+coverage, sequence) | hb_map (hb_second) - | hb_apply ([c, this] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Sequence &_) { _.collect_glyphs (c); }) ; } @@ -541,7 +543,8 @@ struct AlternateSubstFormat1 { + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) - | hb_apply ([c, this] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const AlternateSet &_) { _.closure (c); }) ; } @@ -550,7 +553,8 @@ struct AlternateSubstFormat1 if (unlikely (!(this+coverage).add_coverage (c->input))) return; + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) - | hb_apply ([c, this] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const AlternateSet &_) { _.collect_glyphs (c); }) ; } @@ -757,7 +761,8 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([this, glyphs] (const OffsetTo &_) { return (this+_).intersects (glyphs); }) + | hb_map (hb_add (this)) + | hb_map ([glyphs] (const Ligature &_) { return _.intersects (glyphs); }) | hb_any ; } @@ -765,14 +770,16 @@ struct LigatureSet void closure (hb_closure_context_t *c) const { + hb_iter (ligature) - | hb_apply ([this, c] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Ligature &_) { _.closure (c); }) ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { + hb_iter (ligature) - | hb_apply ([this, c] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Ligature &_) { _.collect_glyphs (c); }) ; } @@ -780,7 +787,8 @@ struct LigatureSet { return + hb_iter (ligature) - | hb_map ([this, c] (const OffsetTo &_) { return (this+_).would_apply (c); }) + | hb_map (hb_add (this)) + | hb_map ([c] (const Ligature &_) { return _.would_apply (c); }) | hb_any ; } @@ -852,7 +860,8 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([this, c] (const OffsetTo &_) { (this+_).closure (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const LigatureSet &_) { _.closure (c); }) ; } @@ -862,7 +871,8 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_map (hb_second) - | hb_apply ([this, c] (const OffsetTo &_) { (this+_).collect_glyphs (c); }) + | hb_map (hb_add (this)) + | hb_apply ([c] (const LigatureSet &_) { _.collect_glyphs (c); }) ; } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 091930cc2..7d395b5d8 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1371,7 +1371,8 @@ struct RuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.intersects (glyphs, lookup_context); }) | hb_any ; } @@ -1381,7 +1382,8 @@ struct RuleSet { return + hb_iter (rule) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const Rule &_) { _.closure (c, lookup_context); }) ; } @@ -1390,7 +1392,8 @@ struct RuleSet { return + hb_iter (rule) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const Rule &_) { _.collect_glyphs (c, lookup_context); }) ; } @@ -1399,7 +1402,8 @@ struct RuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.would_apply (c, lookup_context); }) | hb_any ; } @@ -1410,7 +1414,8 @@ struct RuleSet TRACE_APPLY (this); return_trace ( + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).apply (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); }) | hb_any ) ; @@ -1444,7 +1449,8 @@ struct ContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const RuleSet &_) { return _.intersects (glyphs, lookup_context); }) | hb_any ; } @@ -1459,7 +1465,8 @@ struct ContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); }) ; } @@ -1473,7 +1480,8 @@ struct ContextFormat1 }; + hb_iter (ruleSet) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); }) ; } @@ -1571,7 +1579,8 @@ struct ContextFormat2 { return class_def.intersects_class (c->glyphs, _); }, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); }) ; } @@ -1586,7 +1595,8 @@ struct ContextFormat2 }; + hb_iter (ruleSet) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); }) ; } @@ -2022,7 +2032,8 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.intersects (glyphs, lookup_context); }) | hb_any ; } @@ -2030,7 +2041,8 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRule &_) { _.closure (c, lookup_context); }) ; } @@ -2038,7 +2050,8 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRule &_) { _.collect_glyphs (c, lookup_context); }) ; } @@ -2046,7 +2059,8 @@ struct ChainRuleSet { return + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).would_apply (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.would_apply (c, lookup_context); }) | hb_any ; } @@ -2056,7 +2070,8 @@ struct ChainRuleSet TRACE_APPLY (this); return_trace ( + hb_iter (rule) - | hb_map ([&] (const OffsetTo &_) { return (this+_).apply (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) | hb_any ) ; @@ -2089,7 +2104,8 @@ struct ChainContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([&] (const OffsetTo &_) { return (this+_).intersects (glyphs, lookup_context); }) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRuleSet &_) { return _.intersects (glyphs, lookup_context); }) | hb_any ; } @@ -2104,7 +2120,8 @@ struct ChainContextFormat1 + hb_zip (this+coverage, ruleSet) | hb_filter (*c->glyphs, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); }) ; } @@ -2118,7 +2135,8 @@ struct ChainContextFormat1 }; + hb_iter (ruleSet) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); }) ; } @@ -2221,7 +2239,8 @@ struct ChainContextFormat2 { return input_class_def.intersects_class (c->glyphs, _); }, hb_first) | hb_map (hb_second) - | hb_apply ([&] (const OffsetTo &_) { (this+_).closure (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); }) ; } @@ -2241,7 +2260,8 @@ struct ChainContextFormat2 }; + hb_iter (ruleSet) - | hb_apply ([&] (const OffsetTo &_) { (this+_).collect_glyphs (c, lookup_context); }) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); }) ; } diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 228c3ecc1..8f9ff5ab2 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -289,7 +289,7 @@ struct STAT ; + get_axis_value_offsets () - | hb_map ([this] (const OffsetTo& _) { return hb_addressof (this + _); }) + | hb_map (hb_add (this)) | hb_map (&AxisValue::get_value_name_id) | hb_sink (nameids_to_retain) ; From 6555f209586886a4b2562412363cf152d7837d5c Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 15 May 2019 09:42:38 -0700 Subject: [PATCH 321/617] [subset] Truncate empty gids at the end in retain-gids mode. --- src/hb-subset-plan.cc | 8 +++--- .../api/fonts/Roboto-Regular.a.retaingids.ttf | Bin 0 -> 2068 bytes ...urceHanSans-Regular.41,4C2E.retaingids.otf | Bin 2736 -> 2656 bytes test/api/test-subset-glyf.c | 25 ++++++++++++++++++ ...-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 744 -> 732 bytes ...-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 712 -> 704 bytes .../Roboto-Regular.abc.retain-gids.61.ttf | Bin 1808 -> 1792 bytes .../Roboto-Regular.abc.retain-gids.62.ttf | Bin 1756 -> 1748 bytes 8 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/api/fonts/Roboto-Regular.a.retaingids.ttf diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index fad75d0b3..2e7b71b8e 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -183,9 +183,11 @@ _create_old_gid_to_new_gid_map (const hb_face_t *face, | hb_sink (reverse_glyph_map) ; - // TODO(grieger): Should we discard glyphs past the max glyph to keep? - // *num_glyphs = + hb_iter (all_gids_to_retain) | hb_reduce (hb_max, 0); - *num_glyphs = face->get_num_glyphs (); + unsigned max_glyph = + + hb_iter (all_gids_to_retain) + | hb_reduce (hb_max, 0) + ; + *num_glyphs = max_glyph + 1; } + reverse_glyph_map->iter () diff --git a/test/api/fonts/Roboto-Regular.a.retaingids.ttf b/test/api/fonts/Roboto-Regular.a.retaingids.ttf new file mode 100644 index 0000000000000000000000000000000000000000..183b148ca289cc64214f419adb37f3b93a08e1a1 GIT binary patch literal 2068 zcmZuxZ){Ul6hHU9*MDo-y3wuB!uGmuV_RD`w^3m(P_*43Q#RHCuZyykwcCJ|m92we z5D^uZDj*@o1SJw<3`UK&RkI;{*awI)(Fh42SYrH05G88F#F)5x&U^a<#@oE#J->6$ z`Q3Bx>pQ>zpa?+%xh)uKh0UM`Fw~>Bs;#plth;~z5^@FkiMH^LC(jk1C_(-Ma(_p- zt|2va!UDiB2KxFF(Ihz8&j7+I@@Jx1i-uaMCsa*M2L+ngM1RdgaO)SVJkIO%T`T*wvLWA2tX8~dYA(kFq{`a2KF8;OU*itLr+96sF=$5dVH~{e+|;RL z7&{%AX1Q1SE2}dmv3IwRGp{U%_69lY^Krq;S*^>*MX%h-#md$$#T}8;a(ZhlEw{=; z(HNI1)fpG!=}4W-A*}30>{eVn5OFS=@kpfE$0d@%42(`kP+;G@0M4qb?jIl5dD~?! zR&^@d6@EPE2k>-KGUi2nV{1ZiTJpFu|}-*g}p1ZY7Jhluk~@GrVv(mz{w$! zPLp0(al82OblRE56D;tVNBJ~^|2hH>JMacV)9iRBO5x;oImzL6xm{RcB{DW}8A_AQ;9=Q9hB#H&Twm$5g3$w0Y|9gCT{bkQ z1ZB(mYSj|Eo@%NrA)mDSnHJAVvUGlL`N{&a^ar17ZE%uhID7cnW;a>JV}qR=9Aufg zL;fmNCGSvQyMHzL%rD2bX>pd>Y`VXNe9LTBi%CybeoMoeRfS{~1e$7AtGU+B&01BE zEixPM0NQ)YZgQ}(Y%jr!1a%IU%61Tp5S$_Sj37r)=3wKLF-{rdlrf$yD5YG2UkS=e zF|L>348ivVIf6~47(7ByCu7_Q0(}>?Z~=}(8YbWtcAag|1Fu0J?1Uzv1+GFCPQx{f zvd#5@O?U@n(FJCy8En!iu;O=X)31PH_8}DNXCPlcOMQEOP|p(Uy6mG9`X6%lQ5tT?tq@sBONB~JzuuGVfHLDXh*I|05fbl$!;=1j85W(BD zlc;3Plr4F=*_v@L(fY?+RcrL_@~U-B6^)JSnyTF8`eJvJ-{06!VlTAWiz^%akFRsf z#kLZ$+M4&$=NG?Y?58hM2m4QcHFo{bm0MEPoO#!~?z3~Bq~xxXU%vj)l^xNsSljlu zl`9|2<-es^PxWm1@#|fC=c#*Q?K zQR>L;qu&2NgQ2bw1nhAIs7q?vC_%RHqXtYnTF^s-Fc0csBS^v4r@O(?e`ItR9D}3r z{oojmrVfAuzeOCVO0jHzeDnbBqGd8%BSl90Lb)1QjcVdTt+=){7HW8S*0QOF255Su Rh6=TY3blrc#Tu5>;9sKSyNCb) literal 0 HcmV?d00001 diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf index 906bdbefd595a64a682884a2ffd18b7592f7d530..fa2a0e4469e99944f90be57b6e70da09eee8e138 100644 GIT binary patch delta 605 zcmYk3%WD%+6vn@E=aJ5Inlz=-P1?pZ7O9Vc6bfn=QlYwNjWi`xUDzQVI*W`GYpemm z2!f#aKxX4Yve52SsHBTR!0M)}`~h7Sf*@UX6LC||l_@wd_kO=~?ws?Txtk~U2kZI8 z#XKxLfr86dW@po%c4jO9Z9r?}3wEyf)SLwL4UR1r^9xs%d#n&sdFd(nPUYS7^c=3~F#_Sfl-_mBh@Z)Rq zg|Z~Vj@F9HmhvUN5gho<@A??kRpl2}#2vmLepqJ!p7ozS#Bht_q#B&sqwz=+&f|Ba z1>!h}w1PP_BCY;+Mne@7QCw#Q6cFG6)=+{QUNlF;mQf7@W3F!jE><~HhJ&>*XV~HG Sp1tsEcp*Zm7p6}c@ch1cF;681wWwO}} z99)5hBmL=g$M(7B-vBHD@=InU*`2#)?+5f%_9k+f;Q{R|D;R@(Gf$WN^4-*lcIGVe zR59;QTA%Z4ynm6or^tpAv)*w3HM3VNRjPIpH<&*$yCuImRE9js+W5scecCVO_w6~x z!%RjoTAn#yS-*~Mz#e6zW0nV6m)kt%Dzi7s1H;eog83e^duOSbJP_qP;;^$*l~azV z%KaE@0phRvi0}A`b&6Apa#W?D;nN%i<6>(qcif-$K}3fBu;;;{Fp!Xsy;pzg8YB+~ zX%GS$ArxXm5=Gnh_722p!PynZHhzt4Yl+j%O*+U_SLCYR2-7V^DwixU-QMgiw?GPq z^9eqQh$xCPjiXvY1W)A4#P9mNdLTWoFWc|J3r=k9lB>d~MfzgjkE@NUzJqE~`-(|1 z&d10X>x8NR|J#4zVPK4V6tdWS&uc>yx|lY!z!uV*TEif@O&$7gk3@wgn!b)sT0uW% wP{zd|WxWjyt1B{$JPNpgDfl=SJTixZUb7NJ&CVcV_qD2&DqWzmaow%zU&gX^bpQYW diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index 4671156f9..dd9833c58 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -305,6 +305,30 @@ test_subset_glyf_retain_gids (void) hb_face_destroy (face_ac); } +static void +test_subset_glyf_retain_gids_truncates (void) +{ + hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf"); + hb_face_t *face_a = hb_test_open_font_file ("fonts/Roboto-Regular.a.retaingids.ttf"); + + hb_set_t *codepoints = hb_set_create(); + hb_face_t *face_abc_subset; + hb_set_add (codepoints, 97); + + hb_subset_input_t *input = hb_subset_test_create_input (codepoints); + hb_subset_input_set_retain_gids (input, true); + face_abc_subset = hb_subset_test_create_subset (face_abc, input); + hb_set_destroy (codepoints); + + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('g','l','y','f')); + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('l','o','c', 'a')); + check_maxp_num_glyphs(face_abc_subset, 2, true); + + hb_face_destroy (face_abc_subset); + hb_face_destroy (face_abc); + hb_face_destroy (face_a); +} + // TODO(grieger): test for long loca generation. int @@ -322,6 +346,7 @@ main (int argc, char **argv) hb_test_add (test_subset_glyf_with_gsub); hb_test_add (test_subset_glyf_without_gsub); hb_test_add (test_subset_glyf_retain_gids); + hb_test_add (test_subset_glyf_retain_gids_truncates); return hb_test_run(); } diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf index 1a0d5bdd085330849db8bd8ab36627d1a2cd4c40..128eae01645604031f9a5fe2619c0339f481c2e1 100644 GIT binary patch delta 179 zcmaFCdWUs_xZ(i@28M*>+{6L~X~x$K3``0@enfg=aRCDdgD{YPVWNe6Vhm8wEF&W| zk!u(0A_fM=IY7QjMs7(3`!j}%K>idUpCczfIg!Bz$YNj&0TOJvi4_G5DhyA7d=nsF zAulmEm1#TIXP}`KK)yvmesRhFT!s`Nf5XHbjf_l_tr!(~fvSO$Ov*y+2mfxJoWp23 Pc_pI~Bh%(Hj53S>!xbuY delta 191 zcmcb^`hs+{6L~X~x$K3`{yeenfg=aRCDdgD{YPXQG9CVggXmEF&W| zk!u(0Vg?4r6+pg9Ms7(3`!j}%K>iFMpD!mrIgz1)!3M|=0rI(W6DtZB)EJ%u`6fWV zLSABSD${nZ&p<<4fP9OB{Nj@TxeO^l{+@|D8W~w8TQMpM+JFpTU<6_&Wg&LgKMyBo WFq*Ohxgaok4x=(7^X3DLGK>K9t}9{y diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf index 257184b921d6d2fd75aece3078232cc0ee06e89a..2d2b65b0d2ba55182f69c318c72a3d06ca15d7dd 100644 GIT binary patch delta 177 zcmX@XdVqC;xZ)B928M*>+{6L~8OHYv3`{IQenfg=aRCDdgD{Z4Wuk?Aq76{cEF&W| zk!u(0Vg?4r1|VN0Be$f2gOlL{kY57i^W@|wCjx05Am0Q?bL1vg6fmeVJO%PafP96# z#N1S-?OdOMhQq0(f|Me delta 185 zcmX@WdV+O=xZ)ZH28M*>+{6L~8OHYv3`{&genfg=aRCDdgD{Z4XQG9Cq61LSEF&W| zk!u(05(Wmw4j^A8Be$f2gOlL{kY54h3*_V{Co<>&Ap@fckk6HySW&>B#_$x#7Xk7W z@)C1XnYMF%1{#_I~o2L=YlJ?V+X1q>Vv!a(^iKzW|@oXWJYj*ogk_8%brl97^I!O68vb3_p)yO!6d-~0P)yH A`v3p{ delta 297 zcmZqRo4_|gyuO2hfgvF|H?e?0n(;LQ1Je&6KO(uTL_vE6`&Vv!VC=TEI@gl^qk7Hu#S&tC2viUP6CN705saMj&QV7P4zOsykVQ$&?+)1%b&COv;SRlWUmLIXQrC NX9bCEe!(Qc0sss*M&1Ab diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf index 4ff6e338c3364cdbf3df4b6c8061b3fe7e3a1915..eb84f9c9f6476def8c8c9485cd25becc45c6067f 100644 GIT binary patch delta 242 zcmcb^dxdv`xT6mP14BY`Zejt04C8wS2BtkgenfIviGubD_PGoUY%)N8NLoR9ZuyUd z)eH>GA`A?Sd(sn&3m7;Ugn{xWCPv8DuK_9&$Vg30`IB|23aH=-kZ+a&6yVy$x)^Av z29U3kky}#1!O8Fe$Ojq9larsE2&ChI>hAz)j@-nG0w!Z-PLKsazCvDNZYtAuuFpVA z3V?izg8br=|G5k)K>iAld_hra!J@QZCxPa%T$uRdBqQ_WLyXGYj6gXiWue3y%OfX$ SVYHlV$fU%`yg7uag9QNJ5GG7Joid(sn&3m7;Ugn{xGCPv8DZviS2$Vg30`IB|23aH=(kZ+a&6yVy$x&&yb z0g$hfky}#1!O8Fe$X5WV&&f|tWQYes2F5!;K38sHMFEouGbhLbAYUObF*lWIJJ)BR zB^5xvML~XX$^Tr26d->CNWP#bwO~=&uaiLYSZ+-Gagvc`@*zfLexP{_j6lq!ER-m* Y?C0bUjF!wm?qm%nWk#0GK1>}f02Vtw-2eap From 05bc5f96fb0818531404174b71c6ff497d5e2738 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 16 May 2019 13:05:58 -0700 Subject: [PATCH 322/617] [subset] Remove extra iteration --- src/hb-ot-layout-gsub-table.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index a8ac0b803..c03e8f9a5 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -116,8 +116,9 @@ struct SingleSubstFormat1 glyph_map[(g + delta) & 0xFFFF]); }) ; + bool ret = bool (it); SingleSubst_serialize (c->serializer, it); - return_trace (it.len ()); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const @@ -212,8 +213,9 @@ struct SingleSubstFormat2 { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) ; + bool ret = bool (it); SingleSubst_serialize (c->serializer, it); - return_trace (it.len ()); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const From bcd3ffc948f63f59a709923a3ba6dc9d591aae6b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 16 May 2019 13:22:09 -0700 Subject: [PATCH 323/617] Whitespace --- src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index c03e8f9a5..9491c7878 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -112,8 +112,8 @@ struct SingleSubstFormat1 + hb_iter (this+coverage) | hb_filter (glyphset) | hb_map_retains_sorting ([&] (hb_codepoint_t g) { - return hb_codepoint_pair_t (glyph_map[g], - glyph_map[(g + delta) & 0xFFFF]); }) + return hb_codepoint_pair_t (glyph_map[g], + glyph_map[(g + delta) & 0xFFFF]); }) ; bool ret = bool (it); @@ -210,7 +210,7 @@ struct SingleSubstFormat2 + hb_zip (this+coverage, substitute) | hb_filter (glyphset, hb_first) | hb_map_retains_sorting ([&] (hb_pair_t p) -> hb_codepoint_pair_t - { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) + { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) ; bool ret = bool (it); @@ -261,9 +261,9 @@ struct SingleSubst u.format = format; switch (u.format) { case 1: return_trace (u.format1.serialize (c, - + glyphs - | hb_map_retains_sorting (hb_first), - delta)); + + glyphs + | hb_map_retains_sorting (hb_first), + delta)); case 2: return_trace (u.format2.serialize (c, glyphs)); default:return_trace (false); } @@ -662,7 +662,7 @@ struct Ligature unsigned int count = component.lenP1; for (unsigned int i = 1; i < count; i++) if (!glyphs->has (component[i])) - return false; + return false; return true; } @@ -1018,12 +1018,12 @@ struct ReverseChainSingleSubstFormat1 count = backtrack.len; for (unsigned int i = 0; i < count; i++) if (!(this+backtrack[i]).intersects (glyphs)) - return false; + return false; count = lookahead.len; for (unsigned int i = 0; i < count; i++) if (!(this+lookahead[i]).intersects (glyphs)) - return false; + return false; return true; } @@ -1084,7 +1084,7 @@ struct ReverseChainSingleSubstFormat1 backtrack.len, (HBUINT16 *) backtrack.arrayZ, match_coverage, this, &start_index) && - match_lookahead (c, + match_lookahead (c, lookahead.len, (HBUINT16 *) lookahead.arrayZ, match_coverage, this, 1, &end_index)) @@ -1287,8 +1287,8 @@ struct SubstLookup : Lookup bool serialize_single (hb_serialize_context_t *c, uint32_t lookup_props, - hb_sorted_array_t glyphs, - hb_array_t substitutes) + hb_sorted_array_t glyphs, + hb_array_t substitutes) { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false); From b7be59311f27112791e9b9c6356464e1c3ff92c1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 16 May 2019 13:32:56 -0700 Subject: [PATCH 324/617] Fix msan issue The fact that HB_AUTO_RETURN will return rvalue-references for rvalues is very disturbing. Even apart from that, I'm totally lost re any hb_move needs or hb_forward'ing to functions/templates where the type is fixed by explicitly specifying template parameters. ==1==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f6ad65e51e0 at pc 0x0000005da240 bp 0x7ffc104ab670 sp 0x7ffc104ab668 READ of size 4 at 0x7f6ad65e51e0 thread T0 SCARINESS: 55 (4-byte-read-stack-use-after-return) #0 0x5da23f in bool OT::Coverage::serialize, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>) harfbuzz/src/hb-ot-layout-common.hh:1055:16 #1 0x5d88f9 in bool OT::SingleSubstFormat1::serialize, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, unsigned int) harfbuzz/src/hb-ot-layout-gsub-table.hh:98:9 --- src/hb-algs.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 523629aab..ad756a64a 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -286,15 +286,15 @@ hb_pair (T1&& a, T2&& b) { return hb_pair_t (a, b); } struct { - template auto - operator () (const Pair& pair) const HB_AUTO_RETURN (pair.first) + template typename Pair::first_t + operator () (const Pair& pair) const { return pair.first; } } HB_FUNCOBJ (hb_first); struct { - template auto - operator () (const Pair& pair) const HB_AUTO_RETURN (pair.second) + template typename Pair::second_t + operator () (const Pair& pair) const { return pair.second; } } HB_FUNCOBJ (hb_second); From a0febbac439ac4cc58af674f676e473d2f6d726f Mon Sep 17 00:00:00 2001 From: rsheeter Date: Thu, 16 May 2019 15:58:49 -0700 Subject: [PATCH 325/617] Update TESTING.md --- TESTING.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/TESTING.md b/TESTING.md index ba9e32f2c..f99ba7c22 100644 --- a/TESTING.md +++ b/TESTING.md @@ -25,6 +25,11 @@ make distcheck ### Run tests with asan ```shell +# For nice symbols tell asan how to symoblize. Note that it doesn't like versioned copies like llvm-symbolizer-3.8 +# export ASAN_SYMBOLIZER_PATH=path to version-less llvm-symbolizer +# ex +export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.8/bin/llvm-symbolizer + ./configure CC=clang CXX=clang++ CPPFLAGS=-fsanitize=address LDFLAGS=-fsanitize=address # make/run tests as usual ``` From 24958b8868a8003936e872d8fda873c52d528bcf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 17 May 2019 16:20:36 -0700 Subject: [PATCH 326/617] [set] Use StructAtOffsetUnaligned --- src/hb-set.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-set.hh b/src/hb-set.hh index 3b30fa4d4..2f776da69 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -308,7 +308,7 @@ struct hb_set_t { page->add (g); - array = (const T *) ((const char *) array + stride); + array = &StructAtOffsetUnaligned (array, stride); count--; } while (count && (g = *array, start <= g && g < end)); From 08c3648c6e18a0969a64284337dbd5b435d40f37 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 17 May 2019 16:21:34 -0700 Subject: [PATCH 327/617] Oops, fix include --- src/hb-set.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-set.hh b/src/hb-set.hh index 2f776da69..ad449d0ce 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -28,6 +28,7 @@ #define HB_SET_HH #include "hb.hh" +#include "hb-machinery.hh" /* From e66eb21a46b2374bfb51f86ed9f5eec35ba87a61 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 18 May 2019 07:44:48 -0700 Subject: [PATCH 328/617] Don't set _POSIX_C_SOURCE in NetBSD According to a harfbuzz package patch on NetBSD project https://github.com/NetBSD/pkgsrc/blob/trunk/fonts/harfbuzz/patches/patch-src_hb-blob.cc --- src/hb-blob.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 699f66b1a..5783fb294 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -30,7 +30,7 @@ * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */ -#if !defined(_POSIX_C_SOURCE) && !defined(_MSC_VER) +#if !defined(_POSIX_C_SOURCE) && !defined(_MSC_VER) && !defined(__NetBSD__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-macros" #define _POSIX_C_SOURCE 200809L From 3efb7af7e28061f8cd138eb2ed5261bf521abc63 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 11:37:16 -0400 Subject: [PATCH 329/617] [STAT] Fix sanitize condition Oops! Fixes https://oss-fuzz.com/testcase-detail/5696825891225600 --- src/hb-ot-stat-table.hh | 2 +- ...ase-minimized-hb-subset-fuzzer-5696825891225600 | Bin 0 -> 69 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696825891225600 diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 8f9ff5ab2..f12b51ce3 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -186,7 +186,7 @@ struct AxisValue bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (unlikely (c->check_struct (this))) + if (unlikely (!c->check_struct (this))) return_trace (false); switch (u.format) diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696825891225600 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696825891225600 new file mode 100644 index 0000000000000000000000000000000000000000..30515a4c39f9b5297a2b42f9c7c62abba6a69f66 GIT binary patch literal 69 zcmZQzWME)mWM<}IV2ln9aSTcDn0+58BBi0uz{sEtWI=!^ln!-bVBm=PmGJ$$f3UuB L88c83!>4KhItdG- literal 0 HcmV?d00001 From 9ef241cd409b7ad4eeb8259cbf1a7a01358a766e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 11:38:02 -0400 Subject: [PATCH 330/617] [test] Add one more --- ...e-minimized-hb-subset-fuzzer-5634197349203968 | Bin 0 -> 5791 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5634197349203968 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5634197349203968 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5634197349203968 new file mode 100644 index 0000000000000000000000000000000000000000..39e8bd942340995c3516f2fbe1d58a2c28bb17df GIT binary patch literal 5791 zcmeHLSxi$=5IwI2QpzGK#SO8dB3e|y1r!89b{9Yj6-BWk!~{V_5(`8KvK3Nx31 z8e$auF){JOg~cFWDEeule-f7u4N@Z}bzUnZBE?dPioSWd_s*S}J8$O9eeWhWQYwvv zP&_4t#>57)3c&91lm?T8CnwE+HcgW&&agIsL!BX8ts#Zc@^2n~-I396eFVS&d@)}PA{#3s1I1D@E7E!c`}@PaqCV+VZTi=FU;KXxGif!K{81S15Y2-Aim0(-C*`>-F8 zh(a_DAO=#zA`Y^GgNVl=q^nNX7x7YNUVcN`~&+IS~a0Ew@ zh+~lBIFi6*CZEfs?-*1yKA2PT%yg=t8O@>9k__Nk_Aym3hcz?8jNmgobt8x;j?_X6 zzJ<9JkH@ZI?b(Ga39EtvgLM^%vg{-2Bes9(&yWhR?4wx#JuJDfZ>G_mMm7?A+8-=A z>UuJ!k<}+rbEVkCG@5}&G9HpxZy={^Pfgzw*JbhKP2xP?k6_H7>*U{c+ELp+K?;fZ z!iW;{;Djd3Gh?@y;4@T*L@T~gmw)8F{8xwog}{^jn<=GZH->bRDayDho51YVkm zWKDFcMkc6H)v9Wp%GHYcY-M&))`f};LFZVMs3Ei|tR-AtoRlwDs)w!(wLKGP+P+9d zRu4YC7b#*co>xXHJvuxp+$%zq)wy8;rK&_#>QtO_Nzq<9P_2=a_jb3os+$|t{U0R5 olABi>+M7Ds2759_W%sgL&emquQ_Kb)n;+$DQc=K(VTm*F71R7_#{d8T literal 0 HcmV?d00001 From 0ca7ad4352eff357cbb5cc1dfe62aa15b440de84 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 11:39:07 -0400 Subject: [PATCH 331/617] [cff] Fix unlikely invocations --- src/hb-ot-cff-common.hh | 8 ++++---- src/hb-ot-cff1-table.hh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index ef72feddd..ddec517a1 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -132,7 +132,7 @@ struct CFFIndex if (unlikely (!c->extend_min (*this))) return_trace (false); this->count = byteArray.length; this->offSize = offSize_; - if (!unlikely (c->allocate_size (offSize_ * (byteArray.length + 1)))) + if (unlikely (!c->allocate_size (offSize_ * (byteArray.length + 1)))) return_trace (false); /* serialize indices */ @@ -277,7 +277,7 @@ struct CFFIndexOf : CFFIndex if (unlikely (!c->extend_min (*this))) return_trace (false); this->count = dataArrayLen; this->offSize = offSize_; - if (!unlikely (c->allocate_size (offSize_ * (dataArrayLen + 1)))) + if (unlikely (!c->allocate_size (offSize_ * (dataArrayLen + 1)))) return_trace (false); /* serialize indices */ @@ -479,7 +479,7 @@ struct FDArray : CFFIndexOf if (unlikely (!c->extend_min (*this))) return_trace (false); this->count = fontDicts.length; this->offSize = offSize_; - if (!unlikely (c->allocate_size (offSize_ * (fontDicts.length + 1)))) + if (unlikely (!c->allocate_size (offSize_ * (fontDicts.length + 1)))) return_trace (false); /* serialize font dict offsets */ @@ -516,7 +516,7 @@ struct FDArray : CFFIndexOf if (unlikely (!c->extend_min (*this))) return_trace (false); this->count = fdCount; this->offSize = offSize_; - if (!unlikely (c->allocate_size (offSize_ * (fdCount + 1)))) + if (unlikely (!c->allocate_size (offSize_ * (fdCount + 1)))) return_trace (false); /* serialize font dict offsets */ diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh index 8aac5486c..3a887d3d0 100644 --- a/src/hb-ot-cff1-table.hh +++ b/src/hb-ot-cff1-table.hh @@ -576,7 +576,7 @@ struct CFF1StringIndex : CFF1Index TRACE_SERIALIZE (this); if (unlikely ((strings.count == 0) || (sidmap.get_count () == 0))) { - if (!unlikely (c->extend_min (this->count))) + if (unlikely (!c->extend_min (this->count))) return_trace (false); count = 0; return_trace (true); From 3be0ffe45d1ba32ddd8d3af25ff2c420be85da76 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 16 May 2019 11:29:15 -0700 Subject: [PATCH 332/617] [subset] Add drop tables to subset input. --- src/hb-subset-input.cc | 8 ++++ src/hb-subset-input.hh | 1 + src/hb-subset-plan.cc | 3 ++ src/hb-subset-plan.hh | 5 ++- src/hb-subset.cc | 3 ++ src/hb-subset.h | 3 ++ test/api/Makefile.am | 2 + test/api/test-subset-drop-tables.c | 71 ++++++++++++++++++++++++++++++ 8 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/api/test-subset-drop-tables.c diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index b3b27d427..fa5d9b2a7 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -45,6 +45,7 @@ hb_subset_input_create_or_fail () input->unicodes = hb_set_create (); input->glyphs = hb_set_create (); input->name_ids = hb_set_create (); + input->drop_tables = hb_set_create (); input->drop_hints = false; input->drop_layout = true; input->desubroutinize = false; @@ -83,6 +84,7 @@ hb_subset_input_destroy (hb_subset_input_t *subset_input) hb_set_destroy (subset_input->unicodes); hb_set_destroy (subset_input->glyphs); hb_set_destroy (subset_input->name_ids); + hb_set_destroy (subset_input->drop_tables); free (subset_input); } @@ -117,6 +119,12 @@ hb_subset_input_nameid_set (hb_subset_input_t *subset_input) return subset_input->name_ids; } +HB_EXTERN hb_set_t * +hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input) +{ + return subset_input->drop_tables; +} + HB_EXTERN void hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, hb_bool_t drop_hints) diff --git a/src/hb-subset-input.hh b/src/hb-subset-input.hh index d01fecee0..35436f850 100644 --- a/src/hb-subset-input.hh +++ b/src/hb-subset-input.hh @@ -41,6 +41,7 @@ struct hb_subset_input_t hb_set_t *unicodes; hb_set_t *glyphs; hb_set_t *name_ids; + hb_set_t *drop_tables; bool drop_hints : 1; bool drop_layout : 1; diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 2e7b71b8e..bdcef37cf 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -241,6 +241,8 @@ hb_subset_plan_create (hb_face_t *face, plan->retain_gids = input->retain_gids; plan->unicodes = hb_set_create (); plan->name_ids = hb_set_reference (input->name_ids); + plan->drop_tables = hb_set_reference (input->drop_tables); + /* TODO Clean this up... */ if (hb_set_is_empty (plan->name_ids)) hb_set_add_range (plan->name_ids, 0, 0x7FFF); @@ -279,6 +281,7 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) hb_set_destroy (plan->unicodes); hb_set_destroy (plan->name_ids); + hb_set_destroy (plan->drop_tables); hb_face_destroy (plan->source); hb_face_destroy (plan->dest); hb_map_destroy (plan->codepoint_to_glyph); diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index abbab5e22..2443d9b43 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -47,9 +47,12 @@ struct hb_subset_plan_t // For each cp that we'd like to retain maps to the corresponding gid. hb_set_t *unicodes; - //name_ids we would like to retain + // name_ids we would like to retain hb_set_t *name_ids; + // Tables which should be dropped. + hb_set_t *drop_tables; + // The glyph subset hb_map_t *codepoint_to_glyph; diff --git a/src/hb-subset.cc b/src/hb-subset.cc index a8ec14f57..ab5e03122 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -237,6 +237,9 @@ _subset_table (hb_subset_plan_t *plan, static bool _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) { + if (plan->drop_tables->has (tag)) + return true; + switch (tag) { case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */ case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */ diff --git a/src/hb-subset.h b/src/hb-subset.h index 50345061c..67a4c765a 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -57,6 +57,9 @@ hb_subset_input_glyph_set (hb_subset_input_t *subset_input); HB_EXTERN hb_set_t * hb_subset_input_nameid_set (hb_subset_input_t *subset_input); +HB_EXTERN hb_set_t * +hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input); + HB_EXTERN void hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, hb_bool_t drop_hints); diff --git a/test/api/Makefile.am b/test/api/Makefile.am index 9d7b3198c..b9d4d7928 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -42,6 +42,7 @@ TEST_PROGS = \ test-shape \ test-subset \ test-subset-cmap \ + test-subset-drop-tables \ test-subset-glyf \ test-subset-hdmx \ test-subset-hmtx \ @@ -57,6 +58,7 @@ TEST_PROGS = \ test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_cmap_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la +test_subset_drop_tables_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_hmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la diff --git a/test/api/test-subset-drop-tables.c b/test/api/test-subset-drop-tables.c new file mode 100644 index 000000000..e23408008 --- /dev/null +++ b/test/api/test-subset-drop-tables.c @@ -0,0 +1,71 @@ +/* + * Copyright © 2019 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "hb-test.h" +#include "hb-subset-test.h" + +/* Unit tests for hb-subset.cc drop tables functionality */ + +static void +test_subset_drop_tables (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf"); + + hb_set_t *codepoints = hb_set_create(); + hb_set_add (codepoints, 97); + hb_set_add (codepoints, 99); + hb_subset_input_t *input = hb_subset_test_create_input (codepoints); + hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG ('h', 'd', 'm', 'x')); + hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG ('h', 'm', 't', 'x')); + hb_set_destroy (codepoints); + + hb_face_t* subset = hb_subset (face, input); + + hb_blob_t *hdmx = hb_face_reference_table (subset, HB_TAG ('h', 'd', 'm', 'x')); + hb_blob_t *hmtx = hb_face_reference_table (subset, HB_TAG ('h', 'm', 't', 'x')); + hb_blob_t *cmap = hb_face_reference_table (subset, HB_TAG ('c', 'm', 'a', 'p')); + g_assert (!hb_blob_get_length (hdmx)); + g_assert (!hb_blob_get_length (hmtx)); + g_assert ( hb_blob_get_length (cmap)); + hb_blob_destroy (hdmx); + hb_blob_destroy (hmtx); + hb_blob_destroy (cmap); + + hb_face_destroy (subset); + hb_subset_input_destroy (input); + hb_face_destroy (face); +} + + +int +main (int argc, char **argv) +{ + hb_test_init (&argc, &argv); + + hb_test_add (test_subset_drop_tables); + + return hb_test_run(); +} From 67064294a0c521550f5277b51b8c7e5d6bb27e68 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 16 May 2019 15:13:39 -0700 Subject: [PATCH 333/617] [subset] Add drop-tables option to hb-subset util. --- util/hb-subset.cc | 1 + util/options.cc | 45 ++++++++++++++++++++++++++++++++++++++++++--- util/options.hh | 3 +++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 682ca4c34..5ac541a2a 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -94,6 +94,7 @@ struct subset_consumer_t hb_subset_input_set_retain_gids (input, subset_options.retain_gids); hb_subset_input_set_desubroutinize (input, subset_options.desubroutinize); hb_set_set (hb_subset_input_nameid_set (input), subset_options.name_ids); + hb_set_set (hb_subset_input_drop_tables_set (input), subset_options.drop_tables); hb_face_t *face = hb_font_get_face (font); diff --git a/util/options.cc b/util/options.cc index a9b3fc77e..1d7798bb3 100644 --- a/util/options.cc +++ b/util/options.cc @@ -31,6 +31,8 @@ #endif #include +#define DELIMITERS "<+>{},;&#\\xXuUnNiI\n\t\v\f\r " + static struct supported_font_funcs_t { char name[4]; void (*func) (hb_font_t *); @@ -352,7 +354,7 @@ parse_unicodes (const char *name G_GNUC_UNUSED, while (s && *s) { - while (*s && strchr ("<+>{},;&#\\xXuUnNiI\n\t\v\f\r ", *s)) + while (*s && strchr (DELIMITERS, *s)) s++; if (!*s) break; @@ -985,7 +987,7 @@ parse_nameids (const char *name G_GNUC_UNUSED, while (s && *s) { - while (*s && strchr ("<+>{},;&#\\xXuUnNiI\n\t\v\f\r ", *s)) + while (*s && strchr (DELIMITERS, *s)) s++; if (!*s) break; @@ -1013,6 +1015,43 @@ parse_nameids (const char *name G_GNUC_UNUSED, return true; } +static gboolean +parse_drop_tables (const char *name G_GNUC_UNUSED, + const char *arg, + gpointer data, + GError **error G_GNUC_UNUSED) +{ + subset_options_t *subset_opts = (subset_options_t *) data; + + hb_set_clear (subset_opts->drop_tables); + char *s = (char *) arg; + + while (s && *s) + { + while (*s && strchr (", ", *s)) + s++; + if (!*s) + break; + + char *p = s; + while (*p && !strchr (", ", *p)) + p++; + + if ((p - s) > 4) // Table tags are at most 4 bytes. + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Failed parsing table tag values at: '%s'", s); + return false; + } + + hb_tag_t tag = hb_tag_from_string (s, p -s); + hb_set_add (subset_opts->drop_tables, tag); + s = p; + } + + return true; +} + void subset_options_t::add_options (option_parser_t *parser) @@ -1024,6 +1063,7 @@ subset_options_t::add_options (option_parser_t *parser) {"retain-gids", 0, 0, G_OPTION_ARG_NONE, &this->retain_gids, "If set don't renumber glyph ids in the subset.", nullptr}, {"desubroutinize", 0, 0, G_OPTION_ARG_NONE, &this->desubroutinize, "Remove CFF/CFF2 use of subroutines", nullptr}, {"name-IDs", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids, "Subset specified nameids", "list of int numbers"}, + {"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags."}, {nullptr} }; @@ -1033,4 +1073,3 @@ subset_options_t::add_options (option_parser_t *parser) "Options subsetting", this); } - diff --git a/util/options.hh b/util/options.hh index 2691e2269..3c3d32b5b 100644 --- a/util/options.hh +++ b/util/options.hh @@ -678,6 +678,7 @@ struct subset_options_t : option_group_t retain_gids = false; desubroutinize = false; name_ids = hb_set_create (); + drop_tables = hb_set_create(); add_options (parser); } @@ -685,6 +686,7 @@ struct subset_options_t : option_group_t virtual ~subset_options_t () { hb_set_destroy (name_ids); + hb_set_destroy (drop_tables); } @@ -695,6 +697,7 @@ struct subset_options_t : option_group_t hb_bool_t retain_gids; hb_bool_t desubroutinize; hb_set_t *name_ids; + hb_set_t *drop_tables; }; /* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */ From 0ff3618c2d841d16cce9ba2d73321048e7ca6a2d Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Fri, 17 May 2019 15:30:01 -0700 Subject: [PATCH 334/617] [subset] Use hb_subset_input_t inside of subset_options_t so that input defaults are shared between the library and cli. --- src/hb-subset-input.cc | 42 ++++++---- src/hb-subset-input.hh | 7 +- src/hb-subset-plan.cc | 3 +- src/hb-subset-plan.hh | 1 - src/hb-subset.cc | 23 +----- src/hb-subset.h | 6 -- test/api/test-subset-glyf.c | 8 +- test/fuzzing/hb-subset-fuzzer.cc | 8 +- util/Makefile.am | 5 +- util/Makefile.sources | 1 + util/hb-subset.cc | 9 +-- util/options-subset.cc | 127 +++++++++++++++++++++++++++++++ util/options.cc | 101 ------------------------ util/options.hh | 20 +---- 14 files changed, 182 insertions(+), 179 deletions(-) create mode 100644 util/options-subset.cc diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index fa5d9b2a7..8bd6058d0 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -47,10 +47,37 @@ hb_subset_input_create_or_fail () input->name_ids = hb_set_create (); input->drop_tables = hb_set_create (); input->drop_hints = false; - input->drop_layout = true; input->desubroutinize = false; input->retain_gids = false; + hb_tag_t default_drop_tables[] = { + // Layout disabled by default + HB_TAG ('G', 'S', 'U', 'B'), + HB_TAG ('G', 'P', 'O', 'S'), + HB_TAG ('G', 'D', 'E', 'F'), + + // Copied from fontTools: + HB_TAG ('B', 'A', 'S', 'E'), + HB_TAG ('J', 'S', 'T', 'F'), + HB_TAG ('D', 'S', 'I', 'G'), + HB_TAG ('E', 'B', 'D', 'T'), + HB_TAG ('E', 'B', 'L', 'C'), + HB_TAG ('E', 'B', 'S', 'C'), + HB_TAG ('S', 'V', 'G', ' '), + HB_TAG ('P', 'C', 'L', 'T'), + HB_TAG ('L', 'T', 'S', 'H'), + // Graphite tables + HB_TAG ('F', 'e', 'a', 't'), + HB_TAG ('G', 'l', 'a', 't'), + HB_TAG ('G', 'l', 'o', 'c'), + HB_TAG ('S', 'i', 'l', 'f'), + HB_TAG ('S', 'i', 'l', 'l'), + // Colour + HB_TAG ('s', 'b', 'i', 'x') + }; + + input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables)); + return input; } @@ -138,19 +165,6 @@ hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input) return subset_input->drop_hints; } -HB_EXTERN void -hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input, - hb_bool_t drop_layout) -{ - subset_input->drop_layout = drop_layout; -} - -HB_EXTERN hb_bool_t -hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input) -{ - return subset_input->drop_layout; -} - HB_EXTERN void hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input, hb_bool_t desubroutinize) diff --git a/src/hb-subset-input.hh b/src/hb-subset-input.hh index 35436f850..f6dd4ac31 100644 --- a/src/hb-subset-input.hh +++ b/src/hb-subset-input.hh @@ -43,10 +43,9 @@ struct hb_subset_input_t hb_set_t *name_ids; hb_set_t *drop_tables; - bool drop_hints : 1; - bool drop_layout : 1; - bool desubroutinize : 1; - bool retain_gids : 1; + bool drop_hints; + bool desubroutinize; + bool retain_gids; /* TODO * * features diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index bdcef37cf..5ea51c4ab 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -236,7 +236,6 @@ hb_subset_plan_create (hb_face_t *face, hb_subset_plan_t *plan = hb_object_create (); plan->drop_hints = input->drop_hints; - plan->drop_layout = input->drop_layout; plan->desubroutinize = input->desubroutinize; plan->retain_gids = input->retain_gids; plan->unicodes = hb_set_create (); @@ -255,7 +254,7 @@ hb_subset_plan_create (hb_face_t *face, plan->_glyphset = _populate_gids_to_retain (face, input->unicodes, input->glyphs, - !plan->drop_layout, + !input->drop_tables->has (HB_OT_TAG_GSUB), plan->unicodes, plan->codepoint_to_glyph); diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 2443d9b43..6f65e773e 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -40,7 +40,6 @@ struct hb_subset_plan_t hb_object_header_t header; bool drop_hints : 1; - bool drop_layout : 1; bool desubroutinize : 1; bool retain_gids : 1; diff --git a/src/hb-subset.cc b/src/hb-subset.cc index ab5e03122..ba81dbc02 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -249,35 +249,14 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */ return plan->drop_hints; +#ifdef HB_NO_SUBSET_LAYOUT // Drop Layout Tables if requested. case HB_OT_TAG_GDEF: case HB_OT_TAG_GPOS: case HB_OT_TAG_GSUB: -#ifdef HB_NO_SUBSET_LAYOUT return true; #endif - return plan->drop_layout; - // Drop these tables below by default, list pulled - // from fontTools: - case HB_TAG ('B', 'A', 'S', 'E'): - case HB_TAG ('J', 'S', 'T', 'F'): - case HB_TAG ('D', 'S', 'I', 'G'): - case HB_TAG ('E', 'B', 'D', 'T'): - case HB_TAG ('E', 'B', 'L', 'C'): - case HB_TAG ('E', 'B', 'S', 'C'): - case HB_TAG ('S', 'V', 'G', ' '): - case HB_TAG ('P', 'C', 'L', 'T'): - case HB_TAG ('L', 'T', 'S', 'H'): - // Graphite tables: - case HB_TAG ('F', 'e', 'a', 't'): - case HB_TAG ('G', 'l', 'a', 't'): - case HB_TAG ('G', 'l', 'o', 'c'): - case HB_TAG ('S', 'i', 'l', 'f'): - case HB_TAG ('S', 'i', 'l', 'l'): - // Colour - case HB_TAG ('s', 'b', 'i', 'x'): - return true; default: return false; } diff --git a/src/hb-subset.h b/src/hb-subset.h index 67a4c765a..c778896a2 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -66,12 +66,6 @@ hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, HB_EXTERN hb_bool_t hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input); -HB_EXTERN void -hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input, - hb_bool_t drop_layout); -HB_EXTERN hb_bool_t -hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input); - HB_EXTERN void hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input, hb_bool_t desubroutinize); diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index dd9833c58..ad2c8e577 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -137,7 +137,9 @@ test_subset_glyf_with_gsub (void) input = hb_subset_test_create_input (codepoints); hb_set_destroy (codepoints); - hb_subset_input_set_drop_layout (input, false); + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'S', 'U', 'B')); + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'P', 'O', 'S')); + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'D', 'E', 'F')); face_subset = hb_subset_test_create_subset (face_fil, input); @@ -164,7 +166,9 @@ test_subset_glyf_without_gsub (void) input = hb_subset_test_create_input (codepoints); hb_set_destroy (codepoints); - hb_subset_input_set_drop_layout (input, true); + hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'S', 'U', 'B')); + hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'P', 'O', 'S')); + hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'D', 'E', 'F')); face_subset = hb_subset_test_create_subset (face_fil, input); diff --git a/test/fuzzing/hb-subset-fuzzer.cc b/test/fuzzing/hb-subset-fuzzer.cc index 56ffd2271..42ef0071e 100644 --- a/test/fuzzing/hb-subset-fuzzer.cc +++ b/test/fuzzing/hb-subset-fuzzer.cc @@ -16,10 +16,16 @@ trySubset (hb_face_t *face, { hb_subset_input_t *input = hb_subset_input_create_or_fail (); hb_subset_input_set_drop_hints (input, drop_hints); - hb_subset_input_set_drop_layout (input, drop_layout); hb_subset_input_set_retain_gids (input, retain_gids); hb_set_t *codepoints = hb_subset_input_unicode_set (input); + if (!drop_layout) + { + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'S', 'U', 'B')); + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'P', 'O', 'S')); + hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'D', 'E', 'F')); + } + for (int i = 0; i < text_length; i++) { hb_set_add (codepoints, text[i]); diff --git a/util/Makefile.am b/util/Makefile.am index e24a6f3dc..5298e7732 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -50,8 +50,9 @@ bin_PROGRAMS += hb-shape hb_subset_SOURCES = $(HB_SUBSET_CLI_sources) hb_subset_LDADD = \ - $(LDADD) \ - $(top_builddir)/src/libharfbuzz-subset.la + $(top_builddir)/src/libharfbuzz-subset.la \ + $(LDADD) + bin_PROGRAMS += hb-subset hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources) diff --git a/util/Makefile.sources b/util/Makefile.sources index 6c815d26b..bcf85f562 100644 --- a/util/Makefile.sources +++ b/util/Makefile.sources @@ -32,6 +32,7 @@ HB_OT_SHAPE_CLOSURE_sources = \ HB_SUBSET_CLI_sources = \ hb-subset.cc \ options.cc \ + options-subset.cc \ options.hh \ main-font-text.hh \ $(NULL) diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 5ac541a2a..4b7af8e9a 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -43,7 +43,7 @@ struct subset_consumer_t const font_options_t *font_opts) { font = hb_font_reference (font_opts->get_font ()); - input = hb_subset_input_create_or_fail (); + input = hb_subset_input_reference (subset_options.input); } void consume_line (const char *text, @@ -89,13 +89,6 @@ struct subset_consumer_t void finish (const font_options_t *font_opts) { - hb_subset_input_set_drop_layout (input, !subset_options.keep_layout); - hb_subset_input_set_drop_hints (input, subset_options.drop_hints); - hb_subset_input_set_retain_gids (input, subset_options.retain_gids); - hb_subset_input_set_desubroutinize (input, subset_options.desubroutinize); - hb_set_set (hb_subset_input_nameid_set (input), subset_options.name_ids); - hb_set_set (hb_subset_input_drop_tables_set (input), subset_options.drop_tables); - hb_face_t *face = hb_font_get_face (font); hb_face_t *new_face = hb_subset (face, input); diff --git a/util/options-subset.cc b/util/options-subset.cc new file mode 100644 index 000000000..8ce194604 --- /dev/null +++ b/util/options-subset.cc @@ -0,0 +1,127 @@ +/* + * Copyright © 2019 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "options.hh" + +#include "hb-subset-input.hh" + +static gboolean +parse_nameids (const char *name G_GNUC_UNUSED, + const char *arg, + gpointer data, + GError **error G_GNUC_UNUSED) +{ + subset_options_t *subset_opts = (subset_options_t *) data; + hb_set_t *name_ids = subset_opts->input->name_ids; + + hb_set_clear (name_ids); + + char *s = (char *) arg; + char *p; + + while (s && *s) + { + while (*s && strchr (", ", *s)) + s++; + if (!*s) + break; + + errno = 0; + hb_codepoint_t u = strtoul (s, &p, 10); + if (errno || s == p) + { + hb_set_destroy (name_ids); + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Failed parsing nameID values at: '%s'", s); + return false; + } + + hb_set_add (name_ids, u); + + s = p; + } + + return true; +} + +static gboolean +parse_drop_tables (const char *name, + const char *arg, + gpointer data, + GError **error G_GNUC_UNUSED) +{ + subset_options_t *subset_opts = (subset_options_t *) data; + hb_set_t *drop_tables = subset_opts->input->drop_tables; + + char last_name_char = name[strlen (name) - 1]; + + if (last_name_char != '+' && last_name_char != '-') + hb_set_clear (drop_tables); + + char *s = strtok((char *) arg, ", "); + while (s) + { + if (strlen (s) > 4) // Table tags are at most 4 bytes. + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Failed parsing table tag values at: '%s'", s); + return false; + } + + hb_tag_t tag = hb_tag_from_string (s, strlen (s)); + + if (last_name_char != '-') + hb_set_add (drop_tables, tag); + else + hb_set_del (drop_tables, tag); + + s = strtok(NULL, ", "); + } + + return true; +} + +void +subset_options_t::add_options (option_parser_t *parser) +{ + GOptionEntry entries[] = + { + {"no-hinting", 0, 0, G_OPTION_ARG_NONE, &this->input->drop_hints, "Whether to drop hints", nullptr}, + {"retain-gids", 0, 0, G_OPTION_ARG_NONE, &this->input->retain_gids, "If set don't renumber glyph ids in the subset.", nullptr}, + {"desubroutinize", 0, 0, G_OPTION_ARG_NONE, &this->input->desubroutinize, "Remove CFF/CFF2 use of subroutines", nullptr}, + {"name-IDs", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids, "Subset specified nameids", "list of int numbers"}, + {"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags."}, + {"drop-tables+", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags."}, + {"drop-tables-", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags."}, + + {nullptr} + }; + parser->add_group (entries, + "subset", + "Subset options:", + "Options subsetting", + this); +} diff --git a/util/options.cc b/util/options.cc index 1d7798bb3..4e6ca57e7 100644 --- a/util/options.cc +++ b/util/options.cc @@ -972,104 +972,3 @@ format_options_t::serialize_buffer_of_glyphs (hb_buffer_t *buffer, serialize_glyphs (buffer, font, output_format, format_flags, gs); g_string_append_c (gs, '\n'); } - -static gboolean -parse_nameids (const char *name G_GNUC_UNUSED, - const char *arg, - gpointer data, - GError **error G_GNUC_UNUSED) -{ - subset_options_t *subset_opts = (subset_options_t *) data; - - hb_set_t *name_ids = hb_set_create (); - char *s = (char *) arg; - char *p; - - while (s && *s) - { - while (*s && strchr (DELIMITERS, *s)) - s++; - if (!*s) - break; - - errno = 0; - hb_codepoint_t u = strtoul (s, &p, 10); - if (errno || s == p) - { - hb_set_destroy (name_ids); - g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, - "Failed parsing nameID values at: '%s'", s); - return false; - } - - hb_set_add (name_ids, u); - - s = p; - } - - hb_set_t *prev = subset_opts->name_ids; - subset_opts->name_ids = hb_set_reference (name_ids); - hb_set_destroy (prev); - hb_set_destroy (name_ids); - - return true; -} - -static gboolean -parse_drop_tables (const char *name G_GNUC_UNUSED, - const char *arg, - gpointer data, - GError **error G_GNUC_UNUSED) -{ - subset_options_t *subset_opts = (subset_options_t *) data; - - hb_set_clear (subset_opts->drop_tables); - char *s = (char *) arg; - - while (s && *s) - { - while (*s && strchr (", ", *s)) - s++; - if (!*s) - break; - - char *p = s; - while (*p && !strchr (", ", *p)) - p++; - - if ((p - s) > 4) // Table tags are at most 4 bytes. - { - g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, - "Failed parsing table tag values at: '%s'", s); - return false; - } - - hb_tag_t tag = hb_tag_from_string (s, p -s); - hb_set_add (subset_opts->drop_tables, tag); - s = p; - } - - return true; -} - - -void -subset_options_t::add_options (option_parser_t *parser) -{ - GOptionEntry entries[] = - { - {"layout", 0, 0, G_OPTION_ARG_NONE, &this->keep_layout, "Keep OpenType Layout tables", nullptr}, - {"no-hinting", 0, 0, G_OPTION_ARG_NONE, &this->drop_hints, "Whether to drop hints", nullptr}, - {"retain-gids", 0, 0, G_OPTION_ARG_NONE, &this->retain_gids, "If set don't renumber glyph ids in the subset.", nullptr}, - {"desubroutinize", 0, 0, G_OPTION_ARG_NONE, &this->desubroutinize, "Remove CFF/CFF2 use of subroutines", nullptr}, - {"name-IDs", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids, "Subset specified nameids", "list of int numbers"}, - {"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags."}, - - {nullptr} - }; - parser->add_group (entries, - "subset", - "Subset options:", - "Options subsetting", - this); -} diff --git a/util/options.hh b/util/options.hh index 3c3d32b5b..83dbe3402 100644 --- a/util/options.hh +++ b/util/options.hh @@ -28,6 +28,7 @@ #define OPTIONS_HH #include "hb.hh" +#include "hb-subset.h" #include #include @@ -673,31 +674,18 @@ struct subset_options_t : option_group_t { subset_options_t (option_parser_t *parser) { - keep_layout = false; - drop_hints = false; - retain_gids = false; - desubroutinize = false; - name_ids = hb_set_create (); - drop_tables = hb_set_create(); - + input = hb_subset_input_create_or_fail (); add_options (parser); } virtual ~subset_options_t () { - hb_set_destroy (name_ids); - hb_set_destroy (drop_tables); + hb_subset_input_destroy (input); } - void add_options (option_parser_t *parser); - hb_bool_t keep_layout; - hb_bool_t drop_hints; - hb_bool_t retain_gids; - hb_bool_t desubroutinize; - hb_set_t *name_ids; - hb_set_t *drop_tables; + hb_subset_input_t *input; }; /* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */ From d6de4659aa7edb991507f8838dc566874e5b6a61 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 15:33:23 -0400 Subject: [PATCH 335/617] Add HB_OPTIMIZE_SIZE Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index caff9d83e..fd5a71341 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -43,6 +43,9 @@ #ifndef NDEBUG #define NDEBUG #endif +#ifndef __OPTIMIZE_SIZE__ +#define __OPTIMIZE_SIZE__ +#endif #endif #ifdef HB_LEAN @@ -113,6 +116,11 @@ #endif #endif +#ifdef __OPTIMIZE_SIZE__ +#ifndef HB_OPTIMIZE_SIZE +#define HB_OPTIMIZE_SIZE +#endif +#endif #ifdef HAVE_CONFIG_OVERRIDE_H #include "config-override.h" From d1f9b2f961c71e5218ee359e8fb20cfbdb894c7e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 15:47:49 -0400 Subject: [PATCH 336/617] [gen-ucd] Flesh out a bit more --- src/gen-ucd.py | 54 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index d97085e69..473052843 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -29,18 +29,46 @@ dm1 = set(v[0] for i,v in dm.items() if len(v) == 1) dmx = set(v for v in dm.values() if len(v) not in (1,2)) assert not dmx -print(len(sorted(gc_set))) -print(len(sorted(gc_ccc_non0))) -print(len(sorted(gc_bmg_non0))) -print("GC, CCC, and BMG fit in one byte. Compress together.") -print() +#print(len(sorted(gc_set))) +#print(len(sorted(gc_ccc_non0))) +#print(len(sorted(gc_bmg_non0))) +#print("GC, CCC, and BMG fit in one byte. Compress together.") +#print() -print(len(sorted(sc_set))) -print("SC fits in one byte. Compress separately.") -print() +#print(len(sorted(sc_set))) +#print("SC fits in one byte. Compress separately.") +#print() -print(len(dm)) -print(len(dm1), min(dm1), max(dm1)) -print(len(dm2)) -#print(sorted(dm2diff)) -print(len(sorted(set(v // 512 for v in dm1)))) +#print(len(dm)) +#print(len(dm1), min(dm1), max(dm1)) +#print(len(dm2)) +##print(sorted(dm2diff)) +#print(len(sorted(set(v // 512 for v in dm1)))) + + +DEFAULT = 1 +COMPACT = 3 +print() +print('#include ') +for compression in (DEFAULT, COMPACT): + print() + if compression == DEFAULT: + print('#ifdef HB_OPTIMIZE_SIZE') + else: + print('#else') + print() + + code = packTab.Code('_hb_ucd') + + packTab.pack_table(gc, 'Cn', compression=compression).genCode(code, 'gc') + packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') + packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') + packTab.pack_table(sc, 'Zzzz', compression=compression).genCode(code, 'sc') + + code.print_c(linkage='static inline') + + + if compression != DEFAULT: + print() + print('#endif') + print() From 4a0eb066fdceb0cab48107f17670d6943ec0d61e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 16:57:04 -0400 Subject: [PATCH 337/617] [gen-ucd] Add gc order --- src/gen-ucd.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 473052843..341d54be9 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -45,6 +45,11 @@ assert not dmx ##print(sorted(dm2diff)) #print(len(sorted(set(v // 512 for v in dm1)))) +gc_order = packTab.AutoMapping() +for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', + 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', + 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',): + gc_order[_] DEFAULT = 1 COMPACT = 3 @@ -60,7 +65,7 @@ for compression in (DEFAULT, COMPACT): code = packTab.Code('_hb_ucd') - packTab.pack_table(gc, 'Cn', compression=compression).genCode(code, 'gc') + packTab.pack_table(gc, 'Cn', mapping=gc_order, compression=compression).genCode(code, 'gc') packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') packTab.pack_table(sc, 'Zzzz', compression=compression).genCode(code, 'sc') From be8de188671c04ddd8ec4d7af38b313322189136 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 17:17:38 -0400 Subject: [PATCH 338/617] [gen-ucd] Start adding script-order --- src/gen-ucd.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 341d54be9..09128d2cd 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -2,7 +2,7 @@ from __future__ import print_function, division, absolute_import -import io, os.path, sys +import io, os.path, sys, re if len (sys.argv) != 2: print ("usage: ./gen-ucd ucdxml-file", file=sys.stderr) @@ -51,6 +51,18 @@ for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',): gc_order[_] +sc_order = packTab.AutoMapping() +sc_array = [] +sc_re = re.compile(" (HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") +for line in open('hb-common.h'): + m = sc_re.search (line) + if not m: continue + name = m.group(1) + tag = ''.join(m.group(i) for i in range(2, 6)) + i = sc_order[tag] + assert i == len(sc_array) + sc_array.append(name) + DEFAULT = 1 COMPACT = 3 print() From 1aadd1449c65c50d5f35191f43136841c64ad399 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 17:29:13 -0400 Subject: [PATCH 339/617] [gen-ucd] Generate script order table --- src/gen-ucd.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 09128d2cd..1160cb58c 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -67,6 +67,11 @@ DEFAULT = 1 COMPACT = 3 print() print('#include ') +print() +code = packTab.Code('_hb_ucd') +sc_array, _, _ = code.addArray('hb_script_t', 'sc_map', sc_array) +code.print_c(linkage='static inline') + for compression in (DEFAULT, COMPACT): print() if compression == DEFAULT: @@ -80,7 +85,7 @@ for compression in (DEFAULT, COMPACT): packTab.pack_table(gc, 'Cn', mapping=gc_order, compression=compression).genCode(code, 'gc') packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') - packTab.pack_table(sc, 'Zzzz', compression=compression).genCode(code, 'sc') + packTab.pack_table(sc, 'Zzzz', mapping=sc_order, compression=compression).genCode(code, 'sc') code.print_c(linkage='static inline') From f49a5bec9fc241c098be5a49233aa83cd5dc098e Mon Sep 17 00:00:00 2001 From: rsheeter Date: Mon, 20 May 2019 20:45:11 -0700 Subject: [PATCH 340/617] [docs] Tweak fuzzer doc --- TESTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/TESTING.md b/TESTING.md index f99ba7c22..4efc64ca5 100644 --- a/TESTING.md +++ b/TESTING.md @@ -24,6 +24,8 @@ make distcheck ### Run tests with asan +**NOTE**: this sometimes yields harder to read results than the full fuzzer + ```shell # For nice symbols tell asan how to symoblize. Note that it doesn't like versioned copies like llvm-symbolizer-3.8 # export ASAN_SYMBOLIZER_PATH=path to version-less llvm-symbolizer @@ -63,7 +65,11 @@ cmake -DHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAIL # push your changs to a branch on googlefonts/harfbuzz # In a local copy of oss-fuzz, edit projects/harfbuzz/Dockerfile # Change the git clone to pull your branch + +# Do this periodically sudo python infra/helper.py build_image harfbuzz + +# Do these to update/run sudo python infra/helper.py build_fuzzers --sanitizer address harfbuzz sudo python infra/helper.py run_fuzzer harfbuzz hb-subset-fuzzer ``` From f9b089b695edc89023e3d62700ae68d5648f8494 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 14:43:18 -0700 Subject: [PATCH 341/617] [subset] Starting to sketch glyf as iter --- src/hb-ot-glyf-table.hh | 58 ++++++++++++++++++++++++++++++----------- src/hb-subset-plan.hh | 2 ++ src/hb-subset.cc | 2 +- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index f7629eca3..e30bdf799 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -81,24 +81,52 @@ struct glyf return_trace (true); } - bool subset (hb_subset_plan_t *plan) const + template + bool serialize(hb_serialize_context_t *c, + Iterator it) { - hb_blob_t *glyf_prime = nullptr; - hb_blob_t *loca_prime = nullptr; + TRACE_SERIALIZE (this); - bool success = true; - bool use_short_loca = false; - if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) { - success = success && plan->add_table (HB_OT_TAG_glyf, glyf_prime); - success = success && plan->add_table (HB_OT_TAG_loca, loca_prime); - success = success && _add_head_and_set_loca_version (plan, use_short_loca); - } else { - success = false; - } - hb_blob_destroy (loca_prime); - hb_blob_destroy (glyf_prime); + // TODO actually copy glyph + // TODO worry about instructions + // TODO capture dest locations for loca - return success; + return_trace (true); + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + + glyf *glyf_prime = c->serializer->start_embed (); + if (unlikely (!glyf_prime)) return_trace (false); + + OT::glyf::accelerator_t glyf; + glyf.init (c->plan->source); + + // stream new-gids => pair of start/end offsets + // can now copy glyph from =>end + // TODO(instructions) + auto it = + + hb_iota (c->plan->num_output_glyphs ()) + | hb_map ([&] (hb_codepoint_t new_gid) { + unsigned int start_offset = 0, end_offset = 0; + // simple case: empty glyph + hb_codepoint_t old_gid; + if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); + + if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && + glyf.remove_padding (start_offset, &end_offset)))) + { + // TODO signal irreversible error + return hb_pair (start_offset, end_offset); + } + return hb_pair (start_offset, end_offset); + }); + + glyf_prime->serialize (c->serializer, it); + + return_trace (true); } static bool diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index abbab5e22..bdc710101 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -68,6 +68,8 @@ struct hb_subset_plan_t /* * The set of input glyph ids which will be retained in the subset. + * Does NOT include ids kept due to retain_gids. You probably want to use + * glyph_map/reverse_glyph_map. */ inline const hb_set_t * glyphset () const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 800bd35c8..99a8747d7 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -156,7 +156,7 @@ _subset_table (hb_subset_plan_t *plan, bool result = true; switch (tag) { case HB_OT_TAG_glyf: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_hdmx: result = _subset (plan); From fb9bff955a9356b053c5c9bcd7aa9101edb55767 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 14:59:03 -0700 Subject: [PATCH 342/617] [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out. --- src/Makefile.sources | 2 - src/hb-ot-glyf-table.hh | 9 +- src/hb-subset-glyf.cc | 346 ---------------------------------------- src/hb-subset-glyf.hh | 40 ----- src/hb-subset.cc | 1 - 5 files changed, 6 insertions(+), 392 deletions(-) delete mode 100644 src/hb-subset-glyf.cc delete mode 100644 src/hb-subset-glyf.hh diff --git a/src/Makefile.sources b/src/Makefile.sources index e61315be6..e345ffbf3 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -241,8 +241,6 @@ HB_SUBSET_sources = \ hb-subset-cff1.hh \ hb-subset-cff2.cc \ hb-subset-cff2.hh \ - hb-subset-glyf.cc \ - hb-subset-glyf.hh \ hb-subset-glyf.hh \ hb-subset-input.cc \ hb-subset-input.hh \ diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index e30bdf799..b54c11fa7 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -21,7 +21,7 @@ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * - * Google Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Reiger, Roderick Sheeter */ #ifndef HB_OT_GLYF_TABLE_HH @@ -29,7 +29,6 @@ #include "hb-open-type.hh" #include "hb-ot-head-table.hh" -#include "hb-subset-glyf.hh" namespace OT { @@ -111,10 +110,14 @@ struct glyf + hb_iota (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { unsigned int start_offset = 0, end_offset = 0; - // simple case: empty glyph + hb_codepoint_t old_gid; + // should never happen, ALL old gids should be mapped if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); + // being empty is perfectly normal + if (c->plan->is_empty_glyph (old_gid)) return hb_pair (start_offset, end_offset); + if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc deleted file mode 100644 index 0647ee4e7..000000000 --- a/src/hb-subset-glyf.cc +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger, Roderick Sheeter - */ - -#include "hb-open-type.hh" -#include "hb-ot-glyf-table.hh" -#include "hb-set.h" -#include "hb-subset-glyf.hh" - -struct loca_data_t -{ - bool is_short; - void *data; - unsigned int size; - - inline bool - _write_loca_entry (unsigned int id, - unsigned int offset) - { - unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32); - if ((id + 1) * entry_size <= size) - { - if (is_short) { - ((OT::HBUINT16*) data) [id] = offset / 2; - } else { - ((OT::HBUINT32*) data) [id] = offset; - } - return true; - } - - // Offset was not written because the write is out of bounds. - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.", - id, - size); - return false; - } -}; - -/* - * If hints are being dropped find the range which in glyf at which - * the hinting instructions are located. Add them to the instruction_ranges - * vector. - */ -static bool -_add_instructions_range (const OT::glyf::accelerator_t &glyf, - hb_codepoint_t glyph_id, - unsigned int glyph_start_offset, - unsigned int glyph_end_offset, - bool drop_hints, - hb_vector_t *instruction_ranges /* OUT */) -{ - if (!instruction_ranges->resize (instruction_ranges->length + 2)) - { - DEBUG_MSG(SUBSET, nullptr, "Failed to resize instruction_ranges."); - return false; - } - unsigned int *instruction_start = &(*instruction_ranges)[instruction_ranges->length - 2]; - *instruction_start = 0; - unsigned int *instruction_end = &(*instruction_ranges)[instruction_ranges->length - 1]; - *instruction_end = 0; - - if (drop_hints) - { - if (unlikely (!glyf.get_instruction_offsets (glyph_start_offset, glyph_end_offset, - instruction_start, instruction_end))) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", glyph_id); - return false; - } - } - - return true; -} - -static bool -_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf, - const hb_subset_plan_t *plan, - loca_data_t *loca_data, /* OUT */ - unsigned int *glyf_size /* OUT */, - hb_vector_t *instruction_ranges /* OUT */) -{ - unsigned int total = 0; - - hb_codepoint_t next_glyph = HB_SET_VALUE_INVALID; - while (plan->glyphset ()->next (&next_glyph)) - { - unsigned int start_offset = 0, end_offset = 0; - if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - { - DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph); - start_offset = end_offset = 0; - } - - bool is_zero_length = end_offset - start_offset < OT::glyf::GlyphHeader::static_size; - if (!_add_instructions_range (glyf, - next_glyph, - start_offset, - end_offset, - plan->drop_hints && !is_zero_length, - instruction_ranges)) - return false; - - if (is_zero_length) - continue; /* 0-length glyph */ - - total += end_offset - start_offset - - ((*instruction_ranges)[instruction_ranges->length - 1] - - (*instruction_ranges)[instruction_ranges->length - 2]); - /* round2 so short loca will work */ - total += total % 2; - } - - *glyf_size = total; - loca_data->is_short = (total <= 131070); - loca_data->size = (plan->num_output_glyphs () + 1) - * (loca_data->is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32)); - - DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca", - total, - loca_data->size, - loca_data->is_short ? "short" : "long"); - return true; -} - -static void -_update_components (const hb_subset_plan_t *plan, - char *glyph_start, - unsigned int length) -{ - OT::glyf::CompositeGlyphHeader::Iterator iterator; - if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start, - length, - &iterator)) - { - do - { - hb_codepoint_t new_gid; - if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, - &new_gid)) - continue; - - ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; - } while (iterator.move_to_next ()); - } -} - -static bool _remove_composite_instruction_flag (char *glyf_prime, unsigned int length) -{ - /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ - OT::glyf::CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false; - const OT::glyf::CompositeGlyphHeader *glyph; - do { - glyph = composite_it.current; - OT::HBUINT16 *flags = const_cast (&glyph->flags); - *flags = (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS; - } while (composite_it.move_to_next ()); - return true; -} - -static bool -_write_glyf_and_loca_prime (const hb_subset_plan_t *plan, - const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_vector_t &instruction_ranges, - unsigned int glyf_prime_size, - char *glyf_prime_data /* OUT */, - loca_data_t *loca_prime /* OUT */) -{ - char *glyf_prime_data_next = glyf_prime_data; - - bool success = true; - - - unsigned int i = 0; - hb_codepoint_t new_gid; - for (new_gid = 0; new_gid < plan->num_output_glyphs (); new_gid++) - { - hb_codepoint_t old_gid; - if (!plan->old_gid_for_new_gid (new_gid, &old_gid)) - { - // Empty glyph, add a loca entry and carry on. - loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - continue; - } - - - unsigned int start_offset = 0, end_offset = 0; - if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - end_offset = start_offset = 0; - - unsigned int instruction_start = instruction_ranges[i * 2]; - unsigned int instruction_end = instruction_ranges[i * 2 + 1]; - - int length = end_offset - start_offset - (instruction_end - instruction_start); - - if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size) - { - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)", - i, length); - return false; - } - - if (instruction_start == instruction_end) - memcpy (glyf_prime_data_next, glyf_data + start_offset, length); - else - { - memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset); - memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end); - /* if the instructions end at the end this was a composite glyph, else simple */ - if (instruction_end == end_offset) - { - if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false; - } - else - /* zero instruction length, which is just before instruction_start */ - memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2); - } - - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - _update_components (plan, glyf_prime_data_next, length); - - // TODO: don't align to two bytes if using long loca. - glyf_prime_data_next += length + (length % 2); // Align to 2 bytes for short loca. - - i++; - } - - // loca table has n+1 entries where the last entry signifies the end location of the last - // glyph. - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - return success; -} - -static bool -_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_subset_plan_t *plan, - bool *use_short_loca, - hb_blob_t **glyf_prime_blob /* OUT */, - hb_blob_t **loca_prime_blob /* OUT */) -{ - // TODO(grieger): Sanity check allocation size for the new table. - loca_data_t loca_prime; - unsigned int glyf_prime_size; - hb_vector_t instruction_ranges; - instruction_ranges.init (); - - if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf, - plan, - &loca_prime, - &glyf_prime_size, - &instruction_ranges))) { - instruction_ranges.fini (); - return false; - } - *use_short_loca = loca_prime.is_short; - - char *glyf_prime_data = (char *) calloc (1, glyf_prime_size); - loca_prime.data = (void *) calloc (1, loca_prime.size); - if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data, - instruction_ranges, - glyf_prime_size, glyf_prime_data, - &loca_prime))) { - free (glyf_prime_data); - free (loca_prime.data); - instruction_ranges.fini (); - return false; - } - instruction_ranges.fini (); - - *glyf_prime_blob = hb_blob_create (glyf_prime_data, - glyf_prime_size, - HB_MEMORY_MODE_READONLY, - glyf_prime_data, - free); - *loca_prime_blob = hb_blob_create ((char *) loca_prime.data, - loca_prime.size, - HB_MEMORY_MODE_READONLY, - loca_prime.data, - free); - return true; -} - -/** - * hb_subset_glyf: - * Subsets the glyph table according to a provided plan. - * - * Return value: subsetted glyf table. - * - * Since: 1.7.5 - **/ -bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime, /* OUT */ - hb_blob_t **loca_prime /* OUT */) -{ - hb_blob_t *glyf_blob = hb_sanitize_context_t ().reference_table (plan->source); - const char *glyf_data = hb_blob_get_data (glyf_blob, nullptr); - - OT::glyf::accelerator_t glyf; - glyf.init (plan->source); - bool result = _hb_subset_glyf_and_loca (glyf, - glyf_data, - plan, - use_short_loca, - glyf_prime, - loca_prime); - - hb_blob_destroy (glyf_blob); - glyf.fini (); - - return result; -} diff --git a/src/hb-subset-glyf.hh b/src/hb-subset-glyf.hh deleted file mode 100644 index 99cf8f071..000000000 --- a/src/hb-subset-glyf.hh +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger - */ - -#ifndef HB_SUBSET_GLYF_HH -#define HB_SUBSET_GLYF_HH - -#include "hb.hh" - -#include "hb-subset.hh" - -HB_INTERNAL bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime /* OUT */, - hb_blob_t **loca_prime /* OUT */); - -#endif /* HB_SUBSET_GLYF_HH */ diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 99a8747d7..c42d97856 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -28,7 +28,6 @@ #include "hb-open-type.hh" #include "hb-subset.hh" -#include "hb-subset-glyf.hh" #include "hb-open-file.hh" #include "hb-ot-cmap-table.hh" From 8f174870e9eed4c47463fdb0d4fe3e22a6f5fdc8 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 16:52:00 -0700 Subject: [PATCH 343/617] [subset] Dinner time, checkpoint --- src/hb-ot-glyf-table.hh | 97 ++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index b54c11fa7..2867d0f23 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -86,9 +86,13 @@ struct glyf { TRACE_SERIALIZE (this); - // TODO actually copy glyph - // TODO worry about instructions - // TODO capture dest locations for loca + // pad glyphs to 2-byte boundaries to permit short loca + HBUINT8 pad; + + it + | hb_apply ( [&] (hb_bytes_t glyph) { + glyph.copy(c); + if (glyph.length % 2) c->extend(pad); + }); return_trace (true); } @@ -103,32 +107,54 @@ struct glyf OT::glyf::accelerator_t glyf; glyf.init (c->plan->source); - // stream new-gids => pair of start/end offsets - // can now copy glyph from =>end - // TODO(instructions) + // stream new-gids => glyph to keep + // if dropping hints the glyph to keep doesn't have them anymore auto it = + hb_iota (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { - unsigned int start_offset = 0, end_offset = 0; - hb_codepoint_t old_gid; - // should never happen, ALL old gids should be mapped - if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); - - // being empty is perfectly normal - if (c->plan->is_empty_glyph (old_gid)) return hb_pair (start_offset, end_offset); + // should never happen fail, ALL old gids should be mapped + if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_bytes_t (); + unsigned int start_offset, end_offset; if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { // TODO signal irreversible error - return hb_pair (start_offset, end_offset); + return hb_bytes_t (); } - return hb_pair (start_offset, end_offset); + hb_bytes_t glyph ((const char *) this, end_offset - start_offset); + + // if dropping hints, find hints region and subtract it + if (c->plan->drop_hints) { + unsigned int instruction_length; + if (!glyf.get_instruction_length (glyph, &instruction_length)) + { + // TODO signal irreversible failure + return hb_bytes_t (); + } + glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); + } + + return glyph; }); glyf_prime->serialize (c->serializer, it); + // we know enough to write loca + // TODO calculate size, do we need two or four byte loca entries + unsigned int offset = 0; + HBUINT16 loca_entry; + loca *loca_prime = c->serializer->start_embed (); + + hb_enumerate (it) + | hb_apply ([&] (hb_pair_t p) { + offset += p.second.length; + loca_entry = offset / 2; + c->serializer->embed(loca_entry); + }); + // one for the road + c->serializer->embed(loca_entry); + return_trace (true); } @@ -412,45 +438,40 @@ struct glyf return true; } - bool get_instruction_offsets (unsigned int start_offset, - unsigned int end_offset, - unsigned int *instruction_start /* OUT */, - unsigned int *instruction_end /* OUT */) const + bool get_instruction_length (hb_bytes_t glyph, + unsigned int * length /* OUT */) const { - if (end_offset - start_offset < GlyphHeader::static_size) + /* Empty glyph; no instructions. */ + if (glyph.get_size() < GlyphHeader::static_size) { - *instruction_start = 0; - *instruction_end = 0; - return true; /* Empty glyph; no instructions. */ + *length = 0; + return true; } - const GlyphHeader &glyph_header = StructAtOffset (glyf_table, start_offset); + unsigned int start = glyph.length; + unsigned int end = glyph.length; + const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) { CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!CompositeGlyphHeader::get_iterator ( - (const char*) this->glyf_table + start_offset, - end_offset - start_offset, &composite_it))) return false; + if (unlikely (!CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; const CompositeGlyphHeader *last; do { last = composite_it.current; } while (composite_it.move_to_next ()); if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) - *instruction_start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); - else - *instruction_start = end_offset; - *instruction_end = end_offset; - if (unlikely (*instruction_start > *instruction_end)) + start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); + if (unlikely (start > end)) { - DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); + DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside %d byte buffer", start, glyph.length); return false; } } else { - unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; - if (unlikely (instruction_length_offset + 2 > end_offset)) + unsigned int instruction_length_offset = GlyphHeader::static_size + 2 * num_contours; + if (unlikely (instruction_length_offset + 2 > glyph.length)) { DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength."); return false; @@ -459,15 +480,13 @@ struct glyf const HBUINT16 &instruction_length = StructAtOffset (glyf_table, instruction_length_offset); unsigned int start = instruction_length_offset + 2; unsigned int end = start + (uint16_t) instruction_length; - if (unlikely (end > end_offset)) // Out of bounds of the current glyph + if (unlikely (end > glyph.length)) // Out of bounds of the current glyph { DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries."); return false; } - - *instruction_start = start; - *instruction_end = end; } + *length = end - start; return true; } From 02d4d4f3e67dcc37915bc386d506bb272455ff1e Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 14:43:18 -0700 Subject: [PATCH 344/617] [subset] Starting to sketch glyf as iter --- src/hb-ot-glyf-table.hh | 58 ++++++++++++++++++++++++++++++----------- src/hb-subset-plan.hh | 2 ++ src/hb-subset.cc | 2 +- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index f7629eca3..e30bdf799 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -81,24 +81,52 @@ struct glyf return_trace (true); } - bool subset (hb_subset_plan_t *plan) const + template + bool serialize(hb_serialize_context_t *c, + Iterator it) { - hb_blob_t *glyf_prime = nullptr; - hb_blob_t *loca_prime = nullptr; + TRACE_SERIALIZE (this); - bool success = true; - bool use_short_loca = false; - if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) { - success = success && plan->add_table (HB_OT_TAG_glyf, glyf_prime); - success = success && plan->add_table (HB_OT_TAG_loca, loca_prime); - success = success && _add_head_and_set_loca_version (plan, use_short_loca); - } else { - success = false; - } - hb_blob_destroy (loca_prime); - hb_blob_destroy (glyf_prime); + // TODO actually copy glyph + // TODO worry about instructions + // TODO capture dest locations for loca - return success; + return_trace (true); + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + + glyf *glyf_prime = c->serializer->start_embed (); + if (unlikely (!glyf_prime)) return_trace (false); + + OT::glyf::accelerator_t glyf; + glyf.init (c->plan->source); + + // stream new-gids => pair of start/end offsets + // can now copy glyph from =>end + // TODO(instructions) + auto it = + + hb_iota (c->plan->num_output_glyphs ()) + | hb_map ([&] (hb_codepoint_t new_gid) { + unsigned int start_offset = 0, end_offset = 0; + // simple case: empty glyph + hb_codepoint_t old_gid; + if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); + + if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && + glyf.remove_padding (start_offset, &end_offset)))) + { + // TODO signal irreversible error + return hb_pair (start_offset, end_offset); + } + return hb_pair (start_offset, end_offset); + }); + + glyf_prime->serialize (c->serializer, it); + + return_trace (true); } static bool diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index abbab5e22..bdc710101 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -68,6 +68,8 @@ struct hb_subset_plan_t /* * The set of input glyph ids which will be retained in the subset. + * Does NOT include ids kept due to retain_gids. You probably want to use + * glyph_map/reverse_glyph_map. */ inline const hb_set_t * glyphset () const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index f4fc77172..ab9b4d885 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -156,7 +156,7 @@ _subset_table (hb_subset_plan_t *plan, bool result = true; switch (tag) { case HB_OT_TAG_glyf: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_hdmx: result = _subset2 (plan); From 240bc86e3a0b177ee84ec9c60723304a0cf4c405 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 14:59:03 -0700 Subject: [PATCH 345/617] [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out. --- src/Makefile.sources | 2 - src/hb-ot-glyf-table.hh | 9 +- src/hb-subset-glyf.cc | 346 ---------------------------------------- src/hb-subset-glyf.hh | 40 ----- src/hb-subset.cc | 1 - 5 files changed, 6 insertions(+), 392 deletions(-) delete mode 100644 src/hb-subset-glyf.cc delete mode 100644 src/hb-subset-glyf.hh diff --git a/src/Makefile.sources b/src/Makefile.sources index e61315be6..e345ffbf3 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -241,8 +241,6 @@ HB_SUBSET_sources = \ hb-subset-cff1.hh \ hb-subset-cff2.cc \ hb-subset-cff2.hh \ - hb-subset-glyf.cc \ - hb-subset-glyf.hh \ hb-subset-glyf.hh \ hb-subset-input.cc \ hb-subset-input.hh \ diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index e30bdf799..b54c11fa7 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -21,7 +21,7 @@ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * - * Google Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Reiger, Roderick Sheeter */ #ifndef HB_OT_GLYF_TABLE_HH @@ -29,7 +29,6 @@ #include "hb-open-type.hh" #include "hb-ot-head-table.hh" -#include "hb-subset-glyf.hh" namespace OT { @@ -111,10 +110,14 @@ struct glyf + hb_iota (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { unsigned int start_offset = 0, end_offset = 0; - // simple case: empty glyph + hb_codepoint_t old_gid; + // should never happen, ALL old gids should be mapped if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); + // being empty is perfectly normal + if (c->plan->is_empty_glyph (old_gid)) return hb_pair (start_offset, end_offset); + if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc deleted file mode 100644 index 0647ee4e7..000000000 --- a/src/hb-subset-glyf.cc +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger, Roderick Sheeter - */ - -#include "hb-open-type.hh" -#include "hb-ot-glyf-table.hh" -#include "hb-set.h" -#include "hb-subset-glyf.hh" - -struct loca_data_t -{ - bool is_short; - void *data; - unsigned int size; - - inline bool - _write_loca_entry (unsigned int id, - unsigned int offset) - { - unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32); - if ((id + 1) * entry_size <= size) - { - if (is_short) { - ((OT::HBUINT16*) data) [id] = offset / 2; - } else { - ((OT::HBUINT32*) data) [id] = offset; - } - return true; - } - - // Offset was not written because the write is out of bounds. - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.", - id, - size); - return false; - } -}; - -/* - * If hints are being dropped find the range which in glyf at which - * the hinting instructions are located. Add them to the instruction_ranges - * vector. - */ -static bool -_add_instructions_range (const OT::glyf::accelerator_t &glyf, - hb_codepoint_t glyph_id, - unsigned int glyph_start_offset, - unsigned int glyph_end_offset, - bool drop_hints, - hb_vector_t *instruction_ranges /* OUT */) -{ - if (!instruction_ranges->resize (instruction_ranges->length + 2)) - { - DEBUG_MSG(SUBSET, nullptr, "Failed to resize instruction_ranges."); - return false; - } - unsigned int *instruction_start = &(*instruction_ranges)[instruction_ranges->length - 2]; - *instruction_start = 0; - unsigned int *instruction_end = &(*instruction_ranges)[instruction_ranges->length - 1]; - *instruction_end = 0; - - if (drop_hints) - { - if (unlikely (!glyf.get_instruction_offsets (glyph_start_offset, glyph_end_offset, - instruction_start, instruction_end))) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", glyph_id); - return false; - } - } - - return true; -} - -static bool -_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf, - const hb_subset_plan_t *plan, - loca_data_t *loca_data, /* OUT */ - unsigned int *glyf_size /* OUT */, - hb_vector_t *instruction_ranges /* OUT */) -{ - unsigned int total = 0; - - hb_codepoint_t next_glyph = HB_SET_VALUE_INVALID; - while (plan->glyphset ()->next (&next_glyph)) - { - unsigned int start_offset = 0, end_offset = 0; - if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - { - DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph); - start_offset = end_offset = 0; - } - - bool is_zero_length = end_offset - start_offset < OT::glyf::GlyphHeader::static_size; - if (!_add_instructions_range (glyf, - next_glyph, - start_offset, - end_offset, - plan->drop_hints && !is_zero_length, - instruction_ranges)) - return false; - - if (is_zero_length) - continue; /* 0-length glyph */ - - total += end_offset - start_offset - - ((*instruction_ranges)[instruction_ranges->length - 1] - - (*instruction_ranges)[instruction_ranges->length - 2]); - /* round2 so short loca will work */ - total += total % 2; - } - - *glyf_size = total; - loca_data->is_short = (total <= 131070); - loca_data->size = (plan->num_output_glyphs () + 1) - * (loca_data->is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32)); - - DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca", - total, - loca_data->size, - loca_data->is_short ? "short" : "long"); - return true; -} - -static void -_update_components (const hb_subset_plan_t *plan, - char *glyph_start, - unsigned int length) -{ - OT::glyf::CompositeGlyphHeader::Iterator iterator; - if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start, - length, - &iterator)) - { - do - { - hb_codepoint_t new_gid; - if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, - &new_gid)) - continue; - - ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; - } while (iterator.move_to_next ()); - } -} - -static bool _remove_composite_instruction_flag (char *glyf_prime, unsigned int length) -{ - /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ - OT::glyf::CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false; - const OT::glyf::CompositeGlyphHeader *glyph; - do { - glyph = composite_it.current; - OT::HBUINT16 *flags = const_cast (&glyph->flags); - *flags = (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS; - } while (composite_it.move_to_next ()); - return true; -} - -static bool -_write_glyf_and_loca_prime (const hb_subset_plan_t *plan, - const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_vector_t &instruction_ranges, - unsigned int glyf_prime_size, - char *glyf_prime_data /* OUT */, - loca_data_t *loca_prime /* OUT */) -{ - char *glyf_prime_data_next = glyf_prime_data; - - bool success = true; - - - unsigned int i = 0; - hb_codepoint_t new_gid; - for (new_gid = 0; new_gid < plan->num_output_glyphs (); new_gid++) - { - hb_codepoint_t old_gid; - if (!plan->old_gid_for_new_gid (new_gid, &old_gid)) - { - // Empty glyph, add a loca entry and carry on. - loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - continue; - } - - - unsigned int start_offset = 0, end_offset = 0; - if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - end_offset = start_offset = 0; - - unsigned int instruction_start = instruction_ranges[i * 2]; - unsigned int instruction_end = instruction_ranges[i * 2 + 1]; - - int length = end_offset - start_offset - (instruction_end - instruction_start); - - if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size) - { - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)", - i, length); - return false; - } - - if (instruction_start == instruction_end) - memcpy (glyf_prime_data_next, glyf_data + start_offset, length); - else - { - memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset); - memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end); - /* if the instructions end at the end this was a composite glyph, else simple */ - if (instruction_end == end_offset) - { - if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false; - } - else - /* zero instruction length, which is just before instruction_start */ - memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2); - } - - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - _update_components (plan, glyf_prime_data_next, length); - - // TODO: don't align to two bytes if using long loca. - glyf_prime_data_next += length + (length % 2); // Align to 2 bytes for short loca. - - i++; - } - - // loca table has n+1 entries where the last entry signifies the end location of the last - // glyph. - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - return success; -} - -static bool -_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_subset_plan_t *plan, - bool *use_short_loca, - hb_blob_t **glyf_prime_blob /* OUT */, - hb_blob_t **loca_prime_blob /* OUT */) -{ - // TODO(grieger): Sanity check allocation size for the new table. - loca_data_t loca_prime; - unsigned int glyf_prime_size; - hb_vector_t instruction_ranges; - instruction_ranges.init (); - - if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf, - plan, - &loca_prime, - &glyf_prime_size, - &instruction_ranges))) { - instruction_ranges.fini (); - return false; - } - *use_short_loca = loca_prime.is_short; - - char *glyf_prime_data = (char *) calloc (1, glyf_prime_size); - loca_prime.data = (void *) calloc (1, loca_prime.size); - if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data, - instruction_ranges, - glyf_prime_size, glyf_prime_data, - &loca_prime))) { - free (glyf_prime_data); - free (loca_prime.data); - instruction_ranges.fini (); - return false; - } - instruction_ranges.fini (); - - *glyf_prime_blob = hb_blob_create (glyf_prime_data, - glyf_prime_size, - HB_MEMORY_MODE_READONLY, - glyf_prime_data, - free); - *loca_prime_blob = hb_blob_create ((char *) loca_prime.data, - loca_prime.size, - HB_MEMORY_MODE_READONLY, - loca_prime.data, - free); - return true; -} - -/** - * hb_subset_glyf: - * Subsets the glyph table according to a provided plan. - * - * Return value: subsetted glyf table. - * - * Since: 1.7.5 - **/ -bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime, /* OUT */ - hb_blob_t **loca_prime /* OUT */) -{ - hb_blob_t *glyf_blob = hb_sanitize_context_t ().reference_table (plan->source); - const char *glyf_data = hb_blob_get_data (glyf_blob, nullptr); - - OT::glyf::accelerator_t glyf; - glyf.init (plan->source); - bool result = _hb_subset_glyf_and_loca (glyf, - glyf_data, - plan, - use_short_loca, - glyf_prime, - loca_prime); - - hb_blob_destroy (glyf_blob); - glyf.fini (); - - return result; -} diff --git a/src/hb-subset-glyf.hh b/src/hb-subset-glyf.hh deleted file mode 100644 index 99cf8f071..000000000 --- a/src/hb-subset-glyf.hh +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger - */ - -#ifndef HB_SUBSET_GLYF_HH -#define HB_SUBSET_GLYF_HH - -#include "hb.hh" - -#include "hb-subset.hh" - -HB_INTERNAL bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime /* OUT */, - hb_blob_t **loca_prime /* OUT */); - -#endif /* HB_SUBSET_GLYF_HH */ diff --git a/src/hb-subset.cc b/src/hb-subset.cc index ab9b4d885..792a1f6cc 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -28,7 +28,6 @@ #include "hb-open-type.hh" #include "hb-subset.hh" -#include "hb-subset-glyf.hh" #include "hb-open-file.hh" #include "hb-ot-cmap-table.hh" From 0d7fef2d50bba714815c0c13f3b3dd6464710a1d Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 8 May 2019 16:52:00 -0700 Subject: [PATCH 346/617] [subset] Dinner time, checkpoint --- src/hb-ot-glyf-table.hh | 97 ++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index b54c11fa7..2867d0f23 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -86,9 +86,13 @@ struct glyf { TRACE_SERIALIZE (this); - // TODO actually copy glyph - // TODO worry about instructions - // TODO capture dest locations for loca + // pad glyphs to 2-byte boundaries to permit short loca + HBUINT8 pad; + + it + | hb_apply ( [&] (hb_bytes_t glyph) { + glyph.copy(c); + if (glyph.length % 2) c->extend(pad); + }); return_trace (true); } @@ -103,32 +107,54 @@ struct glyf OT::glyf::accelerator_t glyf; glyf.init (c->plan->source); - // stream new-gids => pair of start/end offsets - // can now copy glyph from =>end - // TODO(instructions) + // stream new-gids => glyph to keep + // if dropping hints the glyph to keep doesn't have them anymore auto it = + hb_iota (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { - unsigned int start_offset = 0, end_offset = 0; - hb_codepoint_t old_gid; - // should never happen, ALL old gids should be mapped - if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_pair (start_offset, end_offset); - - // being empty is perfectly normal - if (c->plan->is_empty_glyph (old_gid)) return hb_pair (start_offset, end_offset); + // should never happen fail, ALL old gids should be mapped + if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_bytes_t (); + unsigned int start_offset, end_offset; if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { // TODO signal irreversible error - return hb_pair (start_offset, end_offset); + return hb_bytes_t (); } - return hb_pair (start_offset, end_offset); + hb_bytes_t glyph ((const char *) this, end_offset - start_offset); + + // if dropping hints, find hints region and subtract it + if (c->plan->drop_hints) { + unsigned int instruction_length; + if (!glyf.get_instruction_length (glyph, &instruction_length)) + { + // TODO signal irreversible failure + return hb_bytes_t (); + } + glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); + } + + return glyph; }); glyf_prime->serialize (c->serializer, it); + // we know enough to write loca + // TODO calculate size, do we need two or four byte loca entries + unsigned int offset = 0; + HBUINT16 loca_entry; + loca *loca_prime = c->serializer->start_embed (); + + hb_enumerate (it) + | hb_apply ([&] (hb_pair_t p) { + offset += p.second.length; + loca_entry = offset / 2; + c->serializer->embed(loca_entry); + }); + // one for the road + c->serializer->embed(loca_entry); + return_trace (true); } @@ -412,45 +438,40 @@ struct glyf return true; } - bool get_instruction_offsets (unsigned int start_offset, - unsigned int end_offset, - unsigned int *instruction_start /* OUT */, - unsigned int *instruction_end /* OUT */) const + bool get_instruction_length (hb_bytes_t glyph, + unsigned int * length /* OUT */) const { - if (end_offset - start_offset < GlyphHeader::static_size) + /* Empty glyph; no instructions. */ + if (glyph.get_size() < GlyphHeader::static_size) { - *instruction_start = 0; - *instruction_end = 0; - return true; /* Empty glyph; no instructions. */ + *length = 0; + return true; } - const GlyphHeader &glyph_header = StructAtOffset (glyf_table, start_offset); + unsigned int start = glyph.length; + unsigned int end = glyph.length; + const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) { CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!CompositeGlyphHeader::get_iterator ( - (const char*) this->glyf_table + start_offset, - end_offset - start_offset, &composite_it))) return false; + if (unlikely (!CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; const CompositeGlyphHeader *last; do { last = composite_it.current; } while (composite_it.move_to_next ()); if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) - *instruction_start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); - else - *instruction_start = end_offset; - *instruction_end = end_offset; - if (unlikely (*instruction_start > *instruction_end)) + start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); + if (unlikely (start > end)) { - DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); + DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside %d byte buffer", start, glyph.length); return false; } } else { - unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; - if (unlikely (instruction_length_offset + 2 > end_offset)) + unsigned int instruction_length_offset = GlyphHeader::static_size + 2 * num_contours; + if (unlikely (instruction_length_offset + 2 > glyph.length)) { DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength."); return false; @@ -459,15 +480,13 @@ struct glyf const HBUINT16 &instruction_length = StructAtOffset (glyf_table, instruction_length_offset); unsigned int start = instruction_length_offset + 2; unsigned int end = start + (uint16_t) instruction_length; - if (unlikely (end > end_offset)) // Out of bounds of the current glyph + if (unlikely (end > glyph.length)) // Out of bounds of the current glyph { DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries."); return false; } - - *instruction_start = start; - *instruction_end = end; } + *length = end - start; return true; } From ab3fe5de2bbe10fdc13711537f824b62d091f995 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Thu, 9 May 2019 22:12:20 -0700 Subject: [PATCH 347/617] [subset] Glyf by iter now runs but fails tests --- src/hb-ot-glyf-table.hh | 88 +++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 2867d0f23..39b712d27 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -80,20 +80,35 @@ struct glyf return_trace (true); } + template + static void + _write_loca (Iterator it, unsigned size_denom, char * loca_data) + { + unsigned int offset = 0; + + it + | hb_apply ([&] (hb_bytes_t _) { + offset += _.length / size_denom; + EntryType *entry = (EntryType *) loca_data; + *entry = offset; + loca_data += entry->get_size(); + }); + EntryType *entry = (EntryType *) loca_data; + *entry = offset; + } + template bool serialize(hb_serialize_context_t *c, Iterator it) { TRACE_SERIALIZE (this); - // pad glyphs to 2-byte boundaries to permit short loca HBUINT8 pad; + + it | hb_apply ( [&] (hb_bytes_t glyph) { glyph.copy(c); - if (glyph.length % 2) c->extend(pad); + if (glyph.length % 2) c->embed(pad); }); - return_trace (true); } @@ -107,53 +122,68 @@ struct glyf OT::glyf::accelerator_t glyf; glyf.init (c->plan->source); - // stream new-gids => glyph to keep - // if dropping hints the glyph to keep doesn't have them anymore + // make an iterator of per-glyph hb_bytes_t. + // unpadded, hints removed if that was requested. + unsigned int glyf_padded_size = 0; // auto it = - + hb_iota (c->plan->num_output_glyphs ()) + + hb_range (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { hb_codepoint_t old_gid; - // should never happen fail, ALL old gids should be mapped + + // should never fail, ALL old gids should be mapped if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_bytes_t (); unsigned int start_offset, end_offset; if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && glyf.remove_padding (start_offset, &end_offset)))) { - // TODO signal irreversible error + // TODO signal fatal error return hb_bytes_t (); } hb_bytes_t glyph ((const char *) this, end_offset - start_offset); // if dropping hints, find hints region and subtract it if (c->plan->drop_hints) { - unsigned int instruction_length; - if (!glyf.get_instruction_length (glyph, &instruction_length)) - { - // TODO signal irreversible failure - return hb_bytes_t (); - } - glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); + unsigned int instruction_length; + if (!glyf.get_instruction_length (glyph, &instruction_length)) + { + // TODO signal fatal error + return hb_bytes_t (); + } + glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); } - + glyf_padded_size += glyph.length + glyph.length % 2; return glyph; }); glyf_prime->serialize (c->serializer, it); - // we know enough to write loca - // TODO calculate size, do we need two or four byte loca entries - unsigned int offset = 0; - HBUINT16 loca_entry; - loca *loca_prime = c->serializer->start_embed (); - + hb_enumerate (it) - | hb_apply ([&] (hb_pair_t p) { - offset += p.second.length; - loca_entry = offset / 2; - c->serializer->embed(loca_entry); - }); - // one for the road - c->serializer->embed(loca_entry); + // TODO whats the right way to serialize loca? + // _subset2 will think these bytes are part of glyf if we write to serializer + bool use_short_loca = glyf_padded_size > 131070; + unsigned int loca_prime_size = (c->plan->num_output_glyphs () + 1) * (use_short_loca ? 2 : 4); + char *loca_prime_data = (char *) calloc(1, loca_prime_size); + + if (use_short_loca) + { + _write_loca (it, 2, loca_prime_data); + } + else + { + _write_loca (it, 1, loca_prime_data); + } + + hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, + loca_prime_size, + HB_MEMORY_MODE_READONLY, + loca_prime_data, + free); + if (unlikely (! (c->plan->add_table (HB_OT_TAG_loca, loca_blob) + && _add_head_and_set_loca_version(c->plan, use_short_loca)))) + { + // TODO signal fatal error + return false; + } return_trace (true); } From 14db6512f8dca80a575f468708949346b005834a Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Fri, 10 May 2019 09:32:43 -0700 Subject: [PATCH 348/617] [subset] Correct flipped use short computation --- src/hb-ot-glyf-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 39b712d27..6b2a2be7d 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -103,7 +103,7 @@ struct glyf TRACE_SERIALIZE (this); // pad glyphs to 2-byte boundaries to permit short loca HBUINT8 pad; - + pad = 0; + it | hb_apply ( [&] (hb_bytes_t glyph) { glyph.copy(c); @@ -160,7 +160,7 @@ struct glyf // TODO whats the right way to serialize loca? // _subset2 will think these bytes are part of glyf if we write to serializer - bool use_short_loca = glyf_padded_size > 131070; + bool use_short_loca = glyf_padded_size <= 131070; unsigned int loca_prime_size = (c->plan->num_output_glyphs () + 1) * (use_short_loca ? 2 : 4); char *loca_prime_data = (char *) calloc(1, loca_prime_size); From b77dde8f138442935e5ca99460a520a4117d6dd2 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Fri, 10 May 2019 16:52:19 -0700 Subject: [PATCH 349/617] [subset] Destroy blob --- src/hb-ot-glyf-table.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 6b2a2be7d..86c43cd4e 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -182,9 +182,11 @@ struct glyf && _add_head_and_set_loca_version(c->plan, use_short_loca)))) { // TODO signal fatal error + hb_blob_destroy (loca_blob); return false; } + hb_blob_destroy (loca_blob); return_trace (true); } From 3a4c928fcfce5a8c7a56907b9945e87b0ce8e327 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Sat, 11 May 2019 22:06:46 -0700 Subject: [PATCH 350/617] [subset] Fix glyf tests except hint stripping & local test asan --- src/hb-ot-glyf-table.hh | 93 +++++++++++++++++++++++++++---------- test/api/hb-subset-test.h | 2 +- test/api/hb-test.h | 13 ++++++ test/api/test-subset-glyf.c | 8 ++-- 4 files changed, 86 insertions(+), 30 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 86c43cd4e..5087f457b 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -82,33 +82,54 @@ struct glyf template static void - _write_loca (Iterator it, unsigned size_denom, char * loca_data) + _write_loca (Iterator it, unsigned size_denom, char * dest) { + // write loca[0] through loca[numGlyphs-1] + EntryType * loca_start = (EntryType *) dest; + EntryType * loca_current = loca_start; unsigned int offset = 0; + it - | hb_apply ([&] (hb_bytes_t _) { - offset += _.length / size_denom; - EntryType *entry = (EntryType *) loca_data; - *entry = offset; - loca_data += entry->get_size(); + | hb_apply ([&] (unsigned int padded_size) { + DEBUG_MSG(SUBSET, nullptr, "loca entry %ld offset %d", loca_current - loca_start, offset); + *loca_current = offset / size_denom; + offset += padded_size; + loca_current++; }); - EntryType *entry = (EntryType *) loca_data; - *entry = offset; + // one bonus element so loca[numGlyphs] - loca[numGlyphs -1] is size of last glyph + DEBUG_MSG(SUBSET, nullptr, "loca entry %ld offset %d", loca_current - loca_start, offset); + *loca_current = offset / size_denom; } + // TODO don't pass in plan template bool serialize(hb_serialize_context_t *c, - Iterator it) + Iterator it, + const hb_subset_plan_t *plan) { TRACE_SERIALIZE (this); // pad glyphs to 2-byte boundaries to permit short loca HBUINT8 pad; pad = 0; + it - | hb_apply ( [&] (hb_bytes_t glyph) { - glyph.copy(c); - if (glyph.length % 2) c->embed(pad); + | hb_apply ( [&] (hb_pair_t _) { + const hb_bytes_t& src_glyph = _.first; + unsigned int padded_size = _.second; + hb_bytes_t dest_glyph = src_glyph.copy(c); + unsigned int padding = padded_size - src_glyph.length; + DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", src_glyph.length, padded_size, padding); + while (padding > 0) + { + c->embed(pad); + padding--; + } + + _fix_component_gids (plan, dest_glyph); }); + + // Things old impl did we now don't: + // TODO set instruction length to 0 where appropriate + // TODO _remove_composite_instruction_flag + return_trace (true); } @@ -124,8 +145,7 @@ struct glyf // make an iterator of per-glyph hb_bytes_t. // unpadded, hints removed if that was requested. - unsigned int glyf_padded_size = 0; // - auto it = + auto glyphs = + hb_range (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { hb_codepoint_t old_gid; @@ -138,40 +158,43 @@ struct glyf glyf.remove_padding (start_offset, &end_offset)))) { // TODO signal fatal error + DEBUG_MSG(SUBSET, nullptr, "Unable to get offset or remove padding for new_gid %d", new_gid); return hb_bytes_t (); } - hb_bytes_t glyph ((const char *) this, end_offset - start_offset); + hb_bytes_t glyph (((const char *) this) + start_offset, end_offset - start_offset); // if dropping hints, find hints region and subtract it + unsigned int instruction_length = 0; if (c->plan->drop_hints) { - unsigned int instruction_length; if (!glyf.get_instruction_length (glyph, &instruction_length)) { // TODO signal fatal error + DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); return hb_bytes_t (); } glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); } - glyf_padded_size += glyph.length + glyph.length % 2; + return glyph; }); - glyf_prime->serialize (c->serializer, it); + auto padded_offsets = + + glyphs + | hb_map ([&] (hb_bytes_t _) { return _.length + _.length % 2; }); + + glyf_prime->serialize (c->serializer, hb_zip (glyphs, padded_offsets), c->plan); // TODO whats the right way to serialize loca? // _subset2 will think these bytes are part of glyf if we write to serializer - bool use_short_loca = glyf_padded_size <= 131070; + unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); + bool use_short_loca = max_offset <= 131070; unsigned int loca_prime_size = (c->plan->num_output_glyphs () + 1) * (use_short_loca ? 2 : 4); char *loca_prime_data = (char *) calloc(1, loca_prime_size); if (use_short_loca) - { - _write_loca (it, 2, loca_prime_data); - } + _write_loca (padded_offsets, 2, loca_prime_data); else - { - _write_loca (it, 1, loca_prime_data); - } + _write_loca (padded_offsets, 1, loca_prime_data); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, loca_prime_size, @@ -190,6 +213,26 @@ struct glyf return_trace (true); } + static void + _fix_component_gids (const hb_subset_plan_t *plan, + hb_bytes_t glyph) + { + OT::glyf::CompositeGlyphHeader::Iterator iterator; + if (OT::glyf::CompositeGlyphHeader::get_iterator (&glyph, + glyph.length, + &iterator)) + { + do + { + hb_codepoint_t new_gid; + if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, + &new_gid)) + continue; + ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; + } while (iterator.move_to_next ()); + } + } + static bool _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) { diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h index 8f32aee67..de86a6a5b 100644 --- a/test/api/hb-subset-test.h +++ b/test/api/hb-subset-test.h @@ -91,9 +91,9 @@ hb_subset_test_check (hb_face_t *expected, hb_tag_t table) { hb_blob_t *expected_blob, *actual_blob; - //fprintf(stderr, "comparing %c%c%c%c ", HB_UNTAG(table)); expected_blob = hb_face_reference_table (expected, table); actual_blob = hb_face_reference_table (actual, table); + fprintf(stderr, "comparing %c%c%c%c, expected %d bytes, actual %d bytes\n", HB_UNTAG(table), hb_blob_get_length(expected_blob), hb_blob_get_length (actual_blob)); hb_test_assert_blobs_equal (expected_blob, actual_blob); hb_blob_destroy (expected_blob); hb_blob_destroy (actual_blob); diff --git a/test/api/hb-test.h b/test/api/hb-test.h index 872f45c4b..fc7dbbb4b 100644 --- a/test/api/hb-test.h +++ b/test/api/hb-test.h @@ -173,6 +173,19 @@ static inline void hb_test_assert_blobs_equal (hb_blob_t *expected_blob, hb_blob const char *raw_expected = hb_blob_get_data (expected_blob, &expected_length); const char *raw_actual = hb_blob_get_data (actual_blob, &actual_length); g_assert_cmpint(expected_length, ==, actual_length); + if (memcmp (raw_expected, raw_actual, expected_length) != 0) + { + for (int i = 0; i < expected_length; i++) + { + int expected = *(raw_expected + i); + int actual = *(raw_actual + i); + if (expected != actual) + { + fprintf(stderr, "+%d %02x != %02x\n", i, expected, actual); + } + + } + } g_assert_cmpint(0, ==, memcmp(raw_expected, raw_actual, expected_length)); } diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index 4671156f9..bb8746105 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -70,9 +70,9 @@ test_subset_glyf (void) face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints)); hb_set_destroy (codepoints); - hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f')); - hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a')); check_maxp_num_glyphs(face_abc_subset, 3, true); + hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a')); + hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f')); hb_face_destroy (face_abc_subset); hb_face_destroy (face_abc); @@ -315,8 +315,8 @@ main (int argc, char **argv) hb_test_add (test_subset_glyf_noop); hb_test_add (test_subset_glyf); hb_test_add (test_subset_glyf_with_input_glyphs); - hb_test_add (test_subset_glyf_strip_hints_simple); - hb_test_add (test_subset_glyf_strip_hints_composite); + //hb_test_add (test_subset_glyf_strip_hints_simple); + //hb_test_add (test_subset_glyf_strip_hints_composite); hb_test_add (test_subset_glyf_strip_hints_invalid); hb_test_add (test_subset_glyf_with_components); hb_test_add (test_subset_glyf_with_gsub); From 9d09ac13a114967576284d0b006a0ac7965d928a Mon Sep 17 00:00:00 2001 From: rsheeter Date: Sat, 11 May 2019 23:16:40 -0700 Subject: [PATCH 351/617] [subset] Tweak hint stripping --- src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 5087f457b..c1192f8cd 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -107,7 +107,7 @@ struct glyf const hb_subset_plan_t *plan) { TRACE_SERIALIZE (this); - // pad glyphs to 2-byte boundaries to permit short loca + HBUINT8 pad; pad = 0; + it @@ -124,10 +124,14 @@ struct glyf } _fix_component_gids (plan, dest_glyph); + if (plan->drop_hints) + { + // we copied the glyph w/o instructions, just need to zero instruction length + _zero_instruction_length (dest_glyph); + } }); // Things old impl did we now don't: - // TODO set instruction length to 0 where appropriate // TODO _remove_composite_instruction_flag return_trace (true); @@ -145,6 +149,9 @@ struct glyf // make an iterator of per-glyph hb_bytes_t. // unpadded, hints removed if that was requested. + + // TODO log shows we redo a bunch of the work here; should sink this at end? + auto glyphs = + hb_range (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { @@ -163,15 +170,16 @@ struct glyf } hb_bytes_t glyph (((const char *) this) + start_offset, end_offset - start_offset); - // if dropping hints, find hints region and subtract it - unsigned int instruction_length = 0; + // if dropping hints, find hints region and chop it off the end if (c->plan->drop_hints) { + unsigned int instruction_length = 0; if (!glyf.get_instruction_length (glyph, &instruction_length)) { // TODO signal fatal error DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); return hb_bytes_t (); } + DEBUG_MSG(SUBSET, nullptr, "new_gid %d drop %d instruction bytes from %d byte glyph", new_gid, instruction_length, glyph.length); glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); } @@ -233,6 +241,18 @@ struct glyf } } + static void + _zero_instruction_length (hb_bytes_t glyph) + { + const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); + int16_t num_contours = (int16_t) glyph_header.numberOfContours; + if (num_contours > 0) + { + const HBUINT16 &instruction_length = StructAtOffset (&glyph, GlyphHeader::static_size + 2 * num_contours); + (HBUINT16 &) instruction_length = 0; + } + } + static bool _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) { @@ -517,17 +537,18 @@ struct glyf unsigned int * length /* OUT */) const { /* Empty glyph; no instructions. */ - if (glyph.get_size() < GlyphHeader::static_size) + if (glyph.length < GlyphHeader::static_size) { *length = 0; - return true; + // only 0 byte glyphs are healthy when missing GlyphHeader + return glyph.length == 0; } - unsigned int start = glyph.length; - unsigned int end = glyph.length; const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) { + unsigned int start = glyph.length; + unsigned int end = glyph.length; CompositeGlyphHeader::Iterator composite_it; if (unlikely (!CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; const CompositeGlyphHeader *last; @@ -542,6 +563,7 @@ struct glyf DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside %d byte buffer", start, glyph.length); return false; } + *length = end - start; } else { @@ -552,16 +574,14 @@ struct glyf return false; } - const HBUINT16 &instruction_length = StructAtOffset (glyf_table, instruction_length_offset); - unsigned int start = instruction_length_offset + 2; - unsigned int end = start + (uint16_t) instruction_length; - if (unlikely (end > glyph.length)) // Out of bounds of the current glyph + const HBUINT16 &instruction_length = StructAtOffset (&glyph, instruction_length_offset); + if (unlikely (instruction_length_offset + instruction_length > glyph.length)) // Out of bounds of the current glyph { DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries."); return false; } + *length = (uint16_t) instruction_length; } - *length = end - start; return true; } From 8a84b540c7b850c1fb30d5bc1ffdeb43033be173 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Thu, 16 May 2019 19:14:16 -0700 Subject: [PATCH 352/617] [subset] Tests passing using iterator based glyf --- src/hb-ot-glyf-table.hh | 119 +++++++++++++++++++++++++----------- test/api/test-subset-glyf.c | 4 +- 2 files changed, 87 insertions(+), 36 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index c1192f8cd..0dd042744 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -111,12 +111,14 @@ struct glyf HBUINT8 pad; pad = 0; + it - | hb_apply ( [&] (hb_pair_t _) { - const hb_bytes_t& src_glyph = _.first; + | hb_apply ( [&] (hb_pair_t _) { + const SubsetGlyph& src_glyph = _.first; unsigned int padded_size = _.second; - hb_bytes_t dest_glyph = src_glyph.copy(c); - unsigned int padding = padded_size - src_glyph.length; - DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", src_glyph.length, padded_size, padding); + hb_bytes_t dest_glyph = src_glyph.start.copy(c); + src_glyph.end.copy(c); + dest_glyph.length += src_glyph.end.length; + unsigned int padding = padded_size - dest_glyph.length; + DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, padded_size, padding); while (padding > 0) { c->embed(pad); @@ -126,14 +128,14 @@ struct glyf _fix_component_gids (plan, dest_glyph); if (plan->drop_hints) { - // we copied the glyph w/o instructions, just need to zero instruction length _zero_instruction_length (dest_glyph); + if (unlikely (!_remove_composite_instruction_flag (dest_glyph))) + { + // TODO signal irreversible failure + } } }); - // Things old impl did we now don't: - // TODO _remove_composite_instruction_flag - return_trace (true); } @@ -150,15 +152,16 @@ struct glyf // make an iterator of per-glyph hb_bytes_t. // unpadded, hints removed if that was requested. - // TODO log shows we redo a bunch of the work here; should sink this at end? - + // TODO hb_sink so we don't redo this work for every + glyphs | ... use. auto glyphs = + hb_range (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { hb_codepoint_t old_gid; + SubsetGlyph subset_glyph; + // should never fail, ALL old gids should be mapped - if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return hb_bytes_t (); + if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return subset_glyph; unsigned int start_offset, end_offset; if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && @@ -166,29 +169,52 @@ struct glyf { // TODO signal fatal error DEBUG_MSG(SUBSET, nullptr, "Unable to get offset or remove padding for new_gid %d", new_gid); - return hb_bytes_t (); + return subset_glyph; } - hb_bytes_t glyph (((const char *) this) + start_offset, end_offset - start_offset); - - // if dropping hints, find hints region and chop it off the end - if (c->plan->drop_hints) { - unsigned int instruction_length = 0; - if (!glyf.get_instruction_length (glyph, &instruction_length)) - { - // TODO signal fatal error - DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); - return hb_bytes_t (); - } - DEBUG_MSG(SUBSET, nullptr, "new_gid %d drop %d instruction bytes from %d byte glyph", new_gid, instruction_length, glyph.length); - glyph = hb_bytes_t (&glyph, glyph.length - instruction_length); + subset_glyph.start = hb_bytes_t (((const char *) this) + start_offset, end_offset - start_offset); + if (subset_glyph.start.length == 0) return subset_glyph; + if (unlikely (subset_glyph.start.length < GlyphHeader::static_size)) + { + // TODO signal fatal error, invalid glyph + DEBUG_MSG(SUBSET, nullptr, "Glyph size smaller than minimum header %d", new_gid); + return subset_glyph; } - return glyph; + if (!c->plan->drop_hints) return subset_glyph; + + unsigned int instruction_length = 0; + if (!glyf.get_instruction_length (subset_glyph.start, &instruction_length)) + { + // TODO signal fatal error + DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); + return subset_glyph; + } + DEBUG_MSG(SUBSET, nullptr, "new_gid %d drop %d instruction bytes from %d byte glyph", new_gid, instruction_length, subset_glyph.start.length); + + const GlyphHeader& header = StructAtOffset (&subset_glyph.start, 0); + if (header.numberOfContours < 0) + { + // composite, just chop instructions off the end + subset_glyph.start = hb_bytes_t (&subset_glyph.start, subset_glyph.start.length - instruction_length); + } + else + { + // simple glyph + unsigned start_length = GlyphHeader::static_size + 2 * header.numberOfContours + 2; + subset_glyph.end = hb_bytes_t (&subset_glyph.start + start_length + instruction_length, + subset_glyph.start.length - start_length - instruction_length); + subset_glyph.start = hb_bytes_t (&subset_glyph.start, start_length); + } + + return subset_glyph; }); auto padded_offsets = + glyphs - | hb_map ([&] (hb_bytes_t _) { return _.length + _.length % 2; }); + | hb_map ([&] (SubsetGlyph _) { + unsigned length = _.start.length + _.end.length; + return length + length % 2; + }); glyf_prime->serialize (c->serializer, hb_zip (glyphs, padded_offsets), c->plan); @@ -198,6 +224,7 @@ struct glyf bool use_short_loca = max_offset <= 131070; unsigned int loca_prime_size = (c->plan->num_output_glyphs () + 1) * (use_short_loca ? 2 : 4); char *loca_prime_data = (char *) calloc(1, loca_prime_size); +DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY if (use_short_loca) _write_loca (padded_offsets, 2, loca_prime_data); @@ -246,13 +273,29 @@ struct glyf { const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); int16_t num_contours = (int16_t) glyph_header.numberOfContours; - if (num_contours > 0) - { - const HBUINT16 &instruction_length = StructAtOffset (&glyph, GlyphHeader::static_size + 2 * num_contours); - (HBUINT16 &) instruction_length = 0; - } + if (num_contours <= 0) return; // only for simple glyphs + + const HBUINT16 &instruction_length = StructAtOffset (&glyph, GlyphHeader::static_size + 2 * num_contours); + (HBUINT16 &) instruction_length = 0; } + static bool _remove_composite_instruction_flag (hb_bytes_t glyph) + { + const GlyphHeader &glyph_header = StructAtOffset (&glyph, 0); + if (glyph_header.numberOfContours >= 0) return true; // only for composites + + /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ + OT::glyf::CompositeGlyphHeader::Iterator composite_it; + if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; + const OT::glyf::CompositeGlyphHeader *composite_header; + do { + composite_header = composite_it.current; + OT::HBUINT16 *flags = const_cast (&composite_header->flags); + *flags = (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS; + } while (composite_it.move_to_next ()); + return true; +} + static bool _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) { @@ -271,6 +314,13 @@ struct glyf return success; } + struct SubsetGlyph + { + hb_bytes_t start; + hb_bytes_t end; + }; + + struct GlyphHeader { HBINT16 numberOfContours; /* If the number of contours is @@ -549,6 +599,7 @@ struct glyf { unsigned int start = glyph.length; unsigned int end = glyph.length; + unsigned int glyph_offset = &glyph - glyf_table; CompositeGlyphHeader::Iterator composite_it; if (unlikely (!CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; const CompositeGlyphHeader *last; @@ -557,7 +608,7 @@ struct glyf } while (composite_it.move_to_next ()); if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) - start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); + start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size () - glyph_offset; if (unlikely (start > end)) { DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside %d byte buffer", start, glyph.length); diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index b2d5c2ebe..0bdb1bc33 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -339,8 +339,8 @@ main (int argc, char **argv) hb_test_add (test_subset_glyf_noop); hb_test_add (test_subset_glyf); hb_test_add (test_subset_glyf_with_input_glyphs); - //hb_test_add (test_subset_glyf_strip_hints_simple); - //hb_test_add (test_subset_glyf_strip_hints_composite); + hb_test_add (test_subset_glyf_strip_hints_simple); + hb_test_add (test_subset_glyf_strip_hints_composite); hb_test_add (test_subset_glyf_strip_hints_invalid); hb_test_add (test_subset_glyf_with_components); hb_test_add (test_subset_glyf_with_gsub); From 5cedda5e4a3f726168b87d357aee723e6fd919cd Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Thu, 16 May 2019 19:16:52 -0700 Subject: [PATCH 353/617] [subset] Fix null pointer deref, tidy up a bit --- src/hb-ot-glyf-table.hh | 282 ++++++++++++++++++++---------------- test/api/test-subset-glyf.c | 18 +-- 2 files changed, 167 insertions(+), 133 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 0dd042744..c9b9cf499 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -21,7 +21,7 @@ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * - * Google Author(s): Behdad Esfahbod, Garret Reiger, Roderick Sheeter + * Google Author(s): Behdad Esfahbod, Garret Rieger, Roderick Sheeter */ #ifndef HB_OT_GLYF_TABLE_HH @@ -80,6 +80,34 @@ struct glyf return_trace (true); } + template + static void + _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) + { + unsigned int max_offset = + + padded_offsets + | hb_reduce (hb_max, 0); + bool use_short_loca = max_offset <= 131070; + unsigned int loca_prime_size = (padded_offsets.len () + 1) * (use_short_loca ? 2 : 4); + char *loca_prime_data = (char *) calloc(1, loca_prime_size); + + if (use_short_loca) + _write_loca (padded_offsets, 2, loca_prime_data); + else + _write_loca (padded_offsets, 1, loca_prime_data); + + hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, + loca_prime_size, + HB_MEMORY_MODE_READONLY, + loca_prime_data, + free); + + plan->add_table (HB_OT_TAG_loca, loca_blob); + _add_head_and_set_loca_version(plan, use_short_loca); + + hb_blob_destroy (loca_blob); + } + template static void _write_loca (Iterator it, unsigned size_denom, char * dest) @@ -100,7 +128,6 @@ struct glyf *loca_current = offset / size_denom; } - // TODO don't pass in plan template bool serialize(hb_serialize_context_t *c, Iterator it, @@ -108,33 +135,8 @@ struct glyf { TRACE_SERIALIZE (this); - HBUINT8 pad; - pad = 0; + it - | hb_apply ( [&] (hb_pair_t _) { - const SubsetGlyph& src_glyph = _.first; - unsigned int padded_size = _.second; - hb_bytes_t dest_glyph = src_glyph.start.copy(c); - src_glyph.end.copy(c); - dest_glyph.length += src_glyph.end.length; - unsigned int padding = padded_size - dest_glyph.length; - DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, padded_size, padding); - while (padding > 0) - { - c->embed(pad); - padding--; - } - - _fix_component_gids (plan, dest_glyph); - if (plan->drop_hints) - { - _zero_instruction_length (dest_glyph); - if (unlikely (!_remove_composite_instruction_flag (dest_glyph))) - { - // TODO signal irreversible failure - } - } - }); + | hb_apply ( [&] (const SubsetGlyph& _) { _.serialize (c, plan); }); return_trace (true); } @@ -149,102 +151,35 @@ struct glyf OT::glyf::accelerator_t glyf; glyf.init (c->plan->source); - // make an iterator of per-glyph hb_bytes_t. - // unpadded, hints removed if that was requested. - - // TODO hb_sink so we don't redo this work for every + glyphs | ... use. - auto glyphs = + // Byte region(s) per glyph to output + // unpadded, hints removed if so requested + // If we fail to process a glyph we produce an empty (0-length) glyph + hb_vector_t glyphs; + hb_range (c->plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { - hb_codepoint_t old_gid; - SubsetGlyph subset_glyph; + subset_glyph.new_gid = new_gid; - // should never fail, ALL old gids should be mapped - if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid)) return subset_glyph; + // should never fail: all old gids should be mapped + if (!c->plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid)) return subset_glyph; - unsigned int start_offset, end_offset; - if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - { - // TODO signal fatal error - DEBUG_MSG(SUBSET, nullptr, "Unable to get offset or remove padding for new_gid %d", new_gid); - return subset_glyph; - } - subset_glyph.start = hb_bytes_t (((const char *) this) + start_offset, end_offset - start_offset); - if (subset_glyph.start.length == 0) return subset_glyph; - if (unlikely (subset_glyph.start.length < GlyphHeader::static_size)) - { - // TODO signal fatal error, invalid glyph - DEBUG_MSG(SUBSET, nullptr, "Glyph size smaller than minimum header %d", new_gid); - return subset_glyph; - } - - if (!c->plan->drop_hints) return subset_glyph; - - unsigned int instruction_length = 0; - if (!glyf.get_instruction_length (subset_glyph.start, &instruction_length)) - { - // TODO signal fatal error - DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); - return subset_glyph; - } - DEBUG_MSG(SUBSET, nullptr, "new_gid %d drop %d instruction bytes from %d byte glyph", new_gid, instruction_length, subset_glyph.start.length); - - const GlyphHeader& header = StructAtOffset (&subset_glyph.start, 0); - if (header.numberOfContours < 0) - { - // composite, just chop instructions off the end - subset_glyph.start = hb_bytes_t (&subset_glyph.start, subset_glyph.start.length - instruction_length); - } - else - { - // simple glyph - unsigned start_length = GlyphHeader::static_size + 2 * header.numberOfContours + 2; - subset_glyph.end = hb_bytes_t (&subset_glyph.start + start_length + instruction_length, - subset_glyph.start.length - start_length - instruction_length); - subset_glyph.start = hb_bytes_t (&subset_glyph.start, start_length); - } + subset_glyph.source_glyph = glyf.bytes_for_glyph ((const char *) this, subset_glyph.old_gid); + if (c->plan->drop_hints) subset_glyph.drop_hints (glyf); + else subset_glyph.dest_start = subset_glyph.source_glyph; return subset_glyph; - }); + }) + | hb_sink (glyphs); - auto padded_offsets = - + glyphs - | hb_map ([&] (SubsetGlyph _) { - unsigned length = _.start.length + _.end.length; - return length + length % 2; - }); + glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan); - glyf_prime->serialize (c->serializer, hb_zip (glyphs, padded_offsets), c->plan); + hb_vector_t padded_offsets; + + hb_iter (glyphs) + | hb_map ([&] (const SubsetGlyph& _) { return _.padded_size(); }) + | hb_sink (padded_offsets); - // TODO whats the right way to serialize loca? - // _subset2 will think these bytes are part of glyf if we write to serializer - unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); - bool use_short_loca = max_offset <= 131070; - unsigned int loca_prime_size = (c->plan->num_output_glyphs () + 1) * (use_short_loca ? 2 : 4); - char *loca_prime_data = (char *) calloc(1, loca_prime_size); -DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY + _add_loca_and_head (c->plan, hb_iter (padded_offsets)); - if (use_short_loca) - _write_loca (padded_offsets, 2, loca_prime_data); - else - _write_loca (padded_offsets, 1, loca_prime_data); - - hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, - loca_prime_size, - HB_MEMORY_MODE_READONLY, - loca_prime_data, - free); - if (unlikely (! (c->plan->add_table (HB_OT_TAG_loca, loca_blob) - && _add_head_and_set_loca_version(c->plan, use_short_loca)))) - { - // TODO signal fatal error - hb_blob_destroy (loca_blob); - return false; - } - - hb_blob_destroy (loca_blob); return_trace (true); } @@ -259,11 +194,11 @@ DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY { do { - hb_codepoint_t new_gid; - if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, - &new_gid)) + hb_codepoint_t new_gid; + if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, + &new_gid)) continue; - ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; + ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; } while (iterator.move_to_next ()); } } @@ -314,13 +249,6 @@ DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY return success; } - struct SubsetGlyph - { - hb_bytes_t start; - hb_bytes_t end; - }; - - struct GlyphHeader { HBINT16 numberOfContours; /* If the number of contours is @@ -655,6 +583,25 @@ DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY return true; } + hb_bytes_t bytes_for_glyph (const char * glyf, hb_codepoint_t gid) + { + unsigned int start_offset, end_offset; + if (unlikely (!(get_offsets (gid, &start_offset, &end_offset) && + remove_padding (start_offset, &end_offset)))) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to get offset or remove padding for %d", gid); + return hb_bytes_t (); + } + hb_bytes_t glyph = hb_bytes_t (glyf + start_offset, end_offset - start_offset); + if (glyph.length == 0) return glyph; + if (unlikely (glyph.length < GlyphHeader::static_size)) + { + DEBUG_MSG(SUBSET, nullptr, "Glyph size smaller than minimum header %d", gid); + return hb_bytes_t (); + } + return glyph; + } + private: bool short_offset; unsigned int num_glyphs; @@ -662,6 +609,93 @@ DEBUG_MSG(SUBSET, nullptr, "calloc %u for loca", loca_prime_size); // TEMPORARY hb_blob_ptr_t glyf_table; }; + + struct SubsetGlyph + { + hb_codepoint_t new_gid; + hb_codepoint_t old_gid; + hb_bytes_t source_glyph; + hb_bytes_t dest_start; // region of source_glyph to copy first + hb_bytes_t dest_end; // region of source_glyph to copy second + + + bool serialize (hb_serialize_context_t *c, + const hb_subset_plan_t *plan) const + { + TRACE_SERIALIZE (this); + + hb_bytes_t dest_glyph = dest_start.copy(c); + dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy(c).length); + unsigned int pad_length = padding (); + DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, dest_glyph.length + pad_length, pad_length); + + HBUINT8 pad; + pad = 0; + while (pad_length > 0) + { + c->embed(pad); + pad_length--; + } + + if (dest_glyph.length) + { + _fix_component_gids (plan, dest_glyph); + if (plan->drop_hints) + { + _zero_instruction_length (dest_glyph); + c->check_success (_remove_composite_instruction_flag (dest_glyph)); + } + } + + return_trace (true); + } + + void drop_hints (const OT::glyf::accelerator_t& glyf) + { + if (source_glyph.length == 0) return; + + unsigned int instruction_length = 0; + if (!glyf.get_instruction_length (source_glyph, &instruction_length)) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); + return ; + } + + const GlyphHeader& header = StructAtOffset (&source_glyph, 0); + int16_t num_contours = (int16_t) header.numberOfContours; + DEBUG_MSG(SUBSET, nullptr, "new_gid %d (%d contours) drop %d instruction bytes from %d byte source glyph", new_gid, num_contours, instruction_length, source_glyph.length); + if (num_contours < 0) + { + // composite, just chop instructions off the end + dest_start = hb_bytes_t (&source_glyph, source_glyph.length - instruction_length); + } + else + { + // simple glyph + dest_start = hb_bytes_t (&source_glyph, GlyphHeader::static_size + 2 * header.numberOfContours + 2); + dest_end = hb_bytes_t (&source_glyph + dest_start.length + instruction_length, + source_glyph.length - dest_start.length - instruction_length); +DEBUG_MSG(SUBSET, nullptr, "source_len %d start len %d instruction_len %d end len %d", source_glyph.length, dest_start.length, instruction_length, dest_end.length); + } + } + + unsigned int length () const + { + return dest_start.length + dest_end.length; + } + + // pad to 2 to ensure 2-byte loca will be ok + unsigned int padding () const + { + return length () % 2; + } + + unsigned int padded_size () const + { + return length () + padding (); + } + }; + protected: UnsizedArrayOf dataZ; /* Glyphs data. */ public: diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index 0bdb1bc33..af71f27e3 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -190,9 +190,9 @@ test_subset_glyf_noop (void) face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints)); hb_set_destroy (codepoints); - hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('g','l','y','f')); - hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('l','o','c', 'a')); check_maxp_num_glyphs(face_abc_subset, 4, true); + hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('l','o','c', 'a')); + hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('g','l','y','f')); hb_face_destroy (face_abc_subset); hb_face_destroy (face_abc); @@ -214,9 +214,9 @@ test_subset_glyf_strip_hints_simple (void) face_abc_subset = hb_subset_test_create_subset (face_abc, input); hb_set_destroy (codepoints); + check_maxp_num_glyphs(face_abc_subset, 3, false); hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a')); hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f')); - check_maxp_num_glyphs(face_abc_subset, 3, false); hb_face_destroy (face_abc_subset); hb_face_destroy (face_abc); @@ -239,9 +239,9 @@ test_subset_glyf_strip_hints_composite (void) face_generated_subset = hb_subset_test_create_subset (face_components, input); hb_set_destroy (codepoints); - hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('g','l','y','f')); - hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('l','o','c', 'a')); check_maxp_num_glyphs(face_generated_subset, 4, false); + hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('l','o','c', 'a')); + hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('g','l','y','f')); hb_face_destroy (face_generated_subset); hb_face_destroy (face_subset); @@ -296,9 +296,9 @@ test_subset_glyf_retain_gids (void) face_abc_subset = hb_subset_test_create_subset (face_abc, input); hb_set_destroy (codepoints); - hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f')); - hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a')); check_maxp_num_glyphs(face_abc_subset, 4, true); + hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a')); + hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f')); hb_face_destroy (face_abc_subset); hb_face_destroy (face_abc); @@ -320,9 +320,9 @@ test_subset_glyf_retain_gids_truncates (void) face_abc_subset = hb_subset_test_create_subset (face_abc, input); hb_set_destroy (codepoints); - hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('g','l','y','f')); - hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('l','o','c', 'a')); check_maxp_num_glyphs(face_abc_subset, 2, true); + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('l','o','c', 'a')); + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('g','l','y','f')); hb_face_destroy (face_abc_subset); hb_face_destroy (face_abc); From 3a43603ecea2c349f58396e103a52948776681e0 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Mon, 20 May 2019 20:40:55 -0700 Subject: [PATCH 354/617] [subset] Fix memory leak caused by failure to cleanup glyf accelerator --- src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index c9b9cf499..4d45a93c7 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -148,28 +148,11 @@ struct glyf glyf *glyf_prime = c->serializer->start_embed (); if (unlikely (!glyf_prime)) return_trace (false); - OT::glyf::accelerator_t glyf; - glyf.init (c->plan->source); - // Byte region(s) per glyph to output // unpadded, hints removed if so requested // If we fail to process a glyph we produce an empty (0-length) glyph hb_vector_t glyphs; - + hb_range (c->plan->num_output_glyphs ()) - | hb_map ([&] (hb_codepoint_t new_gid) { - SubsetGlyph subset_glyph; - subset_glyph.new_gid = new_gid; - - // should never fail: all old gids should be mapped - if (!c->plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid)) return subset_glyph; - - subset_glyph.source_glyph = glyf.bytes_for_glyph ((const char *) this, subset_glyph.old_gid); - if (c->plan->drop_hints) subset_glyph.drop_hints (glyf); - else subset_glyph.dest_start = subset_glyph.source_glyph; - - return subset_glyph; - }) - | hb_sink (glyphs); + _populate_subset_glyphs (c->plan, &glyphs); glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan); @@ -183,6 +166,33 @@ struct glyf return_trace (true); } + template + void + _populate_subset_glyphs (const hb_subset_plan_t * plan, + hb_vector_t * glyphs /* OUT */) const + { + OT::glyf::accelerator_t glyf; + glyf.init (plan->source); + + + hb_range (plan->num_output_glyphs ()) + | hb_map ([&] (hb_codepoint_t new_gid) { + SubsetGlyph subset_glyph; + subset_glyph.new_gid = new_gid; + + // should never fail: all old gids should be mapped + if (!plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid)) return subset_glyph; + + subset_glyph.source_glyph = glyf.bytes_for_glyph ((const char *) this, subset_glyph.old_gid); + if (plan->drop_hints) subset_glyph.drop_hints (glyf); + else subset_glyph.dest_start = subset_glyph.source_glyph; + + return subset_glyph; + }) + | hb_sink (glyphs); + + glyf.fini(); + } + static void _fix_component_gids (const hb_subset_plan_t *plan, hb_bytes_t glyph) From 95445d79be0a79e6e2d384d46819730146d397d8 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 11:14:31 -0700 Subject: [PATCH 355/617] [subset] Write loca using more idiomatic harfbuzzese --- src/hb-ot-glyf-table.hh | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 4d45a93c7..3addeb63b 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -80,7 +80,8 @@ struct glyf return_trace (true); } - template + template static void _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) { @@ -92,9 +93,9 @@ struct glyf char *loca_prime_data = (char *) calloc(1, loca_prime_size); if (use_short_loca) - _write_loca (padded_offsets, 2, loca_prime_data); + _write_loca (padded_offsets, 1, loca_prime_data); else - _write_loca (padded_offsets, 1, loca_prime_data); + _write_loca (padded_offsets, 0, loca_prime_data); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, loca_prime_size, @@ -108,26 +109,27 @@ struct glyf hb_blob_destroy (loca_blob); } - template + template static void - _write_loca (Iterator it, unsigned size_denom, char * dest) + _write_loca (Iterator it, unsigned right_shift, char * dest) { - // write loca[0] through loca[numGlyphs-1] - EntryType * loca_start = (EntryType *) dest; - EntryType * loca_current = loca_start; + hb_array_t entries ((EntryType *) dest, it.len () + 1); unsigned int offset = 0; + it - | hb_apply ([&] (unsigned int padded_size) { - DEBUG_MSG(SUBSET, nullptr, "loca entry %ld offset %d", loca_current - loca_start, offset); - *loca_current = offset / size_denom; + | hb_map ([&] (unsigned int padded_size) { + unsigned int result = offset >> right_shift; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d shifted %d", offset, result); offset += padded_size; - loca_current++; - }); + return result; + }) + | hb_sink ( hb_iter (entries)); // one bonus element so loca[numGlyphs] - loca[numGlyphs -1] is size of last glyph - DEBUG_MSG(SUBSET, nullptr, "loca entry %ld offset %d", loca_current - loca_start, offset); - *loca_current = offset / size_denom; + entries.arrayZ[entries.length - 1] = offset >> right_shift; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", (int16_t) entries.arrayZ[entries.length - 1]); } + // requires source of SubsetGlyph complains the identifier isn't declared template bool serialize(hb_serialize_context_t *c, Iterator it, @@ -169,7 +171,7 @@ struct glyf template void _populate_subset_glyphs (const hb_subset_plan_t * plan, - hb_vector_t * glyphs /* OUT */) const + hb_vector_t * glyphs /* OUT */) const { OT::glyf::accelerator_t glyf; glyf.init (plan->source); @@ -311,6 +313,7 @@ struct glyf return size; } + // TODO rewrite using new iterator framework if possible struct Iterator { const char *glyph_start; From 349d692b0ee45330220fd3ec9267979d73acd149 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 12:38:53 -0700 Subject: [PATCH 356/617] [subset] Iter in and out for loca --- src/hb-ot-glyf-table.hh | 31 ++++++++++++++++--------------- test/api/hb-test.h | 7 ++----- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 3addeb63b..a5a81ad35 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -81,21 +81,23 @@ struct glyf } template - static void + hb_requires (hb_is_source_of (Iterator, unsigned int))> + static bool _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) { unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); bool use_short_loca = max_offset <= 131070; - unsigned int loca_prime_size = (padded_offsets.len () + 1) * (use_short_loca ? 2 : 4); + unsigned int loca_prime_size = padded_offsets.len () * (use_short_loca ? 2 : 4); char *loca_prime_data = (char *) calloc(1, loca_prime_size); + if (unlikely (!loca_prime_data)) return false; + if (use_short_loca) - _write_loca (padded_offsets, 1, loca_prime_data); + _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, padded_offsets.len ())); else - _write_loca (padded_offsets, 0, loca_prime_data); + _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, padded_offsets.len ())); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, loca_prime_size, @@ -107,14 +109,15 @@ struct glyf _add_head_and_set_loca_version(plan, use_short_loca); hb_blob_destroy (loca_blob); + return true; } - template + template static void - _write_loca (Iterator it, unsigned right_shift, char * dest) + _write_loca (IteratorIn it, unsigned right_shift, IteratorOut dest) { - hb_array_t entries ((EntryType *) dest, it.len () + 1); unsigned int offset = 0; + it | hb_map ([&] (unsigned int padded_size) { @@ -123,10 +126,7 @@ struct glyf offset += padded_size; return result; }) - | hb_sink ( hb_iter (entries)); - // one bonus element so loca[numGlyphs] - loca[numGlyphs -1] is size of last glyph - entries.arrayZ[entries.length - 1] = offset >> right_shift; - DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", (int16_t) entries.arrayZ[entries.length - 1]); + | hb_sink (dest); } // requires source of SubsetGlyph complains the identifier isn't declared @@ -163,9 +163,10 @@ struct glyf | hb_map ([&] (const SubsetGlyph& _) { return _.padded_size(); }) | hb_sink (padded_offsets); - _add_loca_and_head (c->plan, hb_iter (padded_offsets)); + // loca ends with a final entry == last offset (+0) + padded_offsets << 0; - return_trace (true); + return_trace (c->serializer->check_success (_add_loca_and_head (c->plan, hb_iter (padded_offsets)))); } template diff --git a/test/api/hb-test.h b/test/api/hb-test.h index fc7dbbb4b..59e0a9b36 100644 --- a/test/api/hb-test.h +++ b/test/api/hb-test.h @@ -179,11 +179,8 @@ static inline void hb_test_assert_blobs_equal (hb_blob_t *expected_blob, hb_blob { int expected = *(raw_expected + i); int actual = *(raw_actual + i); - if (expected != actual) - { - fprintf(stderr, "+%d %02x != %02x\n", i, expected, actual); - } - + if (expected != actual) fprintf(stderr, "+%d %02x != %02x\n", i, expected, actual); + else fprintf(stderr, "+%d %02x\n", i, expected); } } g_assert_cmpint(0, ==, memcmp(raw_expected, raw_actual, expected_length)); From c740c8636b48b1790bba42445a301e8e1cf8f749 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 16 May 2019 10:57:33 -0700 Subject: [PATCH 357/617] [subset] Add integration tests for SingleSubst. --- test/subset/data/Makefile.sources | 1 + ...llcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 0 -> 6780 bytes ...smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 0 -> 6396 bytes ...ar.smallcaps.keep-layout-retain-gids.41.ttf | Bin 0 -> 6032 bytes ...ar.smallcaps.keep-layout-retain-gids.43.ttf | Bin 0 -> 6088 bytes ...smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 0 -> 7932 bytes ...-Regular.smallcaps.keep-layout.41,42,43.ttf | Bin 0 -> 2972 bytes ...oto-Regular.smallcaps.keep-layout.41,43.ttf | Bin 0 -> 2572 bytes ...Roboto-Regular.smallcaps.keep-layout.41.ttf | Bin 0 -> 2196 bytes ...Roboto-Regular.smallcaps.keep-layout.43.ttf | Bin 0 -> 2268 bytes ...oto-Regular.smallcaps.keep-layout.CA,CB.ttf | Bin 0 -> 2612 bytes .../data/fonts/Roboto-Regular.smallcaps.ttf | Bin 0 -> 131632 bytes .../data/profiles/keep-layout-retain-gids.txt | 2 ++ test/subset/data/profiles/keep-layout.txt | 1 + test/subset/data/tests/full-font.tests | 1 - test/subset/data/tests/layout.tests | 13 +++++++++++++ test/subset/generate-expected-outputs.py | 3 ++- 17 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.43.ttf create mode 100644 test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf create mode 100644 test/subset/data/fonts/Roboto-Regular.smallcaps.ttf create mode 100644 test/subset/data/profiles/keep-layout-retain-gids.txt create mode 100644 test/subset/data/profiles/keep-layout.txt create mode 100644 test/subset/data/tests/layout.tests diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index dd1bcfe7a..75913fd9f 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -2,6 +2,7 @@ TESTS = \ tests/basics.tests \ tests/full-font.tests \ tests/japanese.tests \ + tests/layout.tests \ $(NULL) XFAIL_TESTS = \ diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf new file mode 100644 index 0000000000000000000000000000000000000000..aa007bac5ca2a8a46925124da8c4467e3b147e5b GIT binary patch literal 6780 zcmeHLeNa@_6+idAw{JfnvTPO>cKLYg3aIP~0-_-_LghnCA{)STH&gk@@+AS;vI~MS zlr}LTTZ#3L##W>0^ux$x#@yZ75gMJ+8LH!?O{7g`OsCVNon*9W6+2@`EAY1GzFib; zn|3njEx?gvPnN3B#{zwPsJs!Klt zFsGs1Tw9-4;NSe!s{jT+lRZ5xUf4)}2#};f+2tAVOS#9@M*vbfQEq7WcJ%DJ+58%| zHv^E<9W6dDXyAT~e+}E?JGzJ3`%-3Vunpt$S36sK295D?8!-Mm09;XLTTAPF*DrSi zX!oFfaVIKtKUSZ^b|=a!I(z(sQYDA|X-@)ZUheMow9Iq!Hvm+29FVi8WzZ{pk=LRe zkM`2emYz1lQ;w$*-)ZdA=P=gK{ zLb|y4M8gAAr>DXNpit?eLY^fkWIW_n1P%qx5EVoeL=-|Afn!dZydV&&%XL{VTCTf8 zIz^kmmRNZkDI_+m`Clv?ec>!;Kh8ORw(tmWJYZS z#o~2(YZj}DvTfFJ@|!EO{?>sPw~Fx zi8Sp3CQlS>5+trGGOQ>p0Fx~{+qRrbN-`P>3yRkZ7cKJduFA4}{s7Uvewn10ewzB~ zOA|9^L*IEVjl6Yfj`We@eQ%PYAIJ+Iop@QkHaB)fzI@;$B5e*|6Y_;4h;(a+PtU-l zEdiVs{lNbjV9~am0WK~sEJ%(37S&0{WCd`(aen3l`Oi;X`qs~H+&^g;8~*mIczWS1IdG1c=tpG79E6V=@se)rL7kgqEh-KijmjU7=r^pRuN8xOSA>rW1O$nucfmHT43SjzL z;u==JOX{xQvMju-&DZ!))Z#{@6n-E3&+_Ristu4P%)z*79qjsaA&a4jWgwP;SO#Jl zh-Dy_f&WDYggwwKI3XbH#Sc2tV{83RKi-ohv_$k!$`}+;qZrw zj5nDmGy6zkHs$zk!Z(Y8y@qO?t{@>Vx+h3@FMT#WsO6g)9hBH5sd7gJCCv`X*(q6V zbx__eRZ%{xs?KF|O93gcr8OW`Nu4dNRLD|lY-kI(^CSxOt{q4lTvl4TY?0z`csHr3%bI zH*Ss4UJ_qUZ*iYl_pEF7BDutr5HU_d)?r zDbw9&)W>T@#w{x?$Vp3NTtZpVs&vIy?<|j?f{-CjjRS~$x6np2@r9Zg`3fU>X5tUk zGSbV)enwtrB+N*rne;P{e&*57Jo-Zk8O)cFSw=E5(5{J*{fxZLNSKk08ED+gNS=gt zy-08&z-l-GBY0mq2=CzObt^m$&qFgj21Q&coQ4p*2-9d~l$*iG9R`WFLYzrmGL{pi<%7LO@*KJ@R!sI1R5*kd8AhX)mjAy|Kx zzvG?=YzM;mZ0ojIvj5Xkcz5@8&I$OU@H3?3qtVK;iw-1L1{O8 zhWfg}+|k$eB$&Hf{5!#X+k@E>Pl3;aQ6iosx?d93A7-29vbij71xDo|3p1YcHy=~W A=>Px# literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f3be30c5bf8ed5cc5d5a77c0cea4a380d1f7a5b0 GIT binary patch literal 6396 zcmeHLeQaCR6+idA=g)-3ah zn~uW5fDtT0*MBxfKd2A`CM3AAkeZHG%A~Fcu|c~HsYsL9q@s2bgG^#tmlAuw`|M^Z z+J`i45)!^o_k7)R&OP_s`|f-95+kBw0EH}_{;nS1zPl!f)=ojHcJ_SjE5_elJ_P;* z`1`wh>KhZ=ANiQbatVAWG8T?eQaVnwdJ_C-WM4w9d)aV|sPrT7y@Ro#vHe#=ub>_J z?DSAL9wQ^IhQ9>b3x`Gz41QzcnGeubP9%kf`^P3%6&5rhARqYV;el}fXCuG<4v|6l zYZ->X{4>Lw=zku3)$mwivUHJ+5E-jbkB&wo;Uhpywf?HD2^-i$&v!%oz0}o?g)&8y|>0Ke+f7QOOCk?;wc~m##v`$v|f6O_>V{ zi>t~5^b6voB(eY_8W!9t( zH#4W~Vol5iEdOfh_><=(_sf#!7fW}uPp-0q>Bn?@(J$GhpAw_}nU9oGuwFq zx+u8bxeP`YoflYm(RsjG>p!~VvSqgH29}qfN9TIQrBd-N&DN@>Mq1;lsd25BN=j_j zrpA^n%0)-|49-Cu^J`bw+BH8fd+CRB7tWst(tlKD zuEp7_Yza#YtGt#DQ7QG3PH-rzAS0=Y^f_J={trM0bPZu3a@0l8maj+(AL|T!b65q%#R?*!mzRmbL z-$MJpSdrzU$!8#+fqVw?8OUcKpMn2J29$#o5`LA(ael+8$uOEO#P7DKeg(!+xH=>pUV*O~?4D7>Q+y-Dh zFvH@+>dR!nYdCW$b4k;NfUxROgsv!J8E?(iYT#|TTFc43lbig3S;n3Y&auqn{IQBz zlf1jn!QmtV$3?zf~ zDyN>n9>Cs!lY4`XWpW@GZ1r$OxPb+z89htPky3n~m1s=K4(@Zp?b<32?82Q!tqn{(1r~C!b0t z9Z8JfIzN9SKga0v0`E!zGSEK9ru=XP$@^GS<;aw*B_aP8-ORQegY78#GGp z-qu`QDr8FE-EDPcg3`6P*OwIuO8@O|b~HK!WjMV5{#KWuj1Ld_Z?g-^)Z5-tqj@p! z3+-&F5VC?t`*&sa3g1s9BW*%KZm0<{~mA)0_)7#jC#dU4oC;Z^jx z89g@97P?*IL~e9){<#^sG!jw{76!bR0U3= HYO4J^(HM{J literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf new file mode 100644 index 0000000000000000000000000000000000000000..44c329eb1e928c5c3458efe47487f5804a9802cb GIT binary patch literal 6032 zcmeHLTWph69RHuMU%y^fwr-AFyN$1uaa+sAm|VsJn{*wM%j!DuE77sq-N233wSys` zGhCdF+~SKt!NdoGF_E*rFbpO6_+k_j6L`RcOt<>tWklog17k4UQN?Fx7PvFqE{h?MtWzp@ts>u09x(D#8~ z(A%FFn$b+}LVttE{6Swd688K3N8!5>3kvjyhhp*z1`GJbuvd47`@4$vdk-SNTbQpn z7L6y;{nSY`3u_`ZHqaIOsC)cNqGGITdp!$v+HkQ~y-$OUziWAZUQm!@gcmppcQOJ;h@KTq$Uc(D6( z_QN@L>+-}kcIrBtJ^71#?DshPlue)US>3WL*3#pPWEq3rhJ)GShkc+EiFw{PYu+d&?Hf}>9j;Du@8k> zuEiNv#bW>iFUez359qx@(j4~b}Z%C&z znEp}camxc<*k_t<1F`|VoReo0w*<6N#*T-^So#P*Tsmqo>}dCL=26wgoj%Swyj=2d zw$$b229N6JhH`(a<_@VzHQC&mRQ+mixRcA}`Upi=GE}K@3TiunZJLYMhn!PnS145L z<+2C^4_GHd2(T*~0HZFdobYm^XOqee3j^A78XxvKdA%>>bh*?k-s zaf}TI5DJ6a7!Lkv8oTEjHYVg`C`tWYv)|JL;B|iB-<<@cNN4m9}f6OUUQEL`w{Je308JI8{)J z*`*4WDrCTmg|$`XPCJ<^=px&=cA2XfP!A=r=U!y_P$u_7L@t*p1>N1pe${TD;Mffta~~(tt=I?yhEK^Gj_Jysbr*1 z$YvDVZ5BmP`E}KcN(u#4P+zm8RQI(98Zuc?swmHd1!O+A)OrVtr*;TQgWCs;X?~`h9QJ!2&#kdQ!V_z>; z=Fm)bjtZ44l&{>zZCs|A5C?CojQdY&N6*jnLZkrpDajIVNpAhCTOFO_fZ$PX4*{=S_Y~Cl0J;BQ(keM>!LU; z2WStl6PB&;ei=Q1-U?X{4Z<%Bi*34H9R5*66>~1bj4Nmrt<^b^!K#P+y^ll?I~ZDe z*WcU`F#NolNx~jhpzmH*thbDq&%e11a{UKW-`_+KhHk~G*O9F29g%$ledOpF=z4`5 iec{Aza!h#$TNbH~M-V0B$+G(;gM^VHF(9LIqCWwxBVz6V literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0a1ea3dced025ae7d9ba1888062ff847797a0e1 GIT binary patch literal 6088 zcmeHLeQZ-z6#w16*VlF%tSjAM?HI3=ZH%>SY;))sFkH9EhiqEO_6H<)1&0D*EMrFi+d7i9;HHRLw%@c5$UR1KM{l@qX!EaK2dMurz>f6=M#3;- z8pZQbe^%e%*4}|1g9hp=pxV*jJ+#G=m01c{J%FL2zbDXrY2f2~0Obp^ujwa6#v7)0 z=>Gdjp3^@R*)nA@TLhTwfcc5RP%zMOU=4K{9;X4V8VYO)%WEVH$pXK+F)-9)yVtu7 z$g|S@?BUQzBr$|;!ZSzohlhK@FZEt{53rLxTMmZJiEri8#uF$&GdLPGo>}gk$Shpq z*9D0L$woq^m1loMbi&4XMw#Y1?fl8lCF?}~H6kzgsA2(AWVec(8>(${swy$vU0m#* zZOF~F+o~#S7Rslc@vqLss1f_gVET z@yp*Fd@g?e;`n#*vwIE`(yqjLxkBDYNLR4j&gaY*%xA3arwh)@pIIu*BP3dA5z>qFsQ4!QJB#rKZ2os5OQT9>Af179 z2GSWwXCR${e=-B|edrSZGN!?J7X79yzu=6ouvA>XSE5~&BtOC)r(G3{dyQ4JgPoOZ zrBmn?zc#7gnH+VRk=kjvNqc(A=sHshJ z`_-r#UEUp4o7Db5Hid(hYG`_><1<(Wr>muDM-&M>Oh;(g^;Lk6$ZKGF-2yzgj^VXq;p_S}7DYZkJOi z+%C6^5c+*yZt<*a*BS|;iy&rr_}oS>&-Cz8YO*{NC2UNMwrfZ0>3Ibw%^2&@j$*EK zHtctDH-S~hCasjWlunFtiig*aO{%zEn<$0Pc@(A6Ss&@M$~ejpV^%{Mi{&t)M{;T_ zikw!M%W#C$6-q(7QLvWUk#+qV1O2($Hl{GVkE^}x1>ZD!P=doz8PUxoCtyvaDa8v6l zOA2xXmt9|7I#c(xwk}JeLd=$Fq5&kITWqO=jl|Xqa=#$u4i<^E2oe%xw;+cENeD8_ z!A6D0sPGsS9;31BLg6dO_kzqSB)j#3>=xuhK@x&2EhOWRAmu9Ag@}lGF%SE&15s?j zr?g{TjoYz{z7%UwZK%UB#PAqSkd-~&1-s!{sFDkraxLugIIOg$+m#u}Wv?PfIgY8y z=XCm(EGCLWvsI>ZQ*=^I@{DF=XNot_iQPbom#)&wSMf#^6RxDMLi6}}n!6!{u@%GE zfIjpiLMuQeDzJbqmCjc~boF5nJtQs1Mg%dRxMidnq_*vf*N86lV1z7(v59CmS+DHVDxD< z!$50Tw!V60(0B{Md`+u5NUwh^_4Q2zVN^3{)Jq`i{f^+);Xye1hI{UUV=xfe2*(u< bVatM*BSDIi^kk{^l97f%VV8+AlmNd2VUe$~ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf new file mode 100644 index 0000000000000000000000000000000000000000..16ad9d515278563a9b4358327dda2455f0627f4e GIT binary patch literal 7932 zcmeHMU2I%O6+Ux+cfD@B>uf^owbysMu@lF;S=%vA>bkCzuI+}TwQHO9ZXk)5_1ccR zjyL{`11f|PAYHXhfwm~El0sBfrAY1Uf)oe!!4KwvC_=j)q zx~?6GpC%M&yEB?I=bSm`%$YNHX6~I!jEGzS3OU<4+PlIN`^SmAr@%GZx<0$dcJ`kIQzdv!JPuAbKfVL7M>C`~)(4@=mMEgecFXs=$qrLNkZ+(%- zJ_Gss0Wk7@V*4K2LDJ@dp|MHhg7Q_g&%>OQ7>-5h+pHA2(?psw6rD_}HL@KvbjUaw z9f}uzDfk#sX&8OFlf$E9OGDHPe@xMy9Em3{^xgOwk>_Q!?fXF z{JVuGq~FZPdXKD%Udc_-;~0V?l=-cL9n6#g+;R*bS@@&$==`r`@4}0c zTUxjH#CMga&MszXX(>C8`W~r*D&d$;=jmCthuo{Y!kng^+FW(binP8WJxDW<{?tv< zg~}ZF%vRS3`_@P`uT&xVU|*y2yS;0yW6Wu%lC^Hhs=r^69X#e;V_V3sm*#khu#G5^ z%;*dr`EF7Lg|tpQ7Sd+YmT8Om9|U{of1Qufe<#00xtxo@Cp`l1(1(%##@xC5p+{gF zP9||GNdCf(=TF%V7c~Bvifq&bb?&g}3e1HoU8m9fyaNj`ox zz}Yrmkjnw1mCNO=ou)rxq>R+w-jva53`BdmQf}2~h^HbUgHxAz1hCum@#ctU1&v1{ z4MDC5Gthu^Dgpz8%LY(etk6P`tATw6mn%BVhfIDl?BUJfh{xwMTKIH_$*02}UnCOb z+KP|x^|2$HvfkCC$(uc#BB_+H*Jb*B{A4QSNnr%<(bH?`Dg2^XBQV99 zS2GZSmMM0!1Ex^Y$aMn0IWd?Eew8s z6{jl7FsD?-GA;&q(bZ60?s1Z>iY~JI@80fn1HCAj_wU+jVRGkvb>$lcPdW5JV^xvB z)cU}kMFj%WjvZ{R^$1M=*746b_yuPBa(~BN#R9W;x71fyR`Mo#_SKgPp5tr14`$`^ zuVzxQM!~zo?aa4p0$bNuyQRb>u!82g%2G?$*|9t86=ez?ItGxPx6Hl8Y&3INfUgJ; zDrRGub^(S3I3vIt0xStoR?NnQ#<1TrmR=-7_K`zr zAUFPEIdNXOwN12vy+ST+n$~Go@dqZGblAaaRqP-Sp=5D}6?teGm+;qSa2c0Z@s(A$ zN)_-ctE*uhpQrn1n38mYM(7Cj(*TWO2dJfLszElW4XwlACvZPx&|W%9G1?AnH#iB@ zohw?S78R#aNRH41U@s&)q5TDvF_cd5`e__`QAj*&$&EsP7*<7}+tK3=+DUg?l<;8Z z8vWo+7Q_yQv^4k+?id+f8*C(D4=b>CuRM&`ODx>FzZ-mOBeeE6VT7UNVbo2eSnb8J u6C(*K?jMOiO2vuj*ikB8(GapMRy!Jlm8>RP-Y*$A3^Vp4KuOv!J@9wO!<63u literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0d9d5a288e34361e8dea71a784c53ed1b33e0dc GIT binary patch literal 2972 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 Oj(W%=0gKyK68(RGbygVw literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9e6dd28f54332c366709ebed5c3dfbcb81153122 GIT binary patch literal 2196 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 PlEK69#Uw}xU0wSYaB@c= literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/Roboto-Regular.smallcaps.ttf b/test/subset/data/fonts/Roboto-Regular.smallcaps.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc58299ba8aa2b9fd9ed60149710961e0ebeb78d GIT binary patch literal 131632 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/profiles/keep-layout-retain-gids.txt b/test/subset/data/profiles/keep-layout-retain-gids.txt new file mode 100644 index 000000000..f4787adef --- /dev/null +++ b/test/subset/data/profiles/keep-layout-retain-gids.txt @@ -0,0 +1,2 @@ +--drop-tables-=GSUB,GPOS +--retain-gids diff --git a/test/subset/data/profiles/keep-layout.txt b/test/subset/data/profiles/keep-layout.txt new file mode 100644 index 000000000..56da0ffe3 --- /dev/null +++ b/test/subset/data/profiles/keep-layout.txt @@ -0,0 +1 @@ +--drop-tables-=GSUB,GPOS diff --git a/test/subset/data/tests/full-font.tests b/test/subset/data/tests/full-font.tests index ff195cead..225bb484a 100644 --- a/test/subset/data/tests/full-font.tests +++ b/test/subset/data/tests/full-font.tests @@ -9,4 +9,3 @@ SUBSETS: abc Ǽ!A bc ×ØÙÚÞ - diff --git a/test/subset/data/tests/layout.tests b/test/subset/data/tests/layout.tests new file mode 100644 index 000000000..dd1c26ee9 --- /dev/null +++ b/test/subset/data/tests/layout.tests @@ -0,0 +1,13 @@ +FONTS: +Roboto-Regular.smallcaps.ttf + +PROFILES: +keep-layout.txt +keep-layout-retain-gids.txt + +SUBSETS: +ABC +AC +C +A +ÊË diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py index 6d11cbfe6..804ed7170 100755 --- a/test/subset/generate-expected-outputs.py +++ b/test/subset/generate-expected-outputs.py @@ -19,14 +19,15 @@ def usage(): def generate_expected_output(input_file, unicodes, profile_flags, output_path): args = ["fonttools", "subset", input_file] - args.extend(profile_flags) args.extend(["--notdef-outline", "--name-IDs=*", "--name-languages=*", "--name-legacy", "--drop-tables+=DSIG,GPOS,GSUB,GDEF", + "--layout-features=*", "--unicodes=%s" % unicodes, "--output-file=%s" % output_path]) + args.extend(profile_flags) check_call(args) From 0af9de13b78ddd35f58ee02ce8ffeffd99509ec5 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 20 May 2019 15:04:20 -0700 Subject: [PATCH 358/617] [subset] For gsub subsetting only consider glyphs reachable via gsub closure. --- src/hb-ot-layout-gsub-table.hh | 4 +-- src/hb-subset-plan.cc | 55 ++++++++++++++++------------------ src/hb-subset-plan.hh | 10 +++++++ 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 9491c7878..0e1966e98 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -103,7 +103,7 @@ struct SingleSubstFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; hb_codepoint_t delta = deltaGlyphID; @@ -203,7 +203,7 @@ struct SingleSubstFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; auto it = diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 5ea51c4ab..c0aee1a2d 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -99,24 +99,21 @@ _remove_invalid_gids (hb_set_t *glyphs, } } -static hb_set_t * -_populate_gids_to_retain (hb_face_t *face, +static void +_populate_gids_to_retain (hb_subset_plan_t* plan, const hb_set_t *unicodes, const hb_set_t *input_glyphs_to_retain, - bool close_over_gsub, - hb_set_t *unicodes_to_retain, - hb_map_t *codepoint_to_glyph) + bool close_over_gsub) { OT::cmap::accelerator_t cmap; OT::glyf::accelerator_t glyf; OT::cff1::accelerator_t cff; - cmap.init (face); - glyf.init (face); - cff.init (face); + cmap.init (plan->source); + glyf.init (plan->source); + cff.init (plan->source); - hb_set_t *initial_gids_to_retain = hb_set_create (); - initial_gids_to_retain->add (0); // Not-def - hb_set_union (initial_gids_to_retain, input_glyphs_to_retain); + plan->_glyphset_gsub->add (0); // Not-def + hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain); hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (unicodes->next (&cp)) @@ -127,38 +124,35 @@ _populate_gids_to_retain (hb_face_t *face, DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp); continue; } - unicodes_to_retain->add (cp); - codepoint_to_glyph->set (cp, gid); - initial_gids_to_retain->add (gid); + plan->unicodes->add (cp); + plan->codepoint_to_glyph->set (cp, gid); + plan->_glyphset_gsub->add (gid); } #ifndef HB_NO_SUBSET_LAYOUT if (close_over_gsub) // Add all glyphs needed for GSUB substitutions. - _gsub_closure (face, initial_gids_to_retain); + _gsub_closure (plan->source, plan->_glyphset_gsub); #endif + _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ()); // Populate a full set of glyphs to retain by adding all referenced // composite glyphs. hb_codepoint_t gid = HB_SET_VALUE_INVALID; - hb_set_t *all_gids_to_retain = hb_set_create (); - while (initial_gids_to_retain->next (&gid)) + while (plan->_glyphset_gsub->next (&gid)) { - _add_gid_and_children (glyf, gid, all_gids_to_retain); + _add_gid_and_children (glyf, gid, plan->_glyphset); #ifndef HB_NO_SUBSET_CFF if (cff.is_valid ()) - _add_cff_seac_components (cff, gid, all_gids_to_retain); + _add_cff_seac_components (cff, gid, plan->_glyphset); #endif } - hb_set_destroy (initial_gids_to_retain); - _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ()); + _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ()); cff.fini (); glyf.fini (); cmap.fini (); - - return all_gids_to_retain; } static void @@ -248,15 +242,17 @@ hb_subset_plan_create (hb_face_t *face, _nameid_closure (face, plan->name_ids); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); + + plan->_glyphset = hb_set_create (); + plan->_glyphset_gsub = hb_set_create (); plan->codepoint_to_glyph = hb_map_create (); plan->glyph_map = hb_map_create (); plan->reverse_glyph_map = hb_map_create (); - plan->_glyphset = _populate_gids_to_retain (face, - input->unicodes, - input->glyphs, - !input->drop_tables->has (HB_OT_TAG_GSUB), - plan->unicodes, - plan->codepoint_to_glyph); + + _populate_gids_to_retain (plan, + input->unicodes, + input->glyphs, + !input->drop_tables->has (HB_OT_TAG_GSUB)); _create_old_gid_to_new_gid_map (face, input->retain_gids, @@ -287,6 +283,7 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) hb_map_destroy (plan->glyph_map); hb_map_destroy (plan->reverse_glyph_map); hb_set_destroy (plan->_glyphset); + hb_set_destroy (plan->_glyphset_gsub); free (plan); } diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 6f65e773e..f0b8ddc2b 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -65,6 +65,7 @@ struct hb_subset_plan_t unsigned int _num_output_glyphs; hb_set_t *_glyphset; + hb_set_t *_glyphset_gsub; public: @@ -77,6 +78,15 @@ struct hb_subset_plan_t return _glyphset; } + /* + * The set of input glyph ids which will be retained in the subset. + */ + inline const hb_set_t * + glyphset_gsub () const + { + return _glyphset_gsub; + } + /* * The total number of output glyphs in the final subset. */ From b928de91a755788fd0fad9fa0f5f03c5670ac6a3 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 21 May 2019 11:23:26 -0700 Subject: [PATCH 359/617] [subset] Add test/subset/data/expected/layout to dist list. --- test/subset/data/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 067712055..3439588ae 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -10,6 +10,7 @@ EXTRA_DIST += \ expected/basics \ expected/full-font \ expected/japanese \ + expected/layout \ fonts \ profiles \ $(NULL) From 4ea44112b5163591ce0b086e0d13ec368f4f6ddc Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 13:07:43 -0700 Subject: [PATCH 360/617] [subset] Remove missed reference to hb-subset-glyf, was deleted --- src/Makefile.sources | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Makefile.sources b/src/Makefile.sources index b175d2004..46fbc56f6 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -242,7 +242,6 @@ HB_SUBSET_sources = \ hb-subset-cff1.hh \ hb-subset-cff2.cc \ hb-subset-cff2.hh \ - hb-subset-glyf.hh \ hb-subset-input.cc \ hb-subset-input.hh \ hb-subset-plan.cc \ From b71d353cee89a6654810f75e7a1d7fd156b76faa Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 20 May 2019 17:33:55 -0400 Subject: [PATCH 361/617] [gen-ucd] Remove some code --- src/gen-ucd.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 1160cb58c..8db7c3741 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -22,9 +22,7 @@ dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd) gc_set = set(gc) gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass) gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr) -sc_set = set(sc) dm2 = set(v for v in dm.values() if len(v) == 2) -dm2diff = set(v[1] - v[0] for v in dm2) dm1 = set(v[0] for i,v in dm.items() if len(v) == 1) dmx = set(v for v in dm.values() if len(v) not in (1,2)) assert not dmx @@ -35,14 +33,9 @@ assert not dmx #print("GC, CCC, and BMG fit in one byte. Compress together.") #print() -#print(len(sorted(sc_set))) -#print("SC fits in one byte. Compress separately.") -#print() - #print(len(dm)) #print(len(dm1), min(dm1), max(dm1)) #print(len(dm2)) -##print(sorted(dm2diff)) #print(len(sorted(set(v // 512 for v in dm1)))) gc_order = packTab.AutoMapping() From 8a48c88fa9fe047a83ba4a45dbd6399412ca3302 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 21 May 2019 13:02:54 -0400 Subject: [PATCH 362/617] [gen-ucd] Comment --- src/gen-ucd.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 8db7c3741..c1594f7b9 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -56,6 +56,10 @@ for line in open('hb-common.h'): assert i == len(sc_array) sc_array.append(name) +# TODO Currently if gc_order or sc_order do not capture all values, we get in +# trouble because they silently add new values. We should be able to "freeze" +# them, or just do the mapping ourselves. + DEFAULT = 1 COMPACT = 3 print() From a03ed95e7d50b9dd947e8982c7730de969795b05 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 21 May 2019 16:43:14 -0400 Subject: [PATCH 363/617] [gen-ucd] Generate decomposition tables Code is ugly. Ugh. --- src/gen-ucd.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index c1594f7b9..9d51ea7e6 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -14,29 +14,26 @@ ucd = youseedy.load_ucdxml (sys.argv[1]) gc = [u['gc'] for u in ucd] ccc = [int(u['ccc']) for u in ucd] -sc = [u['sc'] for u in ucd] bmg = [int(v, 16) - int(u) if v else 0 for u,v in enumerate(u['bmg'] for u in ucd)] +#gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass) +#gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr) + +sc = [u['sc'] for u in ucd] + dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd) if u['dm'] != '#' and u['dt'] == 'can' and not (0xAC00 <= i < 0xAC00+11172)} - -gc_set = set(gc) -gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass) -gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr) -dm2 = set(v for v in dm.values() if len(v) == 2) -dm1 = set(v[0] for i,v in dm.items() if len(v) == 1) -dmx = set(v for v in dm.values() if len(v) not in (1,2)) -assert not dmx - -#print(len(sorted(gc_set))) -#print(len(sorted(gc_ccc_non0))) -#print(len(sorted(gc_bmg_non0))) -#print("GC, CCC, and BMG fit in one byte. Compress together.") -#print() - -#print(len(dm)) -#print(len(dm1), min(dm1), max(dm1)) -#print(len(dm2)) -#print(len(sorted(set(v // 512 for v in dm1)))) +assert not any(v for v in dm.values() if len(v) not in (1,2)) +dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) +dm1_array = ['0x%04Xu' % v for v in dm1] +dm1_order = {v:i+1 for i,v in enumerate(dm1)} +dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) +dm2 = [("_HB_UCD_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % (v+(i,)), v) for v,i in dm2] +dm2_array = [s for s,v in dm2] +l = 1 + len(dm1_array) +dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} +dm_order = {None: 0} +dm_order.update(dm1_order) +dm_order.update(dm2_order) gc_order = packTab.AutoMapping() for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', @@ -67,6 +64,8 @@ print('#include ') print() code = packTab.Code('_hb_ucd') sc_array, _, _ = code.addArray('hb_script_t', 'sc_map', sc_array) +dm1_array, _, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) +dm2_array, _, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) code.print_c(linkage='static inline') for compression in (DEFAULT, COMPACT): @@ -83,6 +82,7 @@ for compression in (DEFAULT, COMPACT): packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') packTab.pack_table(sc, 'Zzzz', mapping=sc_order, compression=compression).genCode(code, 'sc') + packTab.pack_table(dm, None, mapping=dm_order, compression=compression).genCode(code, 'dm') code.print_c(linkage='static inline') From 14e3b0cf41d9657c39f1f921f7e09a1418fa3278 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 20:09:36 -0700 Subject: [PATCH 364/617] [subset] Code review feedback --- src/hb-ot-glyf-table.hh | 53 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index a5a81ad35..2ef0952a5 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -85,23 +85,22 @@ struct glyf static bool _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) { - unsigned int max_offset = - + padded_offsets - | hb_reduce (hb_max, 0); - bool use_short_loca = max_offset <= 131070; - unsigned int loca_prime_size = padded_offsets.len () * (use_short_loca ? 2 : 4); - char *loca_prime_data = (char *) calloc(1, loca_prime_size); + unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); + unsigned num_offsets = padded_offsets.len () + 1; + bool use_short_loca = max_offset < 0x1FFFF; + unsigned entry_size = use_short_loca ? 2 : 4; + char *loca_prime_data = (char *) calloc(entry_size, num_offsets); if (unlikely (!loca_prime_data)) return false; if (use_short_loca) - _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, padded_offsets.len ())); + _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, num_offsets)); else - _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, padded_offsets.len ())); + _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, num_offsets)); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, - loca_prime_size, - HB_MEMORY_MODE_READONLY, + entry_size * num_offsets, + HB_MEMORY_MODE_WRITABLE, loca_prime_data, free); @@ -112,21 +111,24 @@ struct glyf return true; } - template + hb_requires (hb_is_sink_of (IteratorOut, EntryType))> static void _write_loca (IteratorIn it, unsigned right_shift, IteratorOut dest) { unsigned int offset = 0; + it - | hb_map ([&] (unsigned int padded_size) { - unsigned int result = offset >> right_shift; - DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d shifted %d", offset, result); + | hb_map ([=, &offset] (unsigned int padded_size) { + unsigned result = offset >> right_shift; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); offset += padded_size; return result; }) - | hb_sink (dest); + | hb_sink (dest) + ; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); + dest << (offset >> right_shift); } // requires source of SubsetGlyph complains the identifier isn't declared @@ -138,7 +140,8 @@ struct glyf TRACE_SERIALIZE (this); + it - | hb_apply ( [&] (const SubsetGlyph& _) { _.serialize (c, plan); }); + | hb_apply ([=] (const SubsetGlyph& _) { _.serialize (c, plan); }) + ; return_trace (true); } @@ -148,7 +151,7 @@ struct glyf TRACE_SUBSET (this); glyf *glyf_prime = c->serializer->start_embed (); - if (unlikely (!glyf_prime)) return_trace (false); + if (unlikely (!c->serializer->check_success (glyf_prime))) return_trace (false); // Byte region(s) per glyph to output // unpadded, hints removed if so requested @@ -158,15 +161,12 @@ struct glyf glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan); - hb_vector_t padded_offsets; + auto padded_offsets = + hb_iter (glyphs) - | hb_map ([&] (const SubsetGlyph& _) { return _.padded_size(); }) - | hb_sink (padded_offsets); + | hb_map (&SubsetGlyph::padded_size) + ; - // loca ends with a final entry == last offset (+0) - padded_offsets << 0; - - return_trace (c->serializer->check_success (_add_loca_and_head (c->plan, hb_iter (padded_offsets)))); + return_trace (c->serializer->check_success (_add_loca_and_head (c->plan, padded_offsets))); } template @@ -191,7 +191,8 @@ struct glyf return subset_glyph; }) - | hb_sink (glyphs); + | hb_sink (glyphs) + ; glyf.fini(); } From 51a0129f7322e97825455df4eb6eecfea14980f5 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 20:12:19 -0700 Subject: [PATCH 365/617] [subset] Thar be comparison of integers of different signs --- test/api/hb-test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/hb-test.h b/test/api/hb-test.h index 59e0a9b36..d44e8da41 100644 --- a/test/api/hb-test.h +++ b/test/api/hb-test.h @@ -175,7 +175,7 @@ static inline void hb_test_assert_blobs_equal (hb_blob_t *expected_blob, hb_blob g_assert_cmpint(expected_length, ==, actual_length); if (memcmp (raw_expected, raw_actual, expected_length) != 0) { - for (int i = 0; i < expected_length; i++) + for (unsigned int i = 0; i < expected_length; i++) { int expected = *(raw_expected + i); int actual = *(raw_actual + i); From 58ce477ac170969430310750b78dcb5f9e3b06a3 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Tue, 21 May 2019 20:22:40 -0700 Subject: [PATCH 366/617] [subset] Report failure more often --- src/hb-ot-glyf-table.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 2ef0952a5..92382defc 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -104,11 +104,11 @@ struct glyf loca_prime_data, free); - plan->add_table (HB_OT_TAG_loca, loca_blob); - _add_head_and_set_loca_version(plan, use_short_loca); + bool result = plan->add_table (HB_OT_TAG_loca, loca_blob) + && _add_head_and_set_loca_version(plan, use_short_loca); hb_blob_destroy (loca_blob); - return true; + return result; } template Date: Tue, 14 May 2019 13:55:11 -0700 Subject: [PATCH 367/617] [subset] Add one ttf file with fvar/STAT tables to integration test Ignore gvar/MVAR/HVAR table add support for --nameIDs=* option --- src/hb-ot-cmap-table.hh | 27 ++++++++++++++---- src/hb-ot-stat-table.hh | 2 +- src/hb-subset-input.cc | 1 + src/hb-subset-plan.cc | 6 +--- test/api/hb-subset-test.h | 2 +- ...Comfortaa-Regular-new.default.61,62,63.ttf | Bin 0 -> 6492 bytes .../Comfortaa-Regular-new.default.61,63.ttf | Bin 0 -> 6316 bytes .../Comfortaa-Regular-new.default.61.ttf | Bin 0 -> 6148 bytes .../Comfortaa-Regular-new.default.62.ttf | Bin 0 -> 6088 bytes .../Comfortaa-Regular-new.default.63.ttf | Bin 0 -> 6068 bytes ...ar-new.drop-hints-retain-gids.61,62,63.ttf | Bin 0 -> 3284 bytes ...gular-new.drop-hints-retain-gids.61,63.ttf | Bin 0 -> 3164 bytes ...-Regular-new.drop-hints-retain-gids.61.ttf | Bin 0 -> 2868 bytes ...-Regular-new.drop-hints-retain-gids.62.ttf | Bin 0 -> 3020 bytes ...-Regular-new.drop-hints-retain-gids.63.ttf | Bin 0 -> 3024 bytes ...fortaa-Regular-new.drop-hints.61,62,63.ttf | Bin 0 -> 1952 bytes ...Comfortaa-Regular-new.drop-hints.61,63.ttf | Bin 0 -> 1832 bytes .../Comfortaa-Regular-new.drop-hints.61.ttf | Bin 0 -> 1704 bytes .../Comfortaa-Regular-new.drop-hints.62.ttf | Bin 0 -> 1688 bytes .../Comfortaa-Regular-new.drop-hints.63.ttf | Bin 0 -> 1688 bytes ...omfortaa-Regular-new.name-ids.61,62,63.ttf | Bin 0 -> 6236 bytes .../Comfortaa-Regular-new.name-ids.61,63.ttf | Bin 0 -> 6060 bytes .../Comfortaa-Regular-new.name-ids.61.ttf | Bin 0 -> 5892 bytes .../Comfortaa-Regular-new.name-ids.62.ttf | Bin 0 -> 5832 bytes .../Comfortaa-Regular-new.name-ids.63.ttf | Bin 0 -> 5812 bytes ...ortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 0 -> 7824 bytes ...omfortaa-Regular-new.retain-gids.61,63.ttf | Bin 0 -> 7648 bytes .../Comfortaa-Regular-new.retain-gids.61.ttf | Bin 0 -> 7312 bytes .../Comfortaa-Regular-new.retain-gids.62.ttf | Bin 0 -> 7420 bytes .../Comfortaa-Regular-new.retain-gids.63.ttf | Bin 0 -> 7404 bytes ...Pro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3784 -> 2384 bytes ...SourceSansPro-Regular.default.61,62,63.otf | Bin 3496 -> 2096 bytes ...SansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3612 -> 2212 bytes ...utinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33516 -> 32124 bytes ...ar.desubroutinize-retain-gids.61,62,63.otf | Bin 31080 -> 29688 bytes ...ubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34708 -> 33316 bytes ...ular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 3640 -> 2240 bytes ...ansPro-Regular.desubroutinize.61,62,63.otf | Bin 3400 -> 2000 bytes ...-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3596 -> 2196 bytes ...utinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33352 -> 31960 bytes ...ts-desubroutinize-retain-gids.61,62,63.otf | Bin 30956 -> 29564 bytes ...ubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34560 -> 33168 bytes ...ints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3480 -> 2080 bytes ...lar.drop-hints-desubroutinize.61,62,63.otf | Bin 3288 -> 1876 bytes ...op-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3448 -> 2048 bytes ...p-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 33448 -> 32052 bytes ...egular.drop-hints-retain-gids.61,62,63.otf | Bin 31028 -> 29632 bytes ....drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34576 -> 33180 bytes ...-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3564 -> 2164 bytes ...rceSansPro-Regular.drop-hints.61,62,63.otf | Bin 3340 -> 1940 bytes ...sPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3464 -> 2064 bytes ...Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 33668 -> 32276 bytes ...ceSansPro-Regular.retain-gids.61,62,63.otf | Bin 31180 -> 29788 bytes ...Pro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 34724 -> 33332 bytes ...oto-Regular.default.1FC,21,41,20,62,63.ttf | Bin 3772 -> 3164 bytes .../Roboto-Regular.default.61,62,63.ttf | Bin 3368 -> 2760 bytes .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf | Bin 3732 -> 3124 bytes ...-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 2224 -> 1616 bytes .../Roboto-Regular.drop-hints.61,62,63.ttf | Bin 2016 -> 1408 bytes ...boto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 2252 -> 1644 bytes ....default.3042,3044,3046,3048,304A,304B.ttf | Bin 3112 -> 2684 bytes ....default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3356 -> 2928 bytes .../Mplus1p-Regular.default.61,63,65,6B.ttf | Bin 2656 -> 2228 bytes ....default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3652 -> 3224 bytes .../japanese/Mplus1p-Regular.default.660E.ttf | Bin 2396 -> 1968 bytes ...op-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2384 -> 1956 bytes ...op-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2628 -> 2200 bytes ...Mplus1p-Regular.drop-hints.61,63,65,6B.ttf | Bin 1928 -> 1500 bytes ...op-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2924 -> 2496 bytes .../Mplus1p-Regular.drop-hints.660E.ttf | Bin 1668 -> 1240 bytes .../data/fonts/Comfortaa-Regular-new.ttf | Bin 0 -> 230316 bytes test/subset/data/tests/basics.tests | 1 + test/subset/generate-expected-outputs.py | 3 +- test/subset/run-tests.py | 3 +- util/options-subset.cc | 23 +++++++++++++-- 75 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.default.63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,62,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,62,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.62.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,63.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf create mode 100644 test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.63.ttf create mode 100644 test/subset/data/fonts/Comfortaa-Regular-new.ttf diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index ffa767dab..9e9679f8b 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -863,6 +863,7 @@ struct cmap if (unlikely (!CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments))) return false; + if (!find_subtable (12)) return true; return CmapSubtableFormat12::create_sub_table_plan (plan, &cmap_plan->format12_groups); } @@ -881,8 +882,7 @@ struct cmap table->version = 0; - if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ 3))) - return false; + if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ cmap_subset_plan.format12_groups ? 3 : 2))) return false; // TODO(grieger): Convert the below to a for loop @@ -897,9 +897,12 @@ struct cmap format4_plat3_rec.encodingID = 1; // Unicode BMP // Format 12 Encoding Record - EncodingRecord &format12_rec = table->encodingRecord[2]; - format12_rec.platformID = 3; // Windows - format12_rec.encodingID = 10; // Unicode UCS-4 + if (cmap_subset_plan.format12_groups) + { + EncodingRecord &format12_rec = table->encodingRecord[2]; + format12_rec.platformID = 3; // Windows + format12_rec.encodingID = 10; // Unicode UCS-4 + } // Write out format 4 sub table { @@ -913,7 +916,9 @@ struct cmap } // Write out format 12 sub table. + if (cmap_subset_plan.format12_groups) { + EncodingRecord &format12_rec = table->encodingRecord[2]; CmapSubtable &subtable = format12_rec.subtable.serialize (&c, table); subtable.u.format = 12; @@ -1154,6 +1159,18 @@ struct cmap return &(this+result.subtable); } + bool find_subtable (unsigned format) const + { + auto it = + + hb_iter (encodingRecord) + | hb_map (&EncodingRecord::subtable) + | hb_map (hb_add (this)) + | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == format; }) + ; + + return it.len (); + } + public: bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index f12b51ce3..03604a0ad 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -289,7 +289,7 @@ struct STAT ; + get_axis_value_offsets () - | hb_map (hb_add (this)) + | hb_map (hb_add (&(this + offsetToAxisValueOffsets))) | hb_map (&AxisValue::get_value_name_id) | hb_sink (nameids_to_retain) ; diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index 8bd6058d0..098f13e7b 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -45,6 +45,7 @@ hb_subset_input_create_or_fail () input->unicodes = hb_set_create (); input->glyphs = hb_set_create (); input->name_ids = hb_set_create (); + hb_set_add_range (input->name_ids, 0, 6); input->drop_tables = hb_set_create (); input->drop_hints = false; input->desubroutinize = false; diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index c0aee1a2d..7c1ed872c 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -234,12 +234,8 @@ hb_subset_plan_create (hb_face_t *face, plan->retain_gids = input->retain_gids; plan->unicodes = hb_set_create (); plan->name_ids = hb_set_reference (input->name_ids); - plan->drop_tables = hb_set_reference (input->drop_tables); - - /* TODO Clean this up... */ - if (hb_set_is_empty (plan->name_ids)) - hb_set_add_range (plan->name_ids, 0, 0x7FFF); _nameid_closure (face, plan->name_ids); + plan->drop_tables = hb_set_reference (input->drop_tables); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h index 8f32aee67..cee1410c4 100644 --- a/test/api/hb-subset-test.h +++ b/test/api/hb-subset-test.h @@ -70,7 +70,7 @@ hb_subset_test_create_input_from_nameids (const hb_set_t *name_ids) { hb_subset_input_t *input = hb_subset_input_create_or_fail (); hb_set_t * input_name_ids = hb_subset_input_nameid_set (input); - hb_set_union (input_name_ids, name_ids); + hb_set_set (input_name_ids, name_ids); return input; } diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..efe5bcb4c2d6263c061bd1c66ea8b2008ed36b0c GIT binary patch literal 6492 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 UyxAn^L;A4J--Gfk9b?k}08VbkssI20 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bd802a57ee2dbb5acc262e74a7b570fd5691fb1f GIT binary patch literal 6148 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 BslxyO literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9fbebb5d4f92b4a617fafc734cd25c5a60569090 GIT binary patch literal 6088 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f47887e941b2ac2b0c441da55e814ff4ef8b37e8 GIT binary patch literal 3164 zcmeHJOK)366#nM=+1QSIUFU`*g*pz7U6VA9k0DO22HjHQXwI#DN#Ww)=G^H=^n;4i_zL>uTcjwI z++^}y&num&=BBWd(k4?PRiuv7<&?r6P)Pc9w>A=*N2dCcC;O z`+AS*12yUg8UL?p4Hv+~P)`hzN8;CNOiFX~e&mj%-lglcn&xtfJ(*WWhfnYB&qY1X zYEMH|&%y4O+LDKRq62l_dXLxUNn5cK32#G{+udE_c#m( zPQzt#6j;T^ya3tt`aj6P`}nu@2Xj?z^_Ojtjc1Pe`)e!( zd*9jb*ncPMgd(Nf*{9_GUN7qzSkHj+9{T_5EGQF<$@AHEs-p2mXsEQ@y=uR+=8Tr7 zw_RBg7kPq1xu6^*%3Z6ym_$%1bO$%H;I$I;3z#*D&$xD<2d^eNjn_+@c-WFV0)Elk%@uX$JR-yA~}_rMNBn zA)mqqw-Pvz&F5yzW3t(s%`Fy;;^2H?8bg@J0+vxk9y!dSj1XT$3AD3@FhNO{z0{h+ z4BH|#4Av0FNzda1$EQrI0W7kgHFZiHkD1=e^j<;_+E{apAvG3p9NTCmeYVk8fj*Y_ z<#}ftl&p?C9BnIF=<$qYAHrU0m-rQFk;OE}cF@~N6UQFg=@Dp%{8Ts+qNPjuv zD$urw4(hZs2PyPY_Yk9vnAF-Fw3;{`*gfud73l+w{U+uT=ONLC9*Gnp`Z9BDn0cIM zp7Pd=Vw`0=F?E}`wh>ncTA9NHGqoLCpD>@b$PO^>KkGYopBf~J0<$M~0!!sx`4)ac z5fI!Be*Vz{Zu7qmn(byNXZSk_X`+}C2q9Wb4^p_%lm^+lO+AiqUqj(*U2Yq}T_}0} HpQh|@l<$Cj literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bfa9267b9783d46559cddb592ee9ab7c9be03a5b GIT binary patch literal 2868 zcmeHJOK%%h6#nk`6_U8lOq~g73Yj=0c8&A4oi<5P^KNKpqBLqLtr8}wV;k9ZYCCO$ zM1)FL-B4JuKq^Q)BtWo1AP@@{ED;D1Azl(2gg}7Af=ZPrG2a~zX-V?~Sma*Kz2}^J z9^XB4&z*q);KkE$V0!9AM|WZ=e+BT2Q2O|Z*}>VhYv~Vw$_?`2#jLrE&+snSUm+h| zx@hK~8A(46RFOqAX%?0_*HHgc&K1eb+R_)HXB$a>4~XNbgn3RYJU0b6zNRdmqQLWl zpf8U>{()4sxa!hz4sgR@7RsHVfAbGOn{BBQ^+O*f= zdmmC_(bndGo6=@WB2}c0+vAqPk!n?~7Qe{xhE`v%@%df6zd7;U9<@RD2lQy@!Kmi- zYN7G=$Y^k1xZdZ})N18RY4CSjwR+hyq1mMJ@@9+Xy>FmaYYN@p(ix3-Rn^-z7Hk;` zw?xBr-jMFqm<${){iURp5VLC_47dWV61WAc&O=-MYjy>|^ z_{93u)Ke3pakwzpcP17)(|71>JbqS$RDEy1?&9k7`ozTg^u0$5!(;LJ{(-sP-noJP z`S@V1`sS4HSGAT2g*+>t;4!#x5gv<^(sFYUBaqnb|AP#?&Nm_7m1EyaM~=Mq`Mhu7 z23(Gx<%{|%^iI8;zp1+XV=1!vgY%~I53+73Qp#$%AZuo~?Pg#%1Inv7EbGW|p``Q1 zZ74-dUS{QR~VoSp2FH%ldZT-d_r!-r*>3U01SJqSUZZktwk zi&xpSgPt_$-FXky{)BGR0-C6_X$5=4ew%jSpa|Qv69KVc(=MD8S8Uo%`L|`7!K=kB zn--{4Ds1`=pTdC(MLU&9CsV~qIm{%ID;YCCl*^pMFmhPN8uCaZi4=-3_@(be7rTL3 zN)nu6u2I;ycOxafIf7vCmBO(tY87{w30qM z=qp1Xt9;V@{+X1NSMH2<01}~!o)!uI*%%n3xAPW`uG)L2qK#|lf2E39WIAC(mZ Lt55PgpO)+&y~kFh literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c121581a6c33097b5fd66840de7c80a40348111 GIT binary patch literal 3020 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 TCJFy;{Ig;B3b~E>6u$oer1v1+ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9e65c8385833a9de499aecfa991888f656cf310a GIT binary patch literal 1704 zcmZuxU2hvj6g{*4NNDZ4yLC2AQ^>|4v1^=f+i8;&k)%l)8k#7LT1u;gZQ|HQcAeTz zn;;RP(kFz}7V*FXQp*GC0}{L-zQhB6p=yQ1hlGR>0wE+Gs8op(b7s7xCC#jM=AJv} z-Z^u3W+4Fh@j6_Xo;uOllUgcX0kqHQefh-f(Cpf^>=%IdC~>`v*WA&!p@{qjY_W`Df`%X6UGS7e5id zL;Q3mUtaZ?SR{T+#^(wPHf|wBJW1@$+pEhkaF;knY@N6Bsj&U&FVw?%?e21+RIc1W z52==%hZ|w~pLh8YKqHzk4)liF5_&w@+uUQ;=|OKxn3#|#=&fnioA)T(_pFwPx3z@4 z^tLFEq)3jp#w(pie7f!vzsdfd(a>P<{X=}VG4cH_z0nMY%y{IPxZ(F3k@1e$Xn0?= zArLThpLRzE{L}8!FRKuSO=|CNv>N^=2kVUH$WyId@t9xN{q1An*5PPtJX-IMn0|vB z#No={T2_m&x)!2aiNu-yLuZr8vm&CKdj?DoXQ$UECf29-9xaWGCFchQ=lc5Q1_$PoLv{LxQ-R<0 zIu;c2tY~-%9$Z9?Leg7pE@}k7)h+gt=h}Dk>K*I$d|>b%Jg#3Q>6^&M4RZW;=jER( zv5gNrQhSlADU5>*x}e3c8UFt?ZQD3 zb!<06;+$i9a8g`xY%l%aRc$Wr6Av6)V24)g*pK8CF4StqsZ=(dDNo97CY4^v*~Q^P zZV@9WU>R#DB8xOKD8u6I>Owak3$yg3I7(I?OYDneu&(q?(=Ol@&M&B_A*^uBC{Bs< z5tXgX>?QQ0lTVs!NX81zp@UH}XD4&zm}8Z1mS@hUr#kcKY6lQw#!F7Tg&DF-e2a`o z@o!>bjM>gB9mkm?Pp^g0Ho8Mx`SIPzd}->+F}8?aa=KZAI0nc)&DBPgwY3KAO2@;v z$MaT|K4hF!noHb=RBQcjC5!6Itg)@?SYVy9&WIM1ynPb$d@A3+h`$B) literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ada1649afcc05f411e016013c26ca1a5144434e6 GIT binary patch literal 1688 zcmZuxU2hvj6g{*4h-vM*UTmW@0oD$Q-Qaw0oKGQ|&j!*Yq)|&yl(0!0+sLj{+i4O+ zBPfLjo(d8Y4@eDfJi!xGAdryw2~-FQ5)wiP9*}sTQYA{vnemdAG_&%|J$LRsbMD<) zLjdsMRX8v+eYUMLl`g&kXdlx1;@P=VbKBRlp8@V(;^vjSwGJ;n0URD;bM2Bfye2bG=Y1SFWRzq0|5a zPQ>Vc#^Hk>b$A@(Kv%S>J76ZeBAww-An0z05fc&x-8GRwNP2K0yVyY$ueXW$$f3H&Sa9hrErQ2hecuP@`MQKflwqreCFlxiJh7Lh3@W! z{=Nm%TyUMfJSD!H}&olkm>M9n|DNa}U_GhVQe+oP!VU`GK%)go2Nnu44qLy-5!;OgWf@p7e7oq5M3mcx(Ft2P~OV&xZt zI^DLdv2#al+d(E>vO6DQ>|cDBRa-z8M{HZeF;Q>Z4)ls<+jb%cr^WdDx1!fC*?GoN^j(>;!q*CieVJ6j%^f?MH(5DVeo5e zM+YARbM&OR%BVcnI2RdV@i8z%yMULtzoN2EVS{T%#gw=oS8Qdnm(Y(kK53pIBR2SE zTA3v|+sKt8#}dyVAokW6+n|8i|Sw@%mD>5U6RqldG;gv7(36?MwNB22Q5m+y}So`t4i-hoKu=htV60b{&$i= z^=0Q++sjNIeIYo#(m#z2C`wYltdx?4JAr zI4bYU|ItH+fZ%uF=ZzNdsCyk$b3L?8UMC?_H06O1BB2>4L=9M=sYLFCmC8k#5#eJui0$FYsH^WQV+9MOA`n7s_ytr*JR~H9P+1_cpi(7D%y-8_TGHInoO{l>=X~e8 zXYL&c0Dim)2Nvef3?#Gp%G-eQ5xuXTSsGv3zFznoP={&9G9_~zKHLHvZrZ8UO|$aW zRN+0YuSh#*R@XTnrJdmH&K0*;t6$yul=@GAcs`#sSG4N8^TeN`FP*2O=>~qGeU0{0 z`BH7m`3;Drydm?8<&244WNDAmR!ipAIyBs--AUV6GfUZsdFwaw;kt5ryor+h0D{^|1tuUaWgn^QjA>(Ts=kG5!C(I(f_EA2`YJ%B6RD@jXAtvU(yMkH0z()FQa`b0Y2s_RXvI6eRR%+%&fW4VY|ZT5C} zM$QkvJdnIN5*csvwR?RI@2qQfXMSO4Hj(gkc-$`EM0$B_bUEFkdz2&IPR}H(vVFJ+ z7dFvkS#;RL!4m_1n_Ws7=V;$OwYXM(B`|syF2@~u@LlwiHaUOqz4~iCzW1~9p7T$d zDlx60Tt-A$!kEl=T(0ZfSw}s7|6}L91GOXzr?MlilL?e}l=DnK)tJRHlH!F1-oBK4 z_Q&Lf#c6zv3^H~NmzXmkZpr|qn`Z+sti4E9a!(;ji4fxXF*rNTeSQIa z(a;&7a#hAb2=Y{IU18_Ew(cO3CefWo81@%*TNluT$JP}zi%wg2U|7U#-HEWcWa}=R z71wNCrT>S9&f-3C-_`{@irdy7!W0g;742NMkjvNRq*%=6Hi~9tqFh|TB+6LFHYz9} zhdgR9c$*R!Rl+J|g%Ktn0}Is4c#Z2BD{CAZoby&pmFrOptw!`JMlir9 z#~LzX1DDXxEQvWltRgYC_!fBPOnMqC4_7;eI1#Vd`34plUFBP0MwWjM11E{LX7M;p zj1s*D!iVq@koPEVgXx2avlizn z_aWID|Epw>eT_Xftv;67r-HqsD0ewXPQwli{p|n% literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..90e49bef6b67ebb086e89914bd70e964feba8a45 GIT binary patch literal 6236 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5277d1508c02f5436656c2a0d611e862c4c4f1f0 GIT binary patch literal 6060 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 EH{dCJ?EnA( literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..21c8205cb6b397547e4c8d71b6f0774e01b7b3f9 GIT binary patch literal 5812 zcmbVQU2Ggz6+U-n_Q&?F?OpG#ldPNG&17xkops#Aaoxm8o!MQxsncZRIAkZ#b|-7c zF(i%aq^ZkKNYesg5vUX)@lZjLc!s+Ur75CPUyzV^K_DRzNJyv;@PI@SAf(bR-KHl-+DhAkKQ+tjAsV7XGcb@Xe<`ZPYq=4q3q~T zZ*(vfjU$v4NhiB(}YVx9DIy)om>O;^)MY3)VD1WZwpaYWCLxfTwq5( z2gk1Wrr>!00EYzkQ>i_>#~vIT>rJIXL2>lhC#Q>79y_o&&=KtHNVo5+jGx@K`}Dqn zLt7);IwE?<;lSam$I4d^kBmgp?cqSg9(&@z#1mu5RJ+#J(brypcbG;xO#!+>Ay7N% zD18aC=R1?6<08}yR|wu)!$_kU~r-S`vO zAS`)5?P(g&=I8+T*Pm{thyv-R^^flufA=i|v6NoO*O97P4QxCRS_ zs-0KDQnGqBuQbcdn3=rNEjfQvPbA4MsGfqXR_%tCDAyla^|nsd2}V4Id4U1|e#3QjM^F zgpqHRD-zkLyHd56D^*A&>)M$bV`{9Lt~!pBMz&O>P*XHpQ8dHg4EXen+RoJW8TVE< z)fjOrKxZ6h-gT77IZi7AN6sT2({}PIV9AnHM%G14p+dQ$LZ+?4ri~dumug-Gy>ufJ za=sBdV@pE+!{*V%X%2BX`3h)({`11=ByGmIHE#BdDUh~_O=sY8FU5^_&Zs37*Z{I z-nLt7ZJkso*+ZF)!s)PXFQkZXMdaWDe9u;8scyPFsa~=v%@d+z8cwcziK#W+qCZ6R z9^KVW^g`#2&^CAKSk^hT(>u0F&OIhk|L3V8XQ-#LRHqQQpJ$Ayoy^hbCrfMUvze==z_VLS3TCu@yg5z zUzpB7-s8y=R)gY&la)q1UQoidRV>F#4y9!`y7<e zPLyBNM9HBP6OdHl!|PkN2#Qe;*|yD@NWc;38i{aDeKD8bfjUni*kmrRdaZ`wb_){E z?N+OybGyxI7~H0(<8~17ar+^}$L$c};}*{k6W)s2Wg*2|suH`OsB&?*Xw@(m?}(*#<de9o~oye>4 z{{%&a*8qPAQ$(q(9G26(Hz2i#>-A}K8hcR%Cm^<898KdwBooN+K5Sws)eD$`eKqUB z8WFNpM|VRRuBIx360)Es^t&C!~? zwq^@QKwdq(KAM;P)^t_*N$1Xx*Qa-NxX+SzpZ zHm!Y|cD?Urdw2FISZZHxGhn^b`hZ1C?a$Rweq3X9tn_>Nh6x>3BXF_gh0JB#?`Ph{ zlbY>^&gE=kr43`{`2kH?jdmP5T>W0<|8FHdeYXPpf2x@C&HLDdIiAjJs+Ww@@^cy+ z@V?x7RvrPjKbPS-NF@{_7TPjmVK0Q9`!imJn9L?dDN3UW(lw=kI96~ zV={4u$7G_$m`6a&Glq!;#xQY~F-$CaeicET^Za6J$@7b;k9mGE^>NQHrp|kQF?GT7 zi>aqPznHp+98YXa;IhZ5NhqH7$wMGlIOz;iHn>YTYe6#RvQIMR84tq>##}+?0~=PK z^*FD`s!wu{=X{dkpMaeMzR6GeBm+L>lMMJYum?BnUG+H6-e-K0;n#eU;m@PzLEqkW zpJc!bKFNR=fqi(x-e*0|v-dflWccTOlHoVd^I_lK7krWdb)RIw7p=7p?-5r8(`$yN zm+& zVKbZz8SO2>w6;H(3-$#(L5KZjjH38B61ax<&kjJk>^Et$b+P0P(wnao8#~2~<9K1X zQEBmm%-;&ry1+>{23Yii@HG;~|U&}`50bG*iAXz}ms0(x!_Z1*qT$0M5FVe@LuX()=(KBezd6-Mk4|>)v z!}=xKN4sz>Vhlz+LuY6hz1Ze1*g6jztN1VB+l>o}uh~4>hsc7(XIuRx%>sQ1{}uFD zz}G>E8NEnPd43#)jSG-U+Hn`ZcVOfXM#J_N;n#WeU7=Ip*0XVBgR(KgdHxcK412%k zEBsyYEsrnnw%3i6rfI|RK;@3#0GP`-!{y9WIeu#|E4 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3c0f4cd5bb5c894859712f324c492e1130ddaa22 GIT binary patch literal 7824 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf new file mode 100644 index 0000000000000000000000000000000000000000..97eaa26ad39edc5837a5ef2e689586e64d321664 GIT binary patch literal 7420 zcmeHM>u(#^l|Of8_|SurNRgBrI?koWloWAD%eExTw&KV`QL-aHXjw@(t`l?gu&maK z71>FgwsCDYXgZ8t!g zaDQipQe?;O>%#&Igagh!kKaA_oO92;mop?mL{Z!fYCC>%$FBK>l~;(uw;-*YoIW`H z;%kd<5T$N|@0(q6m+6=EI#EL>_<`By-IW$|VU1|31plMi=P${Y$ae6Z{op@$c6njx zi$n4M2L1?9OX4i>pB!8K9PIsy`!Bc`m(jL?=kdY|=U+TK{XgO{BC!?UH_y$xbFqv6 zcpT3C2>PLO5QIK2ZUg#H;J2S!x^y`(K-Y)@aU%Wd`3tk|!5arLwhsTqH<#SY%UW0K zFp>5a@bVdVX}-t(_n*PP|Ag$j%NH(Qs(p!eVf@dtetBhndFP=kKP2jy1OH#hNe^(3 z=@DwB6g@-}R2hAW!l7U&9K6~rf_f;ZUm-z(1`$}G1`356LW`s~3C+;8MRX_QNiqyN z(5^bqysv$_Nq9qbcW_NdW4@L)ucBgkG6VZ6k z>;VrJTs#;`N7L;dzvqB9IM8i&1tB#(2}2kY3v``KbA%dcj>9X``K@&^j&KZlgQ*ZZ$qxcx!X^`F+PcYkcWW&8$g5LMuPv}bwUfAIMr z10Q7I|2hNOe_&6>-mE`cOX6Hl)vQ1Li}9AXTW@ydCuC?>#B12SNn6#*P)+)+c$#*J zLz|(Xd9UC26r8Cd-KH6usgDs5Mf>dlW!yKy6sFl(b0(EeD{>SS z%&|3CC{*m65|)ycvpJ<%X4*{Wly1qnn|eG!c0silWTj$PwRpj z+&N{GF0W~t1~V!>zctO$wU&giw@Q$vz1A+;p)(bg%Ja@zQZO>73`^-*l_->XJe4dI z>VTA-lj?R!8QrJWdPSsAoGq$gv7AJd0{4)K__lT!gp7Ns&WE@BE5N@W!?Z51|c%mBJn zaw_Ph8<~)E)zFMBS;^t1eE0dTj7o7<1^UuZ7UZg2#aPw;Kn58)QLdCy?vztDowOs> z=*cp4Db7pXm7EG$s-ciw!x7_UJq*^gO_YmiyGolmtHdlEQK7z^YOo}G+k&tRngIm< zj#eCoRK`4S8?Cj57Ah3&zVt@nG+B2RQnPPGWZ?pQ&s1b_)pU7My<}60Cq&5)*6*Mw&@4Vv15`+UY|Pw^~(AE2=qnET`HmgdnAA zEj-4Nfxrx@Hs+?lwR!Uug`qYtDH1uDh2tt(sL0idR8gcYr()LRbh&EGjXB#@WZt}- zQ|;E|iSp!0Uzkcm-tNicR+VCf$II1Nte}Kzt7w*&97@Zsw(_kFHzkso3q4aRS9u*G zUG^$w7{j*prA>5Or%?~A=Pp>utaT8{1pJ?X^v=n;&lFaP+D#<6pya3W`!Y*|yD@h{F-+s_}4Ey_!vRq0W;CHj&M# z4y!7-?L^|a-C|XBZXd9!2Dd4z8sK)TRSk0cpj8cVyUnVGxqZm0HgKD@kQRR;RIq}S zn=-G&Q@m_)%G#t%ZYZDimAOsI?hWONuap+4*6jTP=2&0%W92|M$CpNY5`J|dK5k9K z$L)5+$884jaodgfxa~oF-1Z_qZXZT`-1Z?pZt)y8;;pD17E;_V!Fgy{L>65Zf<~rePrxab$QOHnF7Y z0L;L?n(<)OX0laNAv?dCH>Dg|h0XnU!erjJr-E1wb+l9!-dsjcly4d`AX7Ju?!W_% z&0B6Gc5jRi56tn33SzeJT(?+SBI_SdMxioissK(`?0QDQO@XdB*eLGq+-WLY7mS~2MbqWH9Kp%X-fO-PMmMHH1vB6dL$&cE z#-GIZS6;=e&lZk=oO*P9G%x%0>8kKAox4L`pW;#MA9>E=xaugBODP<#a>U73`$Zh< z_TU}bsZ{9>t$l}fz3*mwclRh*YF~CUV7=4&fMb^0pIt@yagD8FrQgptOlV&9!^NT( zGM90;pLrL*)NDU=E@u-fEsvGw2Q+R~8*%7x^?Q~7x0Uq7y$bB_sbbDI?_(q8a4Nm2 zUeZq8&k1b6`?BjldQ5(vS>32RMwk|_|L1D;#r?O2y%s!&M;+zyNI(EBx5f5Bx9cQFsxwA z^XUA@hSe85&g*g6C%MOqKFRQp!p%(z(&hC7J;z5Z9tOWPg`bwUMGC1RfY}lHp}IwZUK}*by*V`fiEZ zE6VsR4)C#?fw>@!jd3)8&1aG(X`IIO2;K_!*50lq^^V#feF~ZlogUFlPaCWKQIFlN z$KyBjMCcuXK2q0rl6UEy;yQmlcUtLdShV=y7W5m?cry>qmuq;-+f=7@WH820^+p4* zzsEakpB5Aojdfb17W@n0%XJzSeRbNPE-_Q51N4M=xlRWmf77QiV6*sBofg!nh3oVt zn?k3s7JG7japByhBYc~hUwH1kyJBBBKSu?+K+E(Zt4(@tEHrXiU} z%cvzfi~9-?E-pzW&==^#(9e3k4$^aI&v}@O(D!=QF2VXm+DAKZEno~rJclupT3OyXs|u^WxO=w`zQ?!w!`G#{t5l|x4-)x)kN)jSk%a8t~J%L u7>zoALx|eT`aAT_-#6+U-n_Tk6c-t~H&WZd+wCu_Uj*^QGpuA4ZCGwZdRI!zqMX?9ZD?quya zhNN+wG)*alHcd+~0u>}Aejq6S_yu4-yE8hlG$S1VTu(q6n$9%Xenh zu9GIb{vf2zYUh6Up6{M}&bjB_yE99Ih~l^z)OPsj*6nkrmtG`_ehsbVqci(wo_=ZJ z6(Uoi-d{QEEz%$9+e8gf)CVgUy`>gweub#34fS7FE?$r=u`Q@?kf?wD)Z+ZvFApVu z0{#e5OUEhjpC4QJJoNpV`_Fsl7g3_G$>T-m&pdtV$8E<$M4}7d*G|uQvx)PcI}GDq zgM8>T8X{j5KLGVA>RV2qy>Q9+5zP{z3+Y$SoU3^I2b?6Zf&M={>s?yZtkz*7?R603 z#52>YPFS$B0QUcn|0?Y9*8I zrU@#KK0?t*I1&v%+bqI*B&=U1L7@f_nx_VeL>nRtq&Er8(6t40C*wF720hj&P&u5I z@isxb?;G5nx8+27;_l6Nb#->MnQ^lrOs%3N7EWb%bocCx4-V}}Z%=i^lVPhDbyQJH zh9l{Cy4|neyI0#e*kg5v(Q5fEOkqwq66VIS=6JkW{DJRpB{ptM;QJ@>op%rXswHlw zlHIAnzU*Kk7EAO^76MU-qXu2!TeNe$M&InhlV;+sYqBHI{eJU*u@9;%=b2h zTbj(qU8Uh;TeqLs)w_RV^QNX|z3D*cz~#eJmk$gKG@FglP_r}i=$?^BhdNS?T0>J; zV*%C?{gzH3O)gS|G}=Ok=rd@0uBC%?e2BjA!RP-v0a2iFG?_#guRiwI~lw1?NO{zNT> zbKI=ifB(AiH-9y+H|MuxXqUxHe9&vlS_z`bpcIeNc5(lDDlqT&YgfUYF4C)1p-O#> zkT@twe1!>`g|nSV`ey*|2z(YKac2!loY@kkfe+U!wOalD@n8f+wp4ViRCJ}Byg@BT zCRO<8iIN&LRi9fvC6|wtl$P;ciBgm*73-v#PAhU16|AupXegAOoD#N@C+3R|;gPekDFUWG)scOlBQ_biFr4?o_N!4rt6uenwOkG;hG!1H0daf(Ytt%}Z z!s(KLmb20>+99(PO_k={m6Tv+P8qh+v#O&|;_+0fP^c43IV;txQ_AQ$vC=1Eg<_?s z!o^Zr=^1zW;S$K^a!IPGDKw3`rc}d>hFw=y12!z`LsPvb)d0%}nEC2dNg^7{o>Yxf zr7~J1%NiLCF&ZkHW!H60L`yXnDvG8{iYA$yM%|oLn;C7M^lr3Kg&8+ObkcQaJy(gW z>()JREQ9mzs=*9^?( zyE4kfiVF3oAuPycxs0)@1ECBebfi?CGQDZHWVvZqs?nn*$V`q)-ISb)*s7tBUBNNq zM?H$Fb%<~|%a~yd+t#19&}|hXA6U*^ zu##Eo!jlQuKY`YpC+iMVSS4z=5afcQy(>ZpKOZ`5s*+ZmDXE0z$f9aN`o%1y98xif zmNIPk&V~(w;?z!#<8UOBFa)w{GMZJN&YIoG^Aw!z$mUe1T@_qzK;XIDXjgSEH`!H# zOVh4~xa_j4VJ`2os}U|Y+tnzSciYtlF0(em5=?{&ml1MH=9PGamrYLD>x8K_;S+%{ zw@%ozCR_@H(k9iKy_3W2>$d`5+0pg>rQx51UET1HOAG#Sxdr}lnSp;?_P{?bd*L6K zeejRVd*C0J{qT=VJa>)wD{8Ba5N{|;?0%xm$>E_?c~0H|TW!s%tyq}buqGyuy0=}K zmN#ti4*yRX$jhACzB<>{mT-|%Pi^b3hD1lPgx!&6amTvw+=(-2%bmXEJE1MmQ+)q^ zfok#4r2X5P^j8)?e=hVG+zH=m}hW`~68D0VXK1>m% zGBPhGcyB;x4=gWFSQFTbN;m`j-0MSV)$U)mTVa5bCMN!Wu!C_N<9iBlZv}$E^t- zlxK18s?2vLh_s@aQeKYWWM}KOpb<*frb2}?s2zZ4?MF;7iSN(6vQ?ig9057CZ*??3 z`t|85^DmuSU0$8yQS2Xij^eoLER?299IkT2%~uCR66<#VP10#|>L#gklXSK3dVRO{ zDA;OOc0FOW)9Qd@w%VOtM*4A%En}tM$u>-AUJby+qVF=NaZeC=55Lr$z;#Y%3o9*; zl@~ZPZdV&|=y3M?ng5@q^u+BF?7zukjyLaPBi68)UY9Rvw{GVIHsD>^)u`N$+U{(c z=Zxc0_hu~w2M~geVAq`pYx*wxHDBK+0?71d1IYB}&~tB~?@9of@O%K7a24ErYx-XB zYrei01IYAG29W93&~sm)?^6L}!g2ta@M(Lc$^VI~!sd#h=|wy};Vg5VtcuPleaqCP z)dM}pM=Tx&Uz^5HOYvD8cfsS|VwED!w`gyEvqAlgM;i;qj;Iywh!~Cah6!zVI2-N? z`3+6Z_u~}9OXbkBc>ZhxrPcX9jn+Th@(Ss-FO5~Vh-*jiz;LZpulI5NMwC_?T(jEC zP2Y_^OTrkvR+*_Y@xhu`H$?3PWqbw)_}KN(Y?#Kz*qeXnnxsh@ zr*S=ox4?b1w`(cAv-Z~jL9!;(W18hl6ScqUiCg7({DzzeyhcZbfAkIF3V(fb zTIsu3w775!2L&+R#G@9pYk1S!RL43ZnBb>+qXFE%P^yjvB}8K#Yt({&9RiL{!=k^A z4eAyr>o`OYiK}%SM*A-Vi~*a)-|JXVqZX~>bvlJkQ7v(NZejlPg@b&Xo|}L2jJM>R zJ2OiKI!BB2G%e8r&C_YRKob8-4A3@wB+Z~@4kfeB(ka}R!0_;qGzEN)J`8!q@3o(v zM0wihoQJ&6*LDHg&(kj2iqAa8V8)YllJe-qI=4dC8R)o#?*iVDduRzH>qonXY-oI{ z-e1x**yr(GLXSE83nP&M=jd_YjziFK7Oj%HZ)0~iMt;9HtZyE6ok8Cv+5yfs#9)wi zgX?0nqK|HkLC&}1y?*c48(8`t<00SX^YDYMl{bwfVf_Wf*z@Cf4slwjd(;Onx51`i z->y9D+Ce$QZ~&3IkM6mRKet+T9OJIe@4+?Xz=|`79>00QRr?bEA9b4xCl1~}wIZVh zUMC4KlK#Dmw5O0x+<=!2et{#&_BC*=&2LTO9`$*Uh?hY99y6d!3+l+vppE-z&^`My zUYhZJl!kV;L*;*dMc#Ph%{QqgYFDD7MnUDdrWzKbQLkSUqIOk(hu-<`$LQ=#A`mrk ZC0Y{{RGw=R^ftX+uU~`kD*g~O=pUK<9a;bY literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf index 1bd287d3d0a4160eb31fbed83aefb18bd5e5e33e..f0ea3ca97aad985c355d7bcc3f66173115393695 100644 GIT binary patch delta 242 zcmX>hdqHS|SUtlM1_l-p|6qNisHf!%85md%7#J85l5-OaSRC2X85lTPfc!NXsfj6~ zKJoEDwL5@(vkagBR}1S&pn4u4UnL{Aq=I)Zqa{%O1CTG1n^;l6z#af(GRy&Dw!FmL z)Qh~2qJZirFfcHEEXXe|`G1kYh=G@Z6J((R0|QVo`{rp}Vk|rij6e}4R=G`A4;xHe zp)+|6pUlK7s*@QRbr=~Z>oJ-#^D-=&oW?k3a~o3tlNwMh&{iO324WQ`I|0Z8nW6%u Mxqx)S8X&LsLz)KG1fWq)lk^Fq1xXGaEN9 z1YtxJx=?Vb3vsI;=t4JY!9U?;4 zv>~AVA@%OEwOT`Xf+D_hg(_CLaPiIc9^%gck;}EJ-T1zaer!c-l>w$YHxS%)cXXlG zeQET%n}a=J5FiY=2ZIN+sCy|msCQ}m+}pu52Rbw(O6T)H#+M@)(6{(<6kYm=FK ze!-X9bW^|K%k3BlJ@RDM+!gxZ%NjaE-+VcMc(~1%b;^5uIcT6GJoKbLG!aN-QNtK6Zbh9_qRmF1yB-?cKEdoIEHYvgef&L6jZtniyx(cy3Tljy;Y={6m5yop1k zD$CqJ?dOAAtz9O;5(~62%U>b7LS2Y>jUPi2Czag5F!v&T4bmEhlVB%pR#Rs}jYjs2 zOThX_q>g#|Gi09rg-WZIKXoZj6q|^GJj;$ZZ__K!k|ND6hs?5MltR|r!TqSxsX=-& zMf)VLD}&SAMNi@sze$W!PvMx#&Cp_Egi+(XV97`+S#X8Asp8LZKS7Vg2zG(A8gQDk zQ@|?guhVSvD|0D#S>mMD*bAAayy`%fk~H|gZkdRZGv}i=b8XZdI&y@cg$@#aVT^E_@@<;r6cRFlK*Jx!A*2q{OsKstoe z-{!w>!{Ge;++|OeRt)Npi`c)XCR-@-o4{v(6Jh;-q&T zaEkw${OJDbmVYM7vd6feg@Gg7V~8NY?{328+^3OSQ4K}_nx@6wd!hK_7hiPuv(fzn D_QVRr diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf index 328c6ee880b2dac7431489ff9ed0a5dab8181b04..7ea55a27fdf247755ac9e423317208a8d7267752 100644 GIT binary patch delta 249 zcmZ1>y+L4tSUtlM1_owN|6qNiXtgp91_qWG1_p+Ns--U7&1$;d6K;3#9{1@bk3e1Y7=iUI}}pmqj^IY7*omzbM+ zk@ry)P<{^s1JlQX{Nj@T7a5Egco{eZfC>~C7=VgdHhXdTG4n7m0!5fu<@9H{Do$LX zBf!+l5Xtz1!GuYZA&Bt=gWkj|s*@QRlbCrK7EMlLoU^%&DS$~0s0C;M5Hka@3Y6^v STiO5HE-l8XJlfM1l%SDYTLPaCa%_WiMVl zkZ5}Gz#rhnMB_hTI2cbRCjJB7xOv5>!EfGfQ#2ZNH*ep}yqWKPGjHC$?0nw+B<{sB zfS%6gQvLJ2^)^5QpT&IHs-au^477iweydopmb)?w3zWAxE*5EsJqo|2EbC{BWp}f! zu5|z%&!~5nt<4&YNs8Fxh*Yd{;m-TVJ;YxG+V0n?j=TQ>{WykLA014!Zzy~^p4ffb z_@?(YE*U*h5WoN$w~f4>(0Us?#f!v{+ z`c@zx#z5qSFEiUjD$RWg|9f7P1c14pAnukVH@L#Z69Sci=~3QV8` zhhK}srOm=Jt!2(O?$K7oO5 z^J?FU+NVUDgJk1-c<{s|qt~%UkE=-XJ5G&Wjlsxy&&31O=sQgmpXnG;1Vi>EJ4zdh zZ7Y{GdP;5;?%*>NJjqK~_+vodiov(83bGLUe<=5b+B?h7sIQvWsEPMXtG|H4HDsN;=HOW8wk1P@pu(n=Owp>8VwInLL)B0hp$AT1YOvv&&EWd1hI z4qxd@Im;3|wZ>XVH!Z6Qu7$oeX`tE*VKOoD2%+5M|&at9&hsT;@z;qv^md&48=5}8RyN+u&5(kM3h`d3~$_;=P-0*If~&IeBOf5}G= z#wqzTQI8d^B;n zt^`vrLnPA-1|z0chHx-;XNY3_$Y3<_it1!W#w2E5hDDRp80TzmV+vqW1L_320f?D_ XSOv-s0rEg*ssL#&ARRLK17`~WoCG%= delta 1508 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 Q0wA|^Lf*8}GZU@<2O}N7ZU6uP delta 5737 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 I@{R5P0DW`4KmY&$ delta 5713 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 M8~!(}K2dJ_FMR2!d;kCd diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf index 170c15109735c15668cd0de5aa11460c245ab18f..9168bc869d211df24b7599ddb46004a17d6a6452 100644 GIT binary patch delta 4463 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 delta 5736 zcmb7I36xCN);{;vty|;0HP7=r-*S`Y;B z(xM|oXha&XdB#T&f)MeD7$Rc!@7rYMy|w;-{r_LJ&i%f<&))m&z0bL|)~S_~@C9@5 zR8F^UIY@xUAr6veW@T9mkwl0P`VgW1$(+1!tanZIM1=CipzB{yl3ykmttrv3?X#$ZqgCy5us{5_DJgG(w$&_!4SLIaEl8PAmDk0|3U%!R43>^xbT zU*aCv=iqb~LMf2>ZsZuOU7_q6yh)u(c*mNGbICpY2eYHFOKzLr*ah zqcA0A!0eb0i(t*L7qOSH&R8DS3(Lm_W5cj2Y#cTPn~N>PYOs~qI&4D<+l+0;_F@OI zqEI2F`xY5za}@InHIybw7iXLA>DmvC2b*K#*- zH*@Q`4cr6VW8Bl+3*4W%x4HL7oaB=dQcW63JLx0CWOK4D*^%r*b|>E?3&EL4BlMcB3=z|CGS(-M&4JvZ+ZK9Cwb?1mwDHDcX$u^IA6e* z@-=)j-@*6uqx={6ZTMOISNVDTUi|+2B7P~qia(k^fj^tSfWL&lg1?qu%m0$Uo&PO= zKmTZoe~N#Of0_Ra{}%s=fGZFS6au}#Ch!Wvf($`RL3=^AAXm^s&{t3>7$T?=j1^20 z%n>XU)Cg7zJ{5c}_*(Fd;O~ONg6{-B2!0a$BKS@4K!^$XLWxi64$7A_E`mIzk}*9tcXHw){94Z;J$W5UzI3&JbH8^XK7 z$09-`63In6kyYdoF`}fXl_*p6is&`b8=`)qL81~-rD&9Bf@r#Eu4s{Hsc4mGy{JyK zRkU67jcBi^QFKUjRCHSOqv(d{4>2wli8W%Y*e8yOTZ%h~Ulr$y-w^jtiA%&);&I~X z;(6lt#mmL(#C76r;s)_S@pt0$;(v*6iyu-1MNw)>N7<<`)r`udI#b=KKGYDZgsP&( zP!p+H)O*xY>JzG#s-w10+o)aCKI#y4j5Jg361TCUz zT1G2r1D$fwQMx(Zp6){Tq6g7cbc&utPornk^XU)h8hRPMie5{9Mt?znO>d`n(0k~8 z^nUs!7wIeX4f-zqSVBl>iC$ut1SHKQnUWkyU&&y}JCfOw1(GF_6_T}* z4U)~0dP#%ifaI9uwB&;1isXjmuHEL$#HBde8tDNAjaeJk59J1RRR zJ1_fL_N(l7*&{heE|kmUTDe8;mWSjCc}sbFdA2-P-b3D3K2SbXULhYTA1|LKpCex= zuaU2me=6T7|4P17zE^%weq4S=eo=l^eoKB&{!~FKD1}mCP}mhdMMTj|@uK1-MQ25x zqL(6HF<3E7QJqqZQA|?IRLoa=pjf8(MDdwolVY1CxA zN~uz#G%H=opfav(p=_soS(&4JUD-!jsC-LVu6##1PB~TiuJS$QhsuwY>y)1>wx>= z(W;568LD}z_f;RMR;y}N+f=(%jjBVcld7Lozo>pwJy2t6zFMMIt4(UBI-riJo2%QZ zJF2^=yQ|++7pcqDW7N~sY4uX|TJ;y|9qLB)5%o#+IrU}rb@d(fLk*#!G)j#@W7qgn znwX}groARxldI{W>8ly28LFw!jMR+ROw-KKEY#F!R%$-gY}9+ezD1+f&vDBHbbWOLbwhO( zx{5l8_EpB4Py>^29@F>`bC zi{|#`Eb}YoF6OT0*Ui1mea!>RgUmzBrRMUKx!OF^Jk~tHJjFc2{H}Svd7*i+d8v7Y zd9}ILyv4l7e8~L0`6u(Q=DQYT5n7ZMv&CzPSz1}LEV-6mmO@LZWrSsdWvXSKWr<~# zrPi|5vfFaRa@z8<<)-Ct<~0X)*03X)}_|e8tX>u zHtQbiVe1dppRISSPi#D!%x1CqY|U)#Y@KXfZM|)UwsPAj+f>^;+fv&a+eX_q+aB9t z+Yh!Yw%fKxcCMYaYwZ@h&mOn8wrAOM?Y-=U_7eMW`#Ae_d)i)O|HS^eeXD)9{fPav z{j&Y01382arNiv-I$|kDD@T?i*U{6_*D=UZ<{0Uib?re9SyN`RYyUab@opMiir`?O)%iL?+weHRCo$dyAqx+Eil=}zw zCHF7x+wMmm+{5?K9<9gYY3_O1)7?|(DfNu-Oz_O|Ec7h%tn+-~srT&j9QB;>T=v}b zJn#}JFYVQO?cSg_!`s&Tinp7$uXnJw+&kJk#XHx#*t^pEnRko#8}9+{3GaFDRqq|| zQ=h=6@R@ubU)0yq_mVHi*V9+vEAb8YjrYy;z32PLx7JtZ+wR-zJL3D^_ml62@4lbo zr~Def%^&b5{cZf&{ycvlf3d&JU+qtg_D}N9^w0Od?_cI$3OZVY}M+#TE>JRbZZ_;c_^@P3Gs3W-DdkS~-7 zy%_2k$_e!d<%foZDng?|lS6Yt?}t{0HidSE8bjZO&W0|A{uR0r`aSfJ!5AJxF$zY< zSQr-*V4_SjrZtnvWHUKTccwR!&lE8wOa=1}lVT<_GnskJBBqA z)(|@!`!4ol>{{%0>~WlkOXBLdCGL)g;~DYR@ec7$@viZn@&56mcxk*UJ~}=zJ|muv zFOIK@ua9qz*T);;2ja)#r{fpmSK>F~cjJ!}L_(C1Cv*vCB9MqBS|>UudL{}J6^U_) znTdsoRf!FW9f`)osaA-N}Q= zQ^`xo8_5S5+zfGsBEyv7%ZOw&OV?*!tb2>jOQx51u%>3heXJHCY&N3M48SFD`}`d6 zBg8|S;NrItu6myUegV2QNQb@x{w3(X0o($*-AIOJ0Un22-B!Tw!M`5nzJ|Cv0Jnqg z91@|~;ByU0&`yvaA|d(~=5`@0g_A&bBZTvi8o~7xH-o$f(1HlG7to1t1lL$p1Kb0A zKk$7J{2zdgpz{Mi02qV<<^r~W1P%he2n8Gkn?nf0vjC5Pt|Jt10{Ah|r?*Ki z0XP!mav1DQye-J1()C%*29ALw)`2t|w5woz0Q_ADZUcmZU^&E{kJX@=2=O8y&jF00 z_GmfqA{bm417H+_z7mRrj_|5sdxC(&p_}mM0&jAh-LD;=Xo*l` z^LYAZ|6tlUwm`=LYjzmni9JX5kC4vk1>@gN-yh>3@Y$$m-L1k6c-`RwpPoXwY-skQ z#oXx$V?Ru>o`e88yA#iO&iN?8kv!)Dq~&Bj=OPs2^nT7Mxbx3`&S{h&|MrYS5?b=Y zbB-Y;dH*@bk(x(6=N#aU=bTF*Ij?!0IhBit^I$itVD}2(PY)|9MiubPhfxW-eCYi^ zR03Fz-U8h)G${Rbs(FuMRN7=QxXGtGNX1}35Ui~z4_JPa^ej>-Xv5%H-sE42SRa-b zG_70Ov`#VTDiD+2o=R$R!Mh3#1&a=df#=I0fmQnVR3KG}-a%zx+YO>T%QOq3urb(m zAv<8ho3j0@mZ4zD)>aBDJj;-c$JWJW@hl(KI~#QdIj1Q;TisugJO3FW)f6HKldm_q zSHJ|jycIj(q ztAw;#pi~$-Spn6QgF_i8p=U7IU<@Qu4sT5uD#(IL{xg-oYWbhKR0vTjAR-%i0CfD% z-F#MFK3k+!n}W>pAfs%QXVn3=Z<0YmY)^WCz8h>;4(blb%I#2B__jk`K+Z-lHTmX% z#)>k*star|>yh2W*|==#)+YO&fSq85wP9lqgtRJA>d&(?5RHKP%RyZMU-n$Gdsz%8 zwG4W}o~FX44&(u28~p#;Wr)c740;~*Pu~humV$`_2tNo$0hq9RSPD(A0xW_#HdFR^ zmO~P-ww|I{oLd=6;%Pg&)$`hO(_k7t%I}C8*(m&%-9pjR?-dzdr-qqXbI#e0QoYxi4_G5>;XU~!yF)H%S+5n zy~z70ih+R@$YuIikY8N#|007C11|%|0-%Tj0|QVo`{rp}ZOl9jj370va-x4iZ%kaF zGg*dDX5tmq$&8FTjEs}@7)_aZ85T`WW1O?OjVXXh4X74qD-bgSu?m!(0OWy8Q329i LKssUa2hJ4$Lr*ia delta 1549 zcmb7EO=}ZT6g`ufOqxjRca0EaMC-=dVrhjIL1MKSEKN17^#iffG;N|y8fT_$D#C2K zaUlrf!bKM$+9O$~d?=FR26iO|Up|eG$9fA`#1b47 zQDPYtxcs%bJlbr`(pu&2;1+F*mxv0*qsdFl{x#$V9=D@yjW-noZ5ogfD-*eO$6|9;^eGjXsGj@U~A=43}2!@D2M4x`lb3SX*gA&)i@d=OvZy(jmuNI8Lgv ztS!`jKDgD|WfH8gKpQjs6{0KDg-F==5oB>e$sUHdm+A9JYY2WXJL$3-hY58W*)uKy z>md;b^YrJ*eDoJ8ty=!nrCFl5L=@y1cD#9;VR^O`X{CKKE09qR1#3U|(@LiX>B$uB z6TGfGCb^5A#YKLz7^9xUS(Tfo#lkS7#(2S!kyEnZ3Uy1xU*Ue99*Gg`5@~txo3m3w zgY`Q!yZp*r%3W4Csde^3rfF7npg>6){9m_BM9GOLJs!q0IP86tOBW7C(o z&(kMNWjq}ck#;ucqxBFZM`%hl@<_t@5&t}oTUNR9m;}}0u!m36;t4{^S1*tb;qhb%B3^SUtlM1_q{A{=xc2(Q0KJ3=GVF7#J85l5-Oa7^Im37#P@rm?0q}H8Dlh zCq5o1KLN-$%K!>+wXhxo@^1k7DjB&Y6&z)Zyg>d5AYULiv7&&11*DZ>4iK~DCFZ7H z~C7=VgdHhXcsW8z_81d1@R%Dt(GGMczT zM}Vo9A(HV2g9(!+LlEN$2EB<_R3|esCNc9eESj9gIA?PkQvj11Pz%riAZ7+)6)4*U S$O9Rs0;IWsw9DiVoG}0s&NNN{ delta 1556 zcmb7EOHUI~6#izW4~nS}6~sq$5{1M_N+f86xTz?iv7u-|B*ef_O4~>u&Xk94X5&H^ zBqp;Ie}W6+A22QqE22gdw{G3IGZ>BdojcPMjYgfxoqNu?=Y01&=bk&S+BOeA>~vex zfc`O)?dzZES!n?@@R`e%ts0JKpMcm~>NkpcYoQ}OJ4<l*@nvS)75Naz8V*Fh1hS6KXgrV&$|nLj9Kycn;Ir?calJ2#Dwbg*hddJ~ z!Qt29sMBU)fz~o-8@FhyV$pjP9-JznqCAQ!W|CTo{&{+v$WpSD<|9>T?PH{^;_HwY zk#lO_irS|{n}dY+IDGctIHQ-bM2|~I@Hq6miUOLml2 z729SmOZ1f7D%`a(NGR$4n ze%`oQ+7%KkF+mIS{0h-k>O#aX{0Ne`s^mI`I2XBAC#@m4eXOLzY-|S9Xk^Ve1S~-! zHVRzNka_wSD$QK}RHX%?I7AfWc~-n}ntpngBx!cJWR@kP6td7c!WHom>^y1J;Wm0Fk2U6R z)9mn-zLc{pu~TcTg>=(`sz8>K6!^bRnTQgz7@#&{9n@SdEPd43j`29shtm;;{TG5 z5sahqXQC`~E9VRRWtyBre8ryI+2JqresnaZA*4gov`+7MxZ~-IExlb|$F#PM0sR!N IX`4v=028(iRR910 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf index 65fa1daea7088efd9f7b2ac972fdc63b21037492..de475e60a3a7dd475cc3070d980f93ed60c55ec1 100644 GIT binary patch delta 257 zcmeB?nIbqrte#;B0|RrNf3Ut$^xU#$1_qWH3=9kj$+?LIjE~tX85r2#0Qnsmsfj6~ zKJoEDc@-evECVRO)xvrL$S(o%RWfo*D)`bFj{^BIK)yt7VnqQ1TL6&BFb9a)@)C1X zFY-Q$0?PkjU|{-KkY8N#|007C11|#y$N&Wf2B2cL%|%>I%sdQ?KoKTZxs&VuUz@l> zM}n!BA(CkZgAr3JLpT__Gej|dWH6d|MRhVGV-hnj!=lM)jB_@(F$FNG0kr}x0b*t# X2Duf)4gvB&hN=K*E)ak62hJ7%J<>R} delta 1509 zcmb7EOKTHR6#kM)CTXPgT_Y43@UgKbTB_3SVzn3yO*O4WsKaE+?kLnikfh9&-1(AIrrQ=-uqzSQNNpT0PSwR zkRFfCVj$ct0kZSQns z&~qZkV<3PIcuyilEg3rDeT!_l&=89BAcoiBd?3d$tnCiu9wfD~K;DHRZ8ng5HA8zC z$bA^rpZhYaP3j*5IfMiH*FX-VKh_(_8s(#b9F1UKY~f~z0~>AbGeZ93$517}E8ma&7{&j)u~ z+a|#p3pBC7Um?0iU5NONA4djPmF!@YdzC(iv_|2k*-4w#SWIZq$ewWtSc*g}ROru> zdF~e~-CF+Cr4mtWA`0>XJKniXzdTclG?Ffv704)yf^nGp1*KDi^kjziDPC6|)7(YR z;2OUfOi<6_lFH4~VqlC>6TD!_$SPTIg}R~QZ*adtkHiRenY0|Zo!Kd4o%LHZ+x*I0 z%3antsV(+Grm3VlP@p6Y{;yjmqU0qsJQ9C?#9!fYZIvsJNl*|n=iLFH1B34`2$o71vdZy diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf index 87c8f00f3427fbc3fedd2259975c20c831692a24..7cca4891a15287f9774fb72d1b9dafb1d753006c 100644 GIT binary patch delta 4447 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 Q3xNFewfxCx|5)q)0gYV0=>Px# delta 5710 zcmb7I33yJ|*4}6M&NrU(&GS6Z=bMw7hiEjVk_uH62{A+^(nN^yQ&WvKL}_UhMMK@D zl`2(&YEWE?OHqm%>QYtes@cCz=+k?j=l`Go|MNZjylbt!*1OkQd+$8YIVbL6d#B*( z+-}`+kq}Kp1d?TCXWK4)_EiHy=zWCx&Cbn_#Cu&IwF04n0drQZGxC8W6 zLk1QWsXO=U2f7dRj3HnUO%b(5sIUlh*N~DCRrEHj8R*jy(z!|stIGI`@?dK8dU#N! zg(dcZeGblWgW+?81aFiLuNd*(=ih^LjuA~qOF8@ z*z3WUCc*Igukp+XW&I(AXU7-hCPaYHZ-#=}fFlg?&_HwyT}0Q=O>`GM!6=NzRG1NS zV16u$Wn!(d=dsRMKGq8>#D-wQu}W+rHVvDHEy8NBRoFW0Q*0BqEsgEL4r0f!)7S;< zDs~gQi#@?9oW@nS6?fwiJOgiuXW?D&?sx${7%#=k@hUux&%o#5i}7XnYJ5Gu32(p~ z@dNk~`~-d$zkpxGZ{m0HCj>>%gpx22Ho{A=M2cuhWD$8p527zIkQhc(5MzipiRnao zF0qJMN~|Q-5}y*Ahz6pO*iRfLP7r5_%fxl!HgTWikrGl#8b~|oBUv&YlH zPM)8a;5Fy9Oys=UZVz3L#a2YDk@D)qvlhKsTEW$ z^$E3++ClB7j!-A5bJRuZDs_{(OFiLJe44M}r_FpHKf=%8x8mpUbNSu*J^2Ov!TeHw zC4U@$GJht29)B^vhQEscF@FR9Oa3?f{rnUBv;52a>-^jN2LfCm6vzZxfkogH1Ozd` zbAmR4Y{5%{d_gZkfnczpR8T1xCzvFdBUmU{Dp)C4E2tBEA=oDPMzCLSL~v4YHZ8a; z_(gD2@L0$bN`y+GL1-8Hgb`teu!XR_Fh`gt>>=zcED{bCRthHwrwHc?7YS>GtArm5 zKNEf>{95>}@H^r6!XJf~gue)X7v2|PB7sOM(um9=mnbNTi<*hriaLtAh`Nhj6Acgz z6}=&<5~W4cL~}$7MN361Md`JoPeq$V4WdTT0nt&>Dbab+710gR9nm8(DHe+rV!hZV z_KI0?O59SMC4N!-viMbTKk*=OiFkx~tay@mhIpQMv3QwywRpX_Uc5!TP5iZZk9eQ> zkobuBl=vs{4e=imTq2feB{qp)5|^})bdbCx$&)ON^VIW&?HUM8d^^~=m?!jXVIPMZgd}dC|yEV(&OpL^lbVadKvu@ zT}Ri`o9V6ePI@nWh(1amr+=W&(iiEg^e^?9O**oQt3+RTIr|KP0|Kwqx69E zsPvTdy!49nhV+i~k&Kjy(=vrjFSE(KGFFz7wUlMaUX;BodsWs?Hb_rF-GyGV!C3kVv(Xou}bl=VuRvK z#SXk#a+b{C8ea5Dy32BQ2LcoWu~&V@_A)vWxlePvQRlhIb1nX zIbJy>t(>J?pnOlcT=|jm6XizbR^=|`KILKM3FTSkW#x6{ZRG0;u2hdxPgc)V&sV>z z{y@D(U8mlv-lg8BKBPXOzNG#|{k!_U2Ga;MQjJDq*0?l5O<|+aj%Pug%fs zX?tk$6XXus6%(C*P5)E?8G)?UzF)!x+J)jrWt zI;l>hGwWQspf0X!q3fXQr0c5dsVmS8)|Kiib>noCb+dKv=-$_Ts9UewsN1S*)E(3v z)1B5`&|THt)ZNuR(Np>~t=H(SdXGM=PwHFf+v{`mdHNpuzWRasVfqUF82y|2>H4|) zcl9guwfZ{!7y51b-TFiNwY-`Lh<{5h$`x}dmWyVp)3C5|$*~V()661%)^~QSR7UNFiUgII-apM`| zMdLN&E#o5-X%d;_CWFag3Ye0nR;FxI7t^bz{-)PW<)$&F$);JRYEzAAjj7JG$+Xk7 z-<1A`>5S=;>AL9;GcpU!aHrDe8haxe9ru{`B(G5%nvPuMP!j%bQY_{V+mQ}mS&dLmiCrx%ZrvS zmadjpEWIp!E&VNnEJH1&mU7ET%b2uff@P9rnq{WtZOa17BFhrXGRsQK8cUsJvt_sC zkmU!BSyfhx)n|=cTUxWNdDdRmB5SF&$~wvVmUX^$sdcrr&br0A%X-*) z%KEeQH|u>HX`^i#o7EP!W!T!=I@`M2`rC%tM%pIYX4)3omf31;8*J&Vw%xYxY(Lt5 zw%xWpw)5?ByVdTuXWHA@JK4M1d)tfb<@T}mx9s!n%j~uG4fd_}-S+S7KiaR@Z`mI@ zcn-#)b66dIN5av{k?qKH^l}tAN*tpc6CE=g)s7m+M~=@NTO7L_haIOJmmR-3kyGSU zIW10~Gwy8Z%uYM=oIRa=or9cZ&N0p@&bOWKI#)W^JHK#lcYf!(1a>6J0Z13tcs?HLlNH+g#tej=D~}F1l{J9=io@h1=xz zxTEgo?hfwG?pNFe?xF4x?g{R<-1FSa-0R%+?yc_hKKF6=IrmlfZTDjj-y`#wJzh`D zlj&*W$?@cS`gn$T$~>byY0nH#wP%TExu@1s=h@`h;c4{j^BnS=^!(_#==sHS%k$8S zdj(#`tMhuj&AcyoyL*egrQRyp_}cnj^mX&~^$qcr`^NdE`R4hS_*VHo@on~f?K|K*?mOqZ>bvcG;urdrezV`} zkNI2ppZDkbd-@0XOZ=n!Z~ABX-|>IoU+b^;Z}ac*ANK#?zvRE+zZW0^bU+)h2ZDiA zpiLkrkRRw1C=QebMh30yOZ6+{+&I_o@CFm zm)P_*_9puW`zS(0gb`^(6ER0zkzgbqX%%@P(k;>}QVgf7teRNB7S30^cdN_J2dOmt3dLw!_`Xolh=$I;Ij5%WdSTvRy zYaM$&);X3R>lG`E4T%kpjf{_qHB?3dW@ zvBzwsh_8>=$I}h*#`t&f@8dtk zuf=c0A0^0yG@(gY6P`pQk&$SX=#c1?=$h!6C`b%WlqM<@;}Vk-GZWQ`C5hFE^@&Z1 zhD2lHK;mfPRN{Q%O5#T1PU2CLOp23=q(13N29xn*t7PY7&ty@uA~`WRE4e7SI{9gG zdvag$Wb$J2_vez2Q*=s~@}}accB#&(-l;*U%GAWv+|-iP+SKQ%U8#eqlc|fT8>#yl zybMW(GQ*tV&xmGZRySl_sDGWwPgSqzU`x+}_pv&JusMiEGXa+(0(}Pf0pg>L@Vd7F zVc182@G6MaB0c&N%SQ_yL?wzyhZMPl0VB_*6siY^dZ6=z4cVCk$3qh9K$`>B)iB-z`E4M#142Qt9O5m&YS1i%_)*a30>)5#1fLGjU>H0Y z{b3Y=eFPK<9pR6J?Fj*nf^H4~oLb$hqp|y2h{D<;g3qx_AYu)SS{NUI2e%TpXYhiL zte`IdCiqZ++JL+eupc0_2rUL&guG}RaKMKLena)Xj!tY>{jVLn>d4GKylK@P3PRPJ ztHPMD`f^oDPe2Se;M)N(K1C7WtJTqQGpgUIa@Lm>xOFtj<7l}*9pJB{jnJhp_Li$V=A{~+SOctX!(fgT9!~6c6XEKA5)Zd=Uu(Xak|4hb^in{kq#*v0k zKa&ZNozG+*i4^>1^;<^g;gNjU$x7I{0r0`YhKf-IJPTor09zsSeIP0UEJv?{Z8#cK z-D6C%9>u7%$zw=UOn19CLr@_@BG^w7f#DNSiJV zndL)9IVj(z2W;P@gNC@C^Z|1MWr0^0*kCRq zr%C2`xzue<{yhOZ!3^iaaSw#FMxgYcXJ;U)g8IwBTme7sTylF^3@5b=dcmEhqNWby zgTyuX|Fz4&$i)nL#``jM7VbTc|QKS z2wV)8CRYu2NuHh`ZhkN~yG$Ib4G#O$t7(H3xTMleHxMScoc_1-&;HxN`M;l= z{HCHRAol598Pk-~aM(IH8@Z5kF=WP_NUoB0Ft~$K4*5R4^4tmj@2rD?fb-*e_mnsX L{u@?r9%uV63D~9~ diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf index f381f1389c86a63d4660ece9b7c3082566db433c..06f0c1f2799b86fe9b7e0e3c3888eeb5ddac109e 100644 GIT binary patch delta 4450 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 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf index f32a1fcfa7e228cae8f462096993686c11ad9b1e..556861c9521ce08a8f40182fe13d41c34b23405a 100644 GIT binary patch delta 4451 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 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf index 604e14045765c95402808c010571b62f017c414f..cf3228d23cdb41f2fc1f16ed060d0b6f03e82765 100644 GIT binary patch delta 242 zcmbOsy+B}sSUtlM1_q`_{=xc2QBTVkGBB_(06{`>Zejt8BU?HH1A7RNza}F!F-6oT zKAwSrxdX^I%K!>+wXmK9^6vooDjB&Y6})>HErI+4K)y_FVnqQ1djOEhFb9a)@)C1X zFY-Q$0-B!ywC`g delta 1548 zcmb7EOK1~O6g@MOX_`n>{M3p?Mzn6M36@r9aTBY>U}&nT)(_H7^T#HQne?LwvvDIR zh|@(E1ueLBA-WX`;=+v}xDnjwQgClqdhVMEsiLR}FYkWOJNLf(@_75oz6V`ybOq2q zXR?X@D_y19R2@NtfMO&3uJ@x!9X@c*byFjuAAd}B8xf9qk$X> ztfB&kzcyEsHXC_btK1v7PTL%c-Xn8pvVxk5D65;zGKrlUj=3^|wV zC@m_s?OJ9TDYeyjg3nO!q%L9M^O5Wn($q5wU#e>(r&|cFg6O03qDpt@kmD^JBUM?} zCTc$)+-~gx307F3jT!z5(M9S)#Bcm4k~pX2CWg6}>1&eKFx&(?>9Cpx6Y4awXIugn zCy@q9^k>LC{R@?LEr04#o+u6x1$l-YZ{4O}o-IXM-7cAB$tZ=awU_%zrBj3SWRms? zURMSexQm{|d47`^qn^TPm7Af(!U&_rc)^m9QnKI*bxXxx=6;qQi4p7qX*J=tW~YE9 z*59Dn;aBET?y|y3t+N+0O?lOUEG231f88<>C8rpmwsIZRT{?1vFLLD=B6nD0)91OD z=o6+go(&R_cDClD{SYKaXi7EmNc{N`e~HH}s9bqWf@*Qt{ikX11R>?B7f6S2`rG`+ zHx16e&rMbp z$&V4N9{FdYEPIsuC4_K-dla3}`8`0`oOdt09MKTcp=nx|S2w$!y?U*C>qgHHNdOCR diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf index 419dfa010d47fad9c033954ef6c1e2124b50c135..1bafff1239438896364ce13af454b911d5451a49 100644 GIT binary patch delta 323 zcmca1d4;duKP1GTfs>(uftf+T+09MiNvPHv1_p*D3=B;9{=xc2(Q0KJ3=GT-K(U16 z+{6L~X{G=M2DU38enx6yil|R~JWyT)$T!OX3UIZs9s}}YfP9sV+>#28GDcn?-v`JS z$W5#$U|<1iXJD8E#B6zqxtggLc^^dq6+8f1_^}|rxa9vu1|tRrb`zii1qKG7VipDl zMg|t9i3{Y^)qhAc{E%V%A^8tVpzYQ;_v&(AoTs5;Kont zOgunMKqFb@N}~g+C#x{)2r%_BL^A$hFk#YU2x2_Jpf{O=MP+gTb22k8!=lMvEORzz nu?8@y0X2cG1cnFD2T-;PkOwkO1xRxNX_v`om~AKTaz57=F&ZccxQX>Z_(PxKb*jX`?AZ2&0sVrc<3#Rl+r$b|%b+xzj37Zt87CXTAbUpsYRoL`zPwD|hDQolP_x1Y(yeWw-Y275add zCk(I^EDK7hc7MTY-$|iAp>83eZmWd4(?a2{xxdBydg{y5M6CSzbYv}{2A0bA@UjF< z3dWV?kKS)K7AwLTk#*hHg_3WZ-Trkm+hNisi;)n&?2EYX@jpiQ`e)3}b;dnRsE_D3 zwqR7fKo3Cj7DIrz>hj;2_dUtAn$d)3Mmm&Z=r@;!ax>!QKqxOppE()It)^|>3*{x~ zk3I-w(uhajhO)xS=%-LN(B9M<$|mK`P>xtw-n8rS4Qs^c&7h1~RFOpvHVSb0b+~G@ zIhdlg$i0dSw3RXKuaE2+FQB9&@;c`@wF2XFjJA=XL2^XS>T^r_ zoC0kwdi)KM?W;$aJ&TKsILOx7I6{q4{zPP}SHl%l7&}IkfaxGn1VhdxJ4%-|+eR%H z87Z}uctXHX@T4wb5%7`h6o#m$HNI5WKpv_icp9Rc&J#M_r9+Olv5iz^**{SG`QS!t z=SZ-?0v(*^SBPGwE<}RH47CZm| diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf index 805532868799ece5ed8a5e11557045b85a28d3de..34303e790a3d9d6445153ee0f6340bf187b4aa72 100644 GIT binary patch delta 236 zcmew%)gUlIte#;B0|V15|6qNi=(%Oh3=AwR3=9kj$+?LIjE~tX85r0jfc%b()Wj4~ zpZItN2IdJszF7uPfUAY|1d#s#$XCh8Evev3XFLkz1H~95auX{G7}x@UOoll?%$Ap! zn|hJ=Q54Yp6rg<{3-XIg{$FG;V&G+9e*jdVz`y`h%(l6R>m3sh10zs`iB;~3dVj{m z6*`j>cqJxYQJu`ln8eJ>uxN4`5$1E GI9mX|;xs=1 delta 1550 zcmb7EOK1~O6g`>Ar;W6VpBhDEKx!gc_j3PF;!Zov6y!`rZFY#xAj_ZxOWpBPg61xx`XMmy3)j|iKKki?1 z*Y!U4quv_<0m6VA4CeJ%;D~!Qxb8qlAlQirUT9fg?!bV)-IqHN(}#U|8 z@z>;=p-;uPZiJxh&I?)%VD$Homb7&}fBkLd_e1VhdxJ4#E6 zZM&9vMoMipp5QSQJgG}qczh%~jSTgy!k6mW$e9*`qaga|yr|MGI^=i*$4FI{v4z^t z2e(_hNP-m>XyOWgh3FD>A>uWD1SybxyuSCwZUGhml$<#qwUuk3;n0yM{2W)FA##T`HhqD6i9TT} zF$V?_uDoJt4pft(Xd-5{Dzq6JIAaT+=4>-;LOMY~J z9gu$}%CbkfXAnd`_b~SWG`z!y%}sYL(s=sts}|E%F{Rx@QoDmmwa(yD;2V-Z0Lw=Y A3;+NC diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf index 9a5c09a174eb6ffb89d325be9ca5f8085c706dec..5177c149e79c43b446771f526ba12488b972136b 100644 GIT binary patch delta 4484 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
P0d}+LoK1DwJNPq>(KhOac%Roww*Rx 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 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf index 57f9a8d5e32c7a8d98b6078bf6924242589668ec..b14b3eb67b837497932956db4124d3c726b15f28 100644 GIT binary patch delta 4446 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 RT#z(mb{fwgl>Te7^?%r)!esye delta 5713 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 M1*8)uf8bmJ0QK}T_5c6? delta 1535 zcmb7EOKTHR6#kN#BuykLT5H52BU(4MiI!GuaTBY>U}&o8!w1q%lQao74>M^S-3*8u z7lJS@Ty!IJ>q6WKf?GGD;194n5nZXMEB(%$38|u}2{-pVzx$nY&&{Xp@AuyAu_N~Z zZ8(!n3|{)M`T+2OpZQ$Htn10ZJ0Sd;`g*Bg=69v%<|wam9V^igxfOU$S^Nh}m1ZmY z)Heb|UsCU_n5{ZOlN9llD_Auvg)1*^_Yr>{=(<*~SOqv>0HhbNzvRkq!SB z=dIT79MStiAV3Ikrt|?{*tw|>Ycby;=ZU^%LxWEb)A`Jw@#HQHY1=$GjF>j&$y+d} zUH0UtW@vXjc`Js34_%ox$ATN4>_d0(nO zawxEjGA#a@Tus_cStkeTa_oc35*98W$xb0nJ)`iYx(;%>jbJN?emZAVxL;ioeMHEIkq<*agyR!fww_ z0WH?wpxNSA=2Gsm%t@`Y7cxzG)qyM}Y4CsDG7%+b(L-(LTBzG}3=9kj$+?LI4AM*i3=HfdAbv(_Vv49w zd^}J-1jskb019xmupR^Q=K%RC8M!4D9A%8WKz z`zVTmfkgpm-^YUd;*$Rt8H^Zs8Q4pJ3V?z@#Vnh>xHd8IFfal|m{{fb!rR|WT%jYt z)XNab_=CZONs}Rn@dSh3#4DPGg+2xs54+Ne!q4XaEp11F;H}?E>V1 Q3{wHpTtM1o@(0cs04udIq5uE@ delta 1556 zcmb7EOKTHR6#ix=X&zcze8l)b2DBBiBwDJ_;wDy0gQ2NSYb{0EX_6+v=3ypHtDD)l z5iBTiBlIsQi2i`0Ag%;K-1`gMxTql1@7$S?DvCP8oqNu?=Y01&=bk%HdLABq6mh~S zK!2Xj#0Tg5n?XPWpT%t1s^OUS1qgklezTaja)(k23zRoGE*5DB-}k?zEbFI=<;Hrj zsdWQ;zfTJs33RJ-OR3 zjSWxUhoP=#uFPzsU7tN!!@;g^o~$Dh==NlT@<~tj`>;PS{PMMLQjcd)#VYE^BF_X$ zu=%w(8nju+(OTwQ$8FlGSZ*!&hi6NuD379wnW0vqf1chZGL$T(xkwdSojl|HTq5y#br816v2>v$&S*R zV%y1Og`SdIg*&(m1yAx47A_x&P9jA;t?(tg4sxoE;3$XzF5Xb#HWy@j6X!`)hPjK{ z&l`72+a$pf6ST0zuMl0ME=1hIk0F8UN^W3;bCGKe(i(viXC-ZBQ)fVpM%Ii&z+xm) zM}g~UGEe858%l4jH)vkVy}kui^OzN~a=kebZWKF#Aw zV}`Tn2~6=#V1jxQS5<79789fNn&1ITL{iCuE7VQpKganRSHwrK^Q6^))9#%-)|r2u zW}C0{rJQAnomyipq?>Z80vSqD;Qu;hB1+7%huV&{QFFMECHyi+mM(IJ6&8J!bAfBZ zRNAvnB2vzFe{?Q_#0X8vMlOllKeArnc1;y4mq}1fHoJQ@P3|D19CZV^Ae{cz|FK<- z^Y49=QAyd1b??eOMXAc8V{bU*Tp}~+NXaC@A&pWeU-!yO2mj7mAb|Ku?Ofm_|Cf9W zZyc9D6J?phoG#`Q6?=APhriHNU_7M3r$f`UNb8(G^5V^7y;tABoVJZ2{S2nG HcZmG}8rBM) diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf index 5422d32284e55d220c6beaf05d2c6195dde407f9..939a565a99537829277c1f7b2f79c8a9e1ec512a 100644 GIT binary patch delta 236 zcmeB>o**zmte#;B0|V1f|6qNi=(%Oh3=AwH3=9kj$+?LIjE~tX85r0zfc%b()Wj4~ zpZItN2Id7ozF7uPfUAY|1d#s$$XCh8Evev3XFLkz-vII@auX{G7}x@UOoll?%$Ap! zn|hJ=Q54Yp5}4 FEdYKHGl>8I delta 1550 zcmb7EOK1~O6g@MOPg`jftu>;^fYyyA)lh|YSF6=vXsT%~wMaWn(j?lXV`loXn-Nsd zMWK+5i;6B>>OzVOcWy*ig5b)9Ag%@7SrF>EZziOQq9(k&`#ta6`|iu?jywBSJG>Sb z&^OYV?!?6Xg`0o|ex|Zz%hoSH$lH)GCIY$D zFpZT!ZbMJxi7&I-Sma|MYiN&b1hS5fXlo!Fln(}SIE0 zg2P{n%cadij@B~wDz4Hthnd=XxOc3Cii#+zoKb2e#^)JrB16einvYbWwVRn$mG44w zM9!*nE9#sQZ4TnKXW`>}hM7H&Sw@^foWEzOF{<`Ce8h8c9X4Y}h~hIHB#L0jxnxIa zQL$~*GRsJ*t-=$0hJq(`2@9W(WG9iLo>ur$T?08)NAMIx7o8VXxz>Oh8)H2A-6nTV1z6QI^}9oQZnS;Eh7Wf>xOSYgxWxfkdY zrZS#Y5|MV+=cDluBu8jUHS$RO`4NAC$1SK_c}#+8a@hT+Y4QXi<*64)hj9Aa{KvNp z&cDx1Miu2S*MBR^iqagfj@Cir*O0s$mWdglWt`G3ie z5v=|4&qP`F7Vas8aFlz5y9OQa@nLhb_AqKcee_+A=_?r5?;)Yz#+X`Xa7p`$#1Hy4 B57htw diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf index 2caee794c84ba19f70c2a3bc046b49faa23163fe..02529e3aca16ffd12755f87e1586fbd7fc453634 100644 GIT binary patch delta 4515 zcmXX~XL!`c)*eZ#)k-U^R@c2T*4K}h-3I`y1R(cJX6JA$`)<)P07gHDT5f(p-cV6@_B8@PB7>0O$arKDG8LJQ%tjU>tC5Y!c4QB72sw#dM6My#$OGgF@&c(v0ZO1U zRE?TY2kJ*7XnnK^+8S+#euj2KbI}5{5FLwti%vmjpmWg0=qfb10WC*&qx;cg=xOvK zdJU~c@1u{=7icYpVHCz;TFj35un1NkYl^kO+F_qz-LPD&ANCbih>gXHvG1@HHXmDt zt;IHDJF&gk5$qIJg>2hN`yir3N|9dV6a_>vQA1I4QM#y;=nK)8qCTR* zNzn+=7|{e#iReesY|%o|3ekGeR?%+Je$g?}Y0*W|HBq(bf#|8|mFPV#!dYC6TW}X1 z#N&8FycwR3x5vBSJ@MZ7AbdDJ8lQld;6LKC@rC#bd=tJM--jQ?PvPhB8~Ac^VxBksv-IniFk_j>P9g4xr$zZel-ijHo0o5Lb!6i2KA7;w4d=lwcB4B9j;;c8O0Ck<^zom9&wx zmvokNmE=hJN(v-}lChFvNr|LPvOuy-vO!WVsgN9$oRFN6{2}>M^0(xXPLM=eNBy{CQ_x;OlmH* zgj!8)q_$Igs6*6As*1WyU8Vk{?ojur8tMu4iuxd>r7EdK>Xjy>O{D44OlenXo^+tJ zK>D?GytGtWmXt1%u9j|+?vU=29+y^0uSlz<52eqg?`Sd2(mL8k`{_7ck8Vb{r?co> zdH_9)9z&PVrF0oRpI%C@qqos}=p%F`T}5A_uh2K?yL1ixlzvA4OV=_8Log&GWf(@q zXc#?XW^9a?2{0ih$~0hFG98&@7bb@p#1t_TnKEV}vy55AtYund{7L<}P!edBi+rUNLW&cQPQuWwcBwGstYRfULf(nJhz=CCil!mW`E7mi;7K zFWV~HE!!_UCOa*=D7z-BmOYR?mA#U^XK|Khm8^lavEC#bX6vy{*w$=2_A|B{o6GiN zzhb{;$FURHQg$XgmtDfHW;e3i**)wb_9R=yUS@Byci9^D8T&?#$R%=Cu95R{r#v8! z$s5X>%iGF3%0HL)kmt(>%7@8E$&>Q$C9m-2UjWS^*SuZSudD4HqK6&(~=itdVDiUEqD ziXz1~iph!}6e-1g#j>Pgtzxrcr(&<-h~kvuyyA-Dmg1h`vEqfIR*5MoC8yLWElRgi zP$rZgDO)N(R(4W;q5M+WM>$wILODiRto&X%UHOx8k#eQ-XXQ5KFUkYT)p2zrbqjTdI#b<6-BaCL zJxD!VJz70UJzYIty-K}By+?gaeNKH{eNX*Z{X$)*E*mhbTXY4dE7XnEeXEw!TLHBB`%6U2}2V@x}k$1%h1!%*HB;>X-FErGfXqgGAuAGH>@*kG3+uNFq|}087>=c8txiu z49^U2jEGTUWQ_)+&FC?PjP;GpjBSmd8ncc0#zDrfjY;G8#_7g6#-+x!#x2GQ<6&c^ z@uKmj@xC$nU*j7SYNAXk6K`^xLZ$|$mZo;5&ZcZro@tptnHHFqo7S1O zn0A@=nU0z&O&3g8O@Ep0o1U0nn%?muUdk(YJ#Xbbe27ou8}qIBkNHf#3*Vj3;q&=^ z{2+b^KY}mf$MQ*jB45H!<)`y0eom5Kz%Suf@N4*=`OSPezl-0)@8=KmmHZ|CHebX4 zYevmdv(n6)J?5zSBXb*brn#Fr-&|lWG8dbtnrEArm{*!NnRlBHnJdkg&9}^t&95vX z3uDn*Y!<&IZfR`!#M0T4V;Nu>Zb@3ESW=cnmNk~GmOYlEma~@R70YeQBg$jVub zR;M*&ZEQ`qW?8?q_O}kPjtxHe<=YBuMYdvFscn{Rk!`hYi><=nJ*!Ief*%>=;_t>NMkL+#i znf7k>{G`3WKGHtcKG8nSKF7Yy{sV9)e&;kceHS{ zbA0Z|aSV2hbR->994W^l#~R00M}_0CmoXLC6XU=yn!o|6aE~iUyHFC9fb#!I9dbs+! zhPuYMCcCD&X1Nx+R=c*icDeStj=Cyc7hN}8)vkN48rMtLTQ}k+-K<;hwzysHfIH3I z+TF$7$35I#?4IhL?Ox(u=Pq~ebsu-1b6<1cbw6>x_Fx{yqxIN40Z&@e)6Da+r?aQ0 zr=Mq-XRK$kXS!#eXN6~@XP4)o=alD?=TFZA&oj?EFX839Ca>EY@iy|d_IC7k_4e`( z_Kx&U@RoXKc^7-vdbfFh^&az9d9Ql!cprQJ^`So6r}0^ReqX}Z)R*D=%-6%$*EiHR z#`m3XnlI&>=Ue7WuJvv9?eOjO9racEF8Qi`k9@U$%CGj@{2_l6e+PdTe~!PuztCUo zpYC7mU+>@LKj1&%ukv5@-}cw|pZnhjBmpj934{U-1FZt>16hF{fxdwufl+}8fzrUN zz@os&Ez*ge=gI5=1s{3ciuoDrNG zTprvI+z~t+JRiIfycc{Pd?NrsEYN~N&+e5oU`$LCAzlEwomqXV= z)u9KWr=eG&_hCFthm~PN*cJ|iW8sG3=Ha&Cj^WS4J;M3nf#G4{QQ_k7wD9ck((u~w z=5R&$Q21oHDttM7D;d5QejI)kejmXjbVMC7MH~@-BpPWDX%qVPH zGoqQ%>}XzeaCAg;T(l&biq4O&if)MRitdY^j8;XH*P_+YN73ie4>3uMjTvILSTGik zHIB84wU2dez$W)7Y!n z`#2t_4;ds4xi+DynGoBqE5FZ&Yj?aiMim#2A#}CC%$FIll#a||nguHpe znD8gk60H-Ni7yia5~C6m6J?1-i4BQeiDQX#iCc+>iI-_e8l9$1v#0seB594%($hMm zWuK4_pMw4gnEW)v z-=OA(ekDXNEMNx2dT;}0AU1*poQE-I0fM%Kcn)fA;xJgrWr#&^1J_{CA8>)|5U)aQ9E?f9$=}0DZa_X4E;bwDLYU((7;_Vj)t%NY zsI7zrRYTkZ`E7{5!hCli9)v}#f!cEDAED82;XVO8L=tbCDr}qS8Ufi5Xj1^d3*n(P zf;bZL;n3wz4Fj3tPhi1@+p9$nZgr^SXKr90uFb?MU9{Lrj z=NS%Uf4T1Cb6VtdswQ_d1DAt=C~o!^?p&K1nir(eX`mat1a+4KOSQ=FU)~^pt2VW) zmm{?>Pe72=Z+U4L1D2;=j#*f)8P^Hkk-7(-2mD;{pUD6FxscUmc0!~e=B9MLrbz1| O;Pc@Oh^5Z;QvDB8jLj$j delta 5761 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 Y{@>4ns;-tBl7h@i_bzOl-uQ*>e?wZrf&c&j delta 5709 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 JGfgXP{{eevsP6y( diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf index ccb442822d992698f4fece43f0882266d4daa63f..a1178c2dad25b43968877184c35a01dfc370f1ee 100644 GIT binary patch delta 4460 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 delta 5732 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 YRl~+0!|;3ZGVa*P^LTbo?&H$~0O}1P0{{R3 delta 769 zcmY+9J8u&~6ot>)n?!!Z1usP?NK?5$$!?SeNP&nfD~e>LNWh{XNbB8+y^42dwKI`v zkPAdXfn;PvO_7pGkwl?Rb2sddesfYY_;O2a!yI{8XqD zv8PmjD80hjAXG_fkjL7@K`J;YbE8$-i9?xc8HuwrlDRMgDR#3Uq_dR`(UrN5RVuc< zt${Jwj_;2~BQMB;b+&mb@B70-MEjlnR{P+ny~)<8u6-UKLZQcFcm!f-+JMI(r;i|! z(C0X1PT_=hk6xjVA#2`3v{(t*m7s+Ir)Ro`Hb6>+;!erD8MC06?64S8Fl8)xt-u+1 zc70AZ6p{41$S4uoXmMtP_3lN#rq)bTV4DxzVz=SWumhiabg@0^%(QM5Vjc%_{>kUB Y<{zS&>0qC~XyX7!w3~(K)T?{{0ifEK%>V!Z diff --git a/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf index d4d26d7ea161f6bf46045adb94cdac8a810dd134..912e1fb2452d3bfe0a6161603df6d9be42e6a24a 100644 GIT binary patch delta 155 zcmZ1>bwYGP7!%i?i4heNa~3SR!N9yx3=lRW0}sP)D4U6akKs6!&5R_@g2ZNJP-D0X YRl~+0!|;2u5LfJEF7DlvfAQ!602V$VlmGw# delta 796 zcmY+9v1=1i9LK+xoNcd7I;aIH8QzpZ+PgH1(m|{tlt3ubYH+B+ectc){e9oPPit@2pL7c4%F|nS zFMNN!_6S(|0@&45X8PX{AyE4B?nhX(51rp{K3umS+QoJ2%H-?P&9Q~)w+MmT$l1XH z?i*ggG9DN%;T#?tF2ltu!>hQ6&nUvO9Xj2?FT)l}R>yDwt5(-=ai(sMXAWmjwNfKm zK*f4)coA2v_l6zne;QuFdF!v?5~_u>hRZlCTsFLl8--^Lnch=zudhYDwzVa8rR)tN z(MkeWOkO(I#{04>wG?qCe4&*eMnhj63wdOeZa$DlH;}_dU&Wb@{X}pwQaY1KI}V~G zi$Zadgpm@uABmmR51346Lv$jQ#WE3fx7OD>-S)iEXyp2-U!lyEs^<-Ilgw+k8qK|f z<|d_+Z_dZ@J|w!_np+@7#^`fvDCQ6mhRh1btVtX(?lMdCFksJ}JI!|js)lHw&*`bJ zX7rKJA-^+XU60w2EVkJUXqfOE@mhfs^7MK|)-;KjcaYK|FsJ#M4fZ>y`ix#vPk}mr xutv4!O0f-(YjnC?`b@npA1uV`Wq2aKD!>Ey+-`yZ4|wbUX&4qM)JzerKn!XEf)0=l0Lc=e5gQ7u`br<(tRnYd_xK zcm-5;0k@H=%={Z60_uYgKQCN2`qFBCdbae?zeBN-uXd2-T=H&~awsAQ7CD+GHx}#Gy1<^~bfwN>m56O` zYhX;e)osVj9N2Ifo(o;i`|Ah#SVP#@zwUIGt;`0i+LQ-{FBdL Y%|9e#rh|R{qKyL_(Qf9V(^Ad*50*5RasU7T diff --git a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf index 99b91bd312ba69771e65be5d612d3a9e0efa5e5a..9ea42ab0960415a70faf933a45d5a75aed1bdeeb 100644 GIT binary patch delta 183 zcmdlWc!6hv855h!M2ifGISUruU|?X0VPIf9T998{@;{d$g@J)hW#bMDCYILE=U#07 z!j#R(%*U{9auQ2uFf#)q3nv2uLmWda1BA`Uz{9W`%4TBVV>k|FGb4$!AhB5))EKTp w)vz(hF#Mi8i#2xgB(~jrKx3JK7zqAnF{DhM$RWbRz{tSFz`?-u|33pi03?ef8vp7?v$J) z2fcU@l!#{!{Q$mP1iyp$4FnIKyeJ+#8UHZ@CObUO^LyTRU_O`MTz!7WE?&NV zTz?8UCzNWUGCdg}1d31IeyH2dkMCdQ`(Jj?%H6c?j@!I-VI`g^SmQE4YPE$iZ?-ob(XC4O=K%$A)cGthV9YT-*ugoII*lVu}jbuwEHn z!aeJq;S%eA8eYMg^~Z1-Rr{LZRh-y$!xh}OUyhgar=vsFR$7TD6TZ-?AIgEB_JleU zdrEcs(w!OO1ZvRerctINKNjqism@f~iUJvDG87kaC{v-kQtT#vKw~nS;#j6xq++q{ z*1B3JJDxWj4qZR-H(2JXwBz+>Lo%!oa{9vT?@_MwVUwUR~K- z!X(Ye%*U{9@+9WaU}gqJ7ET5RhB$^;1_+yxfrnu?l+DDz$8a3VW=0ZcL1MEqs4-lH ws$pZ0Vfa1y6ie*nL#(^`fW|TdF%bOEVn~^MkX?j_fsuiUfrEkR|9=L40FFQ|- z1XqHB8quu_U%-z=!FO=w1Gw@5+~}(DA9KNEF87?@`JM~sN%=?h&XBiQ2g@o{9HJ--xqg3YwL!vuZ!E`*Y^F9!1OCZ;ute7VF`~7mvI?S z4Oeg#FAOik#e2gmxQTDDA)FFBJ;Wcw0u^y&*uskF7`Es9PB>>2P!p+1TEe<`Yq*Fz z;*;SL^M4sGV^v%juApXJF}#ci*0$jl+_T<{8_x0QKy{Q>GR~zhb>@fBz|T&lI+43d zb^DP!Q^p9?pxMjfT*rPQSs7(IS4le#q9l((d6tAxCUq~8JE6Jf@(AJBFRWI$hZZiunoLmr3!ws-LjV8( diff --git a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf index ff361baef7eb5cb0e98a1cdd8976fd1d6ce0659f..281b47523407df5ca94270dc96c51a84d8d998f1 100644 GIT binary patch delta 155 zcmX>j_=abK853K=M2ifGISUruU|?XWU|?W8T998{@;{d$g@J+1VdIVrCKef4PL9ng z%;Aj8d<^R**Rg~KGcz!9)}(PRYDzy delta 769 zcmY+9J#W)M7{~wTytJWdC0>P4h8s`@)Y?@Cs5(?sQB+lmISKzWz^_nz@9so&36J$4beix?WwMz_mNPcxKpui#%yR7J8T9NOqeTPD{)Gm zUZ0T-MHJ%>Qc46io8MVwzk4yCQ){XzvB4i)=d|HTu?3H3ba7njOttP6VlEdlzRBaO YW`87SrGq`bqK$nV(ytYwlkKYeA6N#JPyhe` diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,3048,304A,304B.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,3048,304A,304B.ttf index 33989996ebb10407976a9294b08606039055d2c8..6770dacabc0e8f1a1a26e8be550fbee4ff2e5164 100644 GIT binary patch delta 91 zcmZ1>@keAr7!#Mn#E1-uGMB5D85lS`7#J9@7UUO~{BL70VqoA>n0P}@h%17DfkCA# vx1@q)3-eK+sK;gwMgwLRLxU%-n{8P5S(tel7ESi!n6sIW(}Z#IDegD`)ypZ!yd?a)h6j0C*rR4+Y z%`ZSjNx?TDN<@VObH<3ILnnLpW@l&T_H*VgbyJKvZ~gsRYWg{T0oYrBb>41y`s)%a zfb-OUnM;mI0O@W+pUHdcf#`c+izQ2bB=vQ$E+?fmg~!2;eVc{_A>(k66{}G`E|jQ7 z`2@1DtKikn3cm);)5aPWc^b@IoWjEbDrlj}nuiQC568S^a6-l&YN!)Y*o-&|1!fhp zdnloUGHX8!m+^@ACi!J*D5^IZ%Va5NpHhZgz&3J>dCD8|uyk%jVxF~P*zOTG78RCh z%zSFd+UVe4J0)~!u+B%8aLB)JhW7|)8c_tz;0^4Cx#m_B@!<`5d`*Y^cC;B|!VNdn UL6sZKvp@I$p2T0%U^a2^4V}+pj{pDw diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf index 66b98a6d1b6d1d7df61f2ae0573ed8479cf88cfe..0c662199c2ffa5dad0eea90f4addd2aa5b612985 100644 GIT binary patch delta 91 zcmbOu^+9Yx7!$Y2#E1-uGMB5D85lTi7#J9@7UUO~{BL70VqoAFnRr7^h}(yOfkCA# vx1@q)19Ll2)MhgWqW}vFbJH2c%`&XYEX=$NizYj9&e_bwWx_alA5RWD delta 523 zcma)2Jxc>Y6r9bS;F%~sv+rYJxO7*HCEohSwZ-{o>jtoP0OPvV^wifa zwt&P#|7B$^@d+T+X{amn-slm1A5Ds+X+D)ss-xwJRnth~aj<6%Q!pS*3vpycCd{XW z6xA@FK{nPKy;@n}*PwV>*v1A=gPDU%cvwdTO}MOiNHg8 ztB~D=jW)`x{V*KHbKYI@%hZrmcNxoMNhqIEnq0sEa*TP(YjRXNHzu*hS}|z%h--@y zn>40B8L>7#_}7k&4h`1%NE>JT`+9hnfT9seP!Hb4VUR0sMG}v0$m46;-gu?^S)v%bPw#A$@k{n=sY^q*`_VLc2=ra+>Su;#wqTFVorHlk%miV|WW5wU-oBh(r>@FvV(wM}!oW z2#>;49(w5^Q*>0v Ou>Sif{w6rokA47BtzKII diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf index 28043592ea1262267d65e4a1f3bb4f12e6162902..465ce3479c94571b9cbd69d397fd08fa2d4c63bc 100644 GIT binary patch delta 91 zcmX>iGedGh7!yy-#E1-uGMB5D85p=y7#J9@7UUO~{BL70VqoC0nRr7^h^K^sfkCA# vx1@q4m)RXCnzEUL(Snu5nB#lsW*0VP7G_?CMU%6*=4{sDHesCnj5iJd*?bx6 delta 506 zcma)2%Syvg6r9_{(q|}&pdfO=F14a&p{^7}5duXj;!dJXU-S`rW9zQy!fq|y2>KWK z1@Q}9_zB_*&*Sk@FK`dq)5I96tF6@fBUm;dR_dJ?Ei8=t-nuimec5g%s5g z8!%%-Kb|(lpaze}#V*!)T0~7;LtzaSbkOFVLV-x3%&ve28KHEB0;j9coCbw^<#sBs`N+0l9=@Sgb|L2jr-xz&bc|SQ(yU~V?|#YoH%nck$wwg?f~`1ZF~OrJvIP6 zH~5^->stT{-KKx7?I_Qjt_3;qu4x}pC5%L$9uSmkLFHE;zFE2yH47VkV1i9B4eE8>!jBRHsYBC(%vB+5ipvU{-5 zfz7*LMuYX7eT#gX8j|WQR+}sd-=I`XF5>_uYl-qPIW29DNGwAJ3)$KJI+u~DRYr~e z>@9S;P@O+z;f&wdtH<7_ujDND*~8%w`wT&Ho({z0@*VQsBnWS)#XxpBt}(F^1R-mODb5lFdqf-3pU;`U}pJa$eFsChb5hnnU`VF`Ao0C*< z?x3@SgFnPw&x;Y$O&-ZT_ug~QJMZ4lz8Tl+8GZhyVprzg^$Q^D0qVKe3Bs>StODbo z07PV4W^R~&2J|BHLevh=v?uk2`NHGJvZ@V@+lRrF)>PCyUi(q@t^gH^rehLiWi7$e zicp#fo0!h{cty&s0dc*NW#-=c<~y31&hB@p%~CCPQ{pvqXIydryCsNi%FaEV-BBH?-A8F!{|DL?O%R)#af<<}pCU#>Saw~%M^o9by#wXuPHX}_q X@rHafxxpIetN)*w_#5hPiGDC2J852j$M2ifIGMB5D85r177#J9@7UUO~{BL70VqoB~VPIfTD9cDqWIrgd z9mp>M@>R-mODb44Ft-EwDI0GHu&|tK`Xame4NEm6GcUuU$ysc3Hfyn)Fiw8P83zE{ CP99MJ delta 515 zcma)2u}Z^G6g{sAX;V=m>i&j~T2X^kCtU;~P^9h>+q7wE)6m3Ja43q{RmtMuM<^Yf z1@Q|U`~(O8K~HLgbdv|U=iGPRxi{y2@pbujJ69~+Rou$byM6^|4M4f{`$719gH1sH z1Rx{VvGXs+Gf-5;dYG z)kD}Az~SAmqRUz*_o#R1A?fb1I#fx7Can^24TrE;tF%wVS!-*?VihtLg_Y3;mywxO zW(WO^w-IrnHh;>-DZk0AA$iETlD%ZkK8~h1WC)V|Y#;%bA5ib7K?GAT2C~O?i-}cf OVEy+|_D#G~IQaoGRAE2> diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.61,63,65,6B.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.61,63,65,6B.ttf index e869ff1faaeb94808eba591625f2a308f00b21ee..34c7788b405fad3cce9032f8cbf4dc7cf54ed65c 100644 GIT binary patch delta 100 zcmeC+zr#JjjEQy0M2ifIGMB5D85o$?FfcG)Eyyn}`QOH1#K6GX!oa|wP?nLJ$bL{@ zJCMHv$X6-LEvaCuVF?2A*KEAez{ny$W9#0{F-*aX%)AVXCU0V%v$=@HgmJPSdlUc| C;vR$m delta 532 zcma)2y-LGS7(KU%hFa8uFK~yBTK|F+HfkSM@HdG6LC=d3(@h@9J@?*o&pYov6+Y)~)^ho!Tide>Z^i|nUjyoS&<>-oORNBS z6M%?4*U_KNN9Nnii*YkL)tc%SbNk`l9@AbvhBL$2@iRp=@jAHE?~72OXa@2qDXS@- zQiM`Z@ia=gtD!YfQu-buo&f7udQ#4$4qCuHowLxUB8&6Fch zC909#gM$uS_I?;X;}P=~`7SjC)mw}%Sprd?Qj%Q74$6!b%1d%qx;!E=&)$AA9fB(3^X31~O#TfG9OK{{Z+c_~ diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E.ttf index cb502388e50be4426f03bbaf1a4787e0fc2c8956..b9bb5397495e2d333ef651822342c182ca788012 100644 GIT binary patch delta 99 zcmZqSy}>!bjEQB*M2ifIGMB5D85o$>FfcG)Eyyn}`QOH1#K6GP!oa|wP?nLJ$bL{@ zJCMHx$X6-LEvaC!W|{@$ubFt`1Pj-@gr}RAFmf|8^D-=&yoqVf<|1Yj#>skYVE_WA B9;E;P delta 531 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 z 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ξC}jjpoubXLgGlhlU_VEG{s3dY$D9t?;{Iq0Ewu$M#J>YeB9&CLh>Lm(JDHN~X5YsuduL_wk;?eK~iO+z| zap0OR2~j|M-#uD;>dbAl;Ss54olE%?oPB8+wmmem(jl3GSwu%@H}Np03dTg_0dz>e z42(4gem>PNM@nL&Ur>``Oq6~>UHCXDFVssRIuhoaAbhG`Jk$$iIYzs*q+P_fbW^*? ziDbr>ol}9M7Yn*>!4=g!>+`}aw?(LkuPb@$-G z9?ii!yAK||{-uWp_oG9ZFfz-)B(Vi?A9+FY!8`OA^aZ1p7~_PJNIUzF*e!puPp>C# z!+zPk*v_&yU3betZ~{kBz63gxnqTx|fa6xqcZ!8>4U5cYYr)K*0>a|>?jBb_4s2e0 zM1S*=7oFcDE(li`l-s6(6Po0j_SyI04Hf6W%6+Os0{p zHcXEl6L(BNsw`(ybF372oQEweN(ew_FCvdbb$E>Pj)^>aQ2M!L9h|L>LXX7|Sl$A? zOi>7nV`7g`>9aN&K0|dVs@xFqXqU@`{0ULT?6*H+<^GJ{-n*+wZYFHL64*d>%U*Y! zyUJf;cpH*NdN{;$DT*U%9MoD8$ylxHpn7q{og0iHAig+6_=mx_?>^B4u<^5^r-S~{9Uo)rp z$ISA_%)=q(*nNoDV*k+7S!M#-hi4AS9NY1wklmZaa$aGb!qDBnJXZ^g8Ku^CjF=tv z9MCP@hXmOfDP8}Vl_ACjyg;5v=2luDMRac~dXr$!E6i6&&^vqg1j?mj$$A-JP&KpY z&ySeJk2bS7x@{KJ#-?8I^`+dQdGyAsCjm%_V2jup=XkAiZ1*^w!_jSX$S)T{5(KTC zy8&{d6ut54DG;t8E}-pS+-_Bcg!Qu-e8>!FrI0>{Z{0Qnv2;-|M$0AIels+rB>of1 zhA=MXJ5)Xd#-i`MdRjai%o==7YF?Nd8cMIpNR4)`X%0OepAC6lfEDz-zIEGN(+&t8 z?6VN2R4Zkef$&Earh*B%*=+f6ZTZo6UcCUscbb*X*7jD1!Zq`fFG2NehjU3Yp<3;J zgXg-Ht%`v2A*=E}&kk`2B8(UTgidH-lq7VfBMt~|9Vcr%9I@pL5NsmmLfCXnQ#H8w zqW53DD71r6%#ye~&FScS%gQ2%Okf*%MAS`gP~3Z;j0*p%RBZ@arp@V5>PsD2I<3R|(U)Eob3Qwx_;1zY z^k1BO_Q}UrXPo{l9`i#+{x5ivboahFaw9p}#Qcm&XyDDwz^BV4!K15_L2n%HzBF!7 zuy+|%-K(_&Gwj1#hVADa2qvrTI}eT&qiRI2ziQN)?KU!;+9 zp=Xa7^Xsp@G-k{j4O?*u#e>q-B&q7iUlIC!E2bunO<>#}XGv5hRAR$%MWH^!U4? zJ<)>c-8_NB{n8T%nBr0=@I66FVE^O{VLYpP8U|2O8`T@!oMOVt58m*LKiRCBbftnn`|8pSce1F!KN=y2__1KD@PXG1!`wnav}WUmW{5} zqxoRO$Fy-e-T2&7sOX{7hpA%JJAKYYuL#8>t_LHGi4#B{%4uv};h2w<3yUiZDij{wJ8rwKC)`R{ zgj|MKnTEHwUDw!(?{XSUb)z=FqW+RK`T*TpH%ELYp_Gw%j>0;*oas=Kly@M$L%T^6 zV`E^Ze`^j9vQnY!3M&^-e%OSw-p9*Y%0vt89N{bWir)Sn D*-~Dh literal 0 HcmV?d00001 diff --git a/test/subset/data/tests/basics.tests b/test/subset/data/tests/basics.tests index 794510d87..c310722b0 100644 --- a/test/subset/data/tests/basics.tests +++ b/test/subset/data/tests/basics.tests @@ -1,5 +1,6 @@ FONTS: Roboto-Regular.abc.ttf +Comfortaa-Regular-new.ttf PROFILES: default.txt diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py index 804ed7170..6c65627e3 100755 --- a/test/subset/generate-expected-outputs.py +++ b/test/subset/generate-expected-outputs.py @@ -20,11 +20,10 @@ def usage(): def generate_expected_output(input_file, unicodes, profile_flags, output_path): args = ["fonttools", "subset", input_file] args.extend(["--notdef-outline", - "--name-IDs=*", "--name-languages=*", "--name-legacy", - "--drop-tables+=DSIG,GPOS,GSUB,GDEF", "--layout-features=*", + "--drop-tables+=DSIG,GPOS,GSUB,GDEF,gvar,avar,MVAR,HVAR", "--unicodes=%s" % unicodes, "--output-file=%s" % output_path]) args.extend(profile_flags) diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index 0a1bb1076..7bc8e3aa7 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -66,7 +66,8 @@ def run_test(test, should_check_ots): cli_args = [hb_subset, "--font-file=" + test.font_path, "--output-file=" + out_file, - "--unicodes=%s" % test.unicodes ()] + "--unicodes=%s" % test.unicodes (), + "--drop-tables+=DSIG,GPOS,GSUB,GDEF,gvar,avar,MVAR,HVAR"] cli_args.extend (test.get_profile_flags ()) print (' '.join (cli_args)) _, return_code = cmd (cli_args) diff --git a/util/options-subset.cc b/util/options-subset.cc index 8ce194604..f5c2229e1 100644 --- a/util/options-subset.cc +++ b/util/options-subset.cc @@ -29,7 +29,7 @@ #include "hb-subset-input.hh" static gboolean -parse_nameids (const char *name G_GNUC_UNUSED, +parse_nameids (const char *name, const char *arg, gpointer data, GError **error G_GNUC_UNUSED) @@ -37,7 +37,19 @@ parse_nameids (const char *name G_GNUC_UNUSED, subset_options_t *subset_opts = (subset_options_t *) data; hb_set_t *name_ids = subset_opts->input->name_ids; - hb_set_clear (name_ids); + char last_name_char = name[strlen (name) - 1]; + + if (last_name_char != '+' && last_name_char != '-') + hb_set_clear (name_ids); + + if (0 == strcmp (arg, "*")) + { + if (last_name_char == '-') + hb_set_del_range (name_ids, 0, 0x7FFF); + else + hb_set_add_range (name_ids, 0, 0x7FFF); + return true; + } char *s = (char *) arg; char *p; @@ -59,7 +71,12 @@ parse_nameids (const char *name G_GNUC_UNUSED, return false; } - hb_set_add (name_ids, u); + if (last_name_char != '-') + { + hb_set_add (name_ids, u); + } else { + hb_set_del (name_ids, u); + } s = p; } From ff7fc6d488f37e3faaca4986cde35836f013b03f Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 22 May 2019 17:36:16 -0700 Subject: [PATCH 368/617] [subset] Add morx, mort, kern, and kernx to the default layout tables drop list. --- src/hb-subset-input.cc | 4 ++++ src/hb-subset.cc | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index 098f13e7b..34f1cb863 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -56,6 +56,10 @@ hb_subset_input_create_or_fail () HB_TAG ('G', 'S', 'U', 'B'), HB_TAG ('G', 'P', 'O', 'S'), HB_TAG ('G', 'D', 'E', 'F'), + HB_TAG ('m', 'o', 'r', 'x'), + HB_TAG ('m', 'o', 'r', 't'), + HB_TAG ('k', 'e', 'r', 'x'), + HB_TAG ('k', 'e', 'r', 'n'), // Copied from fontTools: HB_TAG ('B', 'A', 'S', 'E'), diff --git a/src/hb-subset.cc b/src/hb-subset.cc index ba81dbc02..b422a06cc 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -254,6 +254,10 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) case HB_OT_TAG_GDEF: case HB_OT_TAG_GPOS: case HB_OT_TAG_GSUB: + case HB_TAG ('m', 'o', 'r', 'x'): + case HB_TAG ('m', 'o', 'r', 't'): + case HB_TAG ('k', 'e', 'r', 'x'): + case HB_TAG ('k', 'e', 'r', 'n'): return true; #endif From 831c213501fc38229755be7958b2952fe0cdff0e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 22 May 2019 15:46:19 -0400 Subject: [PATCH 369/617] [gen-ucd] Minor --- src/gen-ucd.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/gen-ucd.py b/src/gen-ucd.py index 9d51ea7e6..beec65f1e 100755 --- a/src/gen-ucd.py +++ b/src/gen-ucd.py @@ -5,12 +5,14 @@ from __future__ import print_function, division, absolute_import import io, os.path, sys, re if len (sys.argv) != 2: - print ("usage: ./gen-ucd ucdxml-file", file=sys.stderr) - sys.exit (1) + print("usage: ./gen-ucd-table ucd.nonunihan.grouped.xml", file=sys.stderr) + sys.exit(1) import youseedy, packTab -ucd = youseedy.load_ucdxml (sys.argv[1]) +ucdxml = youseedy.load_ucdxml(sys.argv[1]) +ucd = youseedy.ucdxml_get_repertoire(ucdxml) + gc = [u['gc'] for u in ucd] ccc = [int(u['ccc']) for u in ucd] @@ -59,9 +61,26 @@ for line in open('hb-common.h'): DEFAULT = 1 COMPACT = 3 + + + +print("/* == Start of generated table == */") +print("/*") +print(" * The following table is generated by running:") +print(" *") +print(" * ./gen-ucd-table.py ucd.nonunihan.grouped.xml") +print(" *") +print(" * on file with this description:", ucdxml.description) +print(" */") +print() +print("#ifndef HB_UCD_TABLE_HH") +print("#define HB_UCD_TABLE_HH") +print() + print() print('#include ') print() + code = packTab.Code('_hb_ucd') sc_array, _, _ = code.addArray('hb_script_t', 'sc_map', sc_array) dm1_array, _, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) @@ -91,3 +110,8 @@ for compression in (DEFAULT, COMPACT): print() print('#endif') print() + +print() +print("#endif /* HB_UCD_TABLE_HH */") +print() +print("/* == End of generated table == */") From 36dee9221f8de3a2a6a23f0548460aab4982b594 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 22 May 2019 15:51:53 -0400 Subject: [PATCH 370/617] [gen-ucd] Rename --- src/Makefile.am | 1 + src/{gen-ucd.py => gen-ucd-table.py} | 0 2 files changed, 1 insertion(+) rename src/{gen-ucd.py => gen-ucd-table.py} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index fc772e0ac..6e69105ed 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -258,6 +258,7 @@ GENERATORS = \ gen-indic-table.py \ gen-os2-unicode-ranges.py \ gen-tag-table.py \ + gen-ucd-table.py \ gen-use-table.py \ gen-vowel-constraints.py \ $(NULL) diff --git a/src/gen-ucd.py b/src/gen-ucd-table.py similarity index 100% rename from src/gen-ucd.py rename to src/gen-ucd-table.py From 12c59f6c40401c8221facc5d0aed63f510a77dd7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 23 May 2019 13:33:21 -0400 Subject: [PATCH 371/617] [deprecated] Minor --- src/hb-deprecated.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index 4a5e702ff..026a62c74 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -63,7 +63,7 @@ typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t *glyph, void *user_data); -HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func or hb_font_funcs_set_variation_glyph_func) void +HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func and hb_font_funcs_set_variation_glyph_func) void hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_func_t func, void *user_data, hb_destroy_func_t destroy); From 65392b734e38668b870b1ffcbfb4b42ec289ef58 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 22 May 2019 16:21:21 -0400 Subject: [PATCH 372/617] [ucdn] Replace UCDN with a new UCD implementation UCDN was ~120kb of data. New implementatoin is 69kb in default builds, and 49kb if built with HB_OPTIMIZE_SIZE or __OPTIMIZE_SIZE__. The latter automatically enabled if built with -Os or -Oz. There's room to shave off another 10kb or 20kb. That will follow later. Fixes https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/Makefile.am | 11 - src/Makefile.sources | 5 +- src/gen-ucd-table.py | 11 +- src/hb-algs.hh | 8 + src/hb-ot-layout.cc | 76 +- src/hb-ucd-table.hh | 5160 ++++++++++++++++++++++++++++++ src/hb-ucd.cc | 209 ++ src/hb-ucdn.cc | 272 -- src/hb-ucdn/COPYING | 13 - src/hb-ucdn/Makefile.am | 16 - src/hb-ucdn/Makefile.sources | 7 - src/hb-ucdn/README | 40 - src/hb-ucdn/ucdn.c | 361 --- src/hb-ucdn/ucdn.h | 472 --- src/hb-ucdn/ucdn_db.h | 5790 ---------------------------------- src/hb-unicode.cc | 8 +- 16 files changed, 5427 insertions(+), 7032 deletions(-) create mode 100644 src/hb-ucd-table.hh create mode 100644 src/hb-ucd.cc delete mode 100644 src/hb-ucdn.cc delete mode 100644 src/hb-ucdn/COPYING delete mode 100644 src/hb-ucdn/Makefile.am delete mode 100644 src/hb-ucdn/Makefile.sources delete mode 100644 src/hb-ucdn/README delete mode 100644 src/hb-ucdn/ucdn.c delete mode 100644 src/hb-ucdn/ucdn.h delete mode 100644 src/hb-ucdn/ucdn_db.h diff --git a/src/Makefile.am b/src/Makefile.am index 6e69105ed..d126c4017 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,17 +87,6 @@ HBSOURCES += $(HB_CORETEXT_sources) HBHEADERS += $(HB_CORETEXT_headers) endif -if HAVE_UCDN -SUBDIRS += hb-ucdn -HBCFLAGS += -I$(srcdir)/hb-ucdn -HBLIBS += hb-ucdn/libhb-ucdn.la -HBSOURCES += $(HB_UCDN_sources) -hb-ucdn/libhb-ucdn.la: ucdn -ucdn: - @$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn -endif -DIST_SUBDIRS += hb-ucdn - BUILT_SOURCES += \ hb-version.h diff --git a/src/Makefile.sources b/src/Makefile.sources index 0615a8bfc..f6bcc4159 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -145,6 +145,8 @@ HB_BASE_sources = \ hb-shaper.hh \ hb-static.cc \ hb-string-array.hh \ + hb-ucd-table.hh \ + hb-ucd.cc \ hb-unicode-emoji-table.hh \ hb-unicode.cc \ hb-unicode.hh \ @@ -224,9 +226,6 @@ HB_DIRECTWRITE_headers = hb-directwrite.h HB_UNISCRIBE_sources = hb-uniscribe.cc HB_UNISCRIBE_headers = hb-uniscribe.h -# Additional supplemental sources -HB_UCDN_sources = hb-ucdn.cc - # Sources for libharfbuzz-gobject and libharfbuzz-icu HB_ICU_sources = hb-icu.cc HB_ICU_headers = hb-icu.h diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index beec65f1e..5c1bbdb75 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -24,12 +24,16 @@ sc = [u['sc'] for u in ucd] dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd) if u['dm'] != '#' and u['dt'] == 'can' and not (0xAC00 <= i < 0xAC00+11172)} +ce = {i for i,u in enumerate(ucd) if u['Comp_Ex'] == 'Y'} + assert not any(v for v in dm.values() if len(v) not in (1,2)) dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) dm1_array = ['0x%04Xu' % v for v in dm1] dm1_order = {v:i+1 for i,v in enumerate(dm1)} dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) -dm2 = [("_HB_UCD_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % (v+(i,)), v) for v,i in dm2] +dm2 = [("HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % + (v+(i if i not in ce and not ccc[i] else 0,)), v) + for v,i in dm2] dm2_array = [s for s,v in dm2] l = 1 + len(dm1_array) dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} @@ -63,7 +67,6 @@ DEFAULT = 1 COMPACT = 3 - print("/* == Start of generated table == */") print("/*") print(" * The following table is generated by running:") @@ -78,7 +81,7 @@ print("#define HB_UCD_TABLE_HH") print() print() -print('#include ') +print('#include "hb.hh"') print() code = packTab.Code('_hb_ucd') @@ -90,7 +93,7 @@ code.print_c(linkage='static inline') for compression in (DEFAULT, COMPACT): print() if compression == DEFAULT: - print('#ifdef HB_OPTIMIZE_SIZE') + print('#ifndef HB_OPTIMIZE_SIZE') else: print('#else') print() diff --git a/src/hb-algs.hh b/src/hb-algs.hh index ad756a64a..007db9e40 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -34,6 +34,14 @@ #include "hb-null.hh" +/* Encodes three unsigned integers in one 64-bit number. If the inputs have more than 21 bits, + * values will be truncated / overlap, and might not decode exactly. */ +#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z)) +#define HB_CODEPOINT_DECODE3_1(v) ((hb_codepoint_t) ((v) >> 42)) +#define HB_CODEPOINT_DECODE3_2(v) ((hb_codepoint_t) ((v) >> 21) & 0x1FFFFFu) +#define HB_CODEPOINT_DECODE3_3(v) ((hb_codepoint_t) (v) & 0x1FFFFFu) + + struct { /* Note. This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */ diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index f5c11d8b3..1945df4fe 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -158,84 +158,82 @@ OT::GDEF::is_blacklisted (hb_blob_t *blob, * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693 * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875 */ -#define ENCODE(x,y,z) (((uint64_t) (x) << 48) | ((uint64_t) (y) << 24) | (uint64_t) (z)) - switch ENCODE(blob->length, - face->table.GSUB->table.get_length (), - face->table.GPOS->table.get_length ()) + switch HB_CODEPOINT_ENCODE3(blob->length, + face->table.GSUB->table.get_length (), + face->table.GPOS->table.get_length ()) { /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */ - case ENCODE (442, 2874, 42038): + case HB_CODEPOINT_ENCODE3 (442, 2874, 42038): /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */ - case ENCODE (430, 2874, 40662): + case HB_CODEPOINT_ENCODE3 (430, 2874, 40662): /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */ - case ENCODE (442, 2874, 39116): + case HB_CODEPOINT_ENCODE3 (442, 2874, 39116): /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */ - case ENCODE (430, 2874, 39374): + case HB_CODEPOINT_ENCODE3 (430, 2874, 39374): /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */ - case ENCODE (490, 3046, 41638): + case HB_CODEPOINT_ENCODE3 (490, 3046, 41638): /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */ - case ENCODE (478, 3046, 41902): + case HB_CODEPOINT_ENCODE3 (478, 3046, 41902): /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */ - case ENCODE (898, 12554, 46470): + case HB_CODEPOINT_ENCODE3 (898, 12554, 46470): /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */ - case ENCODE (910, 12566, 47732): + case HB_CODEPOINT_ENCODE3 (910, 12566, 47732): /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */ - case ENCODE (928, 23298, 59332): + case HB_CODEPOINT_ENCODE3 (928, 23298, 59332): /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */ - case ENCODE (940, 23310, 60732): + case HB_CODEPOINT_ENCODE3 (940, 23310, 60732): /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (964, 23836, 60072): + case HB_CODEPOINT_ENCODE3 (964, 23836, 60072): /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (976, 23832, 61456): + case HB_CODEPOINT_ENCODE3 (976, 23832, 61456): /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */ - case ENCODE (994, 24474, 60336): + case HB_CODEPOINT_ENCODE3 (994, 24474, 60336): /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */ - case ENCODE (1006, 24470, 61740): + case HB_CODEPOINT_ENCODE3 (1006, 24470, 61740): /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (1006, 24576, 61346): + case HB_CODEPOINT_ENCODE3 (1006, 24576, 61346): /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (1018, 24572, 62828): + case HB_CODEPOINT_ENCODE3 (1018, 24572, 62828): /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */ - case ENCODE (1006, 24576, 61352): + case HB_CODEPOINT_ENCODE3 (1006, 24576, 61352): /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */ - case ENCODE (1018, 24572, 62834): + case HB_CODEPOINT_ENCODE3 (1018, 24572, 62834): /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */ - case ENCODE (832, 7324, 47162): + case HB_CODEPOINT_ENCODE3 (832, 7324, 47162): /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */ - case ENCODE (844, 7302, 45474): + case HB_CODEPOINT_ENCODE3 (844, 7302, 45474): /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */ - case ENCODE (180, 13054, 7254): + case HB_CODEPOINT_ENCODE3 (180, 13054, 7254): /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */ - case ENCODE (192, 12638, 7254): + case HB_CODEPOINT_ENCODE3 (192, 12638, 7254): /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */ - case ENCODE (192, 12690, 7254): + case HB_CODEPOINT_ENCODE3 (192, 12690, 7254): /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */ - case ENCODE (188, 248, 3852): + case HB_CODEPOINT_ENCODE3 (188, 248, 3852): /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */ - case ENCODE (188, 264, 3426): + case HB_CODEPOINT_ENCODE3 (188, 264, 3426): /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */ - case ENCODE (1058, 47032, 11818): + case HB_CODEPOINT_ENCODE3 (1058, 47032, 11818): /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/ - case ENCODE (1046, 47030, 12600): + case HB_CODEPOINT_ENCODE3 (1046, 47030, 12600): /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */ - case ENCODE (1058, 71796, 16770): + case HB_CODEPOINT_ENCODE3 (1058, 71796, 16770): /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */ - case ENCODE (1046, 71790, 17862): + case HB_CODEPOINT_ENCODE3 (1046, 71790, 17862): /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */ - case ENCODE (1046, 71788, 17112): + case HB_CODEPOINT_ENCODE3 (1046, 71788, 17112): /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */ - case ENCODE (1058, 71794, 17514): + case HB_CODEPOINT_ENCODE3 (1058, 71794, 17514): /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */ - case ENCODE (1330, 109904, 57938): + case HB_CODEPOINT_ENCODE3 (1330, 109904, 57938): /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */ - case ENCODE (1330, 109904, 58972): + case HB_CODEPOINT_ENCODE3 (1330, 109904, 58972): /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */ - case ENCODE (1004, 59092, 14836): + case HB_CODEPOINT_ENCODE3 (1004, 59092, 14836): return true; -#undef ENCODE } return false; } diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh new file mode 100644 index 000000000..95c4bf86e --- /dev/null +++ b/src/hb-ucd-table.hh @@ -0,0 +1,5160 @@ +/* == Start of generated table == */ +/* + * The following table is generated by running: + * + * ./gen-ucd-table.py ucd.nonunihan.grouped.xml + * + * on file with this description: Unicode 12.1.0 + */ + +#ifndef HB_UCD_TABLE_HH +#define HB_UCD_TABLE_HH + + +#include "hb.hh" + +static const hb_script_t +_hb_ucd_sc_map[138] = +{ + HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED, + HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC, + HB_SCRIPT_ARMENIAN, HB_SCRIPT_BENGALI, + HB_SCRIPT_CYRILLIC, HB_SCRIPT_DEVANAGARI, + HB_SCRIPT_GEORGIAN, HB_SCRIPT_GREEK, + HB_SCRIPT_GUJARATI, HB_SCRIPT_GURMUKHI, + HB_SCRIPT_HANGUL, HB_SCRIPT_HAN, + HB_SCRIPT_HEBREW, HB_SCRIPT_HIRAGANA, + HB_SCRIPT_KANNADA, HB_SCRIPT_KATAKANA, + HB_SCRIPT_LAO, HB_SCRIPT_LATIN, + HB_SCRIPT_MALAYALAM, HB_SCRIPT_ORIYA, + HB_SCRIPT_TAMIL, HB_SCRIPT_TELUGU, + HB_SCRIPT_THAI, HB_SCRIPT_TIBETAN, + HB_SCRIPT_BOPOMOFO, HB_SCRIPT_BRAILLE, + HB_SCRIPT_CANADIAN_SYLLABICS, HB_SCRIPT_CHEROKEE, + HB_SCRIPT_ETHIOPIC, HB_SCRIPT_KHMER, + HB_SCRIPT_MONGOLIAN, HB_SCRIPT_MYANMAR, + HB_SCRIPT_OGHAM, HB_SCRIPT_RUNIC, + HB_SCRIPT_SINHALA, HB_SCRIPT_SYRIAC, + HB_SCRIPT_THAANA, HB_SCRIPT_YI, + HB_SCRIPT_DESERET, HB_SCRIPT_GOTHIC, + HB_SCRIPT_OLD_ITALIC, HB_SCRIPT_BUHID, + HB_SCRIPT_HANUNOO, HB_SCRIPT_TAGALOG, + HB_SCRIPT_TAGBANWA, HB_SCRIPT_CYPRIOT, + HB_SCRIPT_LIMBU, HB_SCRIPT_LINEAR_B, + HB_SCRIPT_OSMANYA, HB_SCRIPT_SHAVIAN, + HB_SCRIPT_TAI_LE, HB_SCRIPT_UGARITIC, + HB_SCRIPT_BUGINESE, HB_SCRIPT_COPTIC, + HB_SCRIPT_GLAGOLITIC, HB_SCRIPT_KHAROSHTHI, + HB_SCRIPT_NEW_TAI_LUE, HB_SCRIPT_OLD_PERSIAN, + HB_SCRIPT_SYLOTI_NAGRI, HB_SCRIPT_TIFINAGH, + HB_SCRIPT_BALINESE, HB_SCRIPT_CUNEIFORM, + HB_SCRIPT_NKO, HB_SCRIPT_PHAGS_PA, + HB_SCRIPT_PHOENICIAN, HB_SCRIPT_CARIAN, + HB_SCRIPT_CHAM, HB_SCRIPT_KAYAH_LI, + HB_SCRIPT_LEPCHA, HB_SCRIPT_LYCIAN, + HB_SCRIPT_LYDIAN, HB_SCRIPT_OL_CHIKI, + HB_SCRIPT_REJANG, HB_SCRIPT_SAURASHTRA, + HB_SCRIPT_SUNDANESE, HB_SCRIPT_VAI, + HB_SCRIPT_AVESTAN, HB_SCRIPT_BAMUM, + HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, HB_SCRIPT_IMPERIAL_ARAMAIC, + HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, + HB_SCRIPT_JAVANESE, HB_SCRIPT_KAITHI, + HB_SCRIPT_LISU, HB_SCRIPT_MEETEI_MAYEK, + HB_SCRIPT_OLD_SOUTH_ARABIAN, HB_SCRIPT_OLD_TURKIC, + HB_SCRIPT_SAMARITAN, HB_SCRIPT_TAI_THAM, + HB_SCRIPT_TAI_VIET, HB_SCRIPT_BATAK, + HB_SCRIPT_BRAHMI, HB_SCRIPT_MANDAIC, + HB_SCRIPT_CHAKMA, HB_SCRIPT_MEROITIC_CURSIVE, + HB_SCRIPT_MEROITIC_HIEROGLYPHS, HB_SCRIPT_MIAO, + HB_SCRIPT_SHARADA, HB_SCRIPT_SORA_SOMPENG, + HB_SCRIPT_TAKRI, HB_SCRIPT_BASSA_VAH, + HB_SCRIPT_CAUCASIAN_ALBANIAN, HB_SCRIPT_DUPLOYAN, + HB_SCRIPT_ELBASAN, HB_SCRIPT_GRANTHA, + HB_SCRIPT_KHOJKI, HB_SCRIPT_KHUDAWADI, + HB_SCRIPT_LINEAR_A, HB_SCRIPT_MAHAJANI, + HB_SCRIPT_MANICHAEAN, HB_SCRIPT_MENDE_KIKAKUI, + HB_SCRIPT_MODI, HB_SCRIPT_MRO, + HB_SCRIPT_NABATAEAN, HB_SCRIPT_OLD_NORTH_ARABIAN, + HB_SCRIPT_OLD_PERMIC, HB_SCRIPT_PAHAWH_HMONG, + HB_SCRIPT_PALMYRENE, HB_SCRIPT_PAU_CIN_HAU, + HB_SCRIPT_PSALTER_PAHLAVI, HB_SCRIPT_SIDDHAM, + HB_SCRIPT_TIRHUTA, HB_SCRIPT_WARANG_CITI, + HB_SCRIPT_AHOM, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS, + HB_SCRIPT_HATRAN, HB_SCRIPT_MULTANI, + HB_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_SIGNWRITING, + HB_SCRIPT_ADLAM, HB_SCRIPT_BHAIKSUKI, + HB_SCRIPT_MARCHEN, HB_SCRIPT_OSAGE, + HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA, +}; +static const hb_codepoint_t +_hb_ucd_dm1_map[935] = +{ + 0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u, + 0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu, + 0x038Eu, 0x038Fu, 0x0390u, 0x03A9u, 0x03ACu, 0x03ADu, 0x03AEu, 0x03AFu, + 0x03B0u, 0x03B9u, 0x03CCu, 0x03CDu, 0x03CEu, 0x2002u, 0x2003u, 0x3008u, + 0x3009u, 0x349Eu, 0x34B9u, 0x34BBu, 0x34DFu, 0x3515u, 0x36EEu, 0x36FCu, + 0x3781u, 0x382Fu, 0x3862u, 0x387Cu, 0x38C7u, 0x38E3u, 0x391Cu, 0x393Au, + 0x3A2Eu, 0x3A6Cu, 0x3AE4u, 0x3B08u, 0x3B19u, 0x3B49u, 0x3B9Du, 0x3C18u, + 0x3C4Eu, 0x3D33u, 0x3D96u, 0x3EACu, 0x3EB8u, 0x3F1Bu, 0x3FFCu, 0x4008u, + 0x4018u, 0x4039u, 0x4046u, 0x4096u, 0x40E3u, 0x412Fu, 0x4202u, 0x4227u, + 0x42A0u, 0x4301u, 0x4334u, 0x4359u, 0x43D5u, 0x43D9u, 0x440Bu, 0x446Bu, + 0x452Bu, 0x455Du, 0x4561u, 0x456Bu, 0x45D7u, 0x45F9u, 0x4635u, 0x46BEu, + 0x46C7u, 0x4995u, 0x49E6u, 0x4A6Eu, 0x4A76u, 0x4AB2u, 0x4B33u, 0x4BCEu, + 0x4CCEu, 0x4CEDu, 0x4CF8u, 0x4D56u, 0x4E0Du, 0x4E26u, 0x4E32u, 0x4E38u, + 0x4E39u, 0x4E3Du, 0x4E41u, 0x4E82u, 0x4E86u, 0x4EAEu, 0x4EC0u, 0x4ECCu, + 0x4EE4u, 0x4F60u, 0x4F80u, 0x4F86u, 0x4F8Bu, 0x4FAEu, 0x4FBBu, 0x4FBFu, + 0x5002u, 0x502Bu, 0x507Au, 0x5099u, 0x50CFu, 0x50DAu, 0x50E7u, 0x5140u, + 0x5145u, 0x514Du, 0x5154u, 0x5164u, 0x5167u, 0x5168u, 0x5169u, 0x516Du, + 0x5177u, 0x5180u, 0x518Du, 0x5192u, 0x5195u, 0x5197u, 0x51A4u, 0x51ACu, + 0x51B5u, 0x51B7u, 0x51C9u, 0x51CCu, 0x51DCu, 0x51DEu, 0x51F5u, 0x5203u, + 0x5207u, 0x5217u, 0x5229u, 0x523Au, 0x523Bu, 0x5246u, 0x5272u, 0x5277u, + 0x5289u, 0x529Bu, 0x52A3u, 0x52B3u, 0x52C7u, 0x52C9u, 0x52D2u, 0x52DEu, + 0x52E4u, 0x52F5u, 0x52FAu, 0x5305u, 0x5306u, 0x5317u, 0x533Fu, 0x5349u, + 0x5351u, 0x535Au, 0x5373u, 0x5375u, 0x537Du, 0x537Fu, 0x53C3u, 0x53CAu, + 0x53DFu, 0x53E5u, 0x53EBu, 0x53F1u, 0x5406u, 0x540Fu, 0x541Du, 0x5438u, + 0x5442u, 0x5448u, 0x5468u, 0x549Eu, 0x54A2u, 0x54BDu, 0x54F6u, 0x5510u, + 0x5553u, 0x5555u, 0x5563u, 0x5584u, 0x5587u, 0x5599u, 0x559Du, 0x55ABu, + 0x55B3u, 0x55C0u, 0x55C2u, 0x55E2u, 0x5606u, 0x5651u, 0x5668u, 0x5674u, + 0x56F9u, 0x5716u, 0x5717u, 0x578Bu, 0x57CEu, 0x57F4u, 0x580Du, 0x5831u, + 0x5832u, 0x5840u, 0x585Au, 0x585Eu, 0x58A8u, 0x58ACu, 0x58B3u, 0x58D8u, + 0x58DFu, 0x58EEu, 0x58F2u, 0x58F7u, 0x5906u, 0x591Au, 0x5922u, 0x5944u, + 0x5948u, 0x5951u, 0x5954u, 0x5962u, 0x5973u, 0x59D8u, 0x59ECu, 0x5A1Bu, + 0x5A27u, 0x5A62u, 0x5A66u, 0x5AB5u, 0x5B08u, 0x5B28u, 0x5B3Eu, 0x5B85u, + 0x5BC3u, 0x5BD8u, 0x5BE7u, 0x5BEEu, 0x5BF3u, 0x5BFFu, 0x5C06u, 0x5C22u, + 0x5C3Fu, 0x5C60u, 0x5C62u, 0x5C64u, 0x5C65u, 0x5C6Eu, 0x5C8Du, 0x5CC0u, + 0x5D19u, 0x5D43u, 0x5D50u, 0x5D6Bu, 0x5D6Eu, 0x5D7Cu, 0x5DB2u, 0x5DBAu, + 0x5DE1u, 0x5DE2u, 0x5DFDu, 0x5E28u, 0x5E3Du, 0x5E69u, 0x5E74u, 0x5EA6u, + 0x5EB0u, 0x5EB3u, 0x5EB6u, 0x5EC9u, 0x5ECAu, 0x5ED2u, 0x5ED3u, 0x5ED9u, + 0x5EECu, 0x5EFEu, 0x5F04u, 0x5F22u, 0x5F53u, 0x5F62u, 0x5F69u, 0x5F6Bu, + 0x5F8Bu, 0x5F9Au, 0x5FA9u, 0x5FADu, 0x5FCDu, 0x5FD7u, 0x5FF5u, 0x5FF9u, + 0x6012u, 0x601Cu, 0x6075u, 0x6081u, 0x6094u, 0x60C7u, 0x60D8u, 0x60E1u, + 0x6108u, 0x6144u, 0x6148u, 0x614Cu, 0x614Eu, 0x6160u, 0x6168u, 0x617Au, + 0x618Eu, 0x6190u, 0x61A4u, 0x61AFu, 0x61B2u, 0x61DEu, 0x61F2u, 0x61F6u, + 0x6200u, 0x6210u, 0x621Bu, 0x622Eu, 0x6234u, 0x625Du, 0x62B1u, 0x62C9u, + 0x62CFu, 0x62D3u, 0x62D4u, 0x62FCu, 0x62FEu, 0x633Du, 0x6350u, 0x6368u, + 0x637Bu, 0x6383u, 0x63A0u, 0x63A9u, 0x63C4u, 0x63C5u, 0x63E4u, 0x641Cu, + 0x6422u, 0x6452u, 0x6469u, 0x6477u, 0x647Eu, 0x649Au, 0x649Du, 0x64C4u, + 0x654Fu, 0x6556u, 0x656Cu, 0x6578u, 0x6599u, 0x65C5u, 0x65E2u, 0x65E3u, + 0x6613u, 0x6649u, 0x6674u, 0x6688u, 0x6691u, 0x669Cu, 0x66B4u, 0x66C6u, + 0x66F4u, 0x66F8u, 0x6700u, 0x6717u, 0x671Bu, 0x6721u, 0x674Eu, 0x6753u, + 0x6756u, 0x675Eu, 0x677Bu, 0x6785u, 0x6797u, 0x67F3u, 0x67FAu, 0x6817u, + 0x681Fu, 0x6852u, 0x6881u, 0x6885u, 0x688Eu, 0x68A8u, 0x6914u, 0x6942u, + 0x69A3u, 0x69EAu, 0x6A02u, 0x6A13u, 0x6AA8u, 0x6AD3u, 0x6ADBu, 0x6B04u, + 0x6B21u, 0x6B54u, 0x6B72u, 0x6B77u, 0x6B79u, 0x6B9Fu, 0x6BAEu, 0x6BBAu, + 0x6BBBu, 0x6C4Eu, 0x6C67u, 0x6C88u, 0x6CBFu, 0x6CCCu, 0x6CCDu, 0x6CE5u, + 0x6D16u, 0x6D1Bu, 0x6D1Eu, 0x6D34u, 0x6D3Eu, 0x6D41u, 0x6D69u, 0x6D6Au, + 0x6D77u, 0x6D78u, 0x6D85u, 0x6DCBu, 0x6DDAu, 0x6DEAu, 0x6DF9u, 0x6E1Au, + 0x6E2Fu, 0x6E6Eu, 0x6E9Cu, 0x6EBAu, 0x6EC7u, 0x6ECBu, 0x6ED1u, 0x6EDBu, + 0x6F0Fu, 0x6F22u, 0x6F23u, 0x6F6Eu, 0x6FC6u, 0x6FEBu, 0x6FFEu, 0x701Bu, + 0x701Eu, 0x7039u, 0x704Au, 0x7070u, 0x7077u, 0x707Du, 0x7099u, 0x70ADu, + 0x70C8u, 0x70D9u, 0x7145u, 0x7149u, 0x716Eu, 0x719Cu, 0x71CEu, 0x71D0u, + 0x7210u, 0x721Bu, 0x7228u, 0x722Bu, 0x7235u, 0x7250u, 0x7262u, 0x7280u, + 0x7295u, 0x72AFu, 0x72C0u, 0x72FCu, 0x732Au, 0x7375u, 0x737Au, 0x7387u, + 0x738Bu, 0x73A5u, 0x73B2u, 0x73DEu, 0x7406u, 0x7409u, 0x7422u, 0x7447u, + 0x745Cu, 0x7469u, 0x7471u, 0x7485u, 0x7489u, 0x7498u, 0x74CAu, 0x7506u, + 0x7524u, 0x753Bu, 0x753Eu, 0x7559u, 0x7565u, 0x7570u, 0x75E2u, 0x7610u, + 0x761Du, 0x761Fu, 0x7642u, 0x7669u, 0x76CAu, 0x76DBu, 0x76E7u, 0x76F4u, + 0x7701u, 0x771Eu, 0x771Fu, 0x7740u, 0x774Au, 0x778Bu, 0x77A7u, 0x784Eu, + 0x786Bu, 0x788Cu, 0x7891u, 0x78CAu, 0x78CCu, 0x78FBu, 0x792Au, 0x793Cu, + 0x793Eu, 0x7948u, 0x7949u, 0x7950u, 0x7956u, 0x795Du, 0x795Eu, 0x7965u, + 0x797Fu, 0x798Du, 0x798Eu, 0x798Fu, 0x79AEu, 0x79CAu, 0x79EBu, 0x7A1Cu, + 0x7A40u, 0x7A4Au, 0x7A4Fu, 0x7A81u, 0x7AB1u, 0x7ACBu, 0x7AEEu, 0x7B20u, + 0x7BC0u, 0x7BC6u, 0x7BC9u, 0x7C3Eu, 0x7C60u, 0x7C7Bu, 0x7C92u, 0x7CBEu, + 0x7CD2u, 0x7CD6u, 0x7CE3u, 0x7CE7u, 0x7CE8u, 0x7D00u, 0x7D10u, 0x7D22u, + 0x7D2Fu, 0x7D5Bu, 0x7D63u, 0x7DA0u, 0x7DBEu, 0x7DC7u, 0x7DF4u, 0x7E02u, + 0x7E09u, 0x7E37u, 0x7E41u, 0x7E45u, 0x7F3Eu, 0x7F72u, 0x7F79u, 0x7F7Au, + 0x7F85u, 0x7F95u, 0x7F9Au, 0x7FBDu, 0x7FFAu, 0x8001u, 0x8005u, 0x8046u, + 0x8060u, 0x806Fu, 0x8070u, 0x807Eu, 0x808Bu, 0x80ADu, 0x80B2u, 0x8103u, + 0x813Eu, 0x81D8u, 0x81E8u, 0x81EDu, 0x8201u, 0x8204u, 0x8218u, 0x826Fu, + 0x8279u, 0x828Bu, 0x8291u, 0x829Du, 0x82B1u, 0x82B3u, 0x82BDu, 0x82E5u, + 0x82E6u, 0x831Du, 0x8323u, 0x8336u, 0x8352u, 0x8353u, 0x8363u, 0x83ADu, + 0x83BDu, 0x83C9u, 0x83CAu, 0x83CCu, 0x83DCu, 0x83E7u, 0x83EFu, 0x83F1u, + 0x843Du, 0x8449u, 0x8457u, 0x84EEu, 0x84F1u, 0x84F3u, 0x84FCu, 0x8516u, + 0x8564u, 0x85CDu, 0x85FAu, 0x8606u, 0x8612u, 0x862Du, 0x863Fu, 0x8650u, + 0x865Cu, 0x8667u, 0x8669u, 0x8688u, 0x86A9u, 0x86E2u, 0x870Eu, 0x8728u, + 0x876Bu, 0x8779u, 0x8786u, 0x87BAu, 0x87E1u, 0x8801u, 0x881Fu, 0x884Cu, + 0x8860u, 0x8863u, 0x88C2u, 0x88CFu, 0x88D7u, 0x88DEu, 0x88E1u, 0x88F8u, + 0x88FAu, 0x8910u, 0x8941u, 0x8964u, 0x8986u, 0x898Bu, 0x8996u, 0x8AA0u, + 0x8AAAu, 0x8ABFu, 0x8ACBu, 0x8AD2u, 0x8AD6u, 0x8AEDu, 0x8AF8u, 0x8AFEu, + 0x8B01u, 0x8B39u, 0x8B58u, 0x8B80u, 0x8B8Au, 0x8C48u, 0x8C55u, 0x8CABu, + 0x8CC1u, 0x8CC2u, 0x8CC8u, 0x8CD3u, 0x8D08u, 0x8D1Bu, 0x8D77u, 0x8DBCu, + 0x8DCBu, 0x8DEFu, 0x8DF0u, 0x8ECAu, 0x8ED4u, 0x8F26u, 0x8F2Au, 0x8F38u, + 0x8F3Bu, 0x8F62u, 0x8F9Eu, 0x8FB0u, 0x8FB6u, 0x9023u, 0x9038u, 0x9072u, + 0x907Cu, 0x908Fu, 0x9094u, 0x90CEu, 0x90DEu, 0x90F1u, 0x90FDu, 0x9111u, + 0x911Bu, 0x916Au, 0x9199u, 0x91B4u, 0x91CCu, 0x91CFu, 0x91D1u, 0x9234u, + 0x9238u, 0x9276u, 0x927Cu, 0x92D7u, 0x92D8u, 0x9304u, 0x934Au, 0x93F9u, + 0x9415u, 0x958Bu, 0x95ADu, 0x95B7u, 0x962Eu, 0x964Bu, 0x964Du, 0x9675u, + 0x9678u, 0x967Cu, 0x9686u, 0x96A3u, 0x96B7u, 0x96B8u, 0x96C3u, 0x96E2u, + 0x96E3u, 0x96F6u, 0x96F7u, 0x9723u, 0x9732u, 0x9748u, 0x9756u, 0x97DBu, + 0x97E0u, 0x97FFu, 0x980Bu, 0x9818u, 0x9829u, 0x983Bu, 0x985Eu, 0x98E2u, + 0x98EFu, 0x98FCu, 0x9928u, 0x9929u, 0x99A7u, 0x99C2u, 0x99F1u, 0x99FEu, + 0x9A6Au, 0x9B12u, 0x9B6Fu, 0x9C40u, 0x9C57u, 0x9CFDu, 0x9D67u, 0x9DB4u, + 0x9DFAu, 0x9E1Eu, 0x9E7Fu, 0x9E97u, 0x9E9Fu, 0x9EBBu, 0x9ECEu, 0x9EF9u, + 0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu, + 0x9F9Cu,0x20122u,0x2051Cu,0x20525u,0x2054Bu,0x2063Au,0x20804u,0x208DEu, + 0x20A2Cu,0x20B63u,0x214E4u,0x216A8u,0x216EAu,0x219C8u,0x21B18u,0x21D0Bu, + 0x21DE4u,0x21DE6u,0x22183u,0x2219Fu,0x22331u,0x226D4u,0x22844u,0x2284Au, + 0x22B0Cu,0x22BF1u,0x2300Au,0x232B8u,0x2335Fu,0x23393u,0x2339Cu,0x233C3u, + 0x233D5u,0x2346Du,0x236A3u,0x238A7u,0x23A8Du,0x23AFAu,0x23CBCu,0x23D1Eu, + 0x23ED1u,0x23F5Eu,0x23F8Eu,0x24263u,0x242EEu,0x243ABu,0x24608u,0x24735u, + 0x24814u,0x24C36u,0x24C92u,0x24FA1u,0x24FB8u,0x25044u,0x250F2u,0x250F3u, + 0x25119u,0x25133u,0x25249u,0x2541Du,0x25626u,0x2569Au,0x256C5u,0x2597Cu, + 0x25AA7u,0x25BABu,0x25C80u,0x25CD0u,0x25F86u,0x261DAu,0x26228u,0x26247u, + 0x262D9u,0x2633Eu,0x264DAu,0x26523u,0x265A8u,0x267A7u,0x267B5u,0x26B3Cu, + 0x26C36u,0x26CD5u,0x26D6Bu,0x26F2Cu,0x26FB1u,0x270D2u,0x273CAu,0x27667u, + 0x278AEu,0x27966u,0x27CA8u,0x27ED3u,0x27F2Fu,0x285D2u,0x285EDu,0x2872Eu, + 0x28BFAu,0x28D77u,0x29145u,0x291DFu,0x2921Au,0x2940Au,0x29496u,0x295B6u, + 0x29B30u,0x2A0CEu,0x2A105u,0x2A20Eu,0x2A291u,0x2A392u,0x2A600u, +}; +static const uint64_t +_hb_ucd_dm2_map[1025] = +{ + HB_CODEPOINT_ENCODE3 (0x003Cu, 0x0338u, 0x226Eu), HB_CODEPOINT_ENCODE3 (0x003Du, 0x0338u, 0x2260u), + HB_CODEPOINT_ENCODE3 (0x003Eu, 0x0338u, 0x226Fu), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0300u, 0x00C0u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0301u, 0x00C1u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0302u, 0x00C2u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0303u, 0x00C3u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0304u, 0x0100u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0306u, 0x0102u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0307u, 0x0226u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0308u, 0x00C4u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0309u, 0x1EA2u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Au, 0x00C5u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Cu, 0x01CDu), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Fu, 0x0200u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0311u, 0x0202u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0323u, 0x1EA0u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0325u, 0x1E00u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0328u, 0x0104u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0307u, 0x1E02u), + HB_CODEPOINT_ENCODE3 (0x0042u, 0x0323u, 0x1E04u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0331u, 0x1E06u), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0301u, 0x0106u), HB_CODEPOINT_ENCODE3 (0x0043u, 0x0302u, 0x0108u), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0307u, 0x010Au), HB_CODEPOINT_ENCODE3 (0x0043u, 0x030Cu, 0x010Cu), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0327u, 0x00C7u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0307u, 0x1E0Au), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x030Cu, 0x010Eu), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0323u, 0x1E0Cu), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x0327u, 0x1E10u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x032Du, 0x1E12u), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x0331u, 0x1E0Eu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0300u, 0x00C8u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0301u, 0x00C9u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0302u, 0x00CAu), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0303u, 0x1EBCu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0304u, 0x0112u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0306u, 0x0114u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0307u, 0x0116u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0308u, 0x00CBu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0309u, 0x1EBAu), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Cu, 0x011Au), HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Fu, 0x0204u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0311u, 0x0206u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0323u, 0x1EB8u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0327u, 0x0228u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0328u, 0x0118u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x032Du, 0x1E18u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0330u, 0x1E1Au), + HB_CODEPOINT_ENCODE3 (0x0046u, 0x0307u, 0x1E1Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0301u, 0x01F4u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x0302u, 0x011Cu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0304u, 0x1E20u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x0306u, 0x011Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0307u, 0x0120u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x030Cu, 0x01E6u), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0327u, 0x0122u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0302u, 0x0124u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0307u, 0x1E22u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0308u, 0x1E26u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x030Cu, 0x021Eu), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0323u, 0x1E24u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0327u, 0x1E28u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x032Eu, 0x1E2Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0300u, 0x00CCu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0301u, 0x00CDu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0302u, 0x00CEu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0303u, 0x0128u), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0304u, 0x012Au), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0306u, 0x012Cu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0307u, 0x0130u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0308u, 0x00CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0309u, 0x1EC8u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Cu, 0x01CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Fu, 0x0208u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0311u, 0x020Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0323u, 0x1ECAu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0328u, 0x012Eu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0330u, 0x1E2Cu), + HB_CODEPOINT_ENCODE3 (0x004Au, 0x0302u, 0x0134u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0301u, 0x1E30u), + HB_CODEPOINT_ENCODE3 (0x004Bu, 0x030Cu, 0x01E8u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0323u, 0x1E32u), + HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0327u, 0x0136u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0331u, 0x1E34u), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0301u, 0x0139u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x030Cu, 0x013Du), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0323u, 0x1E36u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0327u, 0x013Bu), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x032Du, 0x1E3Cu), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0331u, 0x1E3Au), + HB_CODEPOINT_ENCODE3 (0x004Du, 0x0301u, 0x1E3Eu), HB_CODEPOINT_ENCODE3 (0x004Du, 0x0307u, 0x1E40u), + HB_CODEPOINT_ENCODE3 (0x004Du, 0x0323u, 0x1E42u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0300u, 0x01F8u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0301u, 0x0143u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0303u, 0x00D1u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0307u, 0x1E44u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x030Cu, 0x0147u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0323u, 0x1E46u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0327u, 0x0145u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x032Du, 0x1E4Au), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0331u, 0x1E48u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0300u, 0x00D2u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0301u, 0x00D3u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0302u, 0x00D4u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0303u, 0x00D5u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0304u, 0x014Cu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0306u, 0x014Eu), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0307u, 0x022Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0308u, 0x00D6u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0309u, 0x1ECEu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Bu, 0x0150u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Cu, 0x01D1u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Fu, 0x020Cu), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0311u, 0x020Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x031Bu, 0x01A0u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0323u, 0x1ECCu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0328u, 0x01EAu), + HB_CODEPOINT_ENCODE3 (0x0050u, 0x0301u, 0x1E54u), HB_CODEPOINT_ENCODE3 (0x0050u, 0x0307u, 0x1E56u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0301u, 0x0154u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0307u, 0x1E58u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Cu, 0x0158u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Fu, 0x0210u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0311u, 0x0212u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0323u, 0x1E5Au), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0327u, 0x0156u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0331u, 0x1E5Eu), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0301u, 0x015Au), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0302u, 0x015Cu), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0307u, 0x1E60u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x030Cu, 0x0160u), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0323u, 0x1E62u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0326u, 0x0218u), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0327u, 0x015Eu), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0307u, 0x1E6Au), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x030Cu, 0x0164u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0323u, 0x1E6Cu), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x0326u, 0x021Au), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0327u, 0x0162u), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x032Du, 0x1E70u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0331u, 0x1E6Eu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0300u, 0x00D9u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0301u, 0x00DAu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0302u, 0x00DBu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0303u, 0x0168u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0304u, 0x016Au), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0306u, 0x016Cu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0308u, 0x00DCu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0309u, 0x1EE6u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Au, 0x016Eu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Bu, 0x0170u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Cu, 0x01D3u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Fu, 0x0214u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0311u, 0x0216u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x031Bu, 0x01AFu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0323u, 0x1EE4u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0324u, 0x1E72u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0328u, 0x0172u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x032Du, 0x1E76u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0330u, 0x1E74u), HB_CODEPOINT_ENCODE3 (0x0056u, 0x0303u, 0x1E7Cu), + HB_CODEPOINT_ENCODE3 (0x0056u, 0x0323u, 0x1E7Eu), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0300u, 0x1E80u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0301u, 0x1E82u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0302u, 0x0174u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0307u, 0x1E86u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0308u, 0x1E84u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0323u, 0x1E88u), HB_CODEPOINT_ENCODE3 (0x0058u, 0x0307u, 0x1E8Au), + HB_CODEPOINT_ENCODE3 (0x0058u, 0x0308u, 0x1E8Cu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0300u, 0x1EF2u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0301u, 0x00DDu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0302u, 0x0176u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0303u, 0x1EF8u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0304u, 0x0232u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0307u, 0x1E8Eu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0308u, 0x0178u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0309u, 0x1EF6u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0323u, 0x1EF4u), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0301u, 0x0179u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0302u, 0x1E90u), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0307u, 0x017Bu), HB_CODEPOINT_ENCODE3 (0x005Au, 0x030Cu, 0x017Du), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0323u, 0x1E92u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0331u, 0x1E94u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0300u, 0x00E0u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0301u, 0x00E1u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0302u, 0x00E2u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0303u, 0x00E3u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0304u, 0x0101u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0306u, 0x0103u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0307u, 0x0227u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0308u, 0x00E4u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0309u, 0x1EA3u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Au, 0x00E5u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Cu, 0x01CEu), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Fu, 0x0201u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0311u, 0x0203u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0323u, 0x1EA1u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0325u, 0x1E01u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0328u, 0x0105u), + HB_CODEPOINT_ENCODE3 (0x0062u, 0x0307u, 0x1E03u), HB_CODEPOINT_ENCODE3 (0x0062u, 0x0323u, 0x1E05u), + HB_CODEPOINT_ENCODE3 (0x0062u, 0x0331u, 0x1E07u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0301u, 0x0107u), + HB_CODEPOINT_ENCODE3 (0x0063u, 0x0302u, 0x0109u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0307u, 0x010Bu), + HB_CODEPOINT_ENCODE3 (0x0063u, 0x030Cu, 0x010Du), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0327u, 0x00E7u), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x0307u, 0x1E0Bu), HB_CODEPOINT_ENCODE3 (0x0064u, 0x030Cu, 0x010Fu), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x0323u, 0x1E0Du), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0327u, 0x1E11u), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x032Du, 0x1E13u), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0331u, 0x1E0Fu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0300u, 0x00E8u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0301u, 0x00E9u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0302u, 0x00EAu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0303u, 0x1EBDu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0304u, 0x0113u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0306u, 0x0115u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0307u, 0x0117u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0308u, 0x00EBu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0309u, 0x1EBBu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Cu, 0x011Bu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Fu, 0x0205u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0311u, 0x0207u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0323u, 0x1EB9u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0327u, 0x0229u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0328u, 0x0119u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x032Du, 0x1E19u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0330u, 0x1E1Bu), HB_CODEPOINT_ENCODE3 (0x0066u, 0x0307u, 0x1E1Fu), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0301u, 0x01F5u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0302u, 0x011Du), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0304u, 0x1E21u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0306u, 0x011Fu), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0307u, 0x0121u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x030Cu, 0x01E7u), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0327u, 0x0123u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0302u, 0x0125u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0307u, 0x1E23u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0308u, 0x1E27u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x030Cu, 0x021Fu), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0323u, 0x1E25u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0327u, 0x1E29u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x032Eu, 0x1E2Bu), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0331u, 0x1E96u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0300u, 0x00ECu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0301u, 0x00EDu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0302u, 0x00EEu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0303u, 0x0129u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0304u, 0x012Bu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0306u, 0x012Du), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0308u, 0x00EFu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0309u, 0x1EC9u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Cu, 0x01D0u), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Fu, 0x0209u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0311u, 0x020Bu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0323u, 0x1ECBu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0328u, 0x012Fu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0330u, 0x1E2Du), HB_CODEPOINT_ENCODE3 (0x006Au, 0x0302u, 0x0135u), + HB_CODEPOINT_ENCODE3 (0x006Au, 0x030Cu, 0x01F0u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0301u, 0x1E31u), + HB_CODEPOINT_ENCODE3 (0x006Bu, 0x030Cu, 0x01E9u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0323u, 0x1E33u), + HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0327u, 0x0137u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0331u, 0x1E35u), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0301u, 0x013Au), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x030Cu, 0x013Eu), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0323u, 0x1E37u), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0327u, 0x013Cu), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x032Du, 0x1E3Du), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0331u, 0x1E3Bu), + HB_CODEPOINT_ENCODE3 (0x006Du, 0x0301u, 0x1E3Fu), HB_CODEPOINT_ENCODE3 (0x006Du, 0x0307u, 0x1E41u), + HB_CODEPOINT_ENCODE3 (0x006Du, 0x0323u, 0x1E43u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0300u, 0x01F9u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0301u, 0x0144u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0303u, 0x00F1u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0307u, 0x1E45u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x030Cu, 0x0148u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0323u, 0x1E47u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0327u, 0x0146u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x032Du, 0x1E4Bu), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0331u, 0x1E49u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0300u, 0x00F2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0301u, 0x00F3u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0302u, 0x00F4u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0303u, 0x00F5u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0304u, 0x014Du), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0306u, 0x014Fu), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0307u, 0x022Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0308u, 0x00F6u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0309u, 0x1ECFu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Bu, 0x0151u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Cu, 0x01D2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Fu, 0x020Du), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0311u, 0x020Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x031Bu, 0x01A1u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0323u, 0x1ECDu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0328u, 0x01EBu), + HB_CODEPOINT_ENCODE3 (0x0070u, 0x0301u, 0x1E55u), HB_CODEPOINT_ENCODE3 (0x0070u, 0x0307u, 0x1E57u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0301u, 0x0155u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0307u, 0x1E59u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Cu, 0x0159u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Fu, 0x0211u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0311u, 0x0213u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0323u, 0x1E5Bu), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0327u, 0x0157u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0331u, 0x1E5Fu), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0301u, 0x015Bu), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0302u, 0x015Du), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0307u, 0x1E61u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x030Cu, 0x0161u), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0323u, 0x1E63u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0326u, 0x0219u), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0327u, 0x015Fu), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0307u, 0x1E6Bu), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0308u, 0x1E97u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x030Cu, 0x0165u), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0323u, 0x1E6Du), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0326u, 0x021Bu), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0327u, 0x0163u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x032Du, 0x1E71u), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0331u, 0x1E6Fu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0300u, 0x00F9u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0301u, 0x00FAu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0302u, 0x00FBu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0303u, 0x0169u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0304u, 0x016Bu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0306u, 0x016Du), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0308u, 0x00FCu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0309u, 0x1EE7u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Au, 0x016Fu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Bu, 0x0171u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Cu, 0x01D4u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Fu, 0x0215u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0311u, 0x0217u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x031Bu, 0x01B0u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0323u, 0x1EE5u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0324u, 0x1E73u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0328u, 0x0173u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x032Du, 0x1E77u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0330u, 0x1E75u), + HB_CODEPOINT_ENCODE3 (0x0076u, 0x0303u, 0x1E7Du), HB_CODEPOINT_ENCODE3 (0x0076u, 0x0323u, 0x1E7Fu), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0300u, 0x1E81u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0301u, 0x1E83u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0302u, 0x0175u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0307u, 0x1E87u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0308u, 0x1E85u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x030Au, 0x1E98u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0323u, 0x1E89u), HB_CODEPOINT_ENCODE3 (0x0078u, 0x0307u, 0x1E8Bu), + HB_CODEPOINT_ENCODE3 (0x0078u, 0x0308u, 0x1E8Du), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0300u, 0x1EF3u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0301u, 0x00FDu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0302u, 0x0177u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0303u, 0x1EF9u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0304u, 0x0233u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0307u, 0x1E8Fu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0308u, 0x00FFu), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0309u, 0x1EF7u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x030Au, 0x1E99u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0323u, 0x1EF5u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0301u, 0x017Au), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x0302u, 0x1E91u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0307u, 0x017Cu), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x030Cu, 0x017Eu), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0323u, 0x1E93u), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x0331u, 0x1E95u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0300u, 0x1FEDu), + HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0301u, 0x0385u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0342u, 0x1FC1u), + HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0300u, 0x1EA6u), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0301u, 0x1EA4u), + HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0303u, 0x1EAAu), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0309u, 0x1EA8u), + HB_CODEPOINT_ENCODE3 (0x00C4u, 0x0304u, 0x01DEu), HB_CODEPOINT_ENCODE3 (0x00C5u, 0x0301u, 0x01FAu), + HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0301u, 0x01FCu), HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0304u, 0x01E2u), + HB_CODEPOINT_ENCODE3 (0x00C7u, 0x0301u, 0x1E08u), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0300u, 0x1EC0u), + HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0301u, 0x1EBEu), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0303u, 0x1EC4u), + HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0309u, 0x1EC2u), HB_CODEPOINT_ENCODE3 (0x00CFu, 0x0301u, 0x1E2Eu), + HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0300u, 0x1ED2u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0301u, 0x1ED0u), + HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0303u, 0x1ED6u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0309u, 0x1ED4u), + HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0301u, 0x1E4Cu), HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0304u, 0x022Cu), + HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0308u, 0x1E4Eu), HB_CODEPOINT_ENCODE3 (0x00D6u, 0x0304u, 0x022Au), + HB_CODEPOINT_ENCODE3 (0x00D8u, 0x0301u, 0x01FEu), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0300u, 0x01DBu), + HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0301u, 0x01D7u), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0304u, 0x01D5u), + HB_CODEPOINT_ENCODE3 (0x00DCu, 0x030Cu, 0x01D9u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0300u, 0x1EA7u), + HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0301u, 0x1EA5u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0303u, 0x1EABu), + HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0309u, 0x1EA9u), HB_CODEPOINT_ENCODE3 (0x00E4u, 0x0304u, 0x01DFu), + HB_CODEPOINT_ENCODE3 (0x00E5u, 0x0301u, 0x01FBu), HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0301u, 0x01FDu), + HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0304u, 0x01E3u), HB_CODEPOINT_ENCODE3 (0x00E7u, 0x0301u, 0x1E09u), + HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0300u, 0x1EC1u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0301u, 0x1EBFu), + HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0303u, 0x1EC5u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0309u, 0x1EC3u), + HB_CODEPOINT_ENCODE3 (0x00EFu, 0x0301u, 0x1E2Fu), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0300u, 0x1ED3u), + HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0301u, 0x1ED1u), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0303u, 0x1ED7u), + HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0309u, 0x1ED5u), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0301u, 0x1E4Du), + HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0304u, 0x022Du), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0308u, 0x1E4Fu), + HB_CODEPOINT_ENCODE3 (0x00F6u, 0x0304u, 0x022Bu), HB_CODEPOINT_ENCODE3 (0x00F8u, 0x0301u, 0x01FFu), + HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0300u, 0x01DCu), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0301u, 0x01D8u), + HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0304u, 0x01D6u), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x030Cu, 0x01DAu), + HB_CODEPOINT_ENCODE3 (0x0102u, 0x0300u, 0x1EB0u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0301u, 0x1EAEu), + HB_CODEPOINT_ENCODE3 (0x0102u, 0x0303u, 0x1EB4u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0309u, 0x1EB2u), + HB_CODEPOINT_ENCODE3 (0x0103u, 0x0300u, 0x1EB1u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0301u, 0x1EAFu), + HB_CODEPOINT_ENCODE3 (0x0103u, 0x0303u, 0x1EB5u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0309u, 0x1EB3u), + HB_CODEPOINT_ENCODE3 (0x0112u, 0x0300u, 0x1E14u), HB_CODEPOINT_ENCODE3 (0x0112u, 0x0301u, 0x1E16u), + HB_CODEPOINT_ENCODE3 (0x0113u, 0x0300u, 0x1E15u), HB_CODEPOINT_ENCODE3 (0x0113u, 0x0301u, 0x1E17u), + HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0300u, 0x1E50u), HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0301u, 0x1E52u), + HB_CODEPOINT_ENCODE3 (0x014Du, 0x0300u, 0x1E51u), HB_CODEPOINT_ENCODE3 (0x014Du, 0x0301u, 0x1E53u), + HB_CODEPOINT_ENCODE3 (0x015Au, 0x0307u, 0x1E64u), HB_CODEPOINT_ENCODE3 (0x015Bu, 0x0307u, 0x1E65u), + HB_CODEPOINT_ENCODE3 (0x0160u, 0x0307u, 0x1E66u), HB_CODEPOINT_ENCODE3 (0x0161u, 0x0307u, 0x1E67u), + HB_CODEPOINT_ENCODE3 (0x0168u, 0x0301u, 0x1E78u), HB_CODEPOINT_ENCODE3 (0x0169u, 0x0301u, 0x1E79u), + HB_CODEPOINT_ENCODE3 (0x016Au, 0x0308u, 0x1E7Au), HB_CODEPOINT_ENCODE3 (0x016Bu, 0x0308u, 0x1E7Bu), + HB_CODEPOINT_ENCODE3 (0x017Fu, 0x0307u, 0x1E9Bu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0300u, 0x1EDCu), + HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0301u, 0x1EDAu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0303u, 0x1EE0u), + HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0309u, 0x1EDEu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0323u, 0x1EE2u), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0300u, 0x1EDDu), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0301u, 0x1EDBu), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0303u, 0x1EE1u), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0309u, 0x1EDFu), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0323u, 0x1EE3u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0300u, 0x1EEAu), + HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0301u, 0x1EE8u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0303u, 0x1EEEu), + HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0309u, 0x1EECu), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0323u, 0x1EF0u), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0300u, 0x1EEBu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0301u, 0x1EE9u), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0303u, 0x1EEFu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0309u, 0x1EEDu), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0323u, 0x1EF1u), HB_CODEPOINT_ENCODE3 (0x01B7u, 0x030Cu, 0x01EEu), + HB_CODEPOINT_ENCODE3 (0x01EAu, 0x0304u, 0x01ECu), HB_CODEPOINT_ENCODE3 (0x01EBu, 0x0304u, 0x01EDu), + HB_CODEPOINT_ENCODE3 (0x0226u, 0x0304u, 0x01E0u), HB_CODEPOINT_ENCODE3 (0x0227u, 0x0304u, 0x01E1u), + HB_CODEPOINT_ENCODE3 (0x0228u, 0x0306u, 0x1E1Cu), HB_CODEPOINT_ENCODE3 (0x0229u, 0x0306u, 0x1E1Du), + HB_CODEPOINT_ENCODE3 (0x022Eu, 0x0304u, 0x0230u), HB_CODEPOINT_ENCODE3 (0x022Fu, 0x0304u, 0x0231u), + HB_CODEPOINT_ENCODE3 (0x0292u, 0x030Cu, 0x01EFu), HB_CODEPOINT_ENCODE3 (0x0308u, 0x0301u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0300u, 0x1FBAu), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0301u, 0x0386u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0304u, 0x1FB9u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0306u, 0x1FB8u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0313u, 0x1F08u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0314u, 0x1F09u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0345u, 0x1FBCu), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0300u, 0x1FC8u), + HB_CODEPOINT_ENCODE3 (0x0395u, 0x0301u, 0x0388u), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0313u, 0x1F18u), + HB_CODEPOINT_ENCODE3 (0x0395u, 0x0314u, 0x1F19u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0300u, 0x1FCAu), + HB_CODEPOINT_ENCODE3 (0x0397u, 0x0301u, 0x0389u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0313u, 0x1F28u), + HB_CODEPOINT_ENCODE3 (0x0397u, 0x0314u, 0x1F29u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0345u, 0x1FCCu), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0300u, 0x1FDAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0301u, 0x038Au), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0304u, 0x1FD9u), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0306u, 0x1FD8u), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0308u, 0x03AAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0313u, 0x1F38u), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0314u, 0x1F39u), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0300u, 0x1FF8u), + HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0301u, 0x038Cu), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0313u, 0x1F48u), + HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0314u, 0x1F49u), HB_CODEPOINT_ENCODE3 (0x03A1u, 0x0314u, 0x1FECu), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0300u, 0x1FEAu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0301u, 0x038Eu), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0304u, 0x1FE9u), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0306u, 0x1FE8u), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0308u, 0x03ABu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0314u, 0x1F59u), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0300u, 0x1FFAu), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0301u, 0x038Fu), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0313u, 0x1F68u), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0314u, 0x1F69u), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0345u, 0x1FFCu), HB_CODEPOINT_ENCODE3 (0x03ACu, 0x0345u, 0x1FB4u), + HB_CODEPOINT_ENCODE3 (0x03AEu, 0x0345u, 0x1FC4u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0300u, 0x1F70u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0301u, 0x03ACu), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0304u, 0x1FB1u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0306u, 0x1FB0u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0313u, 0x1F00u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0314u, 0x1F01u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0342u, 0x1FB6u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0345u, 0x1FB3u), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0300u, 0x1F72u), + HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0301u, 0x03ADu), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0313u, 0x1F10u), + HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0314u, 0x1F11u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0300u, 0x1F74u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0301u, 0x03AEu), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0313u, 0x1F20u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0314u, 0x1F21u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0342u, 0x1FC6u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0345u, 0x1FC3u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0300u, 0x1F76u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0301u, 0x03AFu), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0304u, 0x1FD1u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0306u, 0x1FD0u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0308u, 0x03CAu), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0313u, 0x1F30u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0314u, 0x1F31u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0342u, 0x1FD6u), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0300u, 0x1F78u), + HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0301u, 0x03CCu), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0313u, 0x1F40u), + HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0314u, 0x1F41u), HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0313u, 0x1FE4u), + HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0314u, 0x1FE5u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0300u, 0x1F7Au), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0301u, 0x03CDu), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0304u, 0x1FE1u), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0306u, 0x1FE0u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0308u, 0x03CBu), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0313u, 0x1F50u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0314u, 0x1F51u), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0342u, 0x1FE6u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0300u, 0x1F7Cu), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0301u, 0x03CEu), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0313u, 0x1F60u), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0314u, 0x1F61u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0342u, 0x1FF6u), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0345u, 0x1FF3u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0300u, 0x1FD2u), + HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0301u, 0x0390u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0342u, 0x1FD7u), + HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0300u, 0x1FE2u), HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0301u, 0x03B0u), + HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0342u, 0x1FE7u), HB_CODEPOINT_ENCODE3 (0x03CEu, 0x0345u, 0x1FF4u), + HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0301u, 0x03D3u), HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0308u, 0x03D4u), + HB_CODEPOINT_ENCODE3 (0x0406u, 0x0308u, 0x0407u), HB_CODEPOINT_ENCODE3 (0x0410u, 0x0306u, 0x04D0u), + HB_CODEPOINT_ENCODE3 (0x0410u, 0x0308u, 0x04D2u), HB_CODEPOINT_ENCODE3 (0x0413u, 0x0301u, 0x0403u), + HB_CODEPOINT_ENCODE3 (0x0415u, 0x0300u, 0x0400u), HB_CODEPOINT_ENCODE3 (0x0415u, 0x0306u, 0x04D6u), + HB_CODEPOINT_ENCODE3 (0x0415u, 0x0308u, 0x0401u), HB_CODEPOINT_ENCODE3 (0x0416u, 0x0306u, 0x04C1u), + HB_CODEPOINT_ENCODE3 (0x0416u, 0x0308u, 0x04DCu), HB_CODEPOINT_ENCODE3 (0x0417u, 0x0308u, 0x04DEu), + HB_CODEPOINT_ENCODE3 (0x0418u, 0x0300u, 0x040Du), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0304u, 0x04E2u), + HB_CODEPOINT_ENCODE3 (0x0418u, 0x0306u, 0x0419u), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0308u, 0x04E4u), + HB_CODEPOINT_ENCODE3 (0x041Au, 0x0301u, 0x040Cu), HB_CODEPOINT_ENCODE3 (0x041Eu, 0x0308u, 0x04E6u), + HB_CODEPOINT_ENCODE3 (0x0423u, 0x0304u, 0x04EEu), HB_CODEPOINT_ENCODE3 (0x0423u, 0x0306u, 0x040Eu), + HB_CODEPOINT_ENCODE3 (0x0423u, 0x0308u, 0x04F0u), HB_CODEPOINT_ENCODE3 (0x0423u, 0x030Bu, 0x04F2u), + HB_CODEPOINT_ENCODE3 (0x0427u, 0x0308u, 0x04F4u), HB_CODEPOINT_ENCODE3 (0x042Bu, 0x0308u, 0x04F8u), + HB_CODEPOINT_ENCODE3 (0x042Du, 0x0308u, 0x04ECu), HB_CODEPOINT_ENCODE3 (0x0430u, 0x0306u, 0x04D1u), + HB_CODEPOINT_ENCODE3 (0x0430u, 0x0308u, 0x04D3u), HB_CODEPOINT_ENCODE3 (0x0433u, 0x0301u, 0x0453u), + HB_CODEPOINT_ENCODE3 (0x0435u, 0x0300u, 0x0450u), HB_CODEPOINT_ENCODE3 (0x0435u, 0x0306u, 0x04D7u), + HB_CODEPOINT_ENCODE3 (0x0435u, 0x0308u, 0x0451u), HB_CODEPOINT_ENCODE3 (0x0436u, 0x0306u, 0x04C2u), + HB_CODEPOINT_ENCODE3 (0x0436u, 0x0308u, 0x04DDu), HB_CODEPOINT_ENCODE3 (0x0437u, 0x0308u, 0x04DFu), + HB_CODEPOINT_ENCODE3 (0x0438u, 0x0300u, 0x045Du), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0304u, 0x04E3u), + HB_CODEPOINT_ENCODE3 (0x0438u, 0x0306u, 0x0439u), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0308u, 0x04E5u), + HB_CODEPOINT_ENCODE3 (0x043Au, 0x0301u, 0x045Cu), HB_CODEPOINT_ENCODE3 (0x043Eu, 0x0308u, 0x04E7u), + HB_CODEPOINT_ENCODE3 (0x0443u, 0x0304u, 0x04EFu), HB_CODEPOINT_ENCODE3 (0x0443u, 0x0306u, 0x045Eu), + HB_CODEPOINT_ENCODE3 (0x0443u, 0x0308u, 0x04F1u), HB_CODEPOINT_ENCODE3 (0x0443u, 0x030Bu, 0x04F3u), + HB_CODEPOINT_ENCODE3 (0x0447u, 0x0308u, 0x04F5u), HB_CODEPOINT_ENCODE3 (0x044Bu, 0x0308u, 0x04F9u), + HB_CODEPOINT_ENCODE3 (0x044Du, 0x0308u, 0x04EDu), HB_CODEPOINT_ENCODE3 (0x0456u, 0x0308u, 0x0457u), + HB_CODEPOINT_ENCODE3 (0x0474u, 0x030Fu, 0x0476u), HB_CODEPOINT_ENCODE3 (0x0475u, 0x030Fu, 0x0477u), + HB_CODEPOINT_ENCODE3 (0x04D8u, 0x0308u, 0x04DAu), HB_CODEPOINT_ENCODE3 (0x04D9u, 0x0308u, 0x04DBu), + HB_CODEPOINT_ENCODE3 (0x04E8u, 0x0308u, 0x04EAu), HB_CODEPOINT_ENCODE3 (0x04E9u, 0x0308u, 0x04EBu), + HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D2u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D3u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D4u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05B9u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D8u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05B4u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DCu, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DEu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E0u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E1u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E3u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BFu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E7u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E8u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C2u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05EAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05F2u, 0x05B7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0627u, 0x0653u, 0x0622u), HB_CODEPOINT_ENCODE3 (0x0627u, 0x0654u, 0x0623u), + HB_CODEPOINT_ENCODE3 (0x0627u, 0x0655u, 0x0625u), HB_CODEPOINT_ENCODE3 (0x0648u, 0x0654u, 0x0624u), + HB_CODEPOINT_ENCODE3 (0x064Au, 0x0654u, 0x0626u), HB_CODEPOINT_ENCODE3 (0x06C1u, 0x0654u, 0x06C2u), + HB_CODEPOINT_ENCODE3 (0x06D2u, 0x0654u, 0x06D3u), HB_CODEPOINT_ENCODE3 (0x06D5u, 0x0654u, 0x06C0u), + HB_CODEPOINT_ENCODE3 (0x0915u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0916u, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0917u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x091Cu, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0921u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0922u, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0928u, 0x093Cu, 0x0929u), HB_CODEPOINT_ENCODE3 (0x092Bu, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x092Fu, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0930u, 0x093Cu, 0x0931u), + HB_CODEPOINT_ENCODE3 (0x0933u, 0x093Cu, 0x0934u), HB_CODEPOINT_ENCODE3 (0x09A1u, 0x09BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x09A2u, 0x09BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x09AFu, 0x09BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09BEu, 0x09CBu), HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09D7u, 0x09CCu), + HB_CODEPOINT_ENCODE3 (0x0A16u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A17u, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0A1Cu, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A2Bu, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0A32u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A38u, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0B21u, 0x0B3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0B22u, 0x0B3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B3Eu, 0x0B4Bu), HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B56u, 0x0B48u), + HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B57u, 0x0B4Cu), HB_CODEPOINT_ENCODE3 (0x0B92u, 0x0BD7u, 0x0B94u), + HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BBEu, 0x0BCAu), HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BD7u, 0x0BCCu), + HB_CODEPOINT_ENCODE3 (0x0BC7u, 0x0BBEu, 0x0BCBu), HB_CODEPOINT_ENCODE3 (0x0C46u, 0x0C56u, 0x0C48u), + HB_CODEPOINT_ENCODE3 (0x0CBFu, 0x0CD5u, 0x0CC0u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CC2u, 0x0CCAu), + HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD5u, 0x0CC7u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD6u, 0x0CC8u), + HB_CODEPOINT_ENCODE3 (0x0CCAu, 0x0CD5u, 0x0CCBu), HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D3Eu, 0x0D4Au), + HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D57u, 0x0D4Cu), HB_CODEPOINT_ENCODE3 (0x0D47u, 0x0D3Eu, 0x0D4Bu), + HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCAu, 0x0DDAu), HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCFu, 0x0DDCu), + HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DDFu, 0x0DDEu), HB_CODEPOINT_ENCODE3 (0x0DDCu, 0x0DCAu, 0x0DDDu), + HB_CODEPOINT_ENCODE3 (0x0F40u, 0x0FB5u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F42u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F4Cu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F51u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F56u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F5Bu, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F72u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F74u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F90u, 0x0FB5u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F92u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F9Cu, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FA1u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FA6u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FABu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FB2u, 0x0F80u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FB3u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1025u, 0x102Eu, 0x1026u), + HB_CODEPOINT_ENCODE3 (0x1B05u, 0x1B35u, 0x1B06u), HB_CODEPOINT_ENCODE3 (0x1B07u, 0x1B35u, 0x1B08u), + HB_CODEPOINT_ENCODE3 (0x1B09u, 0x1B35u, 0x1B0Au), HB_CODEPOINT_ENCODE3 (0x1B0Bu, 0x1B35u, 0x1B0Cu), + HB_CODEPOINT_ENCODE3 (0x1B0Du, 0x1B35u, 0x1B0Eu), HB_CODEPOINT_ENCODE3 (0x1B11u, 0x1B35u, 0x1B12u), + HB_CODEPOINT_ENCODE3 (0x1B3Au, 0x1B35u, 0x1B3Bu), HB_CODEPOINT_ENCODE3 (0x1B3Cu, 0x1B35u, 0x1B3Du), + HB_CODEPOINT_ENCODE3 (0x1B3Eu, 0x1B35u, 0x1B40u), HB_CODEPOINT_ENCODE3 (0x1B3Fu, 0x1B35u, 0x1B41u), + HB_CODEPOINT_ENCODE3 (0x1B42u, 0x1B35u, 0x1B43u), HB_CODEPOINT_ENCODE3 (0x1E36u, 0x0304u, 0x1E38u), + HB_CODEPOINT_ENCODE3 (0x1E37u, 0x0304u, 0x1E39u), HB_CODEPOINT_ENCODE3 (0x1E5Au, 0x0304u, 0x1E5Cu), + HB_CODEPOINT_ENCODE3 (0x1E5Bu, 0x0304u, 0x1E5Du), HB_CODEPOINT_ENCODE3 (0x1E62u, 0x0307u, 0x1E68u), + HB_CODEPOINT_ENCODE3 (0x1E63u, 0x0307u, 0x1E69u), HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0302u, 0x1EACu), + HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0306u, 0x1EB6u), HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0302u, 0x1EADu), + HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0306u, 0x1EB7u), HB_CODEPOINT_ENCODE3 (0x1EB8u, 0x0302u, 0x1EC6u), + HB_CODEPOINT_ENCODE3 (0x1EB9u, 0x0302u, 0x1EC7u), HB_CODEPOINT_ENCODE3 (0x1ECCu, 0x0302u, 0x1ED8u), + HB_CODEPOINT_ENCODE3 (0x1ECDu, 0x0302u, 0x1ED9u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0300u, 0x1F02u), + HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0301u, 0x1F04u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0342u, 0x1F06u), + HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0345u, 0x1F80u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0300u, 0x1F03u), + HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0301u, 0x1F05u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0342u, 0x1F07u), + HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0345u, 0x1F81u), HB_CODEPOINT_ENCODE3 (0x1F02u, 0x0345u, 0x1F82u), + HB_CODEPOINT_ENCODE3 (0x1F03u, 0x0345u, 0x1F83u), HB_CODEPOINT_ENCODE3 (0x1F04u, 0x0345u, 0x1F84u), + HB_CODEPOINT_ENCODE3 (0x1F05u, 0x0345u, 0x1F85u), HB_CODEPOINT_ENCODE3 (0x1F06u, 0x0345u, 0x1F86u), + HB_CODEPOINT_ENCODE3 (0x1F07u, 0x0345u, 0x1F87u), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0300u, 0x1F0Au), + HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0301u, 0x1F0Cu), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0342u, 0x1F0Eu), + HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0345u, 0x1F88u), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0300u, 0x1F0Bu), + HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0301u, 0x1F0Du), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0342u, 0x1F0Fu), + HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0345u, 0x1F89u), HB_CODEPOINT_ENCODE3 (0x1F0Au, 0x0345u, 0x1F8Au), + HB_CODEPOINT_ENCODE3 (0x1F0Bu, 0x0345u, 0x1F8Bu), HB_CODEPOINT_ENCODE3 (0x1F0Cu, 0x0345u, 0x1F8Cu), + HB_CODEPOINT_ENCODE3 (0x1F0Du, 0x0345u, 0x1F8Du), HB_CODEPOINT_ENCODE3 (0x1F0Eu, 0x0345u, 0x1F8Eu), + HB_CODEPOINT_ENCODE3 (0x1F0Fu, 0x0345u, 0x1F8Fu), HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0300u, 0x1F12u), + HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0301u, 0x1F14u), HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0300u, 0x1F13u), + HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0301u, 0x1F15u), HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0300u, 0x1F1Au), + HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0301u, 0x1F1Cu), HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0300u, 0x1F1Bu), + HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0301u, 0x1F1Du), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0300u, 0x1F22u), + HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0301u, 0x1F24u), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0342u, 0x1F26u), + HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0345u, 0x1F90u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0300u, 0x1F23u), + HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0301u, 0x1F25u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0342u, 0x1F27u), + HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0345u, 0x1F91u), HB_CODEPOINT_ENCODE3 (0x1F22u, 0x0345u, 0x1F92u), + HB_CODEPOINT_ENCODE3 (0x1F23u, 0x0345u, 0x1F93u), HB_CODEPOINT_ENCODE3 (0x1F24u, 0x0345u, 0x1F94u), + HB_CODEPOINT_ENCODE3 (0x1F25u, 0x0345u, 0x1F95u), HB_CODEPOINT_ENCODE3 (0x1F26u, 0x0345u, 0x1F96u), + HB_CODEPOINT_ENCODE3 (0x1F27u, 0x0345u, 0x1F97u), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0300u, 0x1F2Au), + HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0301u, 0x1F2Cu), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0342u, 0x1F2Eu), + HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0345u, 0x1F98u), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0300u, 0x1F2Bu), + HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0301u, 0x1F2Du), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0342u, 0x1F2Fu), + HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0345u, 0x1F99u), HB_CODEPOINT_ENCODE3 (0x1F2Au, 0x0345u, 0x1F9Au), + HB_CODEPOINT_ENCODE3 (0x1F2Bu, 0x0345u, 0x1F9Bu), HB_CODEPOINT_ENCODE3 (0x1F2Cu, 0x0345u, 0x1F9Cu), + HB_CODEPOINT_ENCODE3 (0x1F2Du, 0x0345u, 0x1F9Du), HB_CODEPOINT_ENCODE3 (0x1F2Eu, 0x0345u, 0x1F9Eu), + HB_CODEPOINT_ENCODE3 (0x1F2Fu, 0x0345u, 0x1F9Fu), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0300u, 0x1F32u), + HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0301u, 0x1F34u), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0342u, 0x1F36u), + HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0300u, 0x1F33u), HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0301u, 0x1F35u), + HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0342u, 0x1F37u), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0300u, 0x1F3Au), + HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0301u, 0x1F3Cu), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0342u, 0x1F3Eu), + HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0300u, 0x1F3Bu), HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0301u, 0x1F3Du), + HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0342u, 0x1F3Fu), HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0300u, 0x1F42u), + HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0301u, 0x1F44u), HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0300u, 0x1F43u), + HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0301u, 0x1F45u), HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0300u, 0x1F4Au), + HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0301u, 0x1F4Cu), HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0300u, 0x1F4Bu), + HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0301u, 0x1F4Du), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0300u, 0x1F52u), + HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0301u, 0x1F54u), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0342u, 0x1F56u), + HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0300u, 0x1F53u), HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0301u, 0x1F55u), + HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0342u, 0x1F57u), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0300u, 0x1F5Bu), + HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0301u, 0x1F5Du), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0342u, 0x1F5Fu), + HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0300u, 0x1F62u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0301u, 0x1F64u), + HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0342u, 0x1F66u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0345u, 0x1FA0u), + HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0300u, 0x1F63u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0301u, 0x1F65u), + HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0342u, 0x1F67u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0345u, 0x1FA1u), + HB_CODEPOINT_ENCODE3 (0x1F62u, 0x0345u, 0x1FA2u), HB_CODEPOINT_ENCODE3 (0x1F63u, 0x0345u, 0x1FA3u), + HB_CODEPOINT_ENCODE3 (0x1F64u, 0x0345u, 0x1FA4u), HB_CODEPOINT_ENCODE3 (0x1F65u, 0x0345u, 0x1FA5u), + HB_CODEPOINT_ENCODE3 (0x1F66u, 0x0345u, 0x1FA6u), HB_CODEPOINT_ENCODE3 (0x1F67u, 0x0345u, 0x1FA7u), + HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0300u, 0x1F6Au), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0301u, 0x1F6Cu), + HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0342u, 0x1F6Eu), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0345u, 0x1FA8u), + HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0300u, 0x1F6Bu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0301u, 0x1F6Du), + HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0342u, 0x1F6Fu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0345u, 0x1FA9u), + HB_CODEPOINT_ENCODE3 (0x1F6Au, 0x0345u, 0x1FAAu), HB_CODEPOINT_ENCODE3 (0x1F6Bu, 0x0345u, 0x1FABu), + HB_CODEPOINT_ENCODE3 (0x1F6Cu, 0x0345u, 0x1FACu), HB_CODEPOINT_ENCODE3 (0x1F6Du, 0x0345u, 0x1FADu), + HB_CODEPOINT_ENCODE3 (0x1F6Eu, 0x0345u, 0x1FAEu), HB_CODEPOINT_ENCODE3 (0x1F6Fu, 0x0345u, 0x1FAFu), + HB_CODEPOINT_ENCODE3 (0x1F70u, 0x0345u, 0x1FB2u), HB_CODEPOINT_ENCODE3 (0x1F74u, 0x0345u, 0x1FC2u), + HB_CODEPOINT_ENCODE3 (0x1F7Cu, 0x0345u, 0x1FF2u), HB_CODEPOINT_ENCODE3 (0x1FB6u, 0x0345u, 0x1FB7u), + HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0300u, 0x1FCDu), HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0301u, 0x1FCEu), + HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0342u, 0x1FCFu), HB_CODEPOINT_ENCODE3 (0x1FC6u, 0x0345u, 0x1FC7u), + HB_CODEPOINT_ENCODE3 (0x1FF6u, 0x0345u, 0x1FF7u), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0300u, 0x1FDDu), + HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0301u, 0x1FDEu), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0342u, 0x1FDFu), + HB_CODEPOINT_ENCODE3 (0x2190u, 0x0338u, 0x219Au), HB_CODEPOINT_ENCODE3 (0x2192u, 0x0338u, 0x219Bu), + HB_CODEPOINT_ENCODE3 (0x2194u, 0x0338u, 0x21AEu), HB_CODEPOINT_ENCODE3 (0x21D0u, 0x0338u, 0x21CDu), + HB_CODEPOINT_ENCODE3 (0x21D2u, 0x0338u, 0x21CFu), HB_CODEPOINT_ENCODE3 (0x21D4u, 0x0338u, 0x21CEu), + HB_CODEPOINT_ENCODE3 (0x2203u, 0x0338u, 0x2204u), HB_CODEPOINT_ENCODE3 (0x2208u, 0x0338u, 0x2209u), + HB_CODEPOINT_ENCODE3 (0x220Bu, 0x0338u, 0x220Cu), HB_CODEPOINT_ENCODE3 (0x2223u, 0x0338u, 0x2224u), + HB_CODEPOINT_ENCODE3 (0x2225u, 0x0338u, 0x2226u), HB_CODEPOINT_ENCODE3 (0x223Cu, 0x0338u, 0x2241u), + HB_CODEPOINT_ENCODE3 (0x2243u, 0x0338u, 0x2244u), HB_CODEPOINT_ENCODE3 (0x2245u, 0x0338u, 0x2247u), + HB_CODEPOINT_ENCODE3 (0x2248u, 0x0338u, 0x2249u), HB_CODEPOINT_ENCODE3 (0x224Du, 0x0338u, 0x226Du), + HB_CODEPOINT_ENCODE3 (0x2261u, 0x0338u, 0x2262u), HB_CODEPOINT_ENCODE3 (0x2264u, 0x0338u, 0x2270u), + HB_CODEPOINT_ENCODE3 (0x2265u, 0x0338u, 0x2271u), HB_CODEPOINT_ENCODE3 (0x2272u, 0x0338u, 0x2274u), + HB_CODEPOINT_ENCODE3 (0x2273u, 0x0338u, 0x2275u), HB_CODEPOINT_ENCODE3 (0x2276u, 0x0338u, 0x2278u), + HB_CODEPOINT_ENCODE3 (0x2277u, 0x0338u, 0x2279u), HB_CODEPOINT_ENCODE3 (0x227Au, 0x0338u, 0x2280u), + HB_CODEPOINT_ENCODE3 (0x227Bu, 0x0338u, 0x2281u), HB_CODEPOINT_ENCODE3 (0x227Cu, 0x0338u, 0x22E0u), + HB_CODEPOINT_ENCODE3 (0x227Du, 0x0338u, 0x22E1u), HB_CODEPOINT_ENCODE3 (0x2282u, 0x0338u, 0x2284u), + HB_CODEPOINT_ENCODE3 (0x2283u, 0x0338u, 0x2285u), HB_CODEPOINT_ENCODE3 (0x2286u, 0x0338u, 0x2288u), + HB_CODEPOINT_ENCODE3 (0x2287u, 0x0338u, 0x2289u), HB_CODEPOINT_ENCODE3 (0x2291u, 0x0338u, 0x22E2u), + HB_CODEPOINT_ENCODE3 (0x2292u, 0x0338u, 0x22E3u), HB_CODEPOINT_ENCODE3 (0x22A2u, 0x0338u, 0x22ACu), + HB_CODEPOINT_ENCODE3 (0x22A8u, 0x0338u, 0x22ADu), HB_CODEPOINT_ENCODE3 (0x22A9u, 0x0338u, 0x22AEu), + HB_CODEPOINT_ENCODE3 (0x22ABu, 0x0338u, 0x22AFu), HB_CODEPOINT_ENCODE3 (0x22B2u, 0x0338u, 0x22EAu), + HB_CODEPOINT_ENCODE3 (0x22B3u, 0x0338u, 0x22EBu), HB_CODEPOINT_ENCODE3 (0x22B4u, 0x0338u, 0x22ECu), + HB_CODEPOINT_ENCODE3 (0x22B5u, 0x0338u, 0x22EDu), HB_CODEPOINT_ENCODE3 (0x2ADDu, 0x0338u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x3046u, 0x3099u, 0x3094u), HB_CODEPOINT_ENCODE3 (0x304Bu, 0x3099u, 0x304Cu), + HB_CODEPOINT_ENCODE3 (0x304Du, 0x3099u, 0x304Eu), HB_CODEPOINT_ENCODE3 (0x304Fu, 0x3099u, 0x3050u), + HB_CODEPOINT_ENCODE3 (0x3051u, 0x3099u, 0x3052u), HB_CODEPOINT_ENCODE3 (0x3053u, 0x3099u, 0x3054u), + HB_CODEPOINT_ENCODE3 (0x3055u, 0x3099u, 0x3056u), HB_CODEPOINT_ENCODE3 (0x3057u, 0x3099u, 0x3058u), + HB_CODEPOINT_ENCODE3 (0x3059u, 0x3099u, 0x305Au), HB_CODEPOINT_ENCODE3 (0x305Bu, 0x3099u, 0x305Cu), + HB_CODEPOINT_ENCODE3 (0x305Du, 0x3099u, 0x305Eu), HB_CODEPOINT_ENCODE3 (0x305Fu, 0x3099u, 0x3060u), + HB_CODEPOINT_ENCODE3 (0x3061u, 0x3099u, 0x3062u), HB_CODEPOINT_ENCODE3 (0x3064u, 0x3099u, 0x3065u), + HB_CODEPOINT_ENCODE3 (0x3066u, 0x3099u, 0x3067u), HB_CODEPOINT_ENCODE3 (0x3068u, 0x3099u, 0x3069u), + HB_CODEPOINT_ENCODE3 (0x306Fu, 0x3099u, 0x3070u), HB_CODEPOINT_ENCODE3 (0x306Fu, 0x309Au, 0x3071u), + HB_CODEPOINT_ENCODE3 (0x3072u, 0x3099u, 0x3073u), HB_CODEPOINT_ENCODE3 (0x3072u, 0x309Au, 0x3074u), + HB_CODEPOINT_ENCODE3 (0x3075u, 0x3099u, 0x3076u), HB_CODEPOINT_ENCODE3 (0x3075u, 0x309Au, 0x3077u), + HB_CODEPOINT_ENCODE3 (0x3078u, 0x3099u, 0x3079u), HB_CODEPOINT_ENCODE3 (0x3078u, 0x309Au, 0x307Au), + HB_CODEPOINT_ENCODE3 (0x307Bu, 0x3099u, 0x307Cu), HB_CODEPOINT_ENCODE3 (0x307Bu, 0x309Au, 0x307Du), + HB_CODEPOINT_ENCODE3 (0x309Du, 0x3099u, 0x309Eu), HB_CODEPOINT_ENCODE3 (0x30A6u, 0x3099u, 0x30F4u), + HB_CODEPOINT_ENCODE3 (0x30ABu, 0x3099u, 0x30ACu), HB_CODEPOINT_ENCODE3 (0x30ADu, 0x3099u, 0x30AEu), + HB_CODEPOINT_ENCODE3 (0x30AFu, 0x3099u, 0x30B0u), HB_CODEPOINT_ENCODE3 (0x30B1u, 0x3099u, 0x30B2u), + HB_CODEPOINT_ENCODE3 (0x30B3u, 0x3099u, 0x30B4u), HB_CODEPOINT_ENCODE3 (0x30B5u, 0x3099u, 0x30B6u), + HB_CODEPOINT_ENCODE3 (0x30B7u, 0x3099u, 0x30B8u), HB_CODEPOINT_ENCODE3 (0x30B9u, 0x3099u, 0x30BAu), + HB_CODEPOINT_ENCODE3 (0x30BBu, 0x3099u, 0x30BCu), HB_CODEPOINT_ENCODE3 (0x30BDu, 0x3099u, 0x30BEu), + HB_CODEPOINT_ENCODE3 (0x30BFu, 0x3099u, 0x30C0u), HB_CODEPOINT_ENCODE3 (0x30C1u, 0x3099u, 0x30C2u), + HB_CODEPOINT_ENCODE3 (0x30C4u, 0x3099u, 0x30C5u), HB_CODEPOINT_ENCODE3 (0x30C6u, 0x3099u, 0x30C7u), + HB_CODEPOINT_ENCODE3 (0x30C8u, 0x3099u, 0x30C9u), HB_CODEPOINT_ENCODE3 (0x30CFu, 0x3099u, 0x30D0u), + HB_CODEPOINT_ENCODE3 (0x30CFu, 0x309Au, 0x30D1u), HB_CODEPOINT_ENCODE3 (0x30D2u, 0x3099u, 0x30D3u), + HB_CODEPOINT_ENCODE3 (0x30D2u, 0x309Au, 0x30D4u), HB_CODEPOINT_ENCODE3 (0x30D5u, 0x3099u, 0x30D6u), + HB_CODEPOINT_ENCODE3 (0x30D5u, 0x309Au, 0x30D7u), HB_CODEPOINT_ENCODE3 (0x30D8u, 0x3099u, 0x30D9u), + HB_CODEPOINT_ENCODE3 (0x30D8u, 0x309Au, 0x30DAu), HB_CODEPOINT_ENCODE3 (0x30DBu, 0x3099u, 0x30DCu), + HB_CODEPOINT_ENCODE3 (0x30DBu, 0x309Au, 0x30DDu), HB_CODEPOINT_ENCODE3 (0x30EFu, 0x3099u, 0x30F7u), + HB_CODEPOINT_ENCODE3 (0x30F0u, 0x3099u, 0x30F8u), HB_CODEPOINT_ENCODE3 (0x30F1u, 0x3099u, 0x30F9u), + HB_CODEPOINT_ENCODE3 (0x30F2u, 0x3099u, 0x30FAu), HB_CODEPOINT_ENCODE3 (0x30FDu, 0x3099u, 0x30FEu), + HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C2u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x11099u, 0x110BAu, 0x1109Au),HB_CODEPOINT_ENCODE3 (0x1109Bu, 0x110BAu, 0x1109Cu), + HB_CODEPOINT_ENCODE3 (0x110A5u, 0x110BAu, 0x110ABu),HB_CODEPOINT_ENCODE3 (0x11131u, 0x11127u, 0x1112Eu), + HB_CODEPOINT_ENCODE3 (0x11132u, 0x11127u, 0x1112Fu),HB_CODEPOINT_ENCODE3 (0x11347u, 0x1133Eu, 0x1134Bu), + HB_CODEPOINT_ENCODE3 (0x11347u, 0x11357u, 0x1134Cu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114B0u, 0x114BCu), + HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BAu, 0x114BBu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BDu, 0x114BEu), + HB_CODEPOINT_ENCODE3 (0x115B8u, 0x115AFu, 0x115BAu),HB_CODEPOINT_ENCODE3 (0x115B9u, 0x115AFu, 0x115BBu), + HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u), +}; + +#ifndef HB_OPTIMIZE_SIZE + +static const uint8_t +_hb_ucd_u8[31814] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28, + 29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59, + 59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59, + 75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 25, 25, 25, 21, + 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 21, 18, 24, 16, + 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 29, 21, 23, 23, 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, + 26, 25, 15, 15, 24, 5, 21, 21, 24, 15, 7, 19, 15, 15, 15, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 25, 9, 9, 9, 9, 9, 9, 9, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, + 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 9, 5, 5, + 5, 9, 9, 5, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 9, 9, + 9, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 5, 9, 9, 5, 9, + 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 5, 9, 5, 9, 9, + 5, 9, 9, 9, 5, 9, 5, 9, 9, 5, 5, 7, 9, 5, 5, 5, + 7, 7, 7, 7, 9, 8, 5, 9, 8, 5, 9, 8, 5, 9, 5, 9, + 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, + 5, 9, 8, 5, 9, 5, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 9, 9, 5, + 5, 9, 5, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 6, 6, 6, 6, 6, 24, 24, 24, 24, 24, 24, 24, 6, 24, 6, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 9, 5, 9, 5, 6, 24, 9, 5, 2, 2, 6, 5, 5, 5, 21, 9, + 2, 2, 2, 2, 24, 24, 9, 21, 9, 9, 9, 2, 9, 2, 9, 9, + 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, + 5, 5, 9, 9, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 5, 5, 9, 5, 25, 9, 5, 9, 9, 5, 5, 9, 9, 9, + 9, 5, 26, 12, 12, 12, 12, 12, 11, 11, 9, 5, 9, 5, 9, 5, + 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 2, 2, 6, 21, 21, 21, 21, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 17, 2, 2, 26, 26, 23, + 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 17, 12, + 21, 12, 12, 21, 12, 12, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, + 7, 7, 7, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 25, 25, 25, 21, 21, 23, 21, 21, 26, 26, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 1, 2, 21, 21, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 7, 7, + 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 21, 7, 12, 12, 12, 12, 12, 12, 12, 1, 26, 12, + 12, 12, 12, 12, 12, 6, 6, 12, 12, 26, 12, 12, 12, 12, 7, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 26, 26, 7, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 1, + 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 6, 6, 26, 21, 21, 21, 6, 2, 2, 12, 23, 23, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 6, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 6, 12, 12, 12, 6, 12, 12, 12, 12, 12, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 2, 2, 21, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, + 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 10, 10, + 7, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 12, 12, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 2, 7, 2, 2, 2, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 7, 2, + 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 7, 7, 2, 7, + 7, 7, 12, 12, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 7, 7, 23, 23, 15, 15, 15, 15, 15, 15, 26, 23, 7, 21, 12, 2, + 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 2, 7, 7, 2, 2, 12, 2, 10, 10, + 10, 12, 12, 2, 2, 2, 2, 12, 12, 2, 2, 12, 12, 12, 2, 2, + 2, 12, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 2, 7, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 7, 7, 7, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, + 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 12, 2, 12, 12, 10, 2, 10, 10, 12, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 23, 2, 2, 2, 2, 2, 2, 2, 7, 12, 12, 12, 12, 12, 12, + 2, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, + 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 2, 2, + 2, 2, 2, 2, 2, 2, 12, 10, 2, 2, 2, 2, 7, 7, 2, 7, + 26, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 12, 7, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, + 7, 2, 7, 7, 7, 7, 2, 2, 2, 7, 7, 2, 7, 2, 7, 7, + 2, 2, 2, 7, 7, 2, 2, 2, 7, 7, 7, 2, 2, 2, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 10, 10, + 12, 10, 10, 2, 2, 2, 10, 10, 10, 2, 10, 10, 10, 12, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 26, 26, 26, 26, 26, 26, 23, 26, 2, 2, 2, 2, 2, + 12, 10, 10, 10, 12, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 12, 12, + 12, 10, 10, 10, 10, 2, 12, 12, 12, 2, 12, 12, 12, 12, 2, 2, + 2, 2, 2, 2, 2, 12, 12, 2, 7, 7, 7, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 15, 15, 15, 15, 15, 15, 15, 26, + 7, 12, 10, 10, 21, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, + 10, 10, 10, 10, 10, 2, 12, 10, 10, 2, 10, 10, 12, 12, 2, 2, + 2, 2, 2, 2, 2, 10, 10, 2, 2, 2, 2, 2, 2, 2, 7, 2, + 2, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 2, 10, 10, 10, 2, 10, 10, 10, 12, 7, 26, + 2, 2, 2, 2, 7, 7, 7, 10, 15, 15, 15, 15, 15, 15, 15, 7, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 7, 7, 7, 7, 7, 7, + 2, 2, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 12, 2, 2, 2, 2, 10, + 10, 10, 12, 12, 12, 2, 12, 2, 10, 10, 10, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 23, + 7, 7, 7, 7, 7, 7, 6, 12, 12, 12, 12, 12, 12, 12, 12, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 2, 2, 2, 2, + 2, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, + 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 2, 2, + 7, 7, 7, 7, 7, 2, 6, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 7, 7, 7, 7, + 7, 26, 26, 26, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 26, 21, 26, 26, 26, 12, 12, 26, 26, 26, 26, 26, 26, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 26, 12, 26, 12, 26, 12, 22, 18, 22, 18, 10, 10, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, + 12, 12, 12, 12, 12, 21, 12, 12, 7, 7, 7, 7, 7, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 2, 26, 26, + 21, 21, 21, 21, 21, 26, 26, 26, 26, 21, 21, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 12, + 12, 10, 12, 12, 12, 12, 12, 12, 10, 12, 12, 10, 10, 12, 12, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 7, 7, 7, 7, 12, 12, + 12, 7, 10, 10, 10, 7, 7, 10, 10, 10, 10, 10, 10, 10, 7, 7, + 7, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 12, 10, 10, 12, 12, 10, 10, 10, 10, 10, 10, 12, 7, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 12, 26, 26, + 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 2, 9, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 6, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 2, + 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 2, + 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 2, 2, 5, 5, 5, 5, 5, 5, 2, 2, + 17, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 21, 7, + 29, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, 18, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 21, 21, 14, 14, + 14, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 12, 12, 12, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 2, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 10, 10, + 10, 10, 10, 10, 10, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 21, 21, 21, 6, 21, 21, 21, 23, 7, 12, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12, 1, 2, + 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, + 12, 12, 12, 10, 10, 10, 10, 12, 12, 10, 10, 10, 2, 2, 2, 2, + 10, 10, 12, 10, 10, 10, 10, 10, 10, 12, 12, 12, 2, 2, 2, 2, + 26, 2, 2, 2, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, + 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 2, 2, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 10, 10, 12, 2, 2, 21, 21, + 7, 7, 7, 7, 7, 10, 12, 10, 12, 12, 12, 12, 12, 12, 12, 2, + 12, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, + 21, 21, 21, 21, 21, 21, 21, 6, 21, 21, 21, 21, 21, 21, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 2, + 12, 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 12, 10, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, + 10, 10, 12, 10, 10, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, + 21, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, + 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 12, 12, 12, 7, 7, + 7, 7, 7, 7, 7, 7, 12, 10, 12, 12, 10, 10, 10, 12, 10, 12, + 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, + 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, + 12, 12, 12, 12, 10, 10, 12, 12, 2, 2, 2, 21, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 10, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 12, 7, 7, + 7, 7, 7, 7, 12, 7, 7, 10, 12, 12, 7, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, + 9, 5, 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, + 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 2, 9, 2, 9, 2, 9, 2, 9, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, + 5, 5, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 5, 24, + 24, 24, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 24, + 5, 5, 5, 5, 2, 2, 5, 5, 9, 9, 9, 9, 2, 24, 24, 24, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 24, 24, 24, + 2, 2, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 2, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 1, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 21, 21, 20, 19, 22, 20, 20, 19, 22, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 27, 28, 1, 1, 1, 1, 1, 29, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 21, 21, 21, 21, 16, + 16, 21, 21, 21, 25, 22, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 25, 21, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 29, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 15, 6, 2, 2, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 6, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 2, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, + 11, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 9, 26, 26, 26, 26, 9, 26, 26, 5, 9, 9, 9, 5, 5, + 9, 9, 9, 5, 26, 9, 26, 26, 25, 9, 9, 9, 9, 9, 26, 26, + 26, 26, 26, 26, 9, 26, 9, 26, 9, 26, 9, 9, 9, 9, 26, 5, + 9, 9, 9, 9, 5, 7, 7, 7, 7, 5, 26, 26, 5, 5, 9, 9, + 25, 25, 25, 25, 25, 9, 5, 5, 5, 5, 26, 25, 26, 26, 5, 26, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 9, 5, 14, 14, 14, 14, 15, 26, 26, 2, 2, 2, 2, + 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 25, 25, 26, 26, 26, 26, + 25, 26, 26, 25, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 25, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, + 26, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 26, 26, 26, 26, + 25, 25, 26, 26, 26, 26, 26, 26, 26, 22, 18, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, + 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, + 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, + 22, 18, 22, 18, 22, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 25, 25, 25, 25, 25, 22, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, + 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, + 18, 22, 18, 22, 18, 22, 18, 22, 18, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 25, 25, + 25, 25, 25, 25, 25, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 9, 5, 9, 9, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, + 9, 5, 9, 5, 5, 9, 5, 5, 5, 5, 5, 5, 6, 6, 9, 9, + 9, 5, 9, 5, 5, 26, 26, 26, 26, 26, 26, 9, 5, 9, 5, 12, + 12, 12, 9, 5, 2, 2, 2, 2, 2, 21, 21, 21, 21, 15, 21, 21, + 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 6, + 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 2, + 21, 21, 20, 19, 20, 19, 21, 21, 21, 20, 19, 21, 20, 19, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 17, 21, 21, 17, 21, 20, 19, 21, 21, + 20, 19, 22, 18, 22, 18, 22, 18, 22, 18, 21, 21, 21, 21, 21, 6, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 17, 17, 21, 21, 21, 21, + 17, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, + 29, 21, 21, 21, 26, 6, 7, 14, 22, 18, 22, 18, 22, 18, 22, 18, + 22, 18, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, 17, 22, 18, 18, + 26, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, + 17, 6, 6, 6, 6, 6, 26, 26, 14, 14, 14, 6, 7, 21, 26, 26, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 24, 24, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 6, 6, 6, 7, + 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 26, 26, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, 15, 15, + 26, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 2, 2, 2, 2, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 7, 12, + 11, 11, 11, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 6, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6, 6, 12, 12, + 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 12, 12, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 24, 24, 24, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 24, 24, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 9, 5, 9, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 6, 24, 24, 9, 5, 9, 5, 7, + 9, 5, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, 9, 9, 5, + 9, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 2, 2, 9, 5, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 7, 6, 6, 5, 7, 7, 7, 7, 7, + 7, 7, 12, 7, 7, 7, 12, 7, 7, 7, 7, 12, 7, 7, 7, 7, + 7, 7, 7, 10, 10, 12, 12, 10, 26, 26, 26, 26, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 26, 26, 23, 26, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, + 12, 12, 7, 7, 7, 7, 7, 7, 21, 21, 21, 7, 21, 7, 7, 12, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 21, 21, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 12, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 10, + 10, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 6, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 21, 21, + 7, 7, 7, 7, 7, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, + 10, 12, 12, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 21, 21, 21, 21, + 6, 7, 7, 7, 7, 7, 7, 26, 26, 26, 7, 10, 12, 10, 7, 7, + 12, 7, 12, 12, 12, 7, 7, 12, 12, 7, 7, 7, 7, 7, 12, 12, + 7, 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6, 21, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 12, 12, 10, 10, + 21, 21, 7, 6, 6, 10, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 2, + 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 10, 10, 12, 10, 10, 12, 10, 10, 21, 10, 12, 2, 2, + 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 7, 12, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 2, + 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 22, + 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 23, 26, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 22, 18, 21, 2, 2, 2, 2, 2, 2, + 21, 17, 17, 16, 16, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, + 18, 22, 18, 22, 18, 21, 21, 22, 18, 21, 21, 21, 21, 16, 16, 16, + 21, 21, 21, 2, 21, 21, 21, 21, 17, 22, 18, 22, 18, 22, 18, 21, + 21, 21, 25, 17, 25, 25, 25, 2, 21, 23, 21, 21, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 1, + 2, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 22, + 18, 21, 22, 18, 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, + 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 2, 2, 2, + 23, 23, 25, 24, 26, 23, 23, 2, 26, 25, 25, 25, 25, 26, 26, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 26, 26, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, + 21, 21, 21, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 14, 14, 14, 14, 14, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 26, 26, 26, 2, + 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 2, 2, + 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, + 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, + 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 14, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 21, + 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 21, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, + 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 2, 2, 7, 2, 2, 7, + 7, 7, 7, 7, 7, 7, 2, 21, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 7, 26, 26, 15, 15, 15, 15, 15, 15, 15, + 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 2, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 15, 15, 7, 7, + 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 12, 12, 12, 2, 12, 12, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 7, 7, 7, 7, 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, 2, 2, 2, 2, 12, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 12, 12, 2, 2, 2, 2, 15, 15, 15, 15, 15, + 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 2, 2, 21, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, + 15, 15, 15, 15, 15, 15, 15, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 15, 15, 15, 15, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, + 10, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 21, 21, 2, 2, + 15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, + 10, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 21, 21, 1, 21, 21, + 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, + 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 10, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 21, 21, 21, 7, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, + 10, 7, 7, 7, 7, 21, 21, 21, 21, 12, 12, 12, 12, 21, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 21, 7, 21, 21, 21, + 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 12, + 12, 12, 10, 10, 12, 10, 12, 12, 21, 21, 21, 21, 21, 21, 12, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 12, 12, 7, 10, 10, + 12, 10, 10, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 10, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 7, 7, 7, + 7, 7, 10, 10, 2, 2, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, + 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, + 10, 10, 12, 12, 12, 10, 12, 7, 7, 7, 7, 21, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 21, 2, 21, 12, 7, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, 10, 12, + 12, 10, 12, 12, 7, 7, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 12, 12, 12, 12, 2, 2, 10, 10, 10, 10, 12, 12, 10, 12, + 12, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 7, 7, 7, 7, 12, 12, 2, 2, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 12, 10, 12, + 12, 21, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 10, 10, + 12, 12, 12, 12, 12, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2, + 10, 10, 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 21, 21, 21, 26, + 12, 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 2, 2, 2, 2, + 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 10, 10, 10, 12, 12, 12, 12, 2, 2, 12, 12, 10, 10, 10, 10, + 12, 7, 21, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, + 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, 7, 12, 12, 12, 12, 21, + 21, 21, 21, 21, 21, 21, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 12, 12, 12, 12, 12, 12, 10, 10, 12, 12, 12, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 21, 21, 7, 21, 21, + 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 10, 12, + 7, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 10, 12, 12, 12, 12, 12, 12, + 12, 10, 12, 12, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, + 7, 12, 12, 12, 12, 12, 12, 2, 2, 2, 12, 2, 12, 12, 2, 12, + 12, 12, 12, 12, 12, 12, 7, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 2, + 12, 12, 2, 10, 10, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 12, 10, 10, 21, 21, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 23, 23, 23, + 23, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, + 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 26, 26, 26, 26, + 6, 6, 6, 6, 21, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 15, 15, 15, 15, 15, + 15, 15, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 7, 7, 7, + 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 12, + 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 12, + 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 21, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 26, 12, 12, 21, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 10, 10, 12, 12, 12, 26, 26, 26, 10, 10, 10, + 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, + 12, 12, 12, 26, 26, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 12, 12, 12, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, + 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 2, 9, 9, + 2, 2, 9, 2, 2, 9, 9, 2, 2, 9, 9, 9, 9, 2, 9, 9, + 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 2, 5, 2, 5, 5, 5, + 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 2, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, + 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 9, 9, 9, 9, 9, 9, + 9, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, + 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, + 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 5, 2, 2, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, + 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 12, 26, 26, 21, 21, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, + 12, 12, 2, 12, 12, 2, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 7, 26, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 23, + 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 12, 12, 12, 12, 12, 12, 12, 6, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, 15, 15, + 23, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, + 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, 7, 2, 2, 2, 2, + 2, 2, 7, 2, 2, 2, 2, 7, 2, 7, 2, 7, 2, 7, 7, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, + 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, + 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, + 25, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, + 26, 26, 2, 26, 26, 26, 26, 2, 2, 2, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 2, 2, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 2, 2, 26, 26, 26, 2, 2, 2, 2, 2, + 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, + 26, 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, 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, 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, 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, 0, 27, 0, 28, 29, 30, 31, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0, + 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 37, 0, 0, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 0, 51, 52, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 54, 59, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, + 0, 16, 0, 0, 0, 0, 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 0, 0, 0, 30, 31, 32, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 33, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 34, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 35, 31, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 37, 38, 0, + 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 41, 0, 42, 0, 0, + 0, 43, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, + 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 57, 49, 0, + 58, 59, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 68, 1, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 71, 72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, + 0, 75, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 76, 0, 0, 0, + 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 78, 0, 79, 0, 0, 0, 0, 0, 74, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 1, 74, 0, 0, 81, 0, 0, 82, + 0, 0, 0, 0, 0, 83, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 84, 85, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 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, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 91, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 88, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 75, 0, 0, 0, 95, 0, 0, 0, 0, 96, 0, 0, 97, 0, 0, + 0, 83, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0,101, 31, 0, + 102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 33, + 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75,106, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 0, 0, 0, 0,107, 0, 0, 0, 0, 0, 0,108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 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, 54, 0, 0, 0, 0, 49,109, 0, + 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, + 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0,113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 115,116,117, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 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,123, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0,125, 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,230,230,230,230,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232, + 220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220, + 220,202,202,220,220,220,220,220,220,220,220,220,220,220, 1, 1, + 1, 1, 1,220,220,220,220,230,230,230,230,230,230,230,230,240, + 230,220,220,220,230,230,230,220,220, 0,230,230,230,220,220,220, + 220,230,232,220,220,230,233,234,234,233,234,234,233,230,230,230, + 230,230,230,230,230,230,230,230,230,230, 0, 0, 0,230,230,230, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,230,230,230,230, + 220,230,230,230,222,220,230,230,230,230,230,230,220,220,220,220, + 220,220,230,230,220,230,230,222,228,230, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230,230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220, + 220,230,230,230,230,230,220,230,230,220, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230,230,230, 0, 0,230,230,230,230,220,230, 0, + 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,220,230,230,220,230, + 230,220,220,220,230,220,220,230,220,230,230,230,220,230,220,230, + 220,230,220,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,230,230,230,230,230,230,230,220,230, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230, 0,230,230,230,230,230,230,230,230,230, 0,230, + 230,230, 0,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 0, 0,220,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230, 0,220,230,230, + 220,230,230,220,230,230,230,220,220,220, 27, 28, 29,230,230,230, + 220,230,230,220,220,230,230,230,230,230, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 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,230, 0, 0, 0, 0, 0, 0, 84, + 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 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,103,103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,107,107,107,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,118,118, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,122,122,122,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, + 0,220, 0,216, 0, 0, 0, 0, 0, 0, 0,129,130, 0,132, 0, + 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, 9, 0, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,222,230,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,230,220, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, + 230,230,230,230,230,230,230, 0, 0,220,230,230,230,230,230,220, + 220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,230,220,230,230,230,230,230,230,230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 1,220, + 220,220,220,220,230,230,220,220,220,220,230, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0,230, 0, + 0, 0,230,230, 0, 0, 0, 0, 0, 0,230,230,220,230,230,230, + 230,230,230,230,220,230,230,234,214,220,202,230,230,230,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230, + 232,228,228,220, 0,230,233,220,230,220,230,230, 1, 1,230,230, + 230,230, 1, 1, 1,230,230, 0, 0, 0, 0,230, 0, 0, 0, 1, + 1,230,220,230, 1, 1,220,220,220,220,230, 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, 0,230,230,230, 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, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,218,228,232,222,224,224, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230,230,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,230,230, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 0,230,230,220, 0, + 0,230,230, 0, 0, 0, 0, 0,230,230, 0,230, 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, 26, 0,230,230,230,230,230,230, + 230,220,220,220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0,230, 0, 0, 0, 0, 0, 0, + 0, 0,230, 1,220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,230, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220,220,230,230,230,220,230,220,220,220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 7, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230,230,230, 0, 0, 0,230,230,230,230,230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 7, 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, 9, 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, 7, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,216, + 216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, 0, 0, + 0, 0, 0, 0, 0,220,220,220,220,220,220,220,220, 0, 0,230, + 230,230,230,230,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230, 0, 0, 0, 0,230,230,230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230, 0,230,230,230,230,230,230,230,230,230,230,230,230,230,230, + 230,230,230, 0, 0,230,230,230,230,230,230,230, 0,230,230, 0, + 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,230,230,230,230,220,220,220,220,220,220, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230,230,230, 7, 0, 0, 0, 0, 0, 16, 17, 17, 17, 17, 17, + 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, + 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 6, 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, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 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, 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, 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, + 8, 9, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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, 0, 11, 12, 0, 13, + 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, + 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, + 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, + 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 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, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 21, 32, 4, 0, 10, + 0, 33, 7, 20, 20, 20, 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, 0, 0, 0, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, + 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, + 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, + 0, 42, 43, 44, 0, 45, 0, 8, 21, 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, 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, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, + 0, 1, 20, 20, 1, 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, 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, 20, 20, 1, 20, + 20, 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, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 21, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 19, 20, + 21, 22, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 28, 28, 29, 30, 31, 32, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 35, 35, 35, + 35, 35, 59, 59, 60, 35, 35, 35, 35, 35, 35, 35, 61, 62, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 63, 64, + 35, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 68, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 69, 70, 35, 35, 35, 35, 71, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 72, 73, 74, 75, 76, 77, 35, 35, 78, 79, 35, 35, 80, 35, + 81, 82, 83, 84, 17, 85, 86, 87, 35, 35, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 88, 25, 25, + 25, 25, 25, 25, 25, 89, 90, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 91, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 92, + 35, 35, 35, 35, 35, 35, 25, 93, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, + 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 0, 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, + 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, + 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, + 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, + 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, + 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 11, 11, 2, + 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, + 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, + 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, + 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, + 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, + 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, + 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, + 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, + 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 22, 2, 2, 2, + 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, + 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, + 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, + 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 20, 20, 20, + 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, + 36, 2, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 2, + 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, + 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 2, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, + 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 2, 30, 30, 30, 30, 2, 2, 30, 2, 30, 30, + 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 2, 30, 30, + 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 45, 45, 45, 45, 45, 45, + 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, + 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, + 28, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, + 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 2, 2, 8, 8, 8, 76, 76, 76, 76, + 76, 76, 76, 76, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, + 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 19, 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, 19, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 30, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, + 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, 2, 39, 39, 39, 39, + 39, 39, 39, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 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, 77, 2, 2, 2, 2, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 2, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, + 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 9, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 12, 12, 12, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, + 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, + 14, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, + 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, + 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, + 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,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, 2, 2, 2, 2, 2, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 2, 2, 2, 2, 2, 2,135,135,135,135, + 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, + 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135,135,135, + 135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106,106,106, + 106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106, + 106,106,106,106, 2, 2, 2, 2, 2, 2, 2, 2,104,104,104,104, + 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, + 110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110, + 110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110, + 110,110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 47, 47, 47, 47, + 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 2, 81, 81, 81, 81, 81, 81, 81, 81, 81,120,120,120,120, + 120,120,120,120,120,120,120,120,120,120,120,120,116,116,116,116, + 116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, 2, 2, + 2, 2, 2,116,116,116,116,116,116,116,116,116,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 2, + 128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, + 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, + 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,117,117,117,117, + 117,117,117,117,117,117,117,117,117,117,117,117,112,112,112,112, + 112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, + 112,112,112, 2, 2, 2, 2,112,112,112,112,112,112,112,112,112, + 112,112,112, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 2, 2, 83, 83, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, + 2, 2, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122, 2, 2, + 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130, + 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,130,130,130, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,101,101, + 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, + 101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101,101,101, + 101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111, 2, 2, 2, 2, 2, 2, 2, 2, 2,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,108,108,108,108, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108, 2,108, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, + 108,108,108,108,108,108,108,108,108,108,108, 2,129,129,129,129, + 129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129, 2,129,129,129,129,129, + 129,129,129,129,129,129, 2, 2, 2, 2, 2, 2,109,109,109,109, + 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, + 109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109,109,109, + 109,109,109,109,109,109, 2, 2, 2, 2, 2, 2,107,107,107,107, + 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, 2,107, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, + 107,107,107,107,107, 2,107,107,107,107,107,107,107, 2,107,107, + 2,107,107,107,107,107, 2, 1,107,107,107,107,107,107,107,107, + 107, 2, 2,107,107, 2, 2,107,107,107, 2, 2,107, 2, 2, 2, + 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107,107,107, + 2, 2,107,107,107,107,107,107,107, 2, 2, 2,107,107,107,107, + 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,137,137,137,137, + 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137, + 137,137,137,137,137,137, 2,137, 2,137,137,137,124,124,124,124, + 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, + 124,124,124,124, 2, 2, 2, 2, 2, 2, 2, 2,124,124,124,124, + 124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, + 123,123, 2, 2,123,123,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,114,114, + 114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114, + 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,114,114,114,114, + 114,114,114,114,114,114, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2,102,102,102,102, + 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, + 102,102,102,102,102, 2, 2, 2, 2, 2, 2, 2,102,102,102,102, + 102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126, + 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, + 126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,126,126, + 126,126,126,126,126,126,126,126, 2, 2, 2, 2, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2,125,125,125,125, + 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125, 5, 5, 5, 5, + 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, + 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,121,121,121,121, + 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, + 121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133,133,133,133,133, + 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133, + 133,133,133, 2,133,133,133,133,133,133,133,133,133,133,133,133, + 133,133, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,133,133,133,133, + 133,133,133,133,133,133,133,133,133, 2, 2, 2,134,134,134,134, + 134,134,134,134,134,134,134,134,134,134,134,134, 2, 2,134,134, + 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, + 134,134,134,134, 2,134,134,134,134,134,134,134,134,134,134,134, + 134,134,134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 2, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, + 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, + 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 2, 2, 2, 2, 2, 2, 2,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2,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, 2,115,115,115,115, + 115,115,115,115,115,115, 2, 2, 2, 2,115,115,103,103,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103, + 103,103,103,103,103,103,103,103,103,103, 2, 2,103,103,103,103, + 103,103, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 119,119, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119, + 119,119,119,119,119,119, 2,119,119,119,119,119,119,119, 2,119, + 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136,136, + 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, + 136,136,136,136, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 15, 15, 15, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, + 105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2,105,105,105,105, + 105,105,105,105,105, 2, 2, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105, 2, 2,105,105,105,105, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, + 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 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, 2, 2, 0, 0,131,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, + 131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131, 56, 56, 56, 56, + 56, 56, 56, 2, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, + 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 14,113,113,113,113, + 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, + 113, 2, 2,113,113,113,113,113,113,113,113,113,113,113,113,113, + 113,113,113, 2, 2, 2, 2, 2, 2, 2, 2, 2,132,132,132,132, + 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, + 132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132,132,132, + 132,132,132,132,132,132, 2, 2, 2, 2,132,132, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, + 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, + 2, 3, 4, 5, 6, 0, 0, 0, 0, 7, 8, 9, 10, 11, 0, 12, + 0, 0, 0, 0, 13, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 16, 0, 17, 18, 19, 0, 0, 0, 20, 21, 22, 0, 23, 0, 24, + 0, 25, 0, 26, 0, 0, 0, 0, 0, 27, 28, 0, 29, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 0, + 41, 0, 42, 43, 44, 45, 46, 47, 48, 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, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 52, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 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, 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, 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, 63, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 66, 0, + 0, 0, 67, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 68, 69, 70, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 0, +}; +static const uint16_t +_hb_ucd_u16[11168] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, + 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, + 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, + 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, + 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, + 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, + 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, + 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, + 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, + 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, + 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 167, 168, 48, 48, 167, 48, 48, 169, 170, 171, 48, 48, + 48, 170, 48, 48, 48, 172, 173, 174, 48, 175, 9, 9, 9, 9, 9, 176, + 177, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, + 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, + 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, + 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, + 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, + 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, + 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, + 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, + 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208, + 208, 208, 285, 72, 286, 72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291, + 208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208, + 9, 9, 305, 11, 11, 306, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, + 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, + 316, 317, 318, 319, 320, 72, 72, 72, 208, 321, 208, 208, 208, 208, 208, 322, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 72, 324, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, + 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 198, 208, 208, 208, 208, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 72, + 48, 337, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, + 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, + 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, + 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, + 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, + 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 386, 48, 387, 48, 48, 205, + 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, + 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, 206, 72, 72, + 390, 391, 392, 393, 394, 48, 48, 48, 48, 48, 48, 395, 396, 397, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 398, 72, 48, 48, 48, 48, 399, 48, 48, 400, 72, 72, 401, + 32, 402, 32, 403, 404, 405, 406, 407, 48, 48, 48, 48, 48, 48, 48, 408, + 409, 2, 3, 4, 5, 410, 411, 412, 48, 413, 48, 199, 414, 415, 416, 417, + 418, 48, 171, 419, 203, 203, 72, 72, 48, 48, 48, 48, 48, 48, 48, 71, + 420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424, 72, 72, 208, 208, 425, + 72, 72, 72, 72, 72, 72, 72, 72, 48, 150, 48, 48, 48, 100, 426, 427, + 48, 48, 428, 48, 429, 48, 48, 430, 48, 431, 48, 48, 432, 433, 72, 72, + 9, 9, 434, 11, 11, 48, 48, 48, 48, 203, 191, 9, 9, 435, 11, 436, + 48, 48, 400, 48, 48, 48, 437, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 314, 48, 198, 400, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 438, 48, 48, 439, 48, 440, 48, 441, 48, 199, 442, 72, 72, 72, 48, 443, + 48, 444, 48, 445, 72, 72, 72, 72, 48, 48, 48, 446, 269, 447, 269, 269, + 448, 449, 48, 450, 451, 452, 48, 453, 48, 454, 72, 72, 455, 48, 456, 457, + 48, 48, 48, 458, 48, 459, 48, 460, 48, 461, 462, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 195, 72, 72, 72, 9, 9, 9, 463, 11, 11, 11, 464, + 48, 48, 465, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 466, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 454, 467, 48, 62, 468, 72, 72, 72, 72, 72, 72, 72, 72, 48, 314, + 469, 48, 48, 470, 471, 447, 472, 473, 220, 48, 48, 474, 475, 48, 195, 191, + 476, 48, 477, 478, 479, 48, 48, 480, 220, 48, 48, 481, 482, 483, 484, 485, + 48, 97, 486, 487, 72, 72, 72, 72, 488, 489, 490, 48, 48, 491, 492, 191, + 493, 83, 84, 494, 495, 496, 497, 498, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 504, 505, 506, 507, 72, 72, + 48, 48, 48, 508, 509, 191, 510, 72, 48, 48, 511, 512, 191, 72, 72, 72, + 48, 172, 513, 514, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 517, 48, 48, 518, 519, 72, + 520, 48, 48, 521, 522, 523, 48, 48, 524, 525, 526, 72, 48, 48, 48, 195, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 84, 48, 504, 527, 528, 147, 174, 529, 48, 530, 531, 532, 72, 72, 72, 72, + 533, 48, 48, 534, 535, 191, 536, 48, 537, 538, 191, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 540, 541, 542, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, 72, 72, 72, 72, 72, 72, + 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 386, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 199, 545, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 314, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, + 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 400, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 559, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 205, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, + 208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568, 72, + 208, 208, 208, 208, 569, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 570, + 208, 208, 208, 208, 208, 285, 269, 451, 72, 72, 72, 72, 72, 72, 72, 72, + 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, + 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, + 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, + 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 606, 607, 608, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 150, 609, 610, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 611, 612, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 613, 614, 72, 72, + 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 484, 269, 269, 616, 617, 72, 72, 72, 72, + 484, 269, 618, 619, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, + 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, + 633, 208, 208, 324, 568, 634, 323, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286, + 208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324, 72, + 324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637, 72, 72, 72, 72, 72, + 638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208, + 208, 208, 208, 208, 208, 322, 637, 642, 633, 323, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 314, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 203, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 643, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, + 48, 203, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 644, 72, 645, 645, 645, 645, 645, 645, 72, 72, 72, 72, 72, 72, 72, 72, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 647, + 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 16, 17, 18, 17, 17, 19, 20, 21, 21, 22, 21, 23, 24, + 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 27, 27, 31, 27, 27, + 32, 33, 33, 33, 34, 27, 27, 27, 35, 35, 35, 36, 37, 37, 37, 38, + 39, 39, 40, 41, 42, 43, 44, 45, 45, 45, 27, 46, 45, 47, 48, 27, + 49, 49, 49, 49, 49, 50, 51, 49, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 110, 111, 112, 113, 110, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 123, 124, 123, 125, 45, 45, 126, 127, 128, 129, 130, 131, 45, 45, + 132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 45, 45, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143, + 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170, + 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176, + 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168, + 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 195, 45, 45, 45, 45, + 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201, + 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211, + 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 217, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 11, 218, 11, 11, 218, 219, 11, 220, 11, 11, 11, 221, 221, 222, 11, 223, + 224, 0, 0, 0, 0, 0, 225, 226, 227, 228, 0, 0, 45, 8, 8, 229, + 0, 0, 230, 231, 232, 0, 4, 4, 233, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 234, 45, 235, 45, 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, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, 0, + 239, 239, 240, 239, 239, 240, 4, 4, 241, 241, 241, 241, 241, 241, 241, 242, + 139, 139, 140, 243, 243, 243, 244, 245, 143, 246, 247, 247, 247, 247, 14, 14, + 0, 0, 0, 0, 0, 45, 45, 45, 248, 249, 248, 248, 248, 248, 248, 250, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 45, 252, + 253, 0, 254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 260, 260, 261, + 262, 263, 263, 264, 142, 142, 142, 142, 265, 0, 263, 266, 0, 0, 267, 260, + 142, 265, 0, 0, 0, 0, 142, 268, 0, 0, 0, 0, 0, 260, 260, 269, + 260, 260, 260, 260, 260, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 0, 0, 0, 0, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 45, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 272, 271, 271, 271, 273, 274, 274, 274, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 276, 45, 14, 14, 14, 14, 14, 14, 277, 277, 277, 277, 277, 278, + 0, 0, 279, 4, 4, 4, 4, 4, 280, 4, 4, 4, 281, 45, 45, 282, + 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 49, 49, + 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299, + 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308, + 309, 310, 247, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 315, 142, 316, 142, 142, 317, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 45, 45, + 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 47, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 325, 45, 27, 27, 27, 27, 326, 27, 27, 327, 45, 45, 328, + 8, 285, 329, 0, 0, 330, 331, 332, 27, 27, 27, 27, 27, 27, 27, 333, + 334, 0, 1, 2, 1, 2, 335, 259, 260, 336, 142, 265, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 345, 45, 45, 342, 342, 342, 342, 342, 342, 342, 346, + 347, 0, 0, 348, 11, 11, 11, 11, 349, 252, 350, 45, 45, 0, 0, 351, + 45, 45, 45, 45, 45, 45, 45, 45, 352, 353, 354, 354, 354, 355, 356, 252, + 357, 357, 358, 359, 360, 361, 361, 362, 363, 364, 365, 365, 366, 367, 45, 45, + 368, 368, 368, 368, 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, 373, 375, + 376, 376, 377, 378, 378, 378, 379, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 381, 380, 382, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 384, 385, 385, 386, 387, 388, 389, 389, 390, 391, 392, 45, 45, 45, 393, 394, + 395, 396, 397, 398, 45, 45, 45, 45, 399, 399, 400, 401, 400, 402, 400, 400, + 403, 404, 405, 406, 407, 407, 408, 408, 409, 409, 45, 45, 410, 410, 411, 412, + 413, 413, 413, 414, 415, 416, 417, 418, 419, 420, 421, 45, 45, 45, 45, 45, + 422, 422, 422, 422, 423, 45, 45, 45, 424, 424, 424, 425, 424, 424, 424, 426, + 0, 0, 427, 285, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 27, 428, 45, 45, 45, 45, 45, 45, 45, 45, + 8, 8, 429, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 27, 430, + 431, 431, 431, 431, 432, 433, 431, 434, 435, 435, 435, 435, 436, 437, 438, 439, + 440, 440, 440, 441, 442, 443, 443, 444, 445, 445, 445, 445, 446, 445, 447, 448, + 449, 450, 449, 451, 45, 45, 45, 45, 452, 453, 454, 455, 455, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 45, 45, 45, 45, 45, 45, 45, 45, + 466, 466, 466, 466, 466, 467, 45, 45, 468, 468, 468, 468, 469, 470, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 471, 471, 471, 472, 471, 473, 45, 45, + 474, 474, 474, 474, 475, 476, 477, 45, 478, 478, 478, 479, 480, 45, 45, 45, + 481, 482, 483, 481, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 17, 17, 17, 484, 45, 45, 45, 45, 45, 45, 485, 485, 485, 485, 485, 486, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 487, 488, 488, 487, 489, 45, + 14, 14, 14, 14, 490, 49, 49, 49, 49, 49, 491, 45, 492, 492, 492, 493, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 494, 495, 495, 496, 497, 495, 498, 499, 499, 500, 501, 502, 45, 45, 45, 45, + 503, 139, 139, 504, 505, 506, 507, 11, 349, 508, 509, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 510, 511, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 512, 512, 512, 513, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 515, 45, 45, 45, 45, 45, 45, + 514, 514, 514, 514, 514, 514, 516, 517, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 518, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 520, 521, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, + 522, 522, 522, 522, 523, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 524, 525, 526, 527, 45, 45, 45, 45, 45, 45, 528, 529, 530, + 531, 531, 531, 531, 532, 533, 534, 535, 531, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 536, 536, 536, 536, 536, 537, 45, 45, 45, 45, 45, 45, + 538, 538, 538, 538, 539, 538, 538, 538, 540, 538, 45, 45, 45, 45, 541, 45, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 543, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 544, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 545, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 546, 45, 45, 45, 547, 548, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 317, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 549, 549, 549, 549, 549, 549, 550, 551, 552, 553, 267, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, + 0, 0, 555, 0, 0, 0, 556, 557, 558, 0, 559, 0, 0, 0, 560, 45, + 11, 11, 11, 11, 561, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 267, + 0, 0, 0, 0, 0, 234, 0, 560, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 225, 0, 0, 0, 562, 563, 564, 565, 0, 0, 0, + 566, 567, 0, 568, 569, 570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, 573, 574, 575, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 576, 577, 578, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 579, 318, 580, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 21, 21, 21, 581, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 584, 45, 45, + 585, 585, 585, 585, 586, 587, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 334, 0, 0, 0, 588, 45, 45, 45, 45, + 334, 0, 0, 589, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 590, 27, 591, 592, 593, 594, 595, 596, 597, 598, 599, 598, 45, 45, 45, 324, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 267, 227, 334, 334, 334, 0, 554, + 600, 0, 0, 0, 0, 0, 600, 0, 0, 0, 600, 45, 45, 45, 601, 0, + 602, 0, 0, 252, 560, 603, 554, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 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, 554, 600, 235, + 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 560, 252, 45, + 252, 0, 0, 0, 427, 285, 0, 0, 427, 0, 589, 45, 45, 45, 45, 45, + 604, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 607, 0, 0, 0, + 0, 0, 0, 0, 0, 267, 589, 608, 609, 554, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 610, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 611, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 612, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 613, 45, + 248, 318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 614, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 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, 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, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 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, 0, 0, 0, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 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, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 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,1446,1458,1468,1476,1480,1486, + 1517, 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,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 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, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 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, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 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, 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, 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,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 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, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 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, 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, 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,1634, 0, 0,1635, 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, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 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, 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,1641, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 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, 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, 0,1645, 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, 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, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 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, 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, 0, 0, 0, 0,1651,1653,1652, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 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, 0, 0, 0, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 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, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 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, 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, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 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, 0,1837,1839,1838, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 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,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 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, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 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, 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, 0, 32, 33, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 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, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 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,1941,1942, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 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, 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, 0,1946,1947, 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, 0, 0, 0, 0, 0,1948,1949, + 1950,1951,1952,1953,1954, 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, 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, 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,1955,1956,1957,1959,1958, + 1960, 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, 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, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 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, 0, 0, 0, 0, 0, +}; +static const int16_t +_hb_ucd_i16[196] = +{ + 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, + 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, + 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, + -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, + 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, + 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, + 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, + 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, + -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, + 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, + -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, + -1, 0, 1, -1, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114110u?_hb_ucd_u8[2176+(((_hb_ucd_u16[((_hb_ucd_u8[u>>4>>5])<<5)+((u>>4)&31u)])<<4)+((u)&15u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[14026+(((_hb_ucd_u8[13034+(((_hb_ucd_u8[12544+(u>>4>>4)])<<4)+((u>>4)&15u))])<<4)+((u)&15u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16170+(((_hb_ucd_b4(16042+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918000u?_hb_ucd_u8[18924+(((_hb_ucd_u16[3008+(((_hb_ucd_u8[17130+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[28764+(u>>6)])<<6)+((u)&63u))]:0; +} + + +#else + +static const uint8_t +_hb_ucd_u8[16998] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 21, 23, 21, 21, 21, 21, 24, 7, 7, + 25, 26, 21, 21, 21, 21, 27, 28, 21, 21, 29, 30, 31, 32, 33, 34, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 21, 40, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 41, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 42, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73, + 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83, + 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91, + 92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97, + 98, 99,100,101,102,103,104,105, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,106, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, + 108,108, 34, 34,109,110,111,112, 34, 34,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,128,129,123, 34, 34,130,123, + 131,132,133,134,135,136,137,138,139,140,141,123,142,123,143,144, + 145,146,147,148,149,150,151,123,152,153,123,154,155,156,157,123, + 158,159,123,160,161,162,123,123,163,164,165,166,123,167,123,168, + 34, 34, 34, 34, 34, 34, 34,169,170, 34,171,123,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, + 34, 34, 34, 34, 34, 34, 34, 34,172,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123, 34, 34, 34, 34,173,123,123,123, + 34, 34, 34, 34,174,175,176,177,123,123,123,123,178,179,180,181, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,182, + 34, 34, 34, 34, 34,183,123,123,123,123,123,123,123,123,123,123, + 34, 34,184, 34, 34,185,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123,186,187,123,123,123,123,123,123, + 69,188,189,190,191,192,193,123,194,195,196,197,198,199,200,201, + 69, 69, 69, 69,202,203,123,123,123,123,123,123,123,123,123,123, + 204,123,205,123,123,206,123,123,123,123,123,123,123,123,123,123, + 34,207,208,123,123,123,123,123,209,210,211,123,212,213,123,123, + 214,215,216,217,218,123, 69,219, 69, 69, 69, 69, 69,220,221,222, + 223,224,225,226,227,228,123,123,123,123,123,123,123,123,123,123, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,229, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,230, 34, + 231, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,232, 34, 34, + 34, 34, 34, 34, 34, 34, 34,233,123,123,123,123,123,123,123,123, + 34, 34, 34, 34,234,123,123,123,123,123,123,123,123,123,123,123, + 235,123,236,237,123,123,123,123,123,123,123,123,123,123,123,123, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,238, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,239, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, + 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, + 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, + 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, + 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, + 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, + 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, + 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, + 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, + 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, + 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10, + 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11, + 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, + 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11, + 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, + 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2, + 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62, + 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67, + 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43, + 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36, + 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79, + 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36, + 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44, + 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, + 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43, + 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64, + 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 44, + 44, 57, 43, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 43, 43, 43, + 43, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 71, 84, + 85, 43, 43, 43, 83, 84, 85, 84, 70, 43, 43, 43, 36, 36, 36, 36, + 36, 43, 2, 7, 7, 7, 7, 7, 86, 36, 36, 36, 36, 36, 36, 36, + 70, 84, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 84, + 85, 43, 80, 87, 88, 87, 85, 61, 44, 44, 44, 87, 44, 44, 36, 62, + 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80, + 57, 83, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 84, + 85, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61, + 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44, + 57, 83, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, + 61, 36, 62, 36, 36, 44, 71, 84, 85, 43, 43, 57, 83, 87, 85, 44, + 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43, + 57, 84, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 85, + 85, 43, 80, 87, 88, 87, 85, 44, 44, 44, 44, 83, 44, 44, 36, 62, + 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36, + 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36, + 36, 36, 36, 36, 36, 44, 44, 84, 83, 88, 44, 84, 88, 84, 85, 44, + 61, 44, 44, 87, 44, 44, 44, 44, 27, 89, 67, 67, 56, 90, 44, 44, + 83, 84, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 44, 62, 43, 83, 84, 88, 43, 80, 43, 43, 44, + 44, 44, 57, 80, 36, 61, 44, 44, 44, 44, 44, 91, 27, 27, 27, 89, + 70, 84, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 85, + 84, 84, 88, 83, 88, 84, 43, 44, 44, 44, 87, 88, 44, 44, 44, 61, + 62, 61, 44, 44, 44, 44, 44, 44, 43, 84, 62, 36, 36, 36, 61, 36, + 36, 36, 36, 36, 36, 70, 71, 84, 85, 43, 80, 84, 88, 84, 85, 77, + 44, 44, 36, 92, 27, 27, 27, 93, 27, 27, 27, 27, 89, 36, 36, 36, + 44, 84, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, + 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 87, + 84, 43, 80, 80, 84, 84, 84, 84, 44, 84, 64, 44, 44, 44, 44, 44, + 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 94, + 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, + 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, + 70, 36, 43, 43, 43, 43, 71, 44, 36, 36, 61, 81, 43, 43, 43, 44, + 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, + 2, 95, 95, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, + 27, 27, 50, 50, 50, 4, 4, 84, 36, 36, 36, 36, 62, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 61, 44, 57, 43, 43, 43, 43, 43, 43, 83, + 43, 43, 60, 43, 36, 36, 70, 43, 43, 43, 43, 43, 57, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 80, 67, 67, 67, 67, 76, 67, 67, 90, 67, + 2, 2, 95, 67, 21, 64, 44, 44, 36, 36, 36, 36, 36, 92, 85, 43, + 83, 43, 43, 43, 85, 83, 85, 71, 7, 7, 7, 7, 7, 2, 2, 2, + 36, 36, 36, 84, 43, 36, 36, 43, 71, 84, 96, 92, 84, 84, 84, 36, + 70, 43, 71, 36, 36, 36, 36, 36, 36, 83, 85, 83, 84, 84, 85, 92, + 7, 7, 7, 7, 7, 84, 85, 67, 11, 11, 11, 48, 44, 44, 48, 44, + 16, 16, 16, 16, 16, 53, 45, 16, 36, 36, 36, 36, 61, 36, 36, 44, + 36, 36, 36, 61, 61, 36, 36, 44, 61, 36, 36, 44, 36, 36, 36, 61, + 61, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 61, 57, 43, 2, 2, 2, 2, 97, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 98, 44, 67, 67, 67, 67, 67, 44, 44, 44, + 11, 11, 11, 44, 16, 16, 16, 44, 99, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 77, 72,100, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36,101,102, 44, 36, 36, 36, 36, 36, 63, 2,103, + 104, 36, 36, 36, 61, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36, + 36, 43, 80, 44, 44, 44, 44, 44, 36, 43, 60, 64, 44, 44, 44, 44, + 36, 43, 44, 44, 44, 44, 44, 44, 61, 43, 44, 44, 44, 44, 44, 44, + 36, 36, 43, 85, 43, 43, 43, 84, 84, 84, 84, 83, 85, 43, 43, 43, + 43, 43, 2, 86, 2, 66, 70, 44, 7, 7, 7, 7, 7, 44, 44, 44, + 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2,105, 2, 59, 43, 68, + 36,106, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, + 36, 36, 70, 71, 36, 36, 36, 36, 36, 36, 36, 36, 70, 61, 44, 44, + 36, 36, 36, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 61, + 43, 83, 84, 85, 83, 84, 44, 44, 84, 83, 84, 84, 85, 43, 44, 44, + 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, + 36, 36, 61, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 44, 44, + 36, 36, 36, 36, 36, 44, 44, 44, 7, 7, 7, 7, 7, 98, 44, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 70, 83, 85, 44, 2, + 36, 36, 92, 83, 43, 43, 43, 80, 83, 83, 85, 43, 43, 43, 83, 84, + 84, 85, 43, 43, 43, 43, 80, 57, 2, 2, 2, 86, 2, 2, 2, 44, + 43, 43, 43, 43, 43, 43, 43,107, 43, 43, 96, 36, 36, 36, 36, 36, + 36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44, + 95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, + 43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36, + 36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44, 2, 2, + 36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91, 2, 2, + 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2, + 16, 16, 16, 16,108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11, + 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43, + 83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44, + 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, + 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,109, 40, 40, + 43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, + 16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44, + 16, 16, 16, 16,110,110,110,110, 16, 16,108, 16, 11, 11,111,112, + 41, 16,108, 16, 11, 11,111, 41, 16, 16, 44, 16, 11, 11,113, 41, + 16, 16, 16, 16, 11, 11,114, 41, 44, 16,108, 16, 11, 11,111,115, + 116,116,116,116,116,117, 65, 65,118,118,118, 2,119,120,119,120, + 2, 2, 2, 2,121, 65, 65,122, 2, 2, 2, 2,123,124, 2,125, + 126, 2,127,128, 2, 2, 2, 2, 2, 9,126, 2, 2, 2, 2,129, + 65, 65, 68, 65, 65, 65, 65, 65,130, 44, 27, 27, 27, 8,127,131, + 27, 27, 27, 27, 27, 8,127,102, 40, 40, 40, 40, 40, 40, 81, 44, + 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,132, 51, + 133, 51,133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44, + 67,134, 67,135, 67, 34, 11, 16, 11, 32,135, 67, 49, 11, 11, 67, + 67, 67,134,134,134, 11, 11,136, 11, 11, 35, 36, 39, 67, 16, 11, + 8, 8, 49, 16, 16, 26, 67,137, 27, 27, 27, 27, 27, 27, 27, 27, + 103,103,103,103,103,103,103,103,103,138,139,103,140, 67, 44, 44, + 8, 8,141, 67, 67, 8, 67, 67,141, 26, 67,141, 67, 67, 67,141, + 67, 67, 67, 67, 67, 67, 67, 8, 67,141,141, 67, 67, 67, 67, 67, + 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67,142,143, 67, 67, + 67, 67, 67, 67, 67, 67,141, 67, 67, 67, 67, 67, 67, 26, 8, 8, + 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, + 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, + 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, + 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, + 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4, + 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, + 8, 8,127,144, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, + 8,127,145,145,145,145,145,145,145,145,145,145,144, 8, 8, 8, + 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, + 8, 8,141, 26, 8, 8,141, 67, 67, 67, 44, 67, 67, 67, 67, 67, + 67, 67, 67, 44, 67, 67, 67, 67, 11, 11, 11, 11, 11, 11, 11, 47, + 16, 16, 16, 16, 16, 16, 16,108, 32, 11, 32, 34, 34, 34, 34, 11, + 32, 32, 34, 16, 16, 16, 40, 11, 32, 32,137, 67, 67,135, 34,146, + 43, 32, 44, 44, 91, 2, 97, 2, 16, 16, 16,147, 44, 44,147, 44, + 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57, + 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61, + 2,119,119, 2,123,124,119, 2, 2, 2, 2, 6, 2,105,119, 2, + 119, 4, 4, 4, 4, 2, 2, 86, 2, 2, 2, 2, 2,118, 2, 2, + 105,148, 2, 2, 2, 2, 2, 2, 67, 67, 67, 67, 67, 55, 67, 67, + 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 44, 44, 1, 2,149,150, 4, 4, 4, 4, + 4, 67, 4, 4, 4, 4,151,152,153,103,103,103,103, 43, 43, 84, + 154, 40, 40, 67,103,155, 63, 67, 36, 36, 36, 61, 57,156,157, 69, + 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, + 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, + 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, + 158, 27, 27, 27, 27, 27, 27, 27, 36, 36,106, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36,159, 2, 7, 7, 7, 7, 7, 36, 44, 44, + 32, 32, 32, 32, 32, 32, 32, 70, 51,160, 43, 43, 43, 43, 43, 86, + 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36,103,103,103,103,103, + 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41,157, 40, 40, 40, 40, + 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, + 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,161, 34, 35, + 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32, + 11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 47, 44, 44, 44, 44, + 44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36, + 36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67,162, 44, 44, 44, + 36, 36, 2, 2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44, 2, + 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2, + 36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91, + 36, 70, 84, 43, 43, 84, 43, 84,163, 2, 2, 2, 2, 2, 2, 52, + 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83, + 85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44, + 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 92, 83, 36, + 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 62,106, 2, 36, 36, 36, 36, 36, 92, 43, 84, + 2,106,164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61, + 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,112, 40, 40, + 16, 16, 16, 16, 44, 44, 44, 44, 36, 92, 85, 84, 83,163, 85, 44, + 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36, + 165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166, + 16, 16, 16,108, 44, 44, 44, 44, 44,147, 16, 16, 44, 44, 62, 71, + 36, 36, 36, 36,167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61, + 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, + 41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36,145, 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,162, 44, + 2, 2, 2,168,128, 44, 44, 44, 6,169,170,145,145,145,145,145, + 145,145,128,168,128, 2,125,171, 2, 64, 2, 2,151,145,145,128, + 2,172, 8,173, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 61, 79, 91, 2, 3, 2, 4, 5, 6, 2, + 16, 16, 16, 16, 16, 17, 18,127,128, 4, 2, 36, 36, 36, 36, 36, + 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, + 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44, + 20,174, 56,175, 26, 8,141, 90, 44, 44, 44, 44, 79, 65, 67, 44, + 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, + 2, 64, 44,176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67, + 103,103,140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90, + 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44, + 177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44, + 27, 27, 44, 44, 44, 44, 62, 36,150, 36, 36, 36, 36,178, 44, 44, + 36, 36, 36, 43, 43, 80, 44, 44, 36, 36, 36, 36, 36, 36, 36, 91, + 36, 36, 44, 44, 36, 36, 36, 36,179,103,103, 44, 44, 44, 44, 44, + 11, 11, 11, 11, 16, 16, 16, 16, 11, 11, 44, 44, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 44, 44, 36, 36, 44, 44, 44, 44, 44, 91, + 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62, + 36, 36, 36, 91, 27, 27, 27, 27, 36, 36, 36, 77,158, 27, 27, 27, + 44, 44, 44,176, 27, 27, 27, 27, 36, 61, 36, 44, 44,176, 27, 27, + 36, 36, 36, 27, 27, 27, 44, 91, 36, 36, 36, 36, 36, 44, 44, 91, + 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27, + 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36, + 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27, 98, 44, 44, 44, + 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,180, 30, + 36, 36, 36, 36, 36, 36,180, 27, 36, 36, 36, 36, 78, 36, 36, 36, + 36, 36, 70, 80, 44,176, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44, + 36, 36, 36, 44, 91, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, + 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 91, 2, 64, 44, + 44, 44, 44, 44,176, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, + 16,108, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, + 27, 27, 27, 27, 27, 27, 27, 98, 27, 27, 27, 93, 44, 44, 44, 44, + 177, 27, 30, 2, 2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, + 27, 27, 27, 7, 7, 7, 7, 7, 44, 44, 44, 44, 44, 44, 44, 57, + 84, 85, 43, 83, 85, 60,181, 2, 2, 44, 44, 44, 44, 44, 79, 44, + 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43, + 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 92, 88, 44, 44, 44, 44, + 36, 70, 2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83, + 96, 36, 63, 2, 59, 43, 60, 44, 7, 7, 7, 7, 7, 63, 63, 2, + 176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43, 2, 2, 2, 80, + 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, + 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, + 84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62, + 61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44, + 61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44, + 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43, + 84, 43, 83, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 91, 91, 71, + 84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85, + 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44, + 84, 85, 43, 43, 43, 83, 85, 85, 60, 2, 61, 44, 44, 44, 44, 44, + 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84, + 43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44, + 7, 7, 7, 7, 7, 27, 2, 95, 43, 43, 43, 43, 85, 60, 44, 44, + 27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 44, 36, 36, 36, + 92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44, + 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60, + 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36, + 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43, 2, 72, 2, + 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85, + 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, + 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43, + 83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, + 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, + 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88, + 43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83,163, 64, 44, 44, 44, + 27, 27, 89, 67, 67, 67, 56, 20,162, 67, 67, 67, 67, 67, 67, 67, + 67, 44, 44, 44, 44, 44, 44, 91,103,103,103,103,103,103,103,178, + 2, 2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44, + 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, + 40, 40, 95, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,176, 27, 27, + 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, + 27, 27, 27, 30, 2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57, + 92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, + 40, 86, 44, 44, 44, 44, 44, 44, 36, 61, 44, 44, 44, 44, 44, 44, + 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, + 65, 65, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 55, 67, 67, 67, + 67, 67,182, 85, 43, 67,182, 84, 84,183, 65, 65, 65, 82, 43, 43, + 43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, + 67, 67, 67, 67, 90, 44, 44, 44, 67, 43, 76, 44, 44, 44, 44, 44, + 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, + 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, + 16, 16,108, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11, + 11, 11, 11, 16, 16,147,147, 16, 16, 16,147, 16, 16, 16, 16, 16, + 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16, + 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11, + 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, + 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, + 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, + 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, + 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, + 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43, + 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, + 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, + 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, + 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, + 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 94, 36, 36, 61,176, 27, 27, 27, 27, + 43, 43, 43, 80, 44, 44, 44, 44, 16, 16, 43, 43, 43, 74, 44, 44, + 27, 27, 27, 27, 27, 27,158, 27,184, 27, 98, 44, 44, 44, 44, 44, + 27, 27, 27, 27, 27, 27, 27,158, 27, 27, 27, 27, 27, 27, 27, 44, + 36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36, + 36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36, + 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, + 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, + 62, 36, 62, 36, 36, 62, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, + 55, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, + 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, + 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, + 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 44, + 67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67, + 67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67, + 67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44, + 79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65, + 166,166,166,166,166,166,166, 44,166,166,166,166,166,166,166, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 2, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, + 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, + 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, + 14, 7, 17, 21, 7, 6, 11, 2, 5, 2, 5, 6, 8, 8, 8, 24, + 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, + 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, + 18, 21, 21, 29, 15, 6, 18, 6, 12, 11, 11, 12, 9, 26, 26, 9, + 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, + 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, 26, 6, 7, 14, 17, 22, + 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, + 11, 21, 24, 9, 23, 26, 10, 21, 6, 10, 4, 4, 3, 3, 7, 25, + 21, 22, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 23, 2, + 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, 21, 1, 26, 10, 10, 1, + 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, + 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 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, 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, 17, 18, 19, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 40, 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, + 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, + 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 21, 22, + 0, 23, 24, 0, 0, 23, 25, 26, 0, 23, 25, 0, 0, 23, 25, 0, + 0, 23, 25, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 23, 25, 0, + 0, 28, 25, 0, 0, 0, 29, 0, 0, 30, 31, 0, 0, 32, 33, 0, + 34, 35, 0, 36, 37, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 44, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, 0, 48, 0, 0, + 0, 49, 50, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 55, 56, + 0, 0, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 59, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 62, 0, 0, 0, 63, 0, 64, 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 50, 70, + 0, 71, 72, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 75, 76, 77, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 79, 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, 80, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 0, 0, 82, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 69, 62, 0, 88, 0, 0, + 89, 90, 0, 73, 0, 0, 91, 0, 0, 92, 0, 0, 0, 0, 0, 93, + 0, 94, 25, 95, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 0, 62, 98, 0, 0, 62, 0, 0, 0, 99, 0, 0, + 0,100, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 74, 0, 42,101, 0,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0,103, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, + 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,108,109,110, 0, 0, 0, 0,111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112,113, 0, 0, 0, 0, 0, 0, + 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, + 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, + 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, + 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, + 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, + 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, + 0, 0, 19, 1, 21, 0, 0, 47, 0, 0, 0, 0, 0, 38, 48, 1, + 1, 49, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, + 0, 0, 0, 0, 52, 1, 1, 1, 53, 21, 43, 54, 55, 21, 35, 1, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 57, 58, 59, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 57, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, + 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, + 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, + 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 72, 73, 74, 75, + 76, 77, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 19, 84, 0, + 63, 0, 0, 0, 0, 49, 1, 85, 0, 0, 0, 0, 1, 54, 15, 41, + 0, 0, 0, 0, 0, 56, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, + 0, 87, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 88, 9, 12, 4, 89, 8, 90, 47, 0, 59, 50, 0, + 21, 1, 21, 91, 92, 1, 1, 1, 1, 1, 1, 1, 1, 93, 94, 95, + 0, 0, 0, 0, 96, 1, 97, 59, 81, 98, 99, 4, 59, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,100,101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 0, 19, 0, 1, 1, 50, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 50, 0, 0, 0, + 0, 0, 52, 69, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,103,104, 59, 38, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, + 1, 14, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 88, 0, + 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 62, + 0,108, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0,109, 14, 54, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, + 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, + 63, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, + 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 56, + 0, 38, 1, 59, 1, 59, 0, 0, 64, 87, 0, 0, 0, 0, 0, 60, + 112, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, + 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 87,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 0, 0, 8, 90, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, + 0, 0, 0, 0, 0, 0, 0,114, 0,115,116,117,118, 0, 52, 4, + 119, 49, 23, 0, 0, 0, 0, 0, 0, 0, 38, 50, 0, 0, 0, 0, + 38, 59, 0, 0, 0, 0, 0, 0, 1, 88, 1, 1, 1, 1, 39, 1, + 48,103, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 4,119, 0, 0, 0, 1,120, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 0, 0, 0,220,230,230, 0,220,230,220,220,220, 27, 28, 29,230, + 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, + 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0, + 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, + 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0, + 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, + 0, 9, 9, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220, 0, 0, 9, 9, 0, 0, 7, 0, + 230,230,230, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220, + 202,230,230,230,230,230,232,228,228,220, 0,230,233,220,230,220, + 230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, + 0, 0,218,228,232,222,224,224, 0, 8, 8, 0,230, 0,230,230, + 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, + 0,230,220, 0, 0, 0,220,220, 0, 9, 7, 0, 0, 7, 9, 0, + 0, 0, 9, 7, 9, 9, 0, 0, 0, 0, 1, 0, 0,216,216, 1, + 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, + 0, 0, 0, 0, 1, 2, 39, 40, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, + 14, 14, 14, 15, 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, + 14, 23, 24, 24, 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, + 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, + 7, 39, 14, 40, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 41, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, + 83, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 70, 70, 98, 99,100,101,102,102, + 103,104,105,106,107,108,109,110,111,112, 97,113,114,115,116,117, + 118, 97,119,119,120, 97,121,122,123,124,125,126,127,128,129,130, + 131, 97,132, 97,133,134,135,136,137,138,139,140,141, 97,142,143, + 97,144,145,146,147, 97,148,149, 97,150,151,152, 97, 97,153,154, + 155,156, 97,157, 97,158,159,159,159,159,159,159,159,160,161,159, + 162, 97, 97, 97, 97, 97,163,163,163,163,163,163,163,163,164, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,165,165, + 165,165,166, 97, 97, 97,167,167,167,167,168,169,170,171, 97, 97, + 97, 97,172,173,174,175,176,176,176,176,176,176,176,176,176,176, + 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, + 176,176,176,176,176,177,176,176,176,176,176,178, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,179,180,181, 32, 32,182, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,183,184, + 97, 97, 97, 97, 97, 97, 59,185,186,187,188,189,190, 97,191,192, + 193, 59, 59,194, 59,195,196,196,196,196,196,197, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,198, 97,199, 97, 97,200, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,201,202,203, 97, 97, 97, 97, 97,204,205, + 206, 97,207,208, 97, 97,209,210,211,212,213, 97, 59, 59, 59, 59, + 59, 59, 59,214,215,216,217,218,219,220,221,222, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,223, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,224, 70,225, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70,227, 97, 97, + 97, 97, 97, 97, 97, 97, 70, 70, 70, 70,228, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,229, 97,230,231, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 0, + 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, + 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 2, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16, + 16, 16, 2, 2, 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 20, 20, + 20, 20, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 2, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, + 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, + 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, + 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, + 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, + 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, + 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, + 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, + 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 2, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, + 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, + 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, + 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, + 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, + 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, + 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, + 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62, + 62, 62, 62, 2, 2, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, + 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 9, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55, + 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, + 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, + 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 26, 26, 26, 2, 2, 2, 2, 2, 12, 12, + 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, + 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0, + 0, 19, 19, 19, 19, 19, 2, 2, 19, 19, 19, 19, 19, 2, 2, 2, + 2, 2, 2, 2, 2, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, + 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, + 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, + 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30, + 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 19, 19, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, + 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, + 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, + 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, + 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, + 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, + 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 9, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118, + 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, + 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, + 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135, + 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106, + 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104, + 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110, + 110,110,110,110, 2, 2, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120, + 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128, + 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, + 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, + 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, + 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, + 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117, + 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, + 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, + 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122, + 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, + 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, + 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 3, 3, + 3, 3, 3, 3, 3, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, + 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, + 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, + 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, + 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, + 108,108,108,108,108, 2,129,129,129,129,129,129,129, 2,129, 2, + 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, + 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, + 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, + 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, + 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, + 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, + 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, + 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, + 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, + 2,137, 2,137,137,137,124,124,124,124,124,124,124,124,124,124, + 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, + 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102, 2, + 2, 2, 2, 2, 2, 2,102,102, 2, 2, 2, 2, 2, 2,126,126, + 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, + 126,126, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,125,125, + 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,125, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 2, 2, 2, 7, 7, 7, 2, 2, 2, 2, 2,121,121, + 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133, + 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, + 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, + 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, + 134,134,134,134,134, 2, 8, 8, 8, 8, 8, 8, 8, 2, 8, 8, + 2, 8, 8, 8, 8, 8, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, + 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, + 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, + 63, 63, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 2, 80, 2, 2, 2, 2, 2, 2, 2,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, + 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, + 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, + 0, 0, 2, 2, 2, 2,136,136,136,136,136,136,136,136,136,136, + 136, 2, 2, 2, 2, 2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, + 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, + 2, 2,105,105,105,105, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, + 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, + 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 56, 2, + 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, + 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, + 2, 2, 2, 2, 13, 13, 14, 14, 2, 2, 2, 2, 2, 14,113,113, + 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, + 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, + 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 0, 0, + 0, 0, 0, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, + 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, + 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 16, 50, 84,118, 88, 89, 90, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 91, 85, 85,220, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, + 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, + 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 42, 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, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, + 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, + 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, + 64, 65, 0, 0, 0, 0, 0, 0, 66, 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, 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, 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, + 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, 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, 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, 67, 68, 0, 69, 70, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105, + 106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0, + 114, 0, 0, 0,115, 0, 0, 0,116, 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, 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,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122, + 123,124,125,126, 0,127, 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, 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, + 0, 0, 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137, + 138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153, + 154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162, + 163, 0, 0, 0, 0, 0, 0, 0,164, 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, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,167, 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, 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,168,169, 0, 0, 0, + 0,170,171, 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, + 0, 0, 0, 0, 0, 0,172,173,174,175,176,177,178,179,180,181, + 182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, + 198,199,200,201,202,203,204,205, 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, 1, 2, 3, 4, +}; +static const uint16_t +_hb_ucd_u16[8928] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, + 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, + 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, + 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, + 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, + 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, + 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, + 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, + 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, + 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, + 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 167, 168, 48, 48, + 167, 48, 48, 169, 170, 171, 48, 48, 48, 170, 48, 48, 48, 172, 173, 174, + 48, 175, 9, 9, 9, 9, 9, 176, 177, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, + 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, + 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, + 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, + 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, + 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, + 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, + 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, + 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 278, 208, 279, 208, 208, 208, 208, 280, + 208, 281, 277, 282, 208, 283, 284, 208, 208, 208, 285, 72, 286, 72, 269, 269, + 269, 287, 208, 208, 208, 208, 288, 269, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 289, 290, 208, 208, 291, 208, 208, 208, 208, 208, 208, 292, 208, + 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, + 298, 299, 277, 277, 277, 300, 277, 301, 208, 208, 208, 277, 302, 208, 208, 303, + 208, 304, 208, 208, 208, 208, 208, 208, 9, 9, 305, 11, 11, 306, 307, 308, + 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313, + 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 72, 72, 72, + 208, 321, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 323, 72, 324, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, + 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, + 48, 48, 48, 198, 208, 208, 208, 208, 48, 48, 48, 48, 48, 48, 48, 72, + 48, 337, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, + 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, + 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, + 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, + 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, + 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, + 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, + 48, 48, 386, 48, 387, 48, 48, 205, 388, 388, 388, 388, 388, 388, 388, 388, + 389, 389, 389, 389, 389, 389, 389, 389, 48, 48, 48, 48, 48, 48, 203, 48, + 48, 48, 48, 48, 48, 206, 72, 72, 390, 391, 392, 393, 394, 48, 48, 48, + 48, 48, 48, 395, 396, 397, 48, 48, 48, 48, 48, 398, 72, 48, 48, 48, + 48, 399, 48, 48, 400, 72, 72, 401, 32, 402, 32, 403, 404, 405, 406, 407, + 48, 48, 48, 48, 48, 48, 48, 408, 409, 2, 3, 4, 5, 410, 411, 412, + 48, 413, 48, 199, 414, 415, 416, 417, 418, 48, 171, 419, 203, 203, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 71, 420, 269, 269, 421, 270, 270, 270, 422, + 423, 324, 424, 72, 72, 208, 208, 425, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 150, 48, 48, 48, 100, 426, 427, 48, 48, 428, 48, 429, 48, 48, 430, + 48, 431, 48, 48, 432, 433, 72, 72, 9, 9, 434, 11, 11, 48, 48, 48, + 48, 203, 191, 9, 9, 435, 11, 436, 48, 48, 400, 48, 48, 48, 437, 72, + 48, 48, 48, 314, 48, 198, 400, 72, 438, 48, 48, 439, 48, 440, 48, 441, + 48, 199, 442, 72, 72, 72, 48, 443, 48, 444, 48, 445, 72, 72, 72, 72, + 48, 48, 48, 446, 269, 447, 269, 269, 448, 449, 48, 450, 451, 452, 48, 453, + 48, 454, 72, 72, 455, 48, 456, 457, 48, 48, 48, 458, 48, 459, 48, 460, + 48, 461, 462, 72, 72, 72, 72, 72, 48, 48, 48, 48, 195, 72, 72, 72, + 9, 9, 9, 463, 11, 11, 11, 464, 48, 48, 465, 191, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 466, 48, 454, 467, 48, 62, 468, 72, 72, + 72, 72, 72, 72, 72, 72, 48, 314, 469, 48, 48, 470, 471, 447, 472, 473, + 220, 48, 48, 474, 475, 48, 195, 191, 476, 48, 477, 478, 479, 48, 48, 480, + 220, 48, 48, 481, 482, 483, 484, 485, 48, 97, 486, 487, 72, 72, 72, 72, + 488, 489, 490, 48, 48, 491, 492, 191, 493, 83, 84, 494, 495, 496, 497, 498, + 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, + 48, 48, 504, 505, 506, 507, 72, 72, 48, 48, 48, 508, 509, 191, 510, 72, + 48, 48, 511, 512, 191, 72, 72, 72, 48, 172, 513, 514, 72, 72, 72, 72, + 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, + 72, 72, 517, 48, 48, 518, 519, 72, 520, 48, 48, 521, 522, 523, 48, 48, + 524, 525, 526, 72, 48, 48, 48, 195, 84, 48, 504, 527, 528, 147, 174, 529, + 48, 530, 531, 532, 72, 72, 72, 72, 533, 48, 48, 534, 535, 191, 536, 48, + 537, 538, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, + 72, 72, 72, 72, 269, 540, 541, 542, 48, 206, 72, 72, 72, 72, 72, 72, + 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 386, 72, 72, 72, + 48, 48, 199, 545, 72, 72, 72, 72, 48, 48, 48, 48, 314, 72, 72, 72, + 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, + 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, + 48, 48, 48, 48, 48, 48, 48, 400, 48, 48, 48, 48, 48, 48, 48, 559, + 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 205, + 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 323, 208, 208, 563, 208, 208, 208, 564, 565, + 566, 208, 567, 208, 208, 208, 568, 72, 208, 208, 208, 208, 569, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 570, 208, 208, 208, 208, 208, 285, 269, 451, + 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, + 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, + 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, + 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, + 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, + 606, 607, 608, 72, 72, 72, 72, 72, 48, 48, 150, 609, 610, 72, 72, 72, + 72, 72, 72, 72, 48, 48, 611, 612, 48, 48, 48, 48, 613, 614, 72, 72, + 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 484, + 269, 269, 616, 617, 72, 72, 72, 72, 484, 269, 618, 619, 72, 72, 72, 72, + 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, + 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, + 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, + 633, 208, 208, 324, 568, 634, 323, 72, 208, 208, 208, 208, 208, 208, 208, 635, + 208, 208, 208, 208, 208, 323, 631, 286, 208, 208, 208, 208, 208, 208, 208, 322, + 208, 208, 208, 208, 208, 568, 324, 72, 324, 208, 208, 208, 636, 175, 208, 208, + 636, 208, 637, 72, 72, 72, 72, 72, 638, 208, 208, 208, 208, 208, 208, 639, + 208, 208, 640, 208, 641, 208, 208, 208, 208, 208, 208, 208, 208, 322, 637, 642, + 633, 323, 72, 72, 72, 72, 72, 72, 48, 48, 48, 48, 48, 314, 72, 72, + 48, 48, 48, 204, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, + 48, 48, 643, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, + 48, 203, 72, 72, 72, 72, 72, 72, 644, 72, 645, 645, 645, 645, 645, 645, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 389, 389, 389, 389, 389, 389, 389, 646, 389, 389, 389, 389, 389, 389, 389, 647, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, + 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, + 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, + 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, + 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, + 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, + 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 26, 26, + 26, 26, 26, 26, 31, 31, 50, 51, 26, 26, 52, 31, 53, 31, 31, 31, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 56, 54, 54, 54, + 57, 58, 59, 60, 60, 61, 62, 63, 58, 64, 65, 66, 67, 60, 60, 68, + 69, 70, 71, 72, 72, 73, 74, 75, 70, 76, 77, 78, 79, 72, 80, 26, + 81, 82, 83, 84, 84, 85, 86, 87, 82, 88, 89, 26, 90, 84, 91, 92, + 93, 94, 95, 96, 96, 97, 98, 99, 94, 100, 101, 102, 103, 96, 96, 26, + 104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111, 26, 112, 109, 109, 113, + 114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114, + 123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132, 26, + 133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136, + 139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148, 26, + 149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152, 26, 26, 26, 26, + 153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159, 26, 26, 26, 26, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160, + 160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165, 26, 26, 26, 26, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172, + 172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172, + 172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176, + 172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185, + 186, 187, 188, 26, 189, 189, 190, 26, 191, 191, 192, 26, 193, 194, 195, 26, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198, + 199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203, + 201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205, 26, + 206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212, 26, + 213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196, + 217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221, + 219, 222, 219, 222, 219, 223, 9, 224, 26, 26, 26, 26, 26, 26, 26, 26, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227, + 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231, + 232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235, + 18, 236, 167, 167, 167, 167, 167, 237, 228, 26, 238, 9, 239, 240, 241, 242, + 2, 2, 2, 2, 243, 244, 2, 2, 2, 2, 2, 245, 246, 247, 2, 248, + 2, 2, 2, 2, 2, 2, 2, 249, 9, 9, 9, 9, 9, 9, 9, 250, + 14, 14, 251, 251, 14, 14, 14, 14, 251, 251, 14, 252, 14, 14, 14, 251, + 14, 14, 14, 14, 14, 14, 253, 14, 253, 14, 254, 255, 14, 14, 256, 257, + 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 260, 261, + 0, 262, 2, 263, 0, 0, 0, 0, 26, 26, 9, 9, 9, 9, 264, 26, + 0, 0, 0, 0, 265, 266, 4, 0, 0, 267, 0, 0, 2, 2, 2, 2, + 2, 268, 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, 0, + 0, 0, 0, 0, 262, 26, 26, 26, 0, 269, 26, 26, 0, 0, 0, 0, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, + 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 275, 276, + 167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278, + 172, 172, 174, 26, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 26, 26, 26, 0, 284, + 285, 0, 0, 0, 286, 287, 0, 288, 289, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295, + 296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 299, 0, 0, 297, 297, 297, 300, 0, 0, 0, 0, 284, 26, 294, 294, + 171, 171, 171, 299, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 301, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 294, 294, 294, 294, 302, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 0, 0, 0, 0, + 280, 280, 280, 280, 280, 280, 283, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 26, 26, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 304, 303, 303, 303, 303, 303, 303, 305, 26, 306, 306, 306, 306, 306, 306, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 308, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 26, + 0, 0, 0, 0, 310, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 311, 2, 2, 2, 2, 2, 2, 312, 26, 26, 26, 26, 26, 313, 2, + 314, 314, 314, 314, 314, 315, 0, 316, 317, 317, 317, 317, 317, 317, 317, 26, + 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321, 54, 54, 54, 54, + 322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331, + 332, 332, 332, 332, 332, 332, 333, 26, 332, 334, 332, 335, 166, 166, 166, 166, + 336, 336, 336, 336, 336, 336, 336, 336, 337, 26, 26, 338, 339, 339, 340, 26, + 341, 341, 341, 26, 174, 174, 2, 2, 2, 2, 2, 342, 343, 26, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345, + 171, 171, 171, 171, 346, 26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 26, 26, 26, + 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 52, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 356, 26, 26, 31, 31, 31, 31, 31, 31, + 31, 31, 357, 31, 31, 31, 31, 31, 31, 26, 26, 26, 26, 26, 31, 51, + 9, 9, 0, 316, 9, 358, 0, 0, 0, 0, 359, 0, 262, 284, 50, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 360, + 361, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 362, 294, 293, 294, + 294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262, 26, 366, + 367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371, 26, 26, 26, 26, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372, + 373, 0, 0, 0, 0, 0, 374, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 257, 0, 284, 375, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 376, + 377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380, 26, 381, 0, 0, 284, + 382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388, + 389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393, 26, 26, 26, 26, 26, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, + 396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400, + 401, 401, 401, 401, 401, 26, 402, 402, 402, 402, 402, 402, 403, 404, 26, 26, + 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 406, 26, 405, 405, 407, 26, 405, 26, 26, 26, + 408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415, + 416, 416, 416, 417, 418, 416, 26, 26, 26, 26, 26, 26, 419, 419, 420, 421, + 422, 422, 422, 423, 424, 424, 424, 425, 26, 26, 26, 26, 26, 26, 26, 26, + 426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427, + 430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438, + 439, 439, 439, 439, 26, 26, 26, 26, 440, 440, 440, 440, 441, 442, 441, 26, + 443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448, + 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26, + 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458, + 0, 0, 0, 0, 0, 26, 0, 316, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 459, + 9, 9, 9, 9, 9, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 459, 26, + 460, 460, 460, 460, 460, 460, 460, 460, 460, 461, 462, 460, 460, 460, 26, 463, + 464, 464, 464, 464, 464, 464, 464, 464, 465, 466, 467, 467, 467, 468, 467, 469, + 470, 470, 470, 470, 470, 470, 471, 470, 472, 26, 473, 473, 473, 473, 474, 26, + 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 475, 475, 477, 140, 478, 26, + 479, 479, 480, 479, 479, 479, 479, 481, 26, 26, 26, 26, 26, 26, 26, 26, + 482, 483, 484, 485, 484, 486, 487, 487, 487, 487, 487, 487, 487, 488, 487, 489, + 490, 491, 492, 493, 493, 494, 495, 496, 491, 497, 498, 499, 500, 501, 501, 26, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 503, 26, 26, 26, 26, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 26, 504, 505, 26, 26, 26, 26, + 506, 506, 506, 506, 506, 506, 507, 506, 506, 506, 506, 507, 26, 26, 26, 26, + 508, 508, 508, 508, 508, 508, 508, 508, 509, 26, 508, 510, 201, 511, 26, 26, + 512, 512, 512, 512, 512, 512, 512, 513, 512, 514, 26, 26, 26, 26, 26, 26, + 515, 515, 515, 516, 515, 517, 515, 515, 26, 26, 26, 26, 26, 26, 26, 26, + 21, 21, 21, 21, 21, 21, 21, 518, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 520, 521, + 26, 26, 26, 26, 60, 522, 60, 60, 60, 60, 60, 522, 523, 26, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 26, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 524, 26, 26, 26, 525, 525, 525, 525, 525, 525, 525, 526, + 527, 528, 527, 527, 527, 527, 529, 527, 530, 26, 527, 527, 527, 531, 532, 532, + 532, 532, 533, 532, 532, 534, 535, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 536, 537, 167, 167, 167, 167, 536, 538, 167, 26, 167, 539, 540, 541, 14, 14, + 14, 257, 15, 375, 14, 542, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 84, 84, 84, 89, + 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 543, 544, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, + 545, 545, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 547, 548, 26, + 545, 545, 545, 545, 545, 545, 545, 545, 549, 26, 26, 26, 26, 26, 26, 26, + 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + 550, 550, 550, 550, 550, 551, 550, 552, 26, 26, 26, 26, 26, 26, 26, 26, + 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, 554, 26, 26, 26, 26, 26, 26, 26, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 555, 556, 556, 556, 557, 556, 558, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, 560, 26, + 561, 561, 561, 561, 561, 561, 561, 561, 562, 26, 561, 563, 563, 561, 561, 564, + 561, 561, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 565, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 566, 566, 566, 566, 566, 566, 566, 566, 566, 567, 566, 566, 566, 566, 566, 566, + 566, 568, 566, 566, 26, 26, 26, 26, 26, 26, 26, 26, 569, 26, 26, 26, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 26, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 571, 26, + 572, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 573, 26, 574, 26, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 346, + 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 576, 575, 577, + 575, 578, 575, 579, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, + 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 580, 581, 0, 582, + 583, 584, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 586, 26, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, + 0, 0, 0, 259, 587, 588, 0, 589, 590, 0, 0, 0, 0, 0, 0, 0, + 591, 592, 259, 259, 0, 0, 0, 593, 594, 595, 596, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, + 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, + 597, 598, 26, 599, 600, 597, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 274, 273, 273, 601, 602, 603, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 604, 280, 283, 280, 605, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 606, + 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 607, 607, 607, 607, 607, 607, 607, 608, 607, 609, 26, 26, 26, 26, 26, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 611, 610, 612, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, + 0, 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, + 614, 31, 31, 31, 615, 616, 617, 618, 619, 620, 615, 621, 615, 617, 617, 622, + 31, 623, 31, 624, 625, 623, 31, 624, 26, 26, 26, 26, 26, 26, 355, 26, + 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26, + 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, + 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 626, 0, 0, 0, + 627, 26, 0, 0, 0, 0, 0, 284, 0, 586, 316, 26, 272, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 613, 0, 269, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 284, 26, 26, + 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0, + 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 595, + 0, 0, 0, 0, 592, 628, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269, + 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 629, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 604, 26, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 630, 26, 26, 26, + 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 631, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 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, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 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,1446,1458,1468,1476,1480,1486, + 1517, 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,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949, + 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958, + 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, +}; +static const int16_t +_hb_ucd_i16[196] = +{ + 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, + 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, + 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, + -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, + 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, + 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, + 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, + 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, + -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, + 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, + -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, + -1, 0, 1, -1, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114110u?_hb_ucd_u8[6432+(((_hb_ucd_u8[1248+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[8640+(((_hb_ucd_u8[7704+(((_hb_ucd_u8[7048+(((_hb_ucd_u8[6802+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9372+(((_hb_ucd_u8[9252+(((_hb_ucd_b4(9124+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918000u?_hb_ucd_u8[10822+(((_hb_ucd_u16[1920+(((_hb_ucd_u8[10150+(((_hb_ucd_u8[9700+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[5632+(((_hb_ucd_u8[15974+(((_hb_ucd_b4(15878+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; +} + +#endif + + +#endif /* HB_UCD_TABLE_HH */ + +/* == End of generated table == */ diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc new file mode 100644 index 000000000..e744664ad --- /dev/null +++ b/src/hb-ucd.cc @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2012 Grigori Goronzy + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "hb.hh" +#include "hb-machinery.hh" + +#include "hb-ucd-table.hh" + +static hb_unicode_combining_class_t +hb_ucd_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return (hb_unicode_combining_class_t) _hb_ucd_ccc (unicode); +} + +static hb_unicode_general_category_t +hb_ucd_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return (hb_unicode_general_category_t) _hb_ucd_gc (unicode); +} + +static hb_codepoint_t +hb_ucd_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return unicode + _hb_ucd_bmg (unicode); +} + +static hb_script_t +hb_ucd_script (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return _hb_ucd_sc_map[_hb_ucd_sc (unicode)]; +} + + +#define SBASE 0xAC00u +#define LBASE 0x1100u +#define VBASE 0x1161u +#define TBASE 0x11A7u +#define SCOUNT 11172u +#define LCOUNT 19u +#define VCOUNT 21u +#define TCOUNT 28u +#define NCOUNT (VCOUNT * TCOUNT) + +static inline bool +_hb_ucd_decompose_hangul (hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b) +{ + unsigned si = ab - SBASE; + + if (si >= SCOUNT) + return false; + + if (si % TCOUNT) + { + /* LV,T */ + *a = SBASE + (si / TCOUNT) * TCOUNT; + *b = TBASE + (si % TCOUNT); + return true; + } else { + /* L,V */ + *a = LBASE + (si / NCOUNT); + *b = VBASE + (si % NCOUNT) / TCOUNT; + return true; + } +} + +static inline bool +_hb_ucd_compose_hangul (hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab) +{ + if (a >= SBASE && a < (SBASE + SCOUNT) && b > TBASE && b < (TBASE + TCOUNT) && + !((a - SBASE) % TCOUNT)) + { + /* LV,T */ + *ab = a + (b - TBASE); + return true; + } + else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) + { + /* L,V */ + int li = a - LBASE; + int vi = b - VBASE; + *ab = SBASE + li * NCOUNT + vi * TCOUNT; + return true; + } + else + return false; +} + +static int +_cmp_pair (const void *_key, const void *_item) +{ + uint64_t& a = * (uint64_t*) _key; + uint64_t b = (* (uint64_t*) _item) & HB_CODEPOINT_ENCODE3(0x1FFFFFu, 0x1FFFFFu, 0); + + return a < b ? -1 : a > b ? +1 : 0; +} + +static hb_bool_t +hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, + void *user_data HB_UNUSED) +{ + if (_hb_ucd_compose_hangul (a, b, ab)) return true; + + uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0); + uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_map, + ARRAY_LENGTH (_hb_ucd_dm2_map), + sizeof (*_hb_ucd_dm2_map), + _cmp_pair); + if (likely (!v)) return false; + + hb_codepoint_t u = HB_CODEPOINT_DECODE3_3 (*v); + if (unlikely (!u)) return false; + + *ab = u; + return true; +} + +static hb_bool_t +hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, + void *user_data HB_UNUSED) +{ + if (_hb_ucd_decompose_hangul (ab, a, b)) return true; + + unsigned i = _hb_ucd_dm (ab); + + if (likely (!i)) return false; + i--; + + if (i < ARRAY_LENGTH (_hb_ucd_dm1_map)) + { + *a = _hb_ucd_dm1_map[i]; + *b = 0; + return true; + } + i -= ARRAY_LENGTH (_hb_ucd_dm1_map); + + uint64_t v = _hb_ucd_dm2_map[i]; + *a = HB_CODEPOINT_DECODE3_1 (v); + *b = HB_CODEPOINT_DECODE3_2 (v); + return true; +} + + +#if HB_USE_ATEXIT +static void free_static_ucd_funcs (); +#endif + +static struct hb_ucd_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t +{ + static hb_unicode_funcs_t *create () + { + hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); + + hb_unicode_funcs_set_combining_class_func (funcs, hb_ucd_combining_class, nullptr, nullptr); + hb_unicode_funcs_set_general_category_func (funcs, hb_ucd_general_category, nullptr, nullptr); + hb_unicode_funcs_set_mirroring_func (funcs, hb_ucd_mirroring, nullptr, nullptr); + hb_unicode_funcs_set_script_func (funcs, hb_ucd_script, nullptr, nullptr); + hb_unicode_funcs_set_compose_func (funcs, hb_ucd_compose, nullptr, nullptr); + hb_unicode_funcs_set_decompose_func (funcs, hb_ucd_decompose, nullptr, nullptr); + + hb_unicode_funcs_make_immutable (funcs); + +#if HB_USE_ATEXIT + atexit (free_static_ucd_funcs); +#endif + + return funcs; + } +} static_ucd_funcs; + +#if HB_USE_ATEXIT +static +void free_static_ucd_funcs () +{ + static_ucd_funcs.free_instance (); +} +#endif + +extern "C" HB_INTERNAL +hb_unicode_funcs_t * +hb_ucd_get_unicode_funcs (); + +hb_unicode_funcs_t * +hb_ucd_get_unicode_funcs () +{ + return static_ucd_funcs.get_unconst (); +} diff --git a/src/hb-ucdn.cc b/src/hb-ucdn.cc deleted file mode 100644 index 8230bf1e8..000000000 --- a/src/hb-ucdn.cc +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2012 Grigori Goronzy - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "hb.hh" - -#include "hb-machinery.hh" - -#include "ucdn.h" - -static const hb_script_t ucdn_script_translate[] = -{ - HB_SCRIPT_COMMON, - HB_SCRIPT_LATIN, - HB_SCRIPT_GREEK, - HB_SCRIPT_CYRILLIC, - HB_SCRIPT_ARMENIAN, - HB_SCRIPT_HEBREW, - HB_SCRIPT_ARABIC, - HB_SCRIPT_SYRIAC, - HB_SCRIPT_THAANA, - HB_SCRIPT_DEVANAGARI, - HB_SCRIPT_BENGALI, - HB_SCRIPT_GURMUKHI, - HB_SCRIPT_GUJARATI, - HB_SCRIPT_ORIYA, - HB_SCRIPT_TAMIL, - HB_SCRIPT_TELUGU, - HB_SCRIPT_KANNADA, - HB_SCRIPT_MALAYALAM, - HB_SCRIPT_SINHALA, - HB_SCRIPT_THAI, - HB_SCRIPT_LAO, - HB_SCRIPT_TIBETAN, - HB_SCRIPT_MYANMAR, - HB_SCRIPT_GEORGIAN, - HB_SCRIPT_HANGUL, - HB_SCRIPT_ETHIOPIC, - HB_SCRIPT_CHEROKEE, - HB_SCRIPT_CANADIAN_SYLLABICS, - HB_SCRIPT_OGHAM, - HB_SCRIPT_RUNIC, - HB_SCRIPT_KHMER, - HB_SCRIPT_MONGOLIAN, - HB_SCRIPT_HIRAGANA, - HB_SCRIPT_KATAKANA, - HB_SCRIPT_BOPOMOFO, - HB_SCRIPT_HAN, - HB_SCRIPT_YI, - HB_SCRIPT_OLD_ITALIC, - HB_SCRIPT_GOTHIC, - HB_SCRIPT_DESERET, - HB_SCRIPT_INHERITED, - HB_SCRIPT_TAGALOG, - HB_SCRIPT_HANUNOO, - HB_SCRIPT_BUHID, - HB_SCRIPT_TAGBANWA, - HB_SCRIPT_LIMBU, - HB_SCRIPT_TAI_LE, - HB_SCRIPT_LINEAR_B, - HB_SCRIPT_UGARITIC, - HB_SCRIPT_SHAVIAN, - HB_SCRIPT_OSMANYA, - HB_SCRIPT_CYPRIOT, - HB_SCRIPT_BRAILLE, - HB_SCRIPT_BUGINESE, - HB_SCRIPT_COPTIC, - HB_SCRIPT_NEW_TAI_LUE, - HB_SCRIPT_GLAGOLITIC, - HB_SCRIPT_TIFINAGH, - HB_SCRIPT_SYLOTI_NAGRI, - HB_SCRIPT_OLD_PERSIAN, - HB_SCRIPT_KHAROSHTHI, - HB_SCRIPT_BALINESE, - HB_SCRIPT_CUNEIFORM, - HB_SCRIPT_PHOENICIAN, - HB_SCRIPT_PHAGS_PA, - HB_SCRIPT_NKO, - HB_SCRIPT_SUNDANESE, - HB_SCRIPT_LEPCHA, - HB_SCRIPT_OL_CHIKI, - HB_SCRIPT_VAI, - HB_SCRIPT_SAURASHTRA, - HB_SCRIPT_KAYAH_LI, - HB_SCRIPT_REJANG, - HB_SCRIPT_LYCIAN, - HB_SCRIPT_CARIAN, - HB_SCRIPT_LYDIAN, - HB_SCRIPT_CHAM, - HB_SCRIPT_TAI_THAM, - HB_SCRIPT_TAI_VIET, - HB_SCRIPT_AVESTAN, - HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, - HB_SCRIPT_SAMARITAN, - HB_SCRIPT_LISU, - HB_SCRIPT_BAMUM, - HB_SCRIPT_JAVANESE, - HB_SCRIPT_MEETEI_MAYEK, - HB_SCRIPT_IMPERIAL_ARAMAIC, - HB_SCRIPT_OLD_SOUTH_ARABIAN, - HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, - HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, - HB_SCRIPT_OLD_TURKIC, - HB_SCRIPT_KAITHI, - HB_SCRIPT_BATAK, - HB_SCRIPT_BRAHMI, - HB_SCRIPT_MANDAIC, - HB_SCRIPT_CHAKMA, - HB_SCRIPT_MEROITIC_CURSIVE, - HB_SCRIPT_MEROITIC_HIEROGLYPHS, - HB_SCRIPT_MIAO, - HB_SCRIPT_SHARADA, - HB_SCRIPT_SORA_SOMPENG, - HB_SCRIPT_TAKRI, - HB_SCRIPT_UNKNOWN, - HB_SCRIPT_BASSA_VAH, - HB_SCRIPT_CAUCASIAN_ALBANIAN, - HB_SCRIPT_DUPLOYAN, - HB_SCRIPT_ELBASAN, - HB_SCRIPT_GRANTHA, - HB_SCRIPT_KHOJKI, - HB_SCRIPT_KHUDAWADI, - HB_SCRIPT_LINEAR_A, - HB_SCRIPT_MAHAJANI, - HB_SCRIPT_MANICHAEAN, - HB_SCRIPT_MENDE_KIKAKUI, - HB_SCRIPT_MODI, - HB_SCRIPT_MRO, - HB_SCRIPT_NABATAEAN, - HB_SCRIPT_OLD_NORTH_ARABIAN, - HB_SCRIPT_OLD_PERMIC, - HB_SCRIPT_PAHAWH_HMONG, - HB_SCRIPT_PALMYRENE, - HB_SCRIPT_PAU_CIN_HAU, - HB_SCRIPT_PSALTER_PAHLAVI, - HB_SCRIPT_SIDDHAM, - HB_SCRIPT_TIRHUTA, - HB_SCRIPT_WARANG_CITI, - HB_SCRIPT_AHOM, - HB_SCRIPT_ANATOLIAN_HIEROGLYPHS, - HB_SCRIPT_HATRAN, - HB_SCRIPT_MULTANI, - HB_SCRIPT_OLD_HUNGARIAN, - HB_SCRIPT_SIGNWRITING, - HB_SCRIPT_ADLAM, - HB_SCRIPT_BHAIKSUKI, - HB_SCRIPT_MARCHEN, - HB_SCRIPT_NEWA, - HB_SCRIPT_OSAGE, - HB_SCRIPT_TANGUT, - HB_SCRIPT_MASARAM_GONDI, - HB_SCRIPT_NUSHU, - HB_SCRIPT_SOYOMBO, - HB_SCRIPT_ZANABAZAR_SQUARE, - HB_SCRIPT_DOGRA, - HB_SCRIPT_GUNJALA_GONDI, - HB_SCRIPT_HANIFI_ROHINGYA, - HB_SCRIPT_MAKASAR, - HB_SCRIPT_MEDEFAIDRIN, - HB_SCRIPT_OLD_SOGDIAN, - HB_SCRIPT_SOGDIAN, - HB_SCRIPT_ELYMAIC, - HB_SCRIPT_NANDINAGARI, - HB_SCRIPT_NYIAKENG_PUACHUE_HMONG, - HB_SCRIPT_WANCHO, -}; - -static hb_unicode_combining_class_t -hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); -} - -static hb_unicode_general_category_t -hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); -} - -static hb_codepoint_t -hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return ucdn_mirror(unicode); -} - -static hb_script_t -hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return ucdn_script_translate[ucdn_get_script(unicode)]; -} - -static hb_bool_t -hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, - void *user_data HB_UNUSED) -{ - return ucdn_compose(ab, a, b); -} - -static hb_bool_t -hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, - void *user_data HB_UNUSED) -{ - return ucdn_decompose(ab, a, b); -} - - -#if HB_USE_ATEXIT -static void free_static_ucdn_funcs (); -#endif - -static struct hb_ucdn_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t -{ - static hb_unicode_funcs_t *create () - { - hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); - - hb_unicode_funcs_set_combining_class_func (funcs, hb_ucdn_combining_class, nullptr, nullptr); - hb_unicode_funcs_set_general_category_func (funcs, hb_ucdn_general_category, nullptr, nullptr); - hb_unicode_funcs_set_mirroring_func (funcs, hb_ucdn_mirroring, nullptr, nullptr); - hb_unicode_funcs_set_script_func (funcs, hb_ucdn_script, nullptr, nullptr); - hb_unicode_funcs_set_compose_func (funcs, hb_ucdn_compose, nullptr, nullptr); - hb_unicode_funcs_set_decompose_func (funcs, hb_ucdn_decompose, nullptr, nullptr); - - hb_unicode_funcs_make_immutable (funcs); - -#if HB_USE_ATEXIT - atexit (free_static_ucdn_funcs); -#endif - - return funcs; - } -} static_ucdn_funcs; - -#if HB_USE_ATEXIT -static -void free_static_ucdn_funcs () -{ - static_ucdn_funcs.free_instance (); -} -#endif - -extern "C" HB_INTERNAL -hb_unicode_funcs_t * -hb_ucdn_get_unicode_funcs (); - -hb_unicode_funcs_t * -hb_ucdn_get_unicode_funcs () -{ - return static_ucdn_funcs.get_unconst (); -} diff --git a/src/hb-ucdn/COPYING b/src/hb-ucdn/COPYING deleted file mode 100644 index be5205c65..000000000 --- a/src/hb-ucdn/COPYING +++ /dev/null @@ -1,13 +0,0 @@ -The contents of this directory are licensed under the following terms: - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/hb-ucdn/Makefile.am b/src/hb-ucdn/Makefile.am deleted file mode 100644 index 73b550254..000000000 --- a/src/hb-ucdn/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libhb-ucdn.la - -include Makefile.sources - -libhb_ucdn_la_SOURCES = $(LIBHB_UCDN_sources) -libhb_ucdn_la_CPPFLAGS = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/src \ - -I$(top_builddir)/src -libhb_ucdn_la_LIBADD = - -EXTRA_DIST = README COPYING - --include $(top_srcdir)/git.mk diff --git a/src/hb-ucdn/Makefile.sources b/src/hb-ucdn/Makefile.sources deleted file mode 100644 index cb823b605..000000000 --- a/src/hb-ucdn/Makefile.sources +++ /dev/null @@ -1,7 +0,0 @@ -NULL = - -LIBHB_UCDN_sources = \ - ucdn.h \ - ucdn.c \ - ucdn_db.h \ - $(NULL) diff --git a/src/hb-ucdn/README b/src/hb-ucdn/README deleted file mode 100644 index 2203ae69a..000000000 --- a/src/hb-ucdn/README +++ /dev/null @@ -1,40 +0,0 @@ -Contents of this directory are derived from UCDN: - - https://github.com/grigorig/ucdn - -The original README follows: - - -UCDN - Unicode Database and Normalization - -UCDN is a Unicode support library. Currently, it provides access -to basic character properties contained in the Unicode Character -Database and low-level normalization functions (pairwise canonical -composition/decomposition and compatibility decomposition). More -functionality might be provided in the future, such as additional -properties, string normalization and encoding conversion. - -UCDN uses standard C89 with no particular dependencies or requirements -except for stdint.h, and can be easily integrated into existing -projects. However, it can also be used as a standalone library, -and a CMake build script is provided for this. The first motivation -behind UCDN development was to provide a standalone set of Unicode -functions for the HarfBuzz OpenType shaping library. For this purpose, -a HarfBuzz-specific wrapper is shipped along with it (hb-ucdn.h). - -UCDN is published under the ISC license, please see the license header -in the C source code for more information. The makeunicodata.py script -required for parsing Unicode database files is licensed under the -PSF license, please see PYTHON-LICENSE for more information. - -UCDN was written by Grigori Goronzy . - -How to Use - -Include ucdn.c, ucdn.h and ucdn_db.h in your project. Now, just use the -functions as documented in ucdn.h. - -In some cases, it might be necessary to regenerate the Unicode -database file. The script makeunicodedata.py (Python 3.x required) -fetches the appropriate files and dumps the compressed database into -ucdn_db.h. diff --git a/src/hb-ucdn/ucdn.c b/src/hb-ucdn/ucdn.c deleted file mode 100644 index f7b33d645..000000000 --- a/src/hb-ucdn/ucdn.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2012 Grigori Goronzy - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include "ucdn.h" - -typedef struct { - unsigned char category; - unsigned char combining; - unsigned char bidi_class; - unsigned char east_asian_width; - unsigned char script; - unsigned char linebreak_class; -} UCDRecord; - -typedef struct { - unsigned short from, to; -} MirrorPair; - -typedef struct { - unsigned short from, to; - unsigned char type; -} BracketPair; - -typedef struct { - unsigned int start; - short count, index; -} Reindex; - -#include "ucdn_db.h" - -/* constants required for Hangul (de)composition */ -#define SBASE 0xAC00 -#define LBASE 0x1100 -#define VBASE 0x1161 -#define TBASE 0x11A7 -#define SCOUNT 11172 -#define LCOUNT 19 -#define VCOUNT 21 -#define TCOUNT 28 -#define NCOUNT (VCOUNT * TCOUNT) - -static const UCDRecord *get_ucd_record(uint32_t code) -{ - int index, offset; - - if (code >= 0x110000) - index = 0; - else { - index = index0[code >> (SHIFT1+SHIFT2)] << SHIFT1; - offset = (code >> SHIFT2) & ((1<= 0x110000) - index = 0; - else { - index = decomp_index0[code >> (DECOMP_SHIFT1+DECOMP_SHIFT2)] - << DECOMP_SHIFT1; - offset = (code >> DECOMP_SHIFT2) & ((1<start < rb->start) - return -1; - else if (ra->start > (rb->start + rb->count)) - return 1; - else - return 0; -} - -static int get_comp_index(uint32_t code, const Reindex *idx, size_t len) -{ - Reindex *res; - Reindex r = {0, 0, 0}; - r.start = code; - res = (Reindex *) bsearch(&r, idx, len, sizeof(Reindex), compare_reindex); - - if (res != NULL) - return res->index + (code - res->start); - else - return -1; -} - -static int compare_mp(const void *a, const void *b) -{ - MirrorPair *mpa = (MirrorPair *)a; - MirrorPair *mpb = (MirrorPair *)b; - return mpa->from - mpb->from; -} - -static int compare_bp(const void *a, const void *b) -{ - BracketPair *bpa = (BracketPair *)a; - BracketPair *bpb = (BracketPair *)b; - return bpa->from - bpb->from; -} - -static BracketPair *search_bp(uint32_t code) -{ - BracketPair bp = {0,0,2}; - BracketPair *res; - - bp.from = code; - res = (BracketPair *) bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, - sizeof(BracketPair), compare_bp); - return res; -} - -static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b) -{ - int si = code - SBASE; - - if (si < 0 || si >= SCOUNT) - return 0; - - if (si % TCOUNT) { - /* LV,T */ - *a = SBASE + (si / TCOUNT) * TCOUNT; - *b = TBASE + (si % TCOUNT); - return 3; - } else { - /* L,V */ - *a = LBASE + (si / NCOUNT); - *b = VBASE + (si % NCOUNT) / TCOUNT; - return 2; - } -} - -static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b) -{ - if (a >= SBASE && a < (SBASE + SCOUNT) && b > TBASE && b < (TBASE + TCOUNT) && - !((a - SBASE) % TCOUNT)) { - /* LV,T */ - *code = a + (b - TBASE); - return 3; - } else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) { - /* L,V */ - int li = a - LBASE; - int vi = b - VBASE; - *code = SBASE + li * NCOUNT + vi * TCOUNT; - return 2; - } else { - return 0; - } -} - -static uint32_t decode_utf16(const unsigned short **code_ptr) -{ - const unsigned short *code = *code_ptr; - - if (code[0] < 0xd800 || code[0] > 0xdc00) { - *code_ptr += 1; - return (uint32_t)code[0]; - } else { - *code_ptr += 2; - return 0x10000 + ((uint32_t)code[1] - 0xdc00) + - (((uint32_t)code[0] - 0xd800) << 10); - } -} - -const char *ucdn_get_unicode_version(void) -{ - return UNIDATA_VERSION; -} - -int ucdn_get_combining_class(uint32_t code) -{ - return get_ucd_record(code)->combining; -} - -int ucdn_get_east_asian_width(uint32_t code) -{ - return get_ucd_record(code)->east_asian_width; -} - -int ucdn_get_general_category(uint32_t code) -{ - return get_ucd_record(code)->category; -} - -int ucdn_get_bidi_class(uint32_t code) -{ - return get_ucd_record(code)->bidi_class; -} - -int ucdn_get_mirrored(uint32_t code) -{ - return ucdn_mirror(code) != code; -} - -int ucdn_get_script(uint32_t code) -{ - return get_ucd_record(code)->script; -} - -int ucdn_get_linebreak_class(uint32_t code) -{ - return get_ucd_record(code)->linebreak_class; -} - -int ucdn_get_resolved_linebreak_class(uint32_t code) -{ - const UCDRecord *record = get_ucd_record(code); - - switch (record->linebreak_class) - { - case UCDN_LINEBREAK_CLASS_AI: - case UCDN_LINEBREAK_CLASS_SG: - case UCDN_LINEBREAK_CLASS_XX: - return UCDN_LINEBREAK_CLASS_AL; - - case UCDN_LINEBREAK_CLASS_SA: - if (record->category == UCDN_GENERAL_CATEGORY_MC || - record->category == UCDN_GENERAL_CATEGORY_MN) - return UCDN_LINEBREAK_CLASS_CM; - return UCDN_LINEBREAK_CLASS_AL; - - case UCDN_LINEBREAK_CLASS_CJ: - return UCDN_LINEBREAK_CLASS_NS; - - case UCDN_LINEBREAK_CLASS_CB: - return UCDN_LINEBREAK_CLASS_B2; - - case UCDN_LINEBREAK_CLASS_NL: - return UCDN_LINEBREAK_CLASS_BK; - - default: - return record->linebreak_class; - } -} - -uint32_t ucdn_mirror(uint32_t code) -{ - MirrorPair mp = {0}; - MirrorPair *res; - - mp.from = code; - res = (MirrorPair *) bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN, - sizeof(MirrorPair), compare_mp); - - if (res == NULL) - return code; - else - return res->to; -} - -uint32_t ucdn_paired_bracket(uint32_t code) -{ - BracketPair *res = search_bp(code); - if (res == NULL) - return code; - else - return res->to; -} - -int ucdn_paired_bracket_type(uint32_t code) -{ - BracketPair *res = search_bp(code); - if (res == NULL) - return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE; - else - return res->type; -} - -int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b) -{ - const unsigned short *rec; - int len; - - if (hangul_pair_decompose(code, a, b)) - return 1; - - rec = get_decomp_record(code); - len = rec[0] >> 8; - - if ((rec[0] & 0xff) != 0 || len == 0) - return 0; - - rec++; - *a = decode_utf16(&rec); - if (len > 1) - *b = decode_utf16(&rec); - else - *b = 0; - - return 1; -} - -int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b) -{ - int l, r, index, indexi, offset; - - if (hangul_pair_compose(code, a, b)) - return 1; - - l = get_comp_index(a, nfc_first, sizeof(nfc_first) / sizeof(Reindex)); - r = get_comp_index(b, nfc_last, sizeof(nfc_last) / sizeof(Reindex)); - - if (l < 0 || r < 0) - return 0; - - indexi = l * TOTAL_LAST + r; - index = comp_index0[indexi >> (COMP_SHIFT1+COMP_SHIFT2)] << COMP_SHIFT1; - offset = (indexi >> COMP_SHIFT2) & ((1<> 8; - - if (len == 0) - return 0; - - rec++; - for (i = 0; i < len; i++) - decomposed[i] = decode_utf16(&rec); - - return len; -} diff --git a/src/hb-ucdn/ucdn.h b/src/hb-ucdn/ucdn.h deleted file mode 100644 index 1317d4fe4..000000000 --- a/src/hb-ucdn/ucdn.h +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Copyright (C) 2012 Grigori Goronzy - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef UCDN_H -#define UCDN_H - - - -#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) -# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)") -# define HB_END_VISIBILITY _Pragma ("GCC visibility pop") -#else -# define HB_BEGIN_VISIBILITY -# define HB_END_VISIBILITY -#endif -#ifdef __cplusplus -# define HB_BEGIN_HEADER extern "C" { HB_BEGIN_VISIBILITY -# define HB_END_HEADER HB_END_VISIBILITY } -#else -# define HB_BEGIN_HEADER HB_BEGIN_VISIBILITY -# define HB_END_HEADER HB_END_VISIBILITY -#endif - -HB_BEGIN_HEADER - -#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \ - defined (_sgi) || defined (__sun) || defined (sun) || \ - defined (__digital__) || defined (__HP_cc) -# include -#elif defined (_AIX) -# include -#elif defined (_MSC_VER) && _MSC_VER < 1600 -/* VS 2010 (_MSC_VER 1600) has stdint.h */ -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -# include -#endif - - -#define UCDN_EAST_ASIAN_F 0 -#define UCDN_EAST_ASIAN_H 1 -#define UCDN_EAST_ASIAN_W 2 -#define UCDN_EAST_ASIAN_NA 3 -#define UCDN_EAST_ASIAN_A 4 -#define UCDN_EAST_ASIAN_N 5 - -#define UCDN_SCRIPT_COMMON 0 -#define UCDN_SCRIPT_LATIN 1 -#define UCDN_SCRIPT_GREEK 2 -#define UCDN_SCRIPT_CYRILLIC 3 -#define UCDN_SCRIPT_ARMENIAN 4 -#define UCDN_SCRIPT_HEBREW 5 -#define UCDN_SCRIPT_ARABIC 6 -#define UCDN_SCRIPT_SYRIAC 7 -#define UCDN_SCRIPT_THAANA 8 -#define UCDN_SCRIPT_DEVANAGARI 9 -#define UCDN_SCRIPT_BENGALI 10 -#define UCDN_SCRIPT_GURMUKHI 11 -#define UCDN_SCRIPT_GUJARATI 12 -#define UCDN_SCRIPT_ORIYA 13 -#define UCDN_SCRIPT_TAMIL 14 -#define UCDN_SCRIPT_TELUGU 15 -#define UCDN_SCRIPT_KANNADA 16 -#define UCDN_SCRIPT_MALAYALAM 17 -#define UCDN_SCRIPT_SINHALA 18 -#define UCDN_SCRIPT_THAI 19 -#define UCDN_SCRIPT_LAO 20 -#define UCDN_SCRIPT_TIBETAN 21 -#define UCDN_SCRIPT_MYANMAR 22 -#define UCDN_SCRIPT_GEORGIAN 23 -#define UCDN_SCRIPT_HANGUL 24 -#define UCDN_SCRIPT_ETHIOPIC 25 -#define UCDN_SCRIPT_CHEROKEE 26 -#define UCDN_SCRIPT_CANADIAN_ABORIGINAL 27 -#define UCDN_SCRIPT_OGHAM 28 -#define UCDN_SCRIPT_RUNIC 29 -#define UCDN_SCRIPT_KHMER 30 -#define UCDN_SCRIPT_MONGOLIAN 31 -#define UCDN_SCRIPT_HIRAGANA 32 -#define UCDN_SCRIPT_KATAKANA 33 -#define UCDN_SCRIPT_BOPOMOFO 34 -#define UCDN_SCRIPT_HAN 35 -#define UCDN_SCRIPT_YI 36 -#define UCDN_SCRIPT_OLD_ITALIC 37 -#define UCDN_SCRIPT_GOTHIC 38 -#define UCDN_SCRIPT_DESERET 39 -#define UCDN_SCRIPT_INHERITED 40 -#define UCDN_SCRIPT_TAGALOG 41 -#define UCDN_SCRIPT_HANUNOO 42 -#define UCDN_SCRIPT_BUHID 43 -#define UCDN_SCRIPT_TAGBANWA 44 -#define UCDN_SCRIPT_LIMBU 45 -#define UCDN_SCRIPT_TAI_LE 46 -#define UCDN_SCRIPT_LINEAR_B 47 -#define UCDN_SCRIPT_UGARITIC 48 -#define UCDN_SCRIPT_SHAVIAN 49 -#define UCDN_SCRIPT_OSMANYA 50 -#define UCDN_SCRIPT_CYPRIOT 51 -#define UCDN_SCRIPT_BRAILLE 52 -#define UCDN_SCRIPT_BUGINESE 53 -#define UCDN_SCRIPT_COPTIC 54 -#define UCDN_SCRIPT_NEW_TAI_LUE 55 -#define UCDN_SCRIPT_GLAGOLITIC 56 -#define UCDN_SCRIPT_TIFINAGH 57 -#define UCDN_SCRIPT_SYLOTI_NAGRI 58 -#define UCDN_SCRIPT_OLD_PERSIAN 59 -#define UCDN_SCRIPT_KHAROSHTHI 60 -#define UCDN_SCRIPT_BALINESE 61 -#define UCDN_SCRIPT_CUNEIFORM 62 -#define UCDN_SCRIPT_PHOENICIAN 63 -#define UCDN_SCRIPT_PHAGS_PA 64 -#define UCDN_SCRIPT_NKO 65 -#define UCDN_SCRIPT_SUNDANESE 66 -#define UCDN_SCRIPT_LEPCHA 67 -#define UCDN_SCRIPT_OL_CHIKI 68 -#define UCDN_SCRIPT_VAI 69 -#define UCDN_SCRIPT_SAURASHTRA 70 -#define UCDN_SCRIPT_KAYAH_LI 71 -#define UCDN_SCRIPT_REJANG 72 -#define UCDN_SCRIPT_LYCIAN 73 -#define UCDN_SCRIPT_CARIAN 74 -#define UCDN_SCRIPT_LYDIAN 75 -#define UCDN_SCRIPT_CHAM 76 -#define UCDN_SCRIPT_TAI_THAM 77 -#define UCDN_SCRIPT_TAI_VIET 78 -#define UCDN_SCRIPT_AVESTAN 79 -#define UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS 80 -#define UCDN_SCRIPT_SAMARITAN 81 -#define UCDN_SCRIPT_LISU 82 -#define UCDN_SCRIPT_BAMUM 83 -#define UCDN_SCRIPT_JAVANESE 84 -#define UCDN_SCRIPT_MEETEI_MAYEK 85 -#define UCDN_SCRIPT_IMPERIAL_ARAMAIC 86 -#define UCDN_SCRIPT_OLD_SOUTH_ARABIAN 87 -#define UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN 88 -#define UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI 89 -#define UCDN_SCRIPT_OLD_TURKIC 90 -#define UCDN_SCRIPT_KAITHI 91 -#define UCDN_SCRIPT_BATAK 92 -#define UCDN_SCRIPT_BRAHMI 93 -#define UCDN_SCRIPT_MANDAIC 94 -#define UCDN_SCRIPT_CHAKMA 95 -#define UCDN_SCRIPT_MEROITIC_CURSIVE 96 -#define UCDN_SCRIPT_MEROITIC_HIEROGLYPHS 97 -#define UCDN_SCRIPT_MIAO 98 -#define UCDN_SCRIPT_SHARADA 99 -#define UCDN_SCRIPT_SORA_SOMPENG 100 -#define UCDN_SCRIPT_TAKRI 101 -#define UCDN_SCRIPT_UNKNOWN 102 -#define UCDN_SCRIPT_BASSA_VAH 103 -#define UCDN_SCRIPT_CAUCASIAN_ALBANIAN 104 -#define UCDN_SCRIPT_DUPLOYAN 105 -#define UCDN_SCRIPT_ELBASAN 106 -#define UCDN_SCRIPT_GRANTHA 107 -#define UCDN_SCRIPT_KHOJKI 108 -#define UCDN_SCRIPT_KHUDAWADI 109 -#define UCDN_SCRIPT_LINEAR_A 110 -#define UCDN_SCRIPT_MAHAJANI 111 -#define UCDN_SCRIPT_MANICHAEAN 112 -#define UCDN_SCRIPT_MENDE_KIKAKUI 113 -#define UCDN_SCRIPT_MODI 114 -#define UCDN_SCRIPT_MRO 115 -#define UCDN_SCRIPT_NABATAEAN 116 -#define UCDN_SCRIPT_OLD_NORTH_ARABIAN 117 -#define UCDN_SCRIPT_OLD_PERMIC 118 -#define UCDN_SCRIPT_PAHAWH_HMONG 119 -#define UCDN_SCRIPT_PALMYRENE 120 -#define UCDN_SCRIPT_PAU_CIN_HAU 121 -#define UCDN_SCRIPT_PSALTER_PAHLAVI 122 -#define UCDN_SCRIPT_SIDDHAM 123 -#define UCDN_SCRIPT_TIRHUTA 124 -#define UCDN_SCRIPT_WARANG_CITI 125 -#define UCDN_SCRIPT_AHOM 126 -#define UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS 127 -#define UCDN_SCRIPT_HATRAN 128 -#define UCDN_SCRIPT_MULTANI 129 -#define UCDN_SCRIPT_OLD_HUNGARIAN 130 -#define UCDN_SCRIPT_SIGNWRITING 131 -#define UCDN_SCRIPT_ADLAM 132 -#define UCDN_SCRIPT_BHAIKSUKI 133 -#define UCDN_SCRIPT_MARCHEN 134 -#define UCDN_SCRIPT_NEWA 135 -#define UCDN_SCRIPT_OSAGE 136 -#define UCDN_SCRIPT_TANGUT 137 -#define UCDN_SCRIPT_MASARAM_GONDI 138 -#define UCDN_SCRIPT_NUSHU 139 -#define UCDN_SCRIPT_SOYOMBO 140 -#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141 -#define UCDN_SCRIPT_DOGRA 142 -#define UCDN_SCRIPT_GUNJALA_GONDI 143 -#define UCDN_SCRIPT_HANIFI_ROHINGYA 144 -#define UCDN_SCRIPT_MAKASAR 145 -#define UCDN_SCRIPT_MEDEFAIDRIN 146 -#define UCDN_SCRIPT_OLD_SOGDIAN 147 -#define UCDN_SCRIPT_SOGDIAN 148 -#define UCDN_SCRIPT_ELYMAIC 149 -#define UCDN_SCRIPT_NANDINAGARI 150 -#define UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG 151 -#define UCDN_SCRIPT_WANCHO 152 - -#define UCDN_LINEBREAK_CLASS_OP 0 -#define UCDN_LINEBREAK_CLASS_CL 1 -#define UCDN_LINEBREAK_CLASS_CP 2 -#define UCDN_LINEBREAK_CLASS_QU 3 -#define UCDN_LINEBREAK_CLASS_GL 4 -#define UCDN_LINEBREAK_CLASS_NS 5 -#define UCDN_LINEBREAK_CLASS_EX 6 -#define UCDN_LINEBREAK_CLASS_SY 7 -#define UCDN_LINEBREAK_CLASS_IS 8 -#define UCDN_LINEBREAK_CLASS_PR 9 -#define UCDN_LINEBREAK_CLASS_PO 10 -#define UCDN_LINEBREAK_CLASS_NU 11 -#define UCDN_LINEBREAK_CLASS_AL 12 -#define UCDN_LINEBREAK_CLASS_HL 13 -#define UCDN_LINEBREAK_CLASS_ID 14 -#define UCDN_LINEBREAK_CLASS_IN 15 -#define UCDN_LINEBREAK_CLASS_HY 16 -#define UCDN_LINEBREAK_CLASS_BA 17 -#define UCDN_LINEBREAK_CLASS_BB 18 -#define UCDN_LINEBREAK_CLASS_B2 19 -#define UCDN_LINEBREAK_CLASS_ZW 20 -#define UCDN_LINEBREAK_CLASS_CM 21 -#define UCDN_LINEBREAK_CLASS_WJ 22 -#define UCDN_LINEBREAK_CLASS_H2 23 -#define UCDN_LINEBREAK_CLASS_H3 24 -#define UCDN_LINEBREAK_CLASS_JL 25 -#define UCDN_LINEBREAK_CLASS_JV 26 -#define UCDN_LINEBREAK_CLASS_JT 27 -#define UCDN_LINEBREAK_CLASS_RI 28 -#define UCDN_LINEBREAK_CLASS_AI 29 -#define UCDN_LINEBREAK_CLASS_BK 30 -#define UCDN_LINEBREAK_CLASS_CB 31 -#define UCDN_LINEBREAK_CLASS_CJ 32 -#define UCDN_LINEBREAK_CLASS_CR 33 -#define UCDN_LINEBREAK_CLASS_LF 34 -#define UCDN_LINEBREAK_CLASS_NL 35 -#define UCDN_LINEBREAK_CLASS_SA 36 -#define UCDN_LINEBREAK_CLASS_SG 37 -#define UCDN_LINEBREAK_CLASS_SP 38 -#define UCDN_LINEBREAK_CLASS_XX 39 -#define UCDN_LINEBREAK_CLASS_ZWJ 40 -#define UCDN_LINEBREAK_CLASS_EB 41 -#define UCDN_LINEBREAK_CLASS_EM 42 - -#define UCDN_GENERAL_CATEGORY_CC 0 -#define UCDN_GENERAL_CATEGORY_CF 1 -#define UCDN_GENERAL_CATEGORY_CN 2 -#define UCDN_GENERAL_CATEGORY_CO 3 -#define UCDN_GENERAL_CATEGORY_CS 4 -#define UCDN_GENERAL_CATEGORY_LL 5 -#define UCDN_GENERAL_CATEGORY_LM 6 -#define UCDN_GENERAL_CATEGORY_LO 7 -#define UCDN_GENERAL_CATEGORY_LT 8 -#define UCDN_GENERAL_CATEGORY_LU 9 -#define UCDN_GENERAL_CATEGORY_MC 10 -#define UCDN_GENERAL_CATEGORY_ME 11 -#define UCDN_GENERAL_CATEGORY_MN 12 -#define UCDN_GENERAL_CATEGORY_ND 13 -#define UCDN_GENERAL_CATEGORY_NL 14 -#define UCDN_GENERAL_CATEGORY_NO 15 -#define UCDN_GENERAL_CATEGORY_PC 16 -#define UCDN_GENERAL_CATEGORY_PD 17 -#define UCDN_GENERAL_CATEGORY_PE 18 -#define UCDN_GENERAL_CATEGORY_PF 19 -#define UCDN_GENERAL_CATEGORY_PI 20 -#define UCDN_GENERAL_CATEGORY_PO 21 -#define UCDN_GENERAL_CATEGORY_PS 22 -#define UCDN_GENERAL_CATEGORY_SC 23 -#define UCDN_GENERAL_CATEGORY_SK 24 -#define UCDN_GENERAL_CATEGORY_SM 25 -#define UCDN_GENERAL_CATEGORY_SO 26 -#define UCDN_GENERAL_CATEGORY_ZL 27 -#define UCDN_GENERAL_CATEGORY_ZP 28 -#define UCDN_GENERAL_CATEGORY_ZS 29 - -#define UCDN_BIDI_CLASS_L 0 -#define UCDN_BIDI_CLASS_LRE 1 -#define UCDN_BIDI_CLASS_LRO 2 -#define UCDN_BIDI_CLASS_R 3 -#define UCDN_BIDI_CLASS_AL 4 -#define UCDN_BIDI_CLASS_RLE 5 -#define UCDN_BIDI_CLASS_RLO 6 -#define UCDN_BIDI_CLASS_PDF 7 -#define UCDN_BIDI_CLASS_EN 8 -#define UCDN_BIDI_CLASS_ES 9 -#define UCDN_BIDI_CLASS_ET 10 -#define UCDN_BIDI_CLASS_AN 11 -#define UCDN_BIDI_CLASS_CS 12 -#define UCDN_BIDI_CLASS_NSM 13 -#define UCDN_BIDI_CLASS_BN 14 -#define UCDN_BIDI_CLASS_B 15 -#define UCDN_BIDI_CLASS_S 16 -#define UCDN_BIDI_CLASS_WS 17 -#define UCDN_BIDI_CLASS_ON 18 -#define UCDN_BIDI_CLASS_LRI 19 -#define UCDN_BIDI_CLASS_RLI 20 -#define UCDN_BIDI_CLASS_FSI 21 -#define UCDN_BIDI_CLASS_PDI 22 - -#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0 -#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1 -#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2 - -/** - * Return version of the Unicode database. - * - * @return Unicode database version - */ -const char *ucdn_get_unicode_version(void); - -/** - * Get combining class of a codepoint. - * - * @param code Unicode codepoint - * @return combining class value, as defined in UAX#44 - */ -int ucdn_get_combining_class(uint32_t code); - -/** - * Get east-asian width of a codepoint. - * - * @param code Unicode codepoint - * @return value according to UCDN_EAST_ASIAN_* and as defined in UAX#11. - */ -int ucdn_get_east_asian_width(uint32_t code); - -/** - * Get general category of a codepoint. - * - * @param code Unicode codepoint - * @return value according to UCDN_GENERAL_CATEGORY_* and as defined in - * UAX#44. - */ -int ucdn_get_general_category(uint32_t code); - -/** - * Get bidirectional class of a codepoint. - * - * @param code Unicode codepoint - * @return value according to UCDN_BIDI_CLASS_* and as defined in UAX#44. - */ -int ucdn_get_bidi_class(uint32_t code); - -/** - * Get script of a codepoint. - * - * @param code Unicode codepoint - * @return value according to UCDN_SCRIPT_* and as defined in UAX#24. - */ -int ucdn_get_script(uint32_t code); - -/** - * Get unresolved linebreak class of a codepoint. This does not take - * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class() - * for resolved linebreak classes. - * - * @param code Unicode codepoint - * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14. - */ -int ucdn_get_linebreak_class(uint32_t code); - -/** - * Get resolved linebreak class of a codepoint. This resolves characters - * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14. - * In addition the CB class is resolved as the equivalent B2 class and - * the NL class is resolved as the equivalent BK class. - * - * @param code Unicode codepoint - * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14. - */ -int ucdn_get_resolved_linebreak_class(uint32_t code); - -/** - * Check if codepoint can be mirrored. - * - * @param code Unicode codepoint - * @return 1 if mirrored character exists, otherwise 0 - */ -int ucdn_get_mirrored(uint32_t code); - -/** - * Mirror a codepoint. - * - * @param code Unicode codepoint - * @return mirrored codepoint or the original codepoint if no - * mirrored character exists - */ -uint32_t ucdn_mirror(uint32_t code); - -/** - * Get paired bracket for a codepoint. - * - * @param code Unicode codepoint - * @return paired bracket codepoint or the original codepoint if no - * paired bracket character exists - */ -uint32_t ucdn_paired_bracket(uint32_t code); - -/** - * Get paired bracket type for a codepoint. - * - * @param code Unicode codepoint - * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined - * in UAX#9. - * - */ -int ucdn_paired_bracket_type(uint32_t code); - -/** - * Pairwise canonical decomposition of a codepoint. This includes - * Hangul Jamo decomposition (see chapter 3.12 of the Unicode core - * specification). - * - * Hangul is decomposed into L and V jamos for LV forms, and an - * LV precomposed syllable and a T jamo for LVT forms. - * - * @param code Unicode codepoint - * @param a filled with first codepoint of decomposition - * @param b filled with second codepoint of decomposition, or 0 - * @return success - */ -int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b); - -/** - * Compatibility decomposition of a codepoint. - * - * @param code Unicode codepoint - * @param decomposed filled with decomposition, must be able to hold 18 - * characters - * @return length of decomposition or 0 in case none exists - */ -int ucdn_compat_decompose(uint32_t code, uint32_t *decomposed); - -/** - * Pairwise canonical composition of two codepoints. This includes - * Hangul Jamo composition (see chapter 3.12 of the Unicode core - * specification). - * - * Hangul composition expects either L and V jamos, or an LV - * precomposed syllable and a T jamo. This is exactly the inverse - * of pairwise Hangul decomposition. - * - * @param code filled with composition - * @param a first codepoint - * @param b second codepoint - * @return success - */ -int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b); - -HB_END_HEADER - -#endif diff --git a/src/hb-ucdn/ucdn_db.h b/src/hb-ucdn/ucdn_db.h deleted file mode 100644 index 8f1310f29..000000000 --- a/src/hb-ucdn/ucdn_db.h +++ /dev/null @@ -1,5790 +0,0 @@ -/* this file was generated by makeunicodedata.py 3.2 */ - -#define UNIDATA_VERSION "12.0.0" -/* a list of unique database records */ -static const UCDRecord ucd_records[] = { - {2, 0, 18, 5, 102, 39}, - {0, 0, 14, 5, 0, 21}, - {0, 0, 16, 5, 0, 17}, - {0, 0, 15, 5, 0, 34}, - {0, 0, 16, 5, 0, 30}, - {0, 0, 17, 5, 0, 30}, - {0, 0, 15, 5, 0, 33}, - {0, 0, 15, 5, 0, 21}, - {0, 0, 16, 5, 0, 21}, - {29, 0, 17, 3, 0, 38}, - {21, 0, 18, 3, 0, 6}, - {21, 0, 18, 3, 0, 3}, - {21, 0, 10, 3, 0, 12}, - {23, 0, 10, 3, 0, 9}, - {21, 0, 10, 3, 0, 10}, - {21, 0, 18, 3, 0, 12}, - {22, 0, 18, 3, 0, 0}, - {18, 0, 18, 3, 0, 2}, - {25, 0, 9, 3, 0, 9}, - {21, 0, 12, 3, 0, 8}, - {17, 0, 9, 3, 0, 16}, - {21, 0, 12, 3, 0, 7}, - {13, 0, 8, 3, 0, 11}, - {21, 0, 18, 3, 0, 8}, - {25, 0, 18, 3, 0, 12}, - {9, 0, 0, 3, 1, 12}, - {21, 0, 18, 3, 0, 9}, - {24, 0, 18, 3, 0, 12}, - {16, 0, 18, 3, 0, 12}, - {5, 0, 0, 3, 1, 12}, - {25, 0, 18, 3, 0, 17}, - {18, 0, 18, 3, 0, 1}, - {0, 0, 15, 5, 0, 35}, - {29, 0, 12, 5, 0, 4}, - {21, 0, 18, 4, 0, 0}, - {23, 0, 10, 3, 0, 10}, - {23, 0, 10, 4, 0, 9}, - {26, 0, 18, 3, 0, 12}, - {21, 0, 18, 4, 0, 29}, - {24, 0, 18, 4, 0, 29}, - {26, 0, 18, 5, 0, 12}, - {7, 0, 0, 4, 1, 29}, - {20, 0, 18, 5, 0, 3}, - {1, 0, 14, 4, 0, 17}, - {26, 0, 18, 4, 0, 12}, - {26, 0, 10, 4, 0, 10}, - {25, 0, 10, 4, 0, 9}, - {15, 0, 8, 4, 0, 29}, - {24, 0, 18, 4, 0, 18}, - {5, 0, 0, 5, 0, 12}, - {19, 0, 18, 5, 0, 3}, - {15, 0, 18, 4, 0, 29}, - {9, 0, 0, 5, 1, 12}, - {9, 0, 0, 4, 1, 12}, - {25, 0, 18, 4, 0, 29}, - {5, 0, 0, 4, 1, 12}, - {5, 0, 0, 5, 1, 12}, - {7, 0, 0, 5, 1, 12}, - {8, 0, 0, 5, 1, 12}, - {6, 0, 0, 5, 1, 12}, - {6, 0, 18, 5, 0, 12}, - {6, 0, 0, 5, 0, 12}, - {24, 0, 18, 5, 0, 12}, - {24, 0, 18, 4, 0, 12}, - {6, 0, 18, 4, 0, 29}, - {6, 0, 18, 5, 0, 18}, - {6, 0, 0, 4, 0, 29}, - {24, 0, 18, 5, 34, 12}, - {12, 230, 13, 4, 40, 21}, - {12, 232, 13, 4, 40, 21}, - {12, 220, 13, 4, 40, 21}, - {12, 216, 13, 4, 40, 21}, - {12, 202, 13, 4, 40, 21}, - {12, 1, 13, 4, 40, 21}, - {12, 240, 13, 4, 40, 21}, - {12, 0, 13, 4, 40, 4}, - {12, 233, 13, 4, 40, 4}, - {12, 234, 13, 4, 40, 4}, - {9, 0, 0, 5, 2, 12}, - {5, 0, 0, 5, 2, 12}, - {24, 0, 18, 5, 2, 12}, - {2, 0, 18, 5, 102, 39}, - {6, 0, 0, 5, 2, 12}, - {21, 0, 18, 5, 0, 8}, - {21, 0, 18, 5, 0, 12}, - {9, 0, 0, 4, 2, 12}, - {5, 0, 0, 4, 2, 12}, - {9, 0, 0, 5, 54, 12}, - {5, 0, 0, 5, 54, 12}, - {25, 0, 18, 5, 2, 12}, - {9, 0, 0, 5, 3, 12}, - {9, 0, 0, 4, 3, 12}, - {5, 0, 0, 4, 3, 12}, - {5, 0, 0, 5, 3, 12}, - {26, 0, 0, 5, 3, 12}, - {12, 230, 13, 5, 3, 21}, - {12, 230, 13, 5, 40, 21}, - {11, 0, 13, 5, 3, 21}, - {9, 0, 0, 5, 4, 12}, - {6, 0, 0, 5, 4, 12}, - {21, 0, 0, 5, 4, 12}, - {5, 0, 0, 5, 4, 12}, - {21, 0, 0, 5, 0, 8}, - {17, 0, 18, 5, 4, 17}, - {26, 0, 18, 5, 4, 12}, - {23, 0, 10, 5, 4, 9}, - {12, 220, 13, 5, 5, 21}, - {12, 230, 13, 5, 5, 21}, - {12, 222, 13, 5, 5, 21}, - {12, 228, 13, 5, 5, 21}, - {12, 10, 13, 5, 5, 21}, - {12, 11, 13, 5, 5, 21}, - {12, 12, 13, 5, 5, 21}, - {12, 13, 13, 5, 5, 21}, - {12, 14, 13, 5, 5, 21}, - {12, 15, 13, 5, 5, 21}, - {12, 16, 13, 5, 5, 21}, - {12, 17, 13, 5, 5, 21}, - {12, 18, 13, 5, 5, 21}, - {12, 19, 13, 5, 5, 21}, - {12, 20, 13, 5, 5, 21}, - {12, 21, 13, 5, 5, 21}, - {12, 22, 13, 5, 5, 21}, - {17, 0, 3, 5, 5, 17}, - {12, 23, 13, 5, 5, 21}, - {21, 0, 3, 5, 5, 12}, - {12, 24, 13, 5, 5, 21}, - {12, 25, 13, 5, 5, 21}, - {21, 0, 3, 5, 5, 6}, - {7, 0, 3, 5, 5, 13}, - {1, 0, 11, 5, 6, 12}, - {1, 0, 11, 5, 0, 12}, - {25, 0, 18, 5, 6, 12}, - {25, 0, 4, 5, 6, 12}, - {21, 0, 10, 5, 6, 10}, - {23, 0, 4, 5, 6, 10}, - {21, 0, 12, 5, 0, 8}, - {21, 0, 4, 5, 6, 8}, - {26, 0, 18, 5, 6, 12}, - {12, 230, 13, 5, 6, 21}, - {12, 30, 13, 5, 6, 21}, - {12, 31, 13, 5, 6, 21}, - {12, 32, 13, 5, 6, 21}, - {21, 0, 4, 5, 0, 6}, - {1, 0, 4, 5, 6, 21}, - {21, 0, 4, 5, 6, 6}, - {7, 0, 4, 5, 6, 12}, - {6, 0, 4, 5, 0, 12}, - {12, 27, 13, 5, 40, 21}, - {12, 28, 13, 5, 40, 21}, - {12, 29, 13, 5, 40, 21}, - {12, 30, 13, 5, 40, 21}, - {12, 31, 13, 5, 40, 21}, - {12, 32, 13, 5, 40, 21}, - {12, 33, 13, 5, 40, 21}, - {12, 34, 13, 5, 40, 21}, - {12, 220, 13, 5, 40, 21}, - {12, 220, 13, 5, 6, 21}, - {13, 0, 11, 5, 6, 11}, - {21, 0, 11, 5, 6, 11}, - {21, 0, 4, 5, 6, 12}, - {12, 35, 13, 5, 40, 21}, - {6, 0, 4, 5, 6, 12}, - {13, 0, 8, 5, 6, 11}, - {26, 0, 4, 5, 6, 12}, - {21, 0, 4, 5, 7, 12}, - {1, 0, 4, 5, 7, 12}, - {7, 0, 4, 5, 7, 12}, - {12, 36, 13, 5, 7, 21}, - {12, 230, 13, 5, 7, 21}, - {12, 220, 13, 5, 7, 21}, - {7, 0, 4, 5, 8, 12}, - {12, 0, 13, 5, 8, 21}, - {13, 0, 3, 5, 65, 11}, - {7, 0, 3, 5, 65, 12}, - {12, 230, 13, 5, 65, 21}, - {12, 220, 13, 5, 65, 21}, - {6, 0, 3, 5, 65, 12}, - {26, 0, 18, 5, 65, 12}, - {21, 0, 18, 5, 65, 12}, - {21, 0, 18, 5, 65, 8}, - {21, 0, 18, 5, 65, 6}, - {23, 0, 3, 5, 65, 9}, - {7, 0, 3, 5, 81, 12}, - {12, 230, 13, 5, 81, 21}, - {6, 0, 3, 5, 81, 12}, - {21, 0, 3, 5, 81, 12}, - {7, 0, 3, 5, 94, 12}, - {12, 220, 13, 5, 94, 21}, - {21, 0, 3, 5, 94, 12}, - {12, 27, 13, 5, 6, 21}, - {12, 28, 13, 5, 6, 21}, - {12, 29, 13, 5, 6, 21}, - {12, 0, 13, 5, 9, 21}, - {10, 0, 0, 5, 9, 21}, - {7, 0, 0, 5, 9, 12}, - {12, 7, 13, 5, 9, 21}, - {12, 9, 13, 5, 9, 21}, - {21, 0, 0, 5, 0, 17}, - {13, 0, 0, 5, 9, 11}, - {21, 0, 0, 5, 9, 12}, - {6, 0, 0, 5, 9, 12}, - {7, 0, 0, 5, 10, 12}, - {12, 0, 13, 5, 10, 21}, - {10, 0, 0, 5, 10, 21}, - {12, 7, 13, 5, 10, 21}, - {12, 9, 13, 5, 10, 21}, - {13, 0, 0, 5, 10, 11}, - {23, 0, 10, 5, 10, 10}, - {15, 0, 0, 5, 10, 12}, - {15, 0, 0, 5, 10, 10}, - {26, 0, 0, 5, 10, 12}, - {23, 0, 10, 5, 10, 9}, - {21, 0, 0, 5, 10, 12}, - {12, 230, 13, 5, 10, 21}, - {12, 0, 13, 5, 11, 21}, - {10, 0, 0, 5, 11, 21}, - {7, 0, 0, 5, 11, 12}, - {12, 7, 13, 5, 11, 21}, - {12, 9, 13, 5, 11, 21}, - {13, 0, 0, 5, 11, 11}, - {21, 0, 0, 5, 11, 12}, - {12, 0, 13, 5, 12, 21}, - {10, 0, 0, 5, 12, 21}, - {7, 0, 0, 5, 12, 12}, - {12, 7, 13, 5, 12, 21}, - {12, 9, 13, 5, 12, 21}, - {13, 0, 0, 5, 12, 11}, - {21, 0, 0, 5, 12, 12}, - {23, 0, 10, 5, 12, 9}, - {12, 0, 13, 5, 13, 21}, - {10, 0, 0, 5, 13, 21}, - {7, 0, 0, 5, 13, 12}, - {12, 7, 13, 5, 13, 21}, - {12, 9, 13, 5, 13, 21}, - {13, 0, 0, 5, 13, 11}, - {26, 0, 0, 5, 13, 12}, - {15, 0, 0, 5, 13, 12}, - {12, 0, 13, 5, 14, 21}, - {7, 0, 0, 5, 14, 12}, - {10, 0, 0, 5, 14, 21}, - {12, 9, 13, 5, 14, 21}, - {13, 0, 0, 5, 14, 11}, - {15, 0, 0, 5, 14, 12}, - {26, 0, 18, 5, 14, 12}, - {23, 0, 10, 5, 14, 9}, - {12, 0, 13, 5, 15, 21}, - {10, 0, 0, 5, 15, 21}, - {7, 0, 0, 5, 15, 12}, - {12, 9, 13, 5, 15, 21}, - {12, 84, 13, 5, 15, 21}, - {12, 91, 13, 5, 15, 21}, - {13, 0, 0, 5, 15, 11}, - {21, 0, 0, 5, 15, 18}, - {15, 0, 18, 5, 15, 12}, - {26, 0, 0, 5, 15, 12}, - {7, 0, 0, 5, 16, 12}, - {12, 0, 13, 5, 16, 21}, - {10, 0, 0, 5, 16, 21}, - {21, 0, 0, 5, 16, 18}, - {12, 7, 13, 5, 16, 21}, - {12, 0, 0, 5, 16, 21}, - {12, 9, 13, 5, 16, 21}, - {13, 0, 0, 5, 16, 11}, - {12, 0, 13, 5, 17, 21}, - {10, 0, 0, 5, 17, 21}, - {7, 0, 0, 5, 17, 12}, - {12, 9, 13, 5, 17, 21}, - {26, 0, 0, 5, 17, 12}, - {15, 0, 0, 5, 17, 12}, - {13, 0, 0, 5, 17, 11}, - {26, 0, 0, 5, 17, 10}, - {10, 0, 0, 5, 18, 21}, - {7, 0, 0, 5, 18, 12}, - {12, 9, 13, 5, 18, 21}, - {12, 0, 13, 5, 18, 21}, - {13, 0, 0, 5, 18, 11}, - {21, 0, 0, 5, 18, 12}, - {7, 0, 0, 5, 19, 36}, - {12, 0, 13, 5, 19, 36}, - {12, 103, 13, 5, 19, 36}, - {12, 9, 13, 5, 19, 36}, - {23, 0, 10, 5, 0, 9}, - {6, 0, 0, 5, 19, 36}, - {12, 107, 13, 5, 19, 36}, - {21, 0, 0, 5, 19, 12}, - {13, 0, 0, 5, 19, 11}, - {21, 0, 0, 5, 19, 17}, - {7, 0, 0, 5, 20, 36}, - {12, 0, 13, 5, 20, 36}, - {12, 118, 13, 5, 20, 36}, - {12, 9, 13, 5, 20, 36}, - {6, 0, 0, 5, 20, 36}, - {12, 122, 13, 5, 20, 36}, - {13, 0, 0, 5, 20, 11}, - {7, 0, 0, 5, 21, 12}, - {26, 0, 0, 5, 21, 18}, - {21, 0, 0, 5, 21, 18}, - {21, 0, 0, 5, 21, 12}, - {21, 0, 0, 5, 21, 4}, - {21, 0, 0, 5, 21, 17}, - {21, 0, 0, 5, 21, 6}, - {26, 0, 0, 5, 21, 12}, - {12, 220, 13, 5, 21, 21}, - {13, 0, 0, 5, 21, 11}, - {15, 0, 0, 5, 21, 12}, - {26, 0, 0, 5, 21, 17}, - {12, 216, 13, 5, 21, 21}, - {22, 0, 18, 5, 21, 0}, - {18, 0, 18, 5, 21, 1}, - {10, 0, 0, 5, 21, 21}, - {12, 129, 13, 5, 21, 21}, - {12, 130, 13, 5, 21, 21}, - {12, 0, 13, 5, 21, 21}, - {12, 132, 13, 5, 21, 21}, - {10, 0, 0, 5, 21, 17}, - {12, 230, 13, 5, 21, 21}, - {12, 9, 13, 5, 21, 21}, - {26, 0, 0, 5, 0, 12}, - {7, 0, 0, 5, 22, 36}, - {10, 0, 0, 5, 22, 36}, - {12, 0, 13, 5, 22, 36}, - {12, 7, 13, 5, 22, 36}, - {12, 9, 13, 5, 22, 36}, - {13, 0, 0, 5, 22, 11}, - {21, 0, 0, 5, 22, 17}, - {21, 0, 0, 5, 22, 12}, - {12, 220, 13, 5, 22, 36}, - {26, 0, 0, 5, 22, 36}, - {9, 0, 0, 5, 23, 12}, - {5, 0, 0, 5, 23, 12}, - {21, 0, 0, 5, 0, 12}, - {6, 0, 0, 5, 23, 12}, - {7, 0, 0, 2, 24, 25}, - {7, 0, 0, 5, 24, 26}, - {7, 0, 0, 5, 24, 27}, - {7, 0, 0, 5, 25, 12}, - {12, 230, 13, 5, 25, 21}, - {21, 0, 0, 5, 25, 12}, - {21, 0, 0, 5, 25, 17}, - {15, 0, 0, 5, 25, 12}, - {26, 0, 18, 5, 25, 12}, - {9, 0, 0, 5, 26, 12}, - {5, 0, 0, 5, 26, 12}, - {17, 0, 18, 5, 27, 17}, - {7, 0, 0, 5, 27, 12}, - {26, 0, 0, 5, 27, 12}, - {21, 0, 0, 5, 27, 12}, - {29, 0, 17, 5, 28, 17}, - {7, 0, 0, 5, 28, 12}, - {22, 0, 18, 5, 28, 0}, - {18, 0, 18, 5, 28, 1}, - {7, 0, 0, 5, 29, 12}, - {14, 0, 0, 5, 29, 12}, - {7, 0, 0, 5, 41, 12}, - {12, 0, 13, 5, 41, 21}, - {12, 9, 13, 5, 41, 21}, - {7, 0, 0, 5, 42, 12}, - {12, 0, 13, 5, 42, 21}, - {12, 9, 13, 5, 42, 21}, - {7, 0, 0, 5, 43, 12}, - {12, 0, 13, 5, 43, 21}, - {7, 0, 0, 5, 44, 12}, - {12, 0, 13, 5, 44, 21}, - {7, 0, 0, 5, 30, 36}, - {12, 0, 13, 5, 30, 36}, - {10, 0, 0, 5, 30, 36}, - {12, 9, 13, 5, 30, 36}, - {21, 0, 0, 5, 30, 17}, - {21, 0, 0, 5, 30, 5}, - {6, 0, 0, 5, 30, 36}, - {21, 0, 0, 5, 30, 12}, - {23, 0, 10, 5, 30, 9}, - {12, 230, 13, 5, 30, 36}, - {13, 0, 0, 5, 30, 11}, - {15, 0, 18, 5, 30, 12}, - {21, 0, 18, 5, 31, 12}, - {21, 0, 18, 5, 0, 6}, - {21, 0, 18, 5, 31, 17}, - {21, 0, 18, 5, 0, 17}, - {17, 0, 18, 5, 31, 18}, - {21, 0, 18, 5, 31, 6}, - {12, 0, 13, 5, 31, 21}, - {1, 0, 14, 5, 31, 4}, - {13, 0, 0, 5, 31, 11}, - {7, 0, 0, 5, 31, 12}, - {6, 0, 0, 5, 31, 12}, - {12, 228, 13, 5, 31, 21}, - {7, 0, 0, 5, 45, 12}, - {12, 0, 13, 5, 45, 21}, - {10, 0, 0, 5, 45, 21}, - {12, 222, 13, 5, 45, 21}, - {12, 230, 13, 5, 45, 21}, - {12, 220, 13, 5, 45, 21}, - {26, 0, 18, 5, 45, 12}, - {21, 0, 18, 5, 45, 6}, - {13, 0, 0, 5, 45, 11}, - {7, 0, 0, 5, 46, 36}, - {7, 0, 0, 5, 55, 36}, - {13, 0, 0, 5, 55, 11}, - {15, 0, 0, 5, 55, 36}, - {26, 0, 18, 5, 55, 36}, - {26, 0, 18, 5, 30, 12}, - {7, 0, 0, 5, 53, 12}, - {12, 230, 13, 5, 53, 21}, - {12, 220, 13, 5, 53, 21}, - {10, 0, 0, 5, 53, 21}, - {12, 0, 13, 5, 53, 21}, - {21, 0, 0, 5, 53, 12}, - {7, 0, 0, 5, 77, 36}, - {10, 0, 0, 5, 77, 36}, - {12, 0, 13, 5, 77, 36}, - {12, 9, 13, 5, 77, 36}, - {12, 230, 13, 5, 77, 36}, - {12, 220, 13, 5, 77, 21}, - {13, 0, 0, 5, 77, 11}, - {21, 0, 0, 5, 77, 36}, - {6, 0, 0, 5, 77, 36}, - {11, 0, 13, 5, 40, 21}, - {12, 0, 13, 5, 61, 21}, - {10, 0, 0, 5, 61, 21}, - {7, 0, 0, 5, 61, 12}, - {12, 7, 13, 5, 61, 21}, - {10, 9, 0, 5, 61, 21}, - {13, 0, 0, 5, 61, 11}, - {21, 0, 0, 5, 61, 17}, - {21, 0, 0, 5, 61, 12}, - {26, 0, 0, 5, 61, 12}, - {12, 230, 13, 5, 61, 21}, - {12, 220, 13, 5, 61, 21}, - {12, 0, 13, 5, 66, 21}, - {10, 0, 0, 5, 66, 21}, - {7, 0, 0, 5, 66, 12}, - {10, 9, 0, 5, 66, 21}, - {12, 9, 13, 5, 66, 21}, - {13, 0, 0, 5, 66, 11}, - {7, 0, 0, 5, 92, 12}, - {12, 7, 13, 5, 92, 21}, - {10, 0, 0, 5, 92, 21}, - {12, 0, 13, 5, 92, 21}, - {10, 9, 0, 5, 92, 21}, - {21, 0, 0, 5, 92, 12}, - {7, 0, 0, 5, 67, 12}, - {10, 0, 0, 5, 67, 21}, - {12, 0, 13, 5, 67, 21}, - {12, 7, 13, 5, 67, 21}, - {21, 0, 0, 5, 67, 17}, - {13, 0, 0, 5, 67, 11}, - {13, 0, 0, 5, 68, 11}, - {7, 0, 0, 5, 68, 12}, - {6, 0, 0, 5, 68, 12}, - {21, 0, 0, 5, 68, 17}, - {21, 0, 0, 5, 66, 12}, - {12, 1, 13, 5, 40, 21}, - {10, 0, 0, 5, 0, 21}, - {7, 0, 0, 5, 0, 12}, - {6, 0, 0, 5, 3, 12}, - {12, 234, 13, 5, 40, 21}, - {12, 214, 13, 5, 40, 21}, - {12, 202, 13, 5, 40, 21}, - {12, 232, 13, 5, 40, 21}, - {12, 228, 13, 5, 40, 21}, - {12, 233, 13, 5, 40, 21}, - {8, 0, 0, 5, 2, 12}, - {24, 0, 18, 5, 2, 18}, - {29, 0, 17, 5, 0, 17}, - {29, 0, 17, 5, 0, 4}, - {1, 0, 14, 5, 0, 20}, - {1, 0, 14, 5, 40, 21}, - {1, 0, 14, 5, 40, 40}, - {1, 0, 0, 5, 0, 21}, - {1, 0, 3, 5, 0, 21}, - {17, 0, 18, 4, 0, 17}, - {17, 0, 18, 5, 0, 4}, - {17, 0, 18, 5, 0, 17}, - {17, 0, 18, 4, 0, 19}, - {17, 0, 18, 4, 0, 29}, - {20, 0, 18, 4, 0, 3}, - {19, 0, 18, 4, 0, 3}, - {22, 0, 18, 5, 0, 0}, - {21, 0, 18, 4, 0, 12}, - {21, 0, 18, 4, 0, 15}, - {21, 0, 18, 4, 0, 17}, - {27, 0, 17, 5, 0, 30}, - {28, 0, 15, 5, 0, 30}, - {1, 0, 1, 5, 0, 21}, - {1, 0, 5, 5, 0, 21}, - {1, 0, 7, 5, 0, 21}, - {1, 0, 2, 5, 0, 21}, - {1, 0, 6, 5, 0, 21}, - {21, 0, 10, 4, 0, 10}, - {21, 0, 10, 5, 0, 10}, - {21, 0, 18, 4, 0, 10}, - {21, 0, 18, 5, 0, 10}, - {21, 0, 18, 5, 0, 5}, - {16, 0, 18, 5, 0, 12}, - {25, 0, 12, 5, 0, 8}, - {18, 0, 18, 5, 0, 1}, - {25, 0, 18, 5, 0, 12}, - {1, 0, 14, 5, 0, 22}, - {1, 0, 14, 5, 0, 12}, - {1, 0, 19, 5, 0, 21}, - {1, 0, 20, 5, 0, 21}, - {1, 0, 21, 5, 0, 21}, - {1, 0, 22, 5, 0, 21}, - {1, 0, 14, 5, 0, 21}, - {15, 0, 8, 5, 0, 12}, - {25, 0, 9, 5, 0, 12}, - {6, 0, 0, 4, 1, 29}, - {23, 0, 10, 5, 0, 10}, - {23, 0, 10, 1, 0, 9}, - {2, 0, 18, 5, 102, 9}, - {9, 0, 0, 5, 0, 12}, - {26, 0, 18, 4, 0, 10}, - {26, 0, 18, 4, 0, 29}, - {5, 0, 0, 4, 0, 29}, - {26, 0, 18, 4, 0, 9}, - {9, 0, 0, 4, 1, 29}, - {26, 0, 10, 5, 0, 12}, - {15, 0, 18, 5, 0, 12}, - {15, 0, 18, 4, 0, 12}, - {15, 0, 18, 5, 0, 29}, - {14, 0, 0, 4, 1, 29}, - {14, 0, 0, 5, 1, 12}, - {25, 0, 9, 5, 0, 9}, - {25, 0, 10, 5, 0, 9}, - {25, 0, 18, 5, 0, 15}, - {26, 0, 18, 2, 0, 14}, - {22, 0, 18, 2, 0, 0}, - {18, 0, 18, 2, 0, 1}, - {26, 0, 18, 2, 0, 12}, - {26, 0, 18, 5, 0, 14}, - {26, 0, 0, 4, 0, 29}, - {26, 0, 18, 5, 0, 29}, - {25, 0, 18, 2, 0, 12}, - {26, 0, 18, 4, 0, 14}, - {26, 0, 18, 5, 0, 41}, - {26, 0, 18, 4, 0, 41}, - {26, 0, 18, 2, 0, 41}, - {26, 0, 18, 2, 0, 29}, - {26, 0, 18, 5, 0, 3}, - {26, 0, 18, 5, 0, 6}, - {26, 0, 0, 5, 52, 12}, - {9, 0, 0, 5, 56, 12}, - {5, 0, 0, 5, 56, 12}, - {26, 0, 18, 5, 54, 12}, - {12, 230, 13, 5, 54, 21}, - {21, 0, 18, 5, 54, 6}, - {21, 0, 18, 5, 54, 17}, - {15, 0, 18, 5, 54, 12}, - {7, 0, 0, 5, 57, 12}, - {6, 0, 0, 5, 57, 12}, - {21, 0, 0, 5, 57, 17}, - {12, 9, 13, 5, 57, 21}, - {21, 0, 18, 5, 0, 3}, - {21, 0, 18, 5, 0, 0}, - {17, 0, 18, 5, 0, 12}, - {17, 0, 18, 5, 0, 19}, - {26, 0, 18, 2, 35, 14}, - {29, 0, 17, 0, 0, 17}, - {21, 0, 18, 2, 0, 1}, - {21, 0, 18, 2, 0, 14}, - {6, 0, 0, 2, 35, 5}, - {7, 0, 0, 2, 0, 14}, - {14, 0, 0, 2, 35, 14}, - {17, 0, 18, 2, 0, 5}, - {12, 218, 13, 2, 40, 21}, - {12, 228, 13, 2, 40, 21}, - {12, 232, 13, 2, 40, 21}, - {12, 222, 13, 2, 40, 21}, - {10, 224, 0, 2, 24, 21}, - {17, 0, 18, 2, 0, 14}, - {6, 0, 0, 2, 0, 14}, - {6, 0, 0, 2, 0, 21}, - {7, 0, 0, 2, 0, 5}, - {7, 0, 0, 2, 32, 32}, - {7, 0, 0, 2, 32, 14}, - {12, 8, 13, 2, 40, 21}, - {24, 0, 18, 2, 0, 5}, - {6, 0, 0, 2, 32, 5}, - {7, 0, 0, 2, 33, 32}, - {7, 0, 0, 2, 33, 14}, - {21, 0, 18, 2, 0, 5}, - {6, 0, 0, 2, 0, 32}, - {6, 0, 0, 2, 33, 5}, - {7, 0, 0, 2, 34, 14}, - {7, 0, 0, 2, 24, 14}, - {26, 0, 0, 2, 0, 14}, - {15, 0, 0, 2, 0, 14}, - {26, 0, 0, 2, 24, 14}, - {26, 0, 18, 2, 24, 14}, - {15, 0, 0, 4, 0, 29}, - {15, 0, 18, 2, 0, 14}, - {26, 0, 0, 2, 33, 14}, - {7, 0, 0, 2, 35, 14}, - {2, 0, 18, 2, 102, 14}, - {7, 0, 0, 2, 36, 14}, - {6, 0, 0, 2, 36, 5}, - {26, 0, 18, 2, 36, 14}, - {7, 0, 0, 5, 82, 12}, - {6, 0, 0, 5, 82, 12}, - {21, 0, 0, 5, 82, 17}, - {7, 0, 0, 5, 69, 12}, - {6, 0, 0, 5, 69, 12}, - {21, 0, 18, 5, 69, 17}, - {21, 0, 18, 5, 69, 6}, - {13, 0, 0, 5, 69, 11}, - {7, 0, 0, 5, 3, 12}, - {21, 0, 18, 5, 3, 12}, - {6, 0, 18, 5, 3, 12}, - {7, 0, 0, 5, 83, 12}, - {14, 0, 0, 5, 83, 12}, - {12, 230, 13, 5, 83, 21}, - {21, 0, 0, 5, 83, 12}, - {21, 0, 0, 5, 83, 17}, - {24, 0, 0, 5, 0, 12}, - {7, 0, 0, 5, 58, 12}, - {12, 0, 13, 5, 58, 21}, - {12, 9, 13, 5, 58, 21}, - {10, 0, 0, 5, 58, 21}, - {26, 0, 18, 5, 58, 12}, - {15, 0, 0, 5, 0, 12}, - {7, 0, 0, 5, 64, 12}, - {21, 0, 18, 5, 64, 18}, - {21, 0, 18, 5, 64, 6}, - {10, 0, 0, 5, 70, 21}, - {7, 0, 0, 5, 70, 12}, - {12, 9, 13, 5, 70, 21}, - {12, 0, 13, 5, 70, 21}, - {21, 0, 0, 5, 70, 17}, - {13, 0, 0, 5, 70, 11}, - {12, 230, 13, 5, 9, 21}, - {21, 0, 0, 5, 9, 18}, - {13, 0, 0, 5, 71, 11}, - {7, 0, 0, 5, 71, 12}, - {12, 0, 13, 5, 71, 21}, - {12, 220, 13, 5, 71, 21}, - {21, 0, 0, 5, 71, 17}, - {7, 0, 0, 5, 72, 12}, - {12, 0, 13, 5, 72, 21}, - {10, 0, 0, 5, 72, 21}, - {10, 9, 0, 5, 72, 21}, - {21, 0, 0, 5, 72, 12}, - {12, 0, 13, 5, 84, 21}, - {10, 0, 0, 5, 84, 21}, - {7, 0, 0, 5, 84, 12}, - {12, 7, 13, 5, 84, 21}, - {10, 9, 0, 5, 84, 21}, - {21, 0, 0, 5, 84, 12}, - {21, 0, 0, 5, 84, 17}, - {13, 0, 0, 5, 84, 11}, - {6, 0, 0, 5, 22, 36}, - {7, 0, 0, 5, 76, 12}, - {12, 0, 13, 5, 76, 21}, - {10, 0, 0, 5, 76, 21}, - {13, 0, 0, 5, 76, 11}, - {21, 0, 0, 5, 76, 12}, - {21, 0, 0, 5, 76, 17}, - {7, 0, 0, 5, 78, 36}, - {12, 230, 13, 5, 78, 36}, - {12, 220, 13, 5, 78, 36}, - {6, 0, 0, 5, 78, 36}, - {21, 0, 0, 5, 78, 36}, - {7, 0, 0, 5, 85, 12}, - {10, 0, 0, 5, 85, 21}, - {12, 0, 13, 5, 85, 21}, - {21, 0, 0, 5, 85, 17}, - {6, 0, 0, 5, 85, 12}, - {12, 9, 13, 5, 85, 21}, - {13, 0, 0, 5, 85, 11}, - {7, 0, 0, 2, 24, 23}, - {7, 0, 0, 2, 24, 24}, - {4, 0, 0, 5, 102, 37}, - {3, 0, 0, 4, 102, 39}, - {12, 26, 13, 5, 5, 21}, - {25, 0, 9, 5, 5, 12}, - {24, 0, 4, 5, 6, 12}, - {12, 0, 13, 4, 40, 21}, - {21, 0, 18, 2, 0, 8}, - {21, 0, 18, 2, 0, 6}, - {21, 0, 18, 2, 0, 15}, - {16, 0, 18, 2, 0, 14}, - {21, 0, 12, 2, 0, 1}, - {21, 0, 12, 2, 0, 5}, - {21, 0, 10, 2, 0, 14}, - {25, 0, 9, 2, 0, 14}, - {17, 0, 9, 2, 0, 14}, - {25, 0, 18, 2, 0, 14}, - {23, 0, 10, 2, 0, 9}, - {21, 0, 10, 2, 0, 10}, - {21, 0, 18, 0, 0, 6}, - {21, 0, 18, 0, 0, 14}, - {21, 0, 10, 0, 0, 14}, - {23, 0, 10, 0, 0, 9}, - {21, 0, 10, 0, 0, 10}, - {22, 0, 18, 0, 0, 0}, - {18, 0, 18, 0, 0, 1}, - {25, 0, 9, 0, 0, 14}, - {21, 0, 12, 0, 0, 1}, - {17, 0, 9, 0, 0, 14}, - {21, 0, 12, 0, 0, 14}, - {13, 0, 8, 0, 0, 14}, - {21, 0, 12, 0, 0, 5}, - {21, 0, 18, 0, 0, 5}, - {25, 0, 18, 0, 0, 14}, - {9, 0, 0, 0, 1, 14}, - {24, 0, 18, 0, 0, 14}, - {16, 0, 18, 0, 0, 14}, - {5, 0, 0, 0, 1, 14}, - {21, 0, 18, 1, 0, 1}, - {22, 0, 18, 1, 0, 0}, - {18, 0, 18, 1, 0, 1}, - {21, 0, 18, 1, 0, 5}, - {7, 0, 0, 1, 33, 14}, - {7, 0, 0, 1, 33, 32}, - {6, 0, 0, 1, 0, 32}, - {6, 0, 0, 1, 0, 5}, - {7, 0, 0, 1, 24, 14}, - {23, 0, 10, 0, 0, 10}, - {26, 0, 18, 0, 0, 14}, - {26, 0, 18, 1, 0, 12}, - {25, 0, 18, 1, 0, 12}, - {1, 0, 18, 5, 0, 21}, - {26, 0, 18, 5, 0, 31}, - {7, 0, 0, 5, 47, 12}, - {14, 0, 18, 5, 2, 12}, - {15, 0, 18, 5, 2, 12}, - {26, 0, 18, 5, 2, 12}, - {26, 0, 0, 5, 2, 12}, - {7, 0, 0, 5, 73, 12}, - {7, 0, 0, 5, 74, 12}, - {7, 0, 0, 5, 37, 12}, - {15, 0, 0, 5, 37, 12}, - {7, 0, 0, 5, 38, 12}, - {14, 0, 0, 5, 38, 12}, - {7, 0, 0, 5, 118, 12}, - {12, 230, 13, 5, 118, 21}, - {7, 0, 0, 5, 48, 12}, - {21, 0, 0, 5, 48, 17}, - {7, 0, 0, 5, 59, 12}, - {21, 0, 0, 5, 59, 17}, - {14, 0, 0, 5, 59, 12}, - {9, 0, 0, 5, 39, 12}, - {5, 0, 0, 5, 39, 12}, - {7, 0, 0, 5, 49, 12}, - {7, 0, 0, 5, 50, 12}, - {13, 0, 0, 5, 50, 11}, - {9, 0, 0, 5, 136, 12}, - {5, 0, 0, 5, 136, 12}, - {7, 0, 0, 5, 106, 12}, - {7, 0, 0, 5, 104, 12}, - {21, 0, 0, 5, 104, 12}, - {7, 0, 0, 5, 110, 12}, - {7, 0, 3, 5, 51, 12}, - {7, 0, 3, 5, 86, 12}, - {21, 0, 3, 5, 86, 17}, - {15, 0, 3, 5, 86, 12}, - {7, 0, 3, 5, 120, 12}, - {26, 0, 3, 5, 120, 12}, - {15, 0, 3, 5, 120, 12}, - {7, 0, 3, 5, 116, 12}, - {15, 0, 3, 5, 116, 12}, - {7, 0, 3, 5, 128, 12}, - {15, 0, 3, 5, 128, 12}, - {7, 0, 3, 5, 63, 12}, - {15, 0, 3, 5, 63, 12}, - {21, 0, 18, 5, 63, 17}, - {7, 0, 3, 5, 75, 12}, - {21, 0, 3, 5, 75, 12}, - {7, 0, 3, 5, 97, 12}, - {7, 0, 3, 5, 96, 12}, - {15, 0, 3, 5, 96, 12}, - {7, 0, 3, 5, 60, 12}, - {12, 0, 13, 5, 60, 21}, - {12, 220, 13, 5, 60, 21}, - {12, 230, 13, 5, 60, 21}, - {12, 1, 13, 5, 60, 21}, - {12, 9, 13, 5, 60, 21}, - {15, 0, 3, 5, 60, 12}, - {21, 0, 3, 5, 60, 17}, - {21, 0, 3, 5, 60, 12}, - {7, 0, 3, 5, 87, 12}, - {15, 0, 3, 5, 87, 12}, - {21, 0, 3, 5, 87, 12}, - {7, 0, 3, 5, 117, 12}, - {15, 0, 3, 5, 117, 12}, - {7, 0, 3, 5, 112, 12}, - {26, 0, 3, 5, 112, 12}, - {12, 230, 13, 5, 112, 21}, - {12, 220, 13, 5, 112, 21}, - {15, 0, 3, 5, 112, 12}, - {21, 0, 3, 5, 112, 17}, - {21, 0, 3, 5, 112, 15}, - {7, 0, 3, 5, 79, 12}, - {21, 0, 18, 5, 79, 17}, - {7, 0, 3, 5, 88, 12}, - {15, 0, 3, 5, 88, 12}, - {7, 0, 3, 5, 89, 12}, - {15, 0, 3, 5, 89, 12}, - {7, 0, 3, 5, 122, 12}, - {21, 0, 3, 5, 122, 12}, - {15, 0, 3, 5, 122, 12}, - {7, 0, 3, 5, 90, 12}, - {9, 0, 3, 5, 130, 12}, - {5, 0, 3, 5, 130, 12}, - {15, 0, 3, 5, 130, 12}, - {7, 0, 4, 5, 144, 12}, - {12, 230, 13, 5, 144, 21}, - {13, 0, 11, 5, 144, 11}, - {15, 0, 11, 5, 6, 12}, - {7, 0, 3, 5, 147, 12}, - {15, 0, 3, 5, 147, 12}, - {7, 0, 4, 5, 148, 12}, - {12, 220, 13, 5, 148, 21}, - {12, 230, 13, 5, 148, 21}, - {15, 0, 4, 5, 148, 12}, - {21, 0, 4, 5, 148, 12}, - {7, 0, 3, 5, 149, 12}, - {10, 0, 0, 5, 93, 21}, - {12, 0, 13, 5, 93, 21}, - {7, 0, 0, 5, 93, 12}, - {12, 9, 13, 5, 93, 21}, - {21, 0, 0, 5, 93, 17}, - {21, 0, 0, 5, 93, 12}, - {15, 0, 18, 5, 93, 12}, - {13, 0, 0, 5, 93, 11}, - {12, 0, 13, 5, 91, 21}, - {10, 0, 0, 5, 91, 21}, - {7, 0, 0, 5, 91, 12}, - {12, 9, 13, 5, 91, 21}, - {12, 7, 13, 5, 91, 21}, - {21, 0, 0, 5, 91, 12}, - {1, 0, 0, 5, 91, 12}, - {21, 0, 0, 5, 91, 17}, - {7, 0, 0, 5, 100, 12}, - {13, 0, 0, 5, 100, 11}, - {12, 230, 13, 5, 95, 21}, - {7, 0, 0, 5, 95, 12}, - {12, 0, 13, 5, 95, 21}, - {10, 0, 0, 5, 95, 21}, - {12, 9, 13, 5, 95, 21}, - {13, 0, 0, 5, 95, 11}, - {21, 0, 0, 5, 95, 17}, - {7, 0, 0, 5, 111, 12}, - {12, 7, 13, 5, 111, 21}, - {21, 0, 0, 5, 111, 12}, - {21, 0, 0, 5, 111, 18}, - {12, 0, 13, 5, 99, 21}, - {10, 0, 0, 5, 99, 21}, - {7, 0, 0, 5, 99, 12}, - {10, 9, 0, 5, 99, 21}, - {21, 0, 0, 5, 99, 17}, - {21, 0, 0, 5, 99, 12}, - {12, 7, 13, 5, 99, 21}, - {13, 0, 0, 5, 99, 11}, - {21, 0, 0, 5, 99, 18}, - {15, 0, 0, 5, 18, 12}, - {7, 0, 0, 5, 108, 12}, - {10, 0, 0, 5, 108, 21}, - {12, 0, 13, 5, 108, 21}, - {10, 9, 0, 5, 108, 21}, - {12, 7, 13, 5, 108, 21}, - {21, 0, 0, 5, 108, 17}, - {21, 0, 0, 5, 108, 12}, - {7, 0, 0, 5, 129, 12}, - {21, 0, 0, 5, 129, 17}, - {7, 0, 0, 5, 109, 12}, - {12, 0, 13, 5, 109, 21}, - {10, 0, 0, 5, 109, 21}, - {12, 7, 13, 5, 109, 21}, - {12, 9, 13, 5, 109, 21}, - {13, 0, 0, 5, 109, 11}, - {12, 0, 13, 5, 107, 21}, - {10, 0, 0, 5, 107, 21}, - {7, 0, 0, 5, 107, 12}, - {12, 7, 13, 5, 40, 21}, - {12, 7, 13, 5, 107, 21}, - {10, 9, 0, 5, 107, 21}, - {12, 230, 13, 5, 107, 21}, - {7, 0, 0, 5, 135, 12}, - {10, 0, 0, 5, 135, 21}, - {12, 0, 13, 5, 135, 21}, - {12, 9, 13, 5, 135, 21}, - {12, 7, 13, 5, 135, 21}, - {21, 0, 0, 5, 135, 17}, - {21, 0, 0, 5, 135, 12}, - {13, 0, 0, 5, 135, 11}, - {12, 230, 13, 5, 135, 21}, - {7, 0, 0, 5, 124, 12}, - {10, 0, 0, 5, 124, 21}, - {12, 0, 13, 5, 124, 21}, - {12, 9, 13, 5, 124, 21}, - {12, 7, 13, 5, 124, 21}, - {21, 0, 0, 5, 124, 12}, - {13, 0, 0, 5, 124, 11}, - {7, 0, 0, 5, 123, 12}, - {10, 0, 0, 5, 123, 21}, - {12, 0, 13, 5, 123, 21}, - {12, 9, 13, 5, 123, 21}, - {12, 7, 13, 5, 123, 21}, - {21, 0, 0, 5, 123, 18}, - {21, 0, 0, 5, 123, 17}, - {21, 0, 0, 5, 123, 6}, - {21, 0, 0, 5, 123, 12}, - {7, 0, 0, 5, 114, 12}, - {10, 0, 0, 5, 114, 21}, - {12, 0, 13, 5, 114, 21}, - {12, 9, 13, 5, 114, 21}, - {21, 0, 0, 5, 114, 17}, - {21, 0, 0, 5, 114, 12}, - {13, 0, 0, 5, 114, 11}, - {21, 0, 18, 5, 31, 18}, - {7, 0, 0, 5, 101, 12}, - {12, 0, 13, 5, 101, 21}, - {10, 0, 0, 5, 101, 21}, - {10, 9, 0, 5, 101, 21}, - {12, 7, 13, 5, 101, 21}, - {13, 0, 0, 5, 101, 11}, - {7, 0, 0, 5, 126, 36}, - {12, 0, 13, 5, 126, 36}, - {10, 0, 0, 5, 126, 36}, - {12, 9, 13, 5, 126, 36}, - {13, 0, 0, 5, 126, 11}, - {15, 0, 0, 5, 126, 36}, - {21, 0, 0, 5, 126, 17}, - {26, 0, 0, 5, 126, 36}, - {7, 0, 0, 5, 142, 12}, - {10, 0, 0, 5, 142, 21}, - {12, 0, 13, 5, 142, 21}, - {12, 9, 13, 5, 142, 21}, - {12, 7, 13, 5, 142, 21}, - {21, 0, 0, 5, 142, 12}, - {9, 0, 0, 5, 125, 12}, - {5, 0, 0, 5, 125, 12}, - {13, 0, 0, 5, 125, 11}, - {15, 0, 0, 5, 125, 12}, - {7, 0, 0, 5, 125, 12}, - {7, 0, 0, 5, 150, 12}, - {10, 0, 0, 5, 150, 21}, - {12, 0, 13, 5, 150, 21}, - {12, 9, 13, 5, 150, 21}, - {21, 0, 0, 5, 150, 18}, - {7, 0, 0, 5, 141, 12}, - {12, 0, 13, 5, 141, 21}, - {12, 0, 0, 5, 141, 21}, - {12, 9, 13, 5, 141, 21}, - {10, 0, 0, 5, 141, 21}, - {21, 0, 0, 5, 141, 18}, - {21, 0, 0, 5, 141, 12}, - {21, 0, 0, 5, 141, 17}, - {7, 0, 0, 5, 140, 12}, - {12, 0, 13, 5, 140, 21}, - {10, 0, 0, 5, 140, 21}, - {12, 9, 13, 5, 140, 21}, - {21, 0, 0, 5, 140, 17}, - {21, 0, 0, 5, 140, 18}, - {7, 0, 0, 5, 121, 12}, - {7, 0, 0, 5, 133, 12}, - {10, 0, 0, 5, 133, 21}, - {12, 0, 13, 5, 133, 21}, - {12, 9, 0, 5, 133, 21}, - {21, 0, 0, 5, 133, 17}, - {13, 0, 0, 5, 133, 11}, - {15, 0, 0, 5, 133, 12}, - {21, 0, 0, 5, 134, 18}, - {21, 0, 0, 5, 134, 6}, - {7, 0, 0, 5, 134, 12}, - {12, 0, 13, 5, 134, 21}, - {10, 0, 0, 5, 134, 21}, - {7, 0, 0, 5, 138, 12}, - {12, 0, 13, 5, 138, 21}, - {12, 7, 13, 5, 138, 21}, - {12, 9, 13, 5, 138, 21}, - {13, 0, 0, 5, 138, 11}, - {7, 0, 0, 5, 143, 12}, - {10, 0, 0, 5, 143, 21}, - {12, 0, 13, 5, 143, 21}, - {12, 9, 13, 5, 143, 21}, - {13, 0, 0, 5, 143, 11}, - {7, 0, 0, 5, 145, 12}, - {12, 0, 13, 5, 145, 21}, - {10, 0, 0, 5, 145, 21}, - {21, 0, 0, 5, 145, 12}, - {23, 0, 10, 5, 14, 10}, - {21, 0, 0, 5, 14, 17}, - {7, 0, 0, 5, 62, 12}, - {14, 0, 0, 5, 62, 12}, - {21, 0, 0, 5, 62, 17}, - {7, 0, 0, 5, 80, 12}, - {7, 0, 0, 5, 80, 0}, - {7, 0, 0, 5, 80, 1}, - {1, 0, 0, 5, 80, 4}, - {1, 0, 0, 5, 80, 0}, - {1, 0, 0, 5, 80, 1}, - {7, 0, 0, 5, 127, 12}, - {7, 0, 0, 5, 127, 0}, - {7, 0, 0, 5, 127, 1}, - {7, 0, 0, 5, 115, 12}, - {13, 0, 0, 5, 115, 11}, - {21, 0, 0, 5, 115, 17}, - {7, 0, 0, 5, 103, 12}, - {12, 1, 13, 5, 103, 21}, - {21, 0, 0, 5, 103, 17}, - {7, 0, 0, 5, 119, 12}, - {12, 230, 13, 5, 119, 21}, - {21, 0, 0, 5, 119, 17}, - {21, 0, 0, 5, 119, 12}, - {26, 0, 0, 5, 119, 12}, - {6, 0, 0, 5, 119, 12}, - {13, 0, 0, 5, 119, 11}, - {15, 0, 0, 5, 119, 12}, - {9, 0, 0, 5, 146, 12}, - {5, 0, 0, 5, 146, 12}, - {15, 0, 0, 5, 146, 12}, - {21, 0, 0, 5, 146, 17}, - {21, 0, 0, 5, 146, 12}, - {7, 0, 0, 5, 98, 12}, - {12, 0, 13, 5, 98, 21}, - {10, 0, 0, 5, 98, 21}, - {6, 0, 0, 5, 98, 12}, - {6, 0, 0, 2, 137, 5}, - {6, 0, 0, 2, 139, 5}, - {6, 0, 0, 2, 0, 5}, - {7, 0, 0, 2, 137, 14}, - {7, 0, 0, 2, 139, 14}, - {7, 0, 0, 5, 105, 12}, - {26, 0, 0, 5, 105, 12}, - {12, 0, 13, 5, 105, 21}, - {12, 1, 13, 5, 105, 21}, - {21, 0, 0, 5, 105, 17}, - {10, 216, 0, 5, 0, 21}, - {10, 226, 0, 5, 0, 21}, - {12, 230, 13, 5, 2, 21}, - {25, 0, 0, 5, 0, 12}, - {13, 0, 8, 5, 0, 11}, - {26, 0, 0, 5, 131, 12}, - {12, 0, 13, 5, 131, 21}, - {21, 0, 0, 5, 131, 17}, - {21, 0, 0, 5, 131, 12}, - {12, 230, 13, 5, 56, 21}, - {7, 0, 0, 5, 151, 12}, - {12, 230, 13, 5, 151, 21}, - {6, 0, 0, 5, 151, 12}, - {13, 0, 0, 5, 151, 11}, - {26, 0, 0, 5, 151, 12}, - {7, 0, 0, 5, 152, 12}, - {12, 230, 13, 5, 152, 21}, - {13, 0, 0, 5, 152, 11}, - {23, 0, 10, 5, 152, 9}, - {7, 0, 3, 5, 113, 12}, - {15, 0, 3, 5, 113, 12}, - {12, 220, 13, 5, 113, 21}, - {9, 0, 3, 5, 132, 12}, - {5, 0, 3, 5, 132, 12}, - {12, 230, 13, 5, 132, 21}, - {12, 7, 13, 5, 132, 21}, - {6, 0, 3, 5, 132, 12}, - {13, 0, 3, 5, 132, 11}, - {21, 0, 3, 5, 132, 0}, - {15, 0, 4, 5, 0, 12}, - {26, 0, 4, 5, 0, 10}, - {23, 0, 4, 5, 0, 10}, - {26, 0, 4, 5, 0, 12}, - {2, 0, 18, 5, 102, 14}, - {26, 0, 0, 2, 0, 29}, - {26, 0, 0, 5, 0, 28}, - {26, 0, 0, 2, 32, 14}, - {24, 0, 18, 2, 0, 42}, - {26, 0, 18, 5, 0, 5}, -}; - -#define BIDI_MIRROR_LEN 420 -static const MirrorPair mirror_pairs[] = { - {40, 41}, - {41, 40}, - {60, 62}, - {62, 60}, - {91, 93}, - {93, 91}, - {123, 125}, - {125, 123}, - {171, 187}, - {187, 171}, - {3898, 3899}, - {3899, 3898}, - {3900, 3901}, - {3901, 3900}, - {5787, 5788}, - {5788, 5787}, - {8249, 8250}, - {8250, 8249}, - {8261, 8262}, - {8262, 8261}, - {8317, 8318}, - {8318, 8317}, - {8333, 8334}, - {8334, 8333}, - {8712, 8715}, - {8713, 8716}, - {8714, 8717}, - {8715, 8712}, - {8716, 8713}, - {8717, 8714}, - {8725, 10741}, - {8735, 11262}, - {8736, 10659}, - {8737, 10651}, - {8738, 10656}, - {8740, 10990}, - {8764, 8765}, - {8765, 8764}, - {8771, 8909}, - {8773, 8780}, - {8780, 8773}, - {8786, 8787}, - {8787, 8786}, - {8788, 8789}, - {8789, 8788}, - {8804, 8805}, - {8805, 8804}, - {8806, 8807}, - {8807, 8806}, - {8808, 8809}, - {8809, 8808}, - {8810, 8811}, - {8811, 8810}, - {8814, 8815}, - {8815, 8814}, - {8816, 8817}, - {8817, 8816}, - {8818, 8819}, - {8819, 8818}, - {8820, 8821}, - {8821, 8820}, - {8822, 8823}, - {8823, 8822}, - {8824, 8825}, - {8825, 8824}, - {8826, 8827}, - {8827, 8826}, - {8828, 8829}, - {8829, 8828}, - {8830, 8831}, - {8831, 8830}, - {8832, 8833}, - {8833, 8832}, - {8834, 8835}, - {8835, 8834}, - {8836, 8837}, - {8837, 8836}, - {8838, 8839}, - {8839, 8838}, - {8840, 8841}, - {8841, 8840}, - {8842, 8843}, - {8843, 8842}, - {8847, 8848}, - {8848, 8847}, - {8849, 8850}, - {8850, 8849}, - {8856, 10680}, - {8866, 8867}, - {8867, 8866}, - {8870, 10974}, - {8872, 10980}, - {8873, 10979}, - {8875, 10981}, - {8880, 8881}, - {8881, 8880}, - {8882, 8883}, - {8883, 8882}, - {8884, 8885}, - {8885, 8884}, - {8886, 8887}, - {8887, 8886}, - {8888, 10204}, - {8905, 8906}, - {8906, 8905}, - {8907, 8908}, - {8908, 8907}, - {8909, 8771}, - {8912, 8913}, - {8913, 8912}, - {8918, 8919}, - {8919, 8918}, - {8920, 8921}, - {8921, 8920}, - {8922, 8923}, - {8923, 8922}, - {8924, 8925}, - {8925, 8924}, - {8926, 8927}, - {8927, 8926}, - {8928, 8929}, - {8929, 8928}, - {8930, 8931}, - {8931, 8930}, - {8932, 8933}, - {8933, 8932}, - {8934, 8935}, - {8935, 8934}, - {8936, 8937}, - {8937, 8936}, - {8938, 8939}, - {8939, 8938}, - {8940, 8941}, - {8941, 8940}, - {8944, 8945}, - {8945, 8944}, - {8946, 8954}, - {8947, 8955}, - {8948, 8956}, - {8950, 8957}, - {8951, 8958}, - {8954, 8946}, - {8955, 8947}, - {8956, 8948}, - {8957, 8950}, - {8958, 8951}, - {8968, 8969}, - {8969, 8968}, - {8970, 8971}, - {8971, 8970}, - {9001, 9002}, - {9002, 9001}, - {10088, 10089}, - {10089, 10088}, - {10090, 10091}, - {10091, 10090}, - {10092, 10093}, - {10093, 10092}, - {10094, 10095}, - {10095, 10094}, - {10096, 10097}, - {10097, 10096}, - {10098, 10099}, - {10099, 10098}, - {10100, 10101}, - {10101, 10100}, - {10179, 10180}, - {10180, 10179}, - {10181, 10182}, - {10182, 10181}, - {10184, 10185}, - {10185, 10184}, - {10187, 10189}, - {10189, 10187}, - {10197, 10198}, - {10198, 10197}, - {10204, 8888}, - {10205, 10206}, - {10206, 10205}, - {10210, 10211}, - {10211, 10210}, - {10212, 10213}, - {10213, 10212}, - {10214, 10215}, - {10215, 10214}, - {10216, 10217}, - {10217, 10216}, - {10218, 10219}, - {10219, 10218}, - {10220, 10221}, - {10221, 10220}, - {10222, 10223}, - {10223, 10222}, - {10627, 10628}, - {10628, 10627}, - {10629, 10630}, - {10630, 10629}, - {10631, 10632}, - {10632, 10631}, - {10633, 10634}, - {10634, 10633}, - {10635, 10636}, - {10636, 10635}, - {10637, 10640}, - {10638, 10639}, - {10639, 10638}, - {10640, 10637}, - {10641, 10642}, - {10642, 10641}, - {10643, 10644}, - {10644, 10643}, - {10645, 10646}, - {10646, 10645}, - {10647, 10648}, - {10648, 10647}, - {10651, 8737}, - {10656, 8738}, - {10659, 8736}, - {10660, 10661}, - {10661, 10660}, - {10664, 10665}, - {10665, 10664}, - {10666, 10667}, - {10667, 10666}, - {10668, 10669}, - {10669, 10668}, - {10670, 10671}, - {10671, 10670}, - {10680, 8856}, - {10688, 10689}, - {10689, 10688}, - {10692, 10693}, - {10693, 10692}, - {10703, 10704}, - {10704, 10703}, - {10705, 10706}, - {10706, 10705}, - {10708, 10709}, - {10709, 10708}, - {10712, 10713}, - {10713, 10712}, - {10714, 10715}, - {10715, 10714}, - {10728, 10729}, - {10729, 10728}, - {10741, 8725}, - {10744, 10745}, - {10745, 10744}, - {10748, 10749}, - {10749, 10748}, - {10795, 10796}, - {10796, 10795}, - {10797, 10798}, - {10798, 10797}, - {10804, 10805}, - {10805, 10804}, - {10812, 10813}, - {10813, 10812}, - {10852, 10853}, - {10853, 10852}, - {10873, 10874}, - {10874, 10873}, - {10875, 10876}, - {10876, 10875}, - {10877, 10878}, - {10878, 10877}, - {10879, 10880}, - {10880, 10879}, - {10881, 10882}, - {10882, 10881}, - {10883, 10884}, - {10884, 10883}, - {10885, 10886}, - {10886, 10885}, - {10887, 10888}, - {10888, 10887}, - {10889, 10890}, - {10890, 10889}, - {10891, 10892}, - {10892, 10891}, - {10893, 10894}, - {10894, 10893}, - {10895, 10896}, - {10896, 10895}, - {10897, 10898}, - {10898, 10897}, - {10899, 10900}, - {10900, 10899}, - {10901, 10902}, - {10902, 10901}, - {10903, 10904}, - {10904, 10903}, - {10905, 10906}, - {10906, 10905}, - {10907, 10908}, - {10908, 10907}, - {10909, 10910}, - {10910, 10909}, - {10911, 10912}, - {10912, 10911}, - {10913, 10914}, - {10914, 10913}, - {10918, 10919}, - {10919, 10918}, - {10920, 10921}, - {10921, 10920}, - {10922, 10923}, - {10923, 10922}, - {10924, 10925}, - {10925, 10924}, - {10927, 10928}, - {10928, 10927}, - {10929, 10930}, - {10930, 10929}, - {10931, 10932}, - {10932, 10931}, - {10933, 10934}, - {10934, 10933}, - {10935, 10936}, - {10936, 10935}, - {10937, 10938}, - {10938, 10937}, - {10939, 10940}, - {10940, 10939}, - {10941, 10942}, - {10942, 10941}, - {10943, 10944}, - {10944, 10943}, - {10945, 10946}, - {10946, 10945}, - {10947, 10948}, - {10948, 10947}, - {10949, 10950}, - {10950, 10949}, - {10951, 10952}, - {10952, 10951}, - {10953, 10954}, - {10954, 10953}, - {10955, 10956}, - {10956, 10955}, - {10957, 10958}, - {10958, 10957}, - {10959, 10960}, - {10960, 10959}, - {10961, 10962}, - {10962, 10961}, - {10963, 10964}, - {10964, 10963}, - {10965, 10966}, - {10966, 10965}, - {10974, 8870}, - {10979, 8873}, - {10980, 8872}, - {10981, 8875}, - {10988, 10989}, - {10989, 10988}, - {10990, 8740}, - {10999, 11000}, - {11000, 10999}, - {11001, 11002}, - {11002, 11001}, - {11262, 8735}, - {11778, 11779}, - {11779, 11778}, - {11780, 11781}, - {11781, 11780}, - {11785, 11786}, - {11786, 11785}, - {11788, 11789}, - {11789, 11788}, - {11804, 11805}, - {11805, 11804}, - {11808, 11809}, - {11809, 11808}, - {11810, 11811}, - {11811, 11810}, - {11812, 11813}, - {11813, 11812}, - {11814, 11815}, - {11815, 11814}, - {11816, 11817}, - {11817, 11816}, - {12296, 12297}, - {12297, 12296}, - {12298, 12299}, - {12299, 12298}, - {12300, 12301}, - {12301, 12300}, - {12302, 12303}, - {12303, 12302}, - {12304, 12305}, - {12305, 12304}, - {12308, 12309}, - {12309, 12308}, - {12310, 12311}, - {12311, 12310}, - {12312, 12313}, - {12313, 12312}, - {12314, 12315}, - {12315, 12314}, - {65113, 65114}, - {65114, 65113}, - {65115, 65116}, - {65116, 65115}, - {65117, 65118}, - {65118, 65117}, - {65124, 65125}, - {65125, 65124}, - {65288, 65289}, - {65289, 65288}, - {65308, 65310}, - {65310, 65308}, - {65339, 65341}, - {65341, 65339}, - {65371, 65373}, - {65373, 65371}, - {65375, 65376}, - {65376, 65375}, - {65378, 65379}, - {65379, 65378}, -}; - -#define BIDI_BRACKET_LEN 120 -static const BracketPair bracket_pairs[] = { - {40, 41, 0}, - {41, 40, 1}, - {91, 93, 0}, - {93, 91, 1}, - {123, 125, 0}, - {125, 123, 1}, - {3898, 3899, 0}, - {3899, 3898, 1}, - {3900, 3901, 0}, - {3901, 3900, 1}, - {5787, 5788, 0}, - {5788, 5787, 1}, - {8261, 8262, 0}, - {8262, 8261, 1}, - {8317, 8318, 0}, - {8318, 8317, 1}, - {8333, 8334, 0}, - {8334, 8333, 1}, - {8968, 8969, 0}, - {8969, 8968, 1}, - {8970, 8971, 0}, - {8971, 8970, 1}, - {9001, 9002, 0}, - {9002, 9001, 1}, - {10088, 10089, 0}, - {10089, 10088, 1}, - {10090, 10091, 0}, - {10091, 10090, 1}, - {10092, 10093, 0}, - {10093, 10092, 1}, - {10094, 10095, 0}, - {10095, 10094, 1}, - {10096, 10097, 0}, - {10097, 10096, 1}, - {10098, 10099, 0}, - {10099, 10098, 1}, - {10100, 10101, 0}, - {10101, 10100, 1}, - {10181, 10182, 0}, - {10182, 10181, 1}, - {10214, 10215, 0}, - {10215, 10214, 1}, - {10216, 10217, 0}, - {10217, 10216, 1}, - {10218, 10219, 0}, - {10219, 10218, 1}, - {10220, 10221, 0}, - {10221, 10220, 1}, - {10222, 10223, 0}, - {10223, 10222, 1}, - {10627, 10628, 0}, - {10628, 10627, 1}, - {10629, 10630, 0}, - {10630, 10629, 1}, - {10631, 10632, 0}, - {10632, 10631, 1}, - {10633, 10634, 0}, - {10634, 10633, 1}, - {10635, 10636, 0}, - {10636, 10635, 1}, - {10637, 10640, 0}, - {10638, 10639, 1}, - {10639, 10638, 0}, - {10640, 10637, 1}, - {10641, 10642, 0}, - {10642, 10641, 1}, - {10643, 10644, 0}, - {10644, 10643, 1}, - {10645, 10646, 0}, - {10646, 10645, 1}, - {10647, 10648, 0}, - {10648, 10647, 1}, - {10712, 10713, 0}, - {10713, 10712, 1}, - {10714, 10715, 0}, - {10715, 10714, 1}, - {10748, 10749, 0}, - {10749, 10748, 1}, - {11810, 11811, 0}, - {11811, 11810, 1}, - {11812, 11813, 0}, - {11813, 11812, 1}, - {11814, 11815, 0}, - {11815, 11814, 1}, - {11816, 11817, 0}, - {11817, 11816, 1}, - {12296, 12297, 0}, - {12297, 12296, 1}, - {12298, 12299, 0}, - {12299, 12298, 1}, - {12300, 12301, 0}, - {12301, 12300, 1}, - {12302, 12303, 0}, - {12303, 12302, 1}, - {12304, 12305, 0}, - {12305, 12304, 1}, - {12308, 12309, 0}, - {12309, 12308, 1}, - {12310, 12311, 0}, - {12311, 12310, 1}, - {12312, 12313, 0}, - {12313, 12312, 1}, - {12314, 12315, 0}, - {12315, 12314, 1}, - {65113, 65114, 0}, - {65114, 65113, 1}, - {65115, 65116, 0}, - {65116, 65115, 1}, - {65117, 65118, 0}, - {65118, 65117, 1}, - {65288, 65289, 0}, - {65289, 65288, 1}, - {65339, 65341, 0}, - {65341, 65339, 1}, - {65371, 65373, 0}, - {65373, 65371, 1}, - {65375, 65376, 0}, - {65376, 65375, 1}, - {65378, 65379, 0}, - {65379, 65378, 1}, -}; - -/* Reindexing of NFC first characters. */ -#define TOTAL_FIRST 376 -#define TOTAL_LAST 62 -static const Reindex nfc_first[] = { - { 60, 2, 0}, - { 65, 15, 3}, - { 82, 8, 19}, - { 97, 15, 28}, - { 114, 8, 44}, - { 168, 0, 53}, - { 194, 0, 54}, - { 196, 3, 55}, - { 202, 0, 59}, - { 207, 0, 60}, - { 212, 2, 61}, - { 216, 0, 64}, - { 220, 0, 65}, - { 226, 0, 66}, - { 228, 3, 67}, - { 234, 0, 71}, - { 239, 0, 72}, - { 244, 2, 73}, - { 248, 0, 76}, - { 252, 0, 77}, - { 258, 1, 78}, - { 274, 1, 80}, - { 332, 1, 82}, - { 346, 1, 84}, - { 352, 1, 86}, - { 360, 3, 88}, - { 383, 0, 92}, - { 416, 1, 93}, - { 431, 1, 95}, - { 439, 0, 97}, - { 490, 1, 98}, - { 550, 3, 100}, - { 558, 1, 104}, - { 658, 0, 106}, - { 913, 0, 107}, - { 917, 0, 108}, - { 919, 0, 109}, - { 921, 0, 110}, - { 927, 0, 111}, - { 929, 0, 112}, - { 933, 0, 113}, - { 937, 0, 114}, - { 940, 0, 115}, - { 942, 0, 116}, - { 945, 0, 117}, - { 949, 0, 118}, - { 951, 0, 119}, - { 953, 0, 120}, - { 959, 0, 121}, - { 961, 0, 122}, - { 965, 0, 123}, - { 969, 2, 124}, - { 974, 0, 127}, - { 978, 0, 128}, - { 1030, 0, 129}, - { 1040, 0, 130}, - { 1043, 0, 131}, - { 1045, 3, 132}, - { 1050, 0, 136}, - { 1054, 0, 137}, - { 1059, 0, 138}, - { 1063, 0, 139}, - { 1067, 0, 140}, - { 1069, 0, 141}, - { 1072, 0, 142}, - { 1075, 0, 143}, - { 1077, 3, 144}, - { 1082, 0, 148}, - { 1086, 0, 149}, - { 1091, 0, 150}, - { 1095, 0, 151}, - { 1099, 0, 152}, - { 1101, 0, 153}, - { 1110, 0, 154}, - { 1140, 1, 155}, - { 1240, 1, 157}, - { 1256, 1, 159}, - { 1575, 0, 161}, - { 1608, 0, 162}, - { 1610, 0, 163}, - { 1729, 0, 164}, - { 1746, 0, 165}, - { 1749, 0, 166}, - { 2344, 0, 167}, - { 2352, 0, 168}, - { 2355, 0, 169}, - { 2503, 0, 170}, - { 2887, 0, 171}, - { 2962, 0, 172}, - { 3014, 1, 173}, - { 3142, 0, 175}, - { 3263, 0, 176}, - { 3270, 0, 177}, - { 3274, 0, 178}, - { 3398, 1, 179}, - { 3545, 0, 181}, - { 3548, 0, 182}, - { 4133, 0, 183}, - { 6917, 0, 184}, - { 6919, 0, 185}, - { 6921, 0, 186}, - { 6923, 0, 187}, - { 6925, 0, 188}, - { 6929, 0, 189}, - { 6970, 0, 190}, - { 6972, 0, 191}, - { 6974, 1, 192}, - { 6978, 0, 194}, - { 7734, 1, 195}, - { 7770, 1, 197}, - { 7778, 1, 199}, - { 7840, 1, 201}, - { 7864, 1, 203}, - { 7884, 1, 205}, - { 7936, 17, 207}, - { 7960, 1, 225}, - { 7968, 17, 227}, - { 7992, 1, 245}, - { 8000, 1, 247}, - { 8008, 1, 249}, - { 8016, 1, 251}, - { 8025, 0, 253}, - { 8032, 16, 254}, - { 8052, 0, 271}, - { 8060, 0, 272}, - { 8118, 0, 273}, - { 8127, 0, 274}, - { 8134, 0, 275}, - { 8182, 0, 276}, - { 8190, 0, 277}, - { 8592, 0, 278}, - { 8594, 0, 279}, - { 8596, 0, 280}, - { 8656, 0, 281}, - { 8658, 0, 282}, - { 8660, 0, 283}, - { 8707, 0, 284}, - { 8712, 0, 285}, - { 8715, 0, 286}, - { 8739, 0, 287}, - { 8741, 0, 288}, - { 8764, 0, 289}, - { 8771, 0, 290}, - { 8773, 0, 291}, - { 8776, 0, 292}, - { 8781, 0, 293}, - { 8801, 0, 294}, - { 8804, 1, 295}, - { 8818, 1, 297}, - { 8822, 1, 299}, - { 8826, 3, 301}, - { 8834, 1, 305}, - { 8838, 1, 307}, - { 8849, 1, 309}, - { 8866, 0, 311}, - { 8872, 1, 312}, - { 8875, 0, 314}, - { 8882, 3, 315}, - { 12358, 0, 319}, - { 12363, 0, 320}, - { 12365, 0, 321}, - { 12367, 0, 322}, - { 12369, 0, 323}, - { 12371, 0, 324}, - { 12373, 0, 325}, - { 12375, 0, 326}, - { 12377, 0, 327}, - { 12379, 0, 328}, - { 12381, 0, 329}, - { 12383, 0, 330}, - { 12385, 0, 331}, - { 12388, 0, 332}, - { 12390, 0, 333}, - { 12392, 0, 334}, - { 12399, 0, 335}, - { 12402, 0, 336}, - { 12405, 0, 337}, - { 12408, 0, 338}, - { 12411, 0, 339}, - { 12445, 0, 340}, - { 12454, 0, 341}, - { 12459, 0, 342}, - { 12461, 0, 343}, - { 12463, 0, 344}, - { 12465, 0, 345}, - { 12467, 0, 346}, - { 12469, 0, 347}, - { 12471, 0, 348}, - { 12473, 0, 349}, - { 12475, 0, 350}, - { 12477, 0, 351}, - { 12479, 0, 352}, - { 12481, 0, 353}, - { 12484, 0, 354}, - { 12486, 0, 355}, - { 12488, 0, 356}, - { 12495, 0, 357}, - { 12498, 0, 358}, - { 12501, 0, 359}, - { 12504, 0, 360}, - { 12507, 0, 361}, - { 12527, 3, 362}, - { 12541, 0, 366}, - { 69785, 0, 367}, - { 69787, 0, 368}, - { 69797, 0, 369}, - { 69937, 1, 370}, - { 70471, 0, 372}, - { 70841, 0, 373}, - { 71096, 1, 374}, - {0,0,0} -}; - -static const Reindex nfc_last[] = { - { 768, 4, 0}, - { 774, 6, 5}, - { 783, 0, 12}, - { 785, 0, 13}, - { 787, 1, 14}, - { 795, 0, 16}, - { 803, 5, 17}, - { 813, 1, 23}, - { 816, 1, 25}, - { 824, 0, 27}, - { 834, 0, 28}, - { 837, 0, 29}, - { 1619, 2, 30}, - { 2364, 0, 33}, - { 2494, 0, 34}, - { 2519, 0, 35}, - { 2878, 0, 36}, - { 2902, 1, 37}, - { 3006, 0, 39}, - { 3031, 0, 40}, - { 3158, 0, 41}, - { 3266, 0, 42}, - { 3285, 1, 43}, - { 3390, 0, 45}, - { 3415, 0, 46}, - { 3530, 0, 47}, - { 3535, 0, 48}, - { 3551, 0, 49}, - { 4142, 0, 50}, - { 6965, 0, 51}, - { 12441, 1, 52}, - { 69818, 0, 54}, - { 69927, 0, 55}, - { 70462, 0, 56}, - { 70487, 0, 57}, - { 70832, 0, 58}, - { 70842, 0, 59}, - { 70845, 0, 60}, - { 71087, 0, 61}, - {0,0,0} -}; - -#define UCDN_EAST_ASIAN_F 0 -#define UCDN_EAST_ASIAN_H 1 -#define UCDN_EAST_ASIAN_W 2 -#define UCDN_EAST_ASIAN_NA 3 -#define UCDN_EAST_ASIAN_A 4 -#define UCDN_EAST_ASIAN_N 5 - -#define UCDN_SCRIPT_COMMON 0 -#define UCDN_SCRIPT_LATIN 1 -#define UCDN_SCRIPT_GREEK 2 -#define UCDN_SCRIPT_CYRILLIC 3 -#define UCDN_SCRIPT_ARMENIAN 4 -#define UCDN_SCRIPT_HEBREW 5 -#define UCDN_SCRIPT_ARABIC 6 -#define UCDN_SCRIPT_SYRIAC 7 -#define UCDN_SCRIPT_THAANA 8 -#define UCDN_SCRIPT_DEVANAGARI 9 -#define UCDN_SCRIPT_BENGALI 10 -#define UCDN_SCRIPT_GURMUKHI 11 -#define UCDN_SCRIPT_GUJARATI 12 -#define UCDN_SCRIPT_ORIYA 13 -#define UCDN_SCRIPT_TAMIL 14 -#define UCDN_SCRIPT_TELUGU 15 -#define UCDN_SCRIPT_KANNADA 16 -#define UCDN_SCRIPT_MALAYALAM 17 -#define UCDN_SCRIPT_SINHALA 18 -#define UCDN_SCRIPT_THAI 19 -#define UCDN_SCRIPT_LAO 20 -#define UCDN_SCRIPT_TIBETAN 21 -#define UCDN_SCRIPT_MYANMAR 22 -#define UCDN_SCRIPT_GEORGIAN 23 -#define UCDN_SCRIPT_HANGUL 24 -#define UCDN_SCRIPT_ETHIOPIC 25 -#define UCDN_SCRIPT_CHEROKEE 26 -#define UCDN_SCRIPT_CANADIAN_ABORIGINAL 27 -#define UCDN_SCRIPT_OGHAM 28 -#define UCDN_SCRIPT_RUNIC 29 -#define UCDN_SCRIPT_KHMER 30 -#define UCDN_SCRIPT_MONGOLIAN 31 -#define UCDN_SCRIPT_HIRAGANA 32 -#define UCDN_SCRIPT_KATAKANA 33 -#define UCDN_SCRIPT_BOPOMOFO 34 -#define UCDN_SCRIPT_HAN 35 -#define UCDN_SCRIPT_YI 36 -#define UCDN_SCRIPT_OLD_ITALIC 37 -#define UCDN_SCRIPT_GOTHIC 38 -#define UCDN_SCRIPT_DESERET 39 -#define UCDN_SCRIPT_INHERITED 40 -#define UCDN_SCRIPT_TAGALOG 41 -#define UCDN_SCRIPT_HANUNOO 42 -#define UCDN_SCRIPT_BUHID 43 -#define UCDN_SCRIPT_TAGBANWA 44 -#define UCDN_SCRIPT_LIMBU 45 -#define UCDN_SCRIPT_TAI_LE 46 -#define UCDN_SCRIPT_LINEAR_B 47 -#define UCDN_SCRIPT_UGARITIC 48 -#define UCDN_SCRIPT_SHAVIAN 49 -#define UCDN_SCRIPT_OSMANYA 50 -#define UCDN_SCRIPT_CYPRIOT 51 -#define UCDN_SCRIPT_BRAILLE 52 -#define UCDN_SCRIPT_BUGINESE 53 -#define UCDN_SCRIPT_COPTIC 54 -#define UCDN_SCRIPT_NEW_TAI_LUE 55 -#define UCDN_SCRIPT_GLAGOLITIC 56 -#define UCDN_SCRIPT_TIFINAGH 57 -#define UCDN_SCRIPT_SYLOTI_NAGRI 58 -#define UCDN_SCRIPT_OLD_PERSIAN 59 -#define UCDN_SCRIPT_KHAROSHTHI 60 -#define UCDN_SCRIPT_BALINESE 61 -#define UCDN_SCRIPT_CUNEIFORM 62 -#define UCDN_SCRIPT_PHOENICIAN 63 -#define UCDN_SCRIPT_PHAGS_PA 64 -#define UCDN_SCRIPT_NKO 65 -#define UCDN_SCRIPT_SUNDANESE 66 -#define UCDN_SCRIPT_LEPCHA 67 -#define UCDN_SCRIPT_OL_CHIKI 68 -#define UCDN_SCRIPT_VAI 69 -#define UCDN_SCRIPT_SAURASHTRA 70 -#define UCDN_SCRIPT_KAYAH_LI 71 -#define UCDN_SCRIPT_REJANG 72 -#define UCDN_SCRIPT_LYCIAN 73 -#define UCDN_SCRIPT_CARIAN 74 -#define UCDN_SCRIPT_LYDIAN 75 -#define UCDN_SCRIPT_CHAM 76 -#define UCDN_SCRIPT_TAI_THAM 77 -#define UCDN_SCRIPT_TAI_VIET 78 -#define UCDN_SCRIPT_AVESTAN 79 -#define UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS 80 -#define UCDN_SCRIPT_SAMARITAN 81 -#define UCDN_SCRIPT_LISU 82 -#define UCDN_SCRIPT_BAMUM 83 -#define UCDN_SCRIPT_JAVANESE 84 -#define UCDN_SCRIPT_MEETEI_MAYEK 85 -#define UCDN_SCRIPT_IMPERIAL_ARAMAIC 86 -#define UCDN_SCRIPT_OLD_SOUTH_ARABIAN 87 -#define UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN 88 -#define UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI 89 -#define UCDN_SCRIPT_OLD_TURKIC 90 -#define UCDN_SCRIPT_KAITHI 91 -#define UCDN_SCRIPT_BATAK 92 -#define UCDN_SCRIPT_BRAHMI 93 -#define UCDN_SCRIPT_MANDAIC 94 -#define UCDN_SCRIPT_CHAKMA 95 -#define UCDN_SCRIPT_MEROITIC_CURSIVE 96 -#define UCDN_SCRIPT_MEROITIC_HIEROGLYPHS 97 -#define UCDN_SCRIPT_MIAO 98 -#define UCDN_SCRIPT_SHARADA 99 -#define UCDN_SCRIPT_SORA_SOMPENG 100 -#define UCDN_SCRIPT_TAKRI 101 -#define UCDN_SCRIPT_UNKNOWN 102 -#define UCDN_SCRIPT_BASSA_VAH 103 -#define UCDN_SCRIPT_CAUCASIAN_ALBANIAN 104 -#define UCDN_SCRIPT_DUPLOYAN 105 -#define UCDN_SCRIPT_ELBASAN 106 -#define UCDN_SCRIPT_GRANTHA 107 -#define UCDN_SCRIPT_KHOJKI 108 -#define UCDN_SCRIPT_KHUDAWADI 109 -#define UCDN_SCRIPT_LINEAR_A 110 -#define UCDN_SCRIPT_MAHAJANI 111 -#define UCDN_SCRIPT_MANICHAEAN 112 -#define UCDN_SCRIPT_MENDE_KIKAKUI 113 -#define UCDN_SCRIPT_MODI 114 -#define UCDN_SCRIPT_MRO 115 -#define UCDN_SCRIPT_NABATAEAN 116 -#define UCDN_SCRIPT_OLD_NORTH_ARABIAN 117 -#define UCDN_SCRIPT_OLD_PERMIC 118 -#define UCDN_SCRIPT_PAHAWH_HMONG 119 -#define UCDN_SCRIPT_PALMYRENE 120 -#define UCDN_SCRIPT_PAU_CIN_HAU 121 -#define UCDN_SCRIPT_PSALTER_PAHLAVI 122 -#define UCDN_SCRIPT_SIDDHAM 123 -#define UCDN_SCRIPT_TIRHUTA 124 -#define UCDN_SCRIPT_WARANG_CITI 125 -#define UCDN_SCRIPT_AHOM 126 -#define UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS 127 -#define UCDN_SCRIPT_HATRAN 128 -#define UCDN_SCRIPT_MULTANI 129 -#define UCDN_SCRIPT_OLD_HUNGARIAN 130 -#define UCDN_SCRIPT_SIGNWRITING 131 -#define UCDN_SCRIPT_ADLAM 132 -#define UCDN_SCRIPT_BHAIKSUKI 133 -#define UCDN_SCRIPT_MARCHEN 134 -#define UCDN_SCRIPT_NEWA 135 -#define UCDN_SCRIPT_OSAGE 136 -#define UCDN_SCRIPT_TANGUT 137 -#define UCDN_SCRIPT_MASARAM_GONDI 138 -#define UCDN_SCRIPT_NUSHU 139 -#define UCDN_SCRIPT_SOYOMBO 140 -#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141 -#define UCDN_SCRIPT_DOGRA 142 -#define UCDN_SCRIPT_GUNJALA_GONDI 143 -#define UCDN_SCRIPT_HANIFI_ROHINGYA 144 -#define UCDN_SCRIPT_MAKASAR 145 -#define UCDN_SCRIPT_MEDEFAIDRIN 146 -#define UCDN_SCRIPT_OLD_SOGDIAN 147 -#define UCDN_SCRIPT_SOGDIAN 148 -#define UCDN_SCRIPT_ELYMAIC 149 -#define UCDN_SCRIPT_NANDINAGARI 150 -#define UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG 151 -#define UCDN_SCRIPT_WANCHO 152 - -#define UCDN_GENERAL_CATEGORY_CC 0 -#define UCDN_GENERAL_CATEGORY_CF 1 -#define UCDN_GENERAL_CATEGORY_CN 2 -#define UCDN_GENERAL_CATEGORY_CO 3 -#define UCDN_GENERAL_CATEGORY_CS 4 -#define UCDN_GENERAL_CATEGORY_LL 5 -#define UCDN_GENERAL_CATEGORY_LM 6 -#define UCDN_GENERAL_CATEGORY_LO 7 -#define UCDN_GENERAL_CATEGORY_LT 8 -#define UCDN_GENERAL_CATEGORY_LU 9 -#define UCDN_GENERAL_CATEGORY_MC 10 -#define UCDN_GENERAL_CATEGORY_ME 11 -#define UCDN_GENERAL_CATEGORY_MN 12 -#define UCDN_GENERAL_CATEGORY_ND 13 -#define UCDN_GENERAL_CATEGORY_NL 14 -#define UCDN_GENERAL_CATEGORY_NO 15 -#define UCDN_GENERAL_CATEGORY_PC 16 -#define UCDN_GENERAL_CATEGORY_PD 17 -#define UCDN_GENERAL_CATEGORY_PE 18 -#define UCDN_GENERAL_CATEGORY_PF 19 -#define UCDN_GENERAL_CATEGORY_PI 20 -#define UCDN_GENERAL_CATEGORY_PO 21 -#define UCDN_GENERAL_CATEGORY_PS 22 -#define UCDN_GENERAL_CATEGORY_SC 23 -#define UCDN_GENERAL_CATEGORY_SK 24 -#define UCDN_GENERAL_CATEGORY_SM 25 -#define UCDN_GENERAL_CATEGORY_SO 26 -#define UCDN_GENERAL_CATEGORY_ZL 27 -#define UCDN_GENERAL_CATEGORY_ZP 28 -#define UCDN_GENERAL_CATEGORY_ZS 29 - -#define UCDN_BIDI_CLASS_L 0 -#define UCDN_BIDI_CLASS_LRE 1 -#define UCDN_BIDI_CLASS_LRO 2 -#define UCDN_BIDI_CLASS_R 3 -#define UCDN_BIDI_CLASS_AL 4 -#define UCDN_BIDI_CLASS_RLE 5 -#define UCDN_BIDI_CLASS_RLO 6 -#define UCDN_BIDI_CLASS_PDF 7 -#define UCDN_BIDI_CLASS_EN 8 -#define UCDN_BIDI_CLASS_ES 9 -#define UCDN_BIDI_CLASS_ET 10 -#define UCDN_BIDI_CLASS_AN 11 -#define UCDN_BIDI_CLASS_CS 12 -#define UCDN_BIDI_CLASS_NSM 13 -#define UCDN_BIDI_CLASS_BN 14 -#define UCDN_BIDI_CLASS_B 15 -#define UCDN_BIDI_CLASS_S 16 -#define UCDN_BIDI_CLASS_WS 17 -#define UCDN_BIDI_CLASS_ON 18 -#define UCDN_BIDI_CLASS_LRI 19 -#define UCDN_BIDI_CLASS_RLI 20 -#define UCDN_BIDI_CLASS_FSI 21 -#define UCDN_BIDI_CLASS_PDI 22 - -/* index tables for the database records */ -#define SHIFT1 5 -#define SHIFT2 3 -static const unsigned char index0[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, - 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, - 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73, - 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 113, 113, 114, 115, 116, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 117, 117, 118, 119, 120, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 121, 122, 123, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 124, 124, 125, 126, 108, 108, 127, 128, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 130, 129, 129, 131, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 132, 133, 134, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 135, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 144, 145, 108, 108, 108, 108, 108, 146, 147, 148, 108, - 108, 108, 108, 108, 149, 150, 108, 108, 151, 152, 153, 108, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 165, 165, 166, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 167, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 168, 169, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 170, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 52, 52, - 173, 172, 172, 172, 172, 174, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 174, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 175, 176, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 177, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 177, -}; - -static const unsigned short index1[] = { - 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 0, 0, 0, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 31, 32, - 33, 34, 35, 27, 30, 29, 27, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 27, 27, 49, 27, 27, 27, 27, 27, 27, 27, 50, 51, 52, 27, 53, 54, - 53, 54, 54, 54, 54, 54, 55, 54, 54, 54, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 65, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 101, 101, 101, 101, 102, 103, - 101, 101, 101, 101, 101, 101, 104, 105, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 106, 107, 107, 107, 108, 109, 110, 110, - 110, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120, - 120, 121, 122, 119, 123, 124, 125, 126, 127, 127, 127, 127, 128, 129, - 130, 131, 132, 133, 134, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 144, - 145, 146, 147, 148, 127, 127, 127, 127, 127, 127, 149, 149, 149, 149, - 150, 151, 152, 119, 153, 154, 155, 155, 155, 156, 157, 158, 159, 159, - 160, 161, 162, 163, 164, 165, 166, 166, 166, 167, 144, 168, 119, 119, - 119, 119, 119, 119, 127, 127, 169, 170, 119, 119, 171, 125, 172, 173, - 174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177, - 182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 119, 214, 215, 216, 217, 217, 218, - 219, 220, 221, 222, 223, 119, 224, 225, 226, 227, 228, 229, 230, 231, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 119, 242, 243, - 244, 245, 246, 243, 247, 248, 249, 250, 251, 119, 252, 253, 254, 255, - 256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 272, 271, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 119, 282, 283, 284, 285, 285, 285, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 296, 296, 299, 300, - 297, 301, 302, 303, 304, 305, 306, 119, 307, 308, 308, 308, 308, 308, - 309, 310, 311, 312, 313, 314, 119, 119, 119, 119, 315, 316, 317, 317, - 318, 317, 319, 320, 321, 322, 323, 324, 119, 119, 119, 119, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 333, 333, 333, 335, 336, 337, - 338, 339, 340, 341, 340, 340, 340, 342, 343, 344, 345, 346, 119, 119, - 119, 119, 347, 347, 347, 347, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 347, 358, 359, 351, 360, 361, 361, 361, 361, 362, 363, - 364, 364, 364, 364, 364, 365, 366, 366, 366, 366, 366, 366, 366, 366, - 366, 366, 366, 366, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 369, 369, 369, - 369, 369, 369, 369, 369, 370, 371, 370, 369, 369, 369, 369, 369, 370, - 369, 369, 369, 369, 370, 371, 370, 369, 371, 369, 369, 369, 369, 369, - 369, 369, 370, 369, 369, 369, 369, 369, 369, 369, 369, 372, 373, 374, - 375, 376, 369, 369, 377, 378, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 379, 380, 381, 382, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 384, 383, 383, - 385, 386, 386, 387, 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, - 390, 391, 392, 393, 394, 119, 395, 395, 396, 119, 397, 397, 398, 119, - 399, 400, 401, 119, 402, 402, 402, 402, 402, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 417, 417, 417, - 418, 417, 417, 417, 417, 417, 417, 419, 420, 417, 417, 417, 417, 421, - 383, 383, 383, 383, 383, 383, 383, 383, 422, 119, 423, 423, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 119, 434, 434, - 434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439, - 440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 119, 119, 119, 119, - 119, 119, 119, 119, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473, - 474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 361, 361, - 361, 361, 361, 491, 492, 119, 493, 494, 495, 496, 497, 498, 54, 54, 54, - 54, 499, 500, 56, 56, 56, 56, 56, 501, 502, 503, 54, 504, 54, 54, 54, - 505, 56, 56, 56, 506, 507, 508, 509, 510, 510, 510, 511, 512, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 513, 514, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 515, 516, 517, 518, 515, 516, - 515, 516, 517, 518, 515, 519, 515, 516, 515, 517, 515, 520, 515, 520, - 515, 520, 521, 522, 523, 524, 525, 526, 515, 527, 528, 529, 530, 531, - 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 56, 548, 549, 550, 551, 552, 553, 553, 554, 555, 556, 557, 558, - 119, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 571, 573, 574, 575, 576, 577, 578, 579, 580, 581, 580, 582, 583, - 580, 584, 580, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 586, - 595, 596, 586, 597, 598, 586, 586, 598, 586, 599, 600, 599, 586, 586, - 601, 586, 586, 586, 586, 586, 602, 586, 586, 580, 603, 604, 605, 606, - 607, 608, 609, 609, 609, 609, 609, 609, 609, 609, 610, 580, 580, 611, - 612, 586, 586, 613, 580, 580, 580, 580, 585, 606, 614, 615, 580, 580, - 580, 580, 580, 616, 119, 119, 119, 580, 617, 119, 119, 618, 618, 618, - 618, 618, 619, 619, 620, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 622, 618, 623, 624, 624, 624, 624, 624, 624, 624, 624, 624, 625, 624, - 624, 624, 624, 626, 580, 624, 624, 627, 580, 628, 629, 630, 631, 632, - 633, 629, 580, 627, 634, 580, 635, 636, 637, 638, 639, 580, 580, 580, - 640, 641, 642, 643, 580, 644, 645, 580, 646, 580, 580, 647, 648, 649, - 650, 580, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 580, - 580, 580, 662, 580, 663, 580, 664, 665, 666, 667, 668, 669, 618, 670, - 670, 671, 580, 580, 580, 662, 672, 673, 586, 586, 586, 674, 675, 586, - 586, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, - 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, - 676, 676, 676, 676, 676, 586, 586, 586, 586, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 586, 586, 677, 678, 678, 679, 586, 586, 586, - 586, 586, 586, 586, 680, 586, 586, 586, 681, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 580, - 580, 580, 682, 580, 580, 586, 586, 683, 684, 685, 629, 580, 580, 686, - 580, 580, 580, 687, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 688, 688, 688, 688, 688, 689, 690, 690, 690, 690, 690, - 691, 692, 693, 694, 695, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 696, 697, 698, 699, 364, 364, 364, 364, 700, 701, 702, 702, 702, 702, - 702, 702, 702, 703, 704, 705, 369, 369, 371, 119, 371, 371, 371, 371, - 371, 371, 371, 371, 706, 706, 706, 706, 707, 708, 709, 710, 711, 712, - 713, 714, 715, 716, 119, 119, 119, 119, 119, 119, 717, 717, 717, 718, - 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 719, 119, 717, 717, - 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, - 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 720, 119, 119, 119, - 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 733, - 734, 733, 733, 733, 735, 736, 737, 738, 739, 740, 741, 741, 742, 741, - 741, 741, 743, 744, 745, 746, 747, 748, 748, 748, 748, 748, 749, 750, - 750, 750, 750, 750, 750, 750, 750, 750, 750, 751, 752, 753, 748, 748, - 748, 754, 721, 721, 721, 721, 722, 119, 755, 755, 756, 756, 756, 757, - 758, 759, 753, 753, 753, 760, 761, 762, 756, 756, 756, 763, 758, 759, - 753, 753, 753, 753, 764, 762, 753, 765, 766, 766, 766, 766, 766, 767, - 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 753, 753, 753, - 768, 769, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 770, - 753, 753, 753, 768, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 772, 773, 580, 580, 580, 580, 580, 580, 580, 580, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 773, 773, 774, 774, 775, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 776, - 777, 777, 777, 777, 777, 777, 778, 119, 779, 779, 779, 779, 779, 780, - 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, - 781, 781, 781, 781, 781, 782, 781, 781, 783, 784, 119, 119, 101, 101, - 101, 101, 101, 785, 786, 787, 101, 101, 101, 788, 789, 789, 789, 789, - 789, 789, 789, 789, 790, 791, 792, 119, 64, 64, 793, 794, 795, 27, 796, - 27, 27, 27, 27, 27, 27, 27, 797, 798, 27, 799, 800, 27, 27, 801, 802, 27, - 803, 119, 119, 119, 119, 119, 804, 805, 806, 807, 808, 808, 809, 810, - 811, 812, 813, 813, 813, 813, 813, 813, 814, 119, 815, 816, 816, 816, - 816, 816, 817, 818, 819, 820, 821, 822, 823, 823, 824, 825, 826, 827, - 828, 828, 829, 830, 831, 831, 832, 833, 834, 835, 366, 366, 366, 836, - 837, 838, 838, 838, 838, 838, 839, 840, 841, 842, 843, 844, 845, 347, - 351, 846, 847, 847, 847, 847, 847, 848, 849, 119, 850, 851, 852, 853, - 347, 347, 854, 855, 856, 856, 856, 856, 856, 856, 857, 858, 859, 119, - 119, 860, 861, 862, 863, 119, 864, 864, 864, 119, 371, 371, 54, 54, 54, - 54, 54, 865, 866, 119, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, - 861, 861, 861, 861, 868, 869, 870, 871, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, - 873, 872, 873, 873, 874, 873, 873, 873, 873, 873, 873, 872, 873, 873, - 874, 873, 873, 873, 872, 873, 873, 874, 873, 873, 873, 872, 873, 873, - 875, 119, 367, 367, 876, 877, 368, 368, 368, 368, 368, 878, 879, 879, - 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, - 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, - 879, 879, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 772, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 881, 773, 773, 773, 773, 882, 119, 883, 884, - 120, 885, 886, 887, 888, 120, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 889, 890, 891, 119, 892, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 893, 119, 119, - 127, 127, 127, 127, 127, 127, 127, 127, 894, 127, 127, 127, 127, 127, - 127, 119, 119, 119, 119, 119, 127, 895, 896, 896, 897, 898, 899, 900, - 901, 902, 903, 904, 905, 906, 907, 908, 169, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 909, 910, 911, - 912, 913, 914, 915, 915, 916, 917, 918, 918, 919, 920, 921, 922, 923, - 923, 923, 923, 924, 925, 925, 925, 926, 927, 927, 927, 928, 929, 930, - 119, 931, 932, 933, 932, 932, 934, 932, 932, 935, 932, 936, 932, 936, - 119, 119, 119, 119, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, - 932, 932, 932, 932, 932, 937, 938, 939, 939, 939, 939, 939, 940, 609, - 941, 941, 941, 941, 941, 941, 942, 943, 944, 945, 580, 946, 947, 119, - 119, 119, 119, 119, 609, 609, 609, 609, 609, 948, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 949, 949, - 949, 950, 951, 951, 951, 951, 951, 951, 952, 119, 953, 954, 954, 955, - 956, 956, 956, 956, 957, 958, 959, 959, 960, 961, 962, 962, 962, 962, - 963, 964, 965, 965, 965, 966, 967, 967, 967, 967, 968, 967, 969, 119, - 119, 119, 119, 119, 970, 970, 970, 970, 970, 971, 971, 971, 971, 971, - 972, 972, 972, 972, 972, 972, 973, 973, 973, 974, 975, 976, 977, 977, - 977, 977, 978, 979, 979, 979, 979, 980, 981, 981, 981, 981, 981, 119, - 982, 982, 982, 982, 982, 982, 983, 984, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 986, 119, 985, 985, 987, 119, - 985, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 988, 989, 990, 990, 990, 990, 991, 992, - 993, 993, 994, 995, 996, 996, 997, 998, 999, 999, 999, 1000, 1001, 1002, - 119, 119, 119, 119, 119, 119, 1003, 1003, 1004, 1005, 1006, 1006, 1007, - 1008, 1009, 1009, 1009, 1010, 119, 119, 119, 119, 119, 119, 119, 119, - 1011, 1011, 1011, 1011, 1012, 1012, 1012, 1013, 1014, 1014, 1015, 1014, - 1014, 1014, 1014, 1014, 1016, 1017, 1018, 1019, 1020, 1020, 1021, 1022, - 1023, 1024, 1025, 1026, 1027, 1027, 1027, 1028, 1029, 1029, 1029, 1030, - 119, 119, 119, 119, 1031, 1032, 1031, 1031, 1033, 1034, 1035, 119, 1036, - 1036, 1036, 1036, 1036, 1036, 1037, 1038, 1039, 1039, 1040, 1041, 1042, - 1042, 1043, 1044, 1045, 1045, 1046, 1047, 119, 1048, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 1049, 1049, 1049, 1049, 1049, 1049, 1049, - 1049, 1049, 1050, 119, 119, 119, 119, 119, 119, 1051, 1051, 1051, 1051, - 1051, 1051, 1052, 119, 1053, 1053, 1053, 1053, 1053, 1053, 1054, 1055, - 1056, 1056, 1056, 1056, 1057, 119, 1058, 1059, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 1060, 1060, 1060, 1061, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 1062, 1062, 1062, 1063, - 1064, 119, 1065, 1065, 1066, 1067, 1068, 1069, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1070, 1070, 1071, - 119, 1072, 1073, 1073, 1073, 1073, 1073, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 119, 1081, 1082, 1083, 1083, 1083, 1083, 1083, 1084, - 1085, 1086, 1087, 1088, 1088, 1088, 1089, 1090, 1091, 1092, 1093, 1093, - 1093, 1094, 1095, 1096, 1097, 1098, 119, 1099, 1099, 1099, 1099, 1100, - 119, 1101, 1102, 1102, 1102, 1102, 1102, 1103, 1104, 1105, 1106, 1107, - 1108, 1109, 1110, 1111, 119, 1112, 1112, 1113, 1112, 1112, 1114, 1115, - 1116, 119, 119, 119, 119, 119, 119, 119, 119, 1117, 1118, 1119, 1120, - 1119, 1121, 1122, 1122, 1122, 1122, 1122, 1123, 1124, 1125, 1126, 1127, - 1128, 1129, 1130, 1131, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1139, 1140, 1140, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 1141, 1141, 1141, 1141, 1141, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 119, 119, 119, 119, 1148, 1148, 1148, 1148, - 1148, 1148, 1149, 1150, 1151, 119, 1152, 1153, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 1154, 1154, 1154, 1154, 1154, 1155, 1156, 1157, 1158, 1159, 1160, - 1161, 119, 119, 119, 119, 1162, 1162, 1162, 1162, 1162, 1162, 1163, 1164, - 1165, 119, 1166, 1167, 1168, 1169, 119, 119, 1170, 1170, 1170, 1170, - 1170, 1171, 1172, 1173, 1174, 1175, 119, 119, 119, 119, 119, 119, 1176, - 1176, 1176, 1177, 1178, 1179, 1180, 1181, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 1182, 1182, 1182, 1182, 1182, 1183, 1184, 1185, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1186, 1186, 1186, - 1186, 1187, 1187, 1187, 1187, 1188, 1189, 1190, 1191, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 1192, 1193, 1192, 1192, 1192, 1192, 1194, 1195, 1196, 119, 119, - 119, 1197, 1198, 1199, 1199, 1199, 1199, 1200, 1201, 1202, 119, 1203, - 1204, 1205, 1205, 1205, 1205, 1205, 1206, 1207, 1208, 1209, 119, 119, - 119, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1211, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 1212, 1213, 1212, 1212, 1212, 1214, 1215, 1216, 1217, 119, 1218, 1219, - 1220, 1221, 1222, 1223, 1223, 1223, 1224, 1225, 1225, 1226, 1227, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 1228, 1229, 1230, 1230, 1230, - 1230, 1231, 1232, 1233, 119, 1234, 1235, 1236, 1237, 1238, 1238, 1238, - 1239, 1240, 1241, 1242, 1243, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 1244, 1244, 1245, 1246, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 1247, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1254, - 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1255, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, - 1256, 1257, 1258, 119, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, - 1254, 1254, 1254, 1254, 1259, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1261, 1260, 1260, 1260, - 1260, 1262, 1263, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1264, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, - 1260, 1260, 1260, 1260, 1260, 1260, 1265, 1266, 1267, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1269, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1270, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, - 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, - 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 1271, - 1272, 1272, 1272, 1273, 1274, 1275, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 1276, 1276, 1276, 1277, 1278, 119, 1279, 1279, - 1279, 1279, 1279, 1279, 1280, 1281, 1282, 119, 1283, 1284, 1285, 1279, - 1279, 1286, 1279, 1279, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1287, 1287, - 1287, 1287, 1288, 1288, 1288, 1288, 1289, 1289, 1290, 1291, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1292, 1292, 1292, 1292, - 1292, 1292, 1292, 1292, 1292, 1293, 1294, 1295, 1295, 1295, 1295, 1295, - 1295, 1296, 1297, 1298, 119, 119, 119, 119, 119, 119, 119, 119, 1299, - 119, 119, 119, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 119, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, - 1300, 1301, 119, 1302, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, - 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, - 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 1303, 119, 119, 119, - 119, 119, 119, 1304, 119, 1305, 119, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1307, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1309, 1308, 1310, - 1308, 1311, 1308, 1312, 1313, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 1314, 119, 609, 609, 609, 609, 1315, 1316, 609, - 609, 609, 609, 609, 609, 1317, 1318, 1319, 1320, 1321, 1322, 609, 609, - 609, 1323, 609, 609, 609, 609, 609, 609, 609, 1324, 119, 119, 944, 944, - 944, 944, 944, 944, 944, 944, 1325, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 939, 939, - 1326, 119, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 616, 119, - 939, 939, 939, 1327, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 1328, 1328, 1328, 1329, 1330, 1330, 1331, - 1328, 1328, 1332, 1333, 1330, 1330, 1328, 1328, 1328, 1329, 1330, 1330, - 1334, 1335, 1336, 1332, 1337, 1338, 1330, 1328, 1328, 1328, 1329, 1330, - 1330, 1339, 1340, 1341, 1342, 1330, 1330, 1330, 1343, 1344, 1345, 1346, - 1330, 1330, 1331, 1328, 1328, 1332, 1330, 1330, 1330, 1328, 1328, 1328, - 1329, 1330, 1330, 1331, 1328, 1328, 1332, 1330, 1330, 1330, 1328, 1328, - 1328, 1329, 1330, 1330, 1331, 1328, 1328, 1332, 1330, 1330, 1330, 1328, - 1328, 1328, 1329, 1330, 1330, 1347, 1328, 1328, 1328, 1348, 1330, 1330, - 1349, 1350, 1328, 1328, 1351, 1330, 1330, 1352, 1331, 1328, 1328, 1353, - 1330, 1330, 1354, 1355, 1328, 1328, 1356, 1330, 1330, 1330, 1357, 1328, - 1328, 1328, 1348, 1330, 1330, 1349, 1358, 1359, 1359, 1359, 1359, 1359, - 1359, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1361, 1361, 1361, - 1361, 1361, 1361, 1362, 1363, 1361, 1361, 1361, 1361, 1361, 1364, 1365, - 1360, 1366, 1367, 119, 1368, 1369, 1361, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 1370, 1371, 1371, 1372, 1373, 1374, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 1375, 1375, 1375, 1375, - 1375, 1376, 1377, 1378, 1379, 1380, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1381, 1381, 1381, - 1381, 1381, 1382, 1383, 1384, 1385, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1386, 1387, 1388, 119, 119, 119, 119, 119, - 1389, 1389, 1389, 1389, 1390, 1391, 1391, 1391, 1392, 1393, 1394, 1395, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 1396, 1397, 1397, 1397, 1397, 1397, 1397, - 1398, 1399, 119, 119, 119, 119, 119, 119, 119, 119, 119, 1396, 1397, - 1397, 1397, 1397, 1400, 1397, 1401, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 1402, 127, 127, 127, 1403, 1404, 1405, 1406, 1407, 1408, - 1403, 1409, 1403, 1405, 1405, 1410, 127, 1411, 127, 1412, 1413, 1411, - 127, 1412, 119, 119, 119, 119, 119, 119, 1414, 119, 1415, 1416, 1416, - 1416, 1416, 1417, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, - 1416, 1416, 1416, 1417, 1418, 1416, 1419, 1420, 1416, 1420, 1421, 1420, - 1416, 1416, 1416, 1422, 1418, 619, 1423, 621, 621, 621, 1424, 621, 621, - 621, 621, 621, 621, 621, 1425, 621, 621, 621, 1426, 1427, 1428, 621, - 1429, 1418, 1418, 1418, 1418, 1418, 1418, 1430, 1431, 1431, 1431, 1432, - 1418, 753, 753, 753, 753, 753, 1433, 753, 1434, 1435, 1418, 1436, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 721, 721, 721, 721, 1437, 1438, 1439, - 721, 721, 721, 721, 721, 721, 721, 721, 1440, 1441, 721, 1442, 1443, 721, - 721, 1444, 1445, 1446, 1447, 1442, 1416, 721, 721, 1448, 1449, 721, 721, - 721, 721, 721, 721, 721, 1450, 1451, 1452, 1453, 721, 1454, 1452, 1452, - 1455, 1456, 1457, 1458, 721, 1459, 1460, 1461, 721, 721, 721, 721, 721, - 721, 721, 721, 1462, 1463, 721, 1464, 642, 1465, 721, 1466, 1467, 580, - 1468, 721, 721, 721, 1416, 1469, 1470, 1416, 1416, 1471, 1416, 1415, - 1416, 1416, 1416, 1416, 1416, 1472, 1473, 1416, 1416, 1472, 1474, 721, - 721, 721, 721, 721, 721, 721, 721, 1475, 1476, 580, 580, 580, 580, 1477, - 1478, 721, 721, 721, 721, 1479, 721, 1480, 721, 1481, 1482, 1483, 1418, - 1416, 1484, 1485, 1486, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 1487, 1418, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 1488, 1489, 721, 1490, 1418, 1418, 580, 1487, 580, 580, 580, - 580, 580, 580, 580, 1418, 580, 1491, 580, 580, 580, 580, 580, 1418, 580, - 580, 580, 1492, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 580, 1493, 721, 1452, 1494, 721, 1452, 1495, 721, 721, 721, 721, - 721, 721, 1496, 1497, 721, 721, 721, 721, 1498, 1499, 1500, 1501, 721, - 1502, 1503, 1504, 721, 721, 721, 721, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 1487, 1418, 1416, 1422, 1490, 1486, 1486, 1418, 1436, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1505, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 1506, 773, 773, 773, 773, 773, 771, 771, 771, 771, - 771, 771, 1507, 773, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 772, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 881, 773, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 1508, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 771, 771, 771, 772, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 1509, 1510, 119, 119, 119, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 119, 119, 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, 880, 1512, -}; - -static const unsigned short index2[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 24, 24, 10, 15, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 26, 17, - 27, 28, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 16, 30, 31, 24, 1, 1, 1, 1, 1, 1, 32, 1, 1, 33, 34, 35, 13, - 36, 13, 37, 38, 39, 40, 41, 42, 24, 43, 44, 27, 45, 46, 47, 47, 48, 49, - 38, 38, 39, 47, 41, 50, 51, 51, 51, 34, 52, 52, 52, 52, 52, 52, 53, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 54, 53, 52, - 52, 52, 52, 52, 53, 55, 55, 55, 56, 56, 56, 56, 55, 56, 55, 55, 55, 56, - 55, 55, 56, 56, 55, 56, 55, 55, 56, 56, 56, 54, 55, 55, 55, 56, 55, 56, - 55, 56, 52, 55, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, - 52, 55, 52, 55, 52, 56, 52, 56, 52, 56, 52, 55, 52, 56, 52, 56, 52, 56, - 52, 56, 52, 56, 53, 55, 52, 55, 53, 55, 52, 56, 52, 56, 55, 52, 56, 52, - 56, 52, 56, 53, 55, 53, 55, 52, 55, 52, 56, 52, 55, 55, 53, 55, 52, 55, - 52, 56, 52, 56, 53, 55, 52, 56, 52, 56, 52, 52, 56, 52, 56, 52, 56, 56, - 56, 52, 52, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 56, 52, 52, 52, 52, - 56, 52, 52, 56, 52, 52, 52, 56, 56, 56, 52, 52, 56, 52, 52, 56, 52, 56, - 52, 56, 52, 52, 56, 52, 56, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 52, - 56, 52, 52, 56, 56, 57, 52, 56, 56, 56, 57, 57, 57, 57, 52, 58, 56, 52, - 58, 56, 52, 58, 56, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52, - 55, 52, 55, 56, 52, 56, 56, 52, 58, 56, 52, 56, 52, 52, 52, 56, 52, 56, - 56, 56, 56, 56, 56, 56, 52, 52, 56, 52, 52, 56, 56, 52, 56, 52, 52, 52, - 52, 56, 56, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 57, 56, 56, 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, - 60, 61, 61, 61, 61, 61, 61, 61, 62, 62, 63, 62, 60, 64, 65, 64, 64, 64, - 65, 64, 60, 60, 66, 61, 62, 62, 62, 62, 62, 62, 39, 39, 39, 39, 62, 39, - 62, 48, 59, 59, 59, 59, 59, 62, 62, 62, 62, 62, 67, 67, 60, 62, 61, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 69, 70, 70, 70, 70, 69, 71, 70, 70, 70, 70, 70, 72, 72, 70, - 70, 70, 70, 72, 72, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 73, 73, - 73, 73, 73, 70, 70, 70, 70, 68, 68, 68, 68, 68, 68, 68, 68, 74, 68, 70, - 70, 70, 68, 68, 68, 70, 70, 75, 68, 68, 68, 70, 70, 70, 70, 68, 69, 70, - 70, 68, 76, 77, 77, 76, 77, 77, 76, 68, 68, 68, 68, 68, 78, 79, 78, 79, - 60, 80, 78, 79, 81, 81, 82, 79, 79, 79, 83, 78, 81, 81, 81, 81, 80, 62, - 78, 84, 78, 78, 78, 81, 78, 81, 78, 78, 79, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 81, 85, 85, 85, 85, 85, 85, 85, - 78, 78, 79, 79, 79, 79, 79, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 79, 86, 86, 86, 86, 86, 86, 86, 79, 79, 79, 79, - 79, 78, 79, 79, 78, 78, 78, 79, 79, 79, 78, 79, 78, 79, 78, 79, 78, 79, - 78, 79, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 79, 79, - 79, 79, 78, 79, 89, 78, 79, 78, 78, 79, 79, 78, 78, 78, 90, 91, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, - 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 93, 92, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93, - 94, 95, 95, 96, 96, 95, 97, 97, 90, 93, 90, 93, 90, 93, 90, 90, 93, 90, - 93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93, 93, 81, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 81, - 81, 99, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 102, 103, 81, 81, 104, 104, 105, 81, 106, 107, 107, 107, 107, - 106, 107, 107, 107, 108, 106, 107, 107, 107, 107, 107, 107, 106, 106, - 106, 106, 106, 106, 107, 107, 106, 107, 107, 108, 109, 107, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 125, 107, 106, 128, 118, 81, 81, 81, 81, 81, 81, 81, 81, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81, 81, 81, 81, - 129, 129, 129, 129, 125, 125, 81, 81, 81, 130, 130, 130, 130, 130, 131, - 132, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 139, 139, 139, - 139, 139, 139, 139, 140, 141, 142, 143, 144, 81, 145, 143, 146, 146, 146, - 146, 146, 146, 146, 146, 147, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 148, 149, 150, 151, 152, 153, 154, 155, 96, 96, 156, 157, 139, - 139, 139, 139, 139, 157, 139, 139, 157, 158, 158, 158, 158, 158, 158, - 158, 158, 158, 158, 134, 159, 159, 160, 146, 146, 161, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 145, 146, 139, 139, 139, 139, - 139, 139, 139, 131, 138, 139, 139, 139, 139, 157, 139, 162, 162, 139, - 139, 138, 157, 139, 139, 157, 146, 146, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 146, 146, 146, 164, 164, 146, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 81, 166, 167, 168, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 169, - 170, 169, 169, 170, 169, 169, 170, 170, 170, 169, 170, 170, 169, 170, - 169, 169, 169, 170, 169, 170, 169, 170, 169, 170, 169, 169, 81, 81, 167, - 167, 167, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 171, 81, - 81, 81, 81, 81, 81, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 176, 175, 177, 177, - 178, 179, 180, 181, 177, 81, 81, 176, 182, 182, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, 184, 185, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 184, 184, 184, 185, - 184, 184, 184, 184, 184, 81, 81, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 81, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 188, 188, 188, 81, 81, 189, 81, 167, 167, 167, 81, 81, 81, 81, - 81, 146, 146, 146, 146, 146, 81, 146, 146, 146, 146, 146, 146, 146, 146, - 81, 81, 81, 81, 81, 157, 139, 139, 139, 139, 139, 139, 131, 157, 139, - 139, 157, 139, 139, 157, 139, 139, 139, 157, 157, 157, 190, 191, 192, - 139, 139, 139, 157, 139, 139, 157, 157, 139, 139, 139, 139, 139, 193, - 193, 193, 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, - 193, 193, 193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 96, 156, 96, - 96, 193, 193, 193, 195, 195, 193, 193, 198, 198, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 200, 201, 195, 195, 195, 195, 195, 195, 202, - 203, 204, 204, 81, 202, 202, 202, 202, 202, 202, 202, 202, 81, 81, 202, - 202, 81, 81, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 81, 202, 202, 202, 202, 202, 202, 202, 81, 202, 81, 81, 81, - 202, 202, 202, 202, 81, 81, 205, 202, 204, 204, 204, 203, 203, 203, 203, - 81, 81, 204, 204, 81, 81, 204, 204, 206, 202, 81, 81, 81, 81, 81, 81, 81, - 81, 204, 81, 81, 81, 81, 202, 202, 81, 202, 202, 202, 203, 203, 81, 81, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 202, 202, 208, 208, - 209, 209, 209, 209, 209, 210, 211, 212, 202, 213, 214, 81, 81, 215, 215, - 216, 81, 217, 217, 217, 217, 217, 217, 81, 81, 81, 81, 217, 217, 81, 81, - 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 81, - 217, 217, 217, 217, 217, 217, 217, 81, 217, 217, 81, 217, 217, 81, 217, - 217, 81, 81, 218, 81, 216, 216, 216, 215, 215, 81, 81, 81, 81, 215, 215, - 81, 81, 215, 215, 219, 81, 81, 81, 215, 81, 81, 81, 81, 81, 81, 81, 217, - 217, 217, 217, 81, 217, 81, 81, 81, 81, 81, 81, 81, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 215, 215, 217, 217, 217, 215, 221, 81, 81, - 222, 222, 223, 81, 224, 224, 224, 224, 224, 224, 224, 224, 224, 81, 224, - 224, 224, 81, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 81, 224, 224, 224, 224, 224, 224, 224, 81, 224, 224, 81, 224, - 224, 224, 224, 224, 81, 81, 225, 224, 223, 223, 223, 222, 222, 222, 222, - 222, 81, 222, 222, 223, 81, 223, 223, 226, 81, 81, 224, 81, 81, 81, 81, - 81, 81, 81, 224, 224, 222, 222, 81, 81, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 228, 229, 81, 81, 81, 81, 81, 81, 81, 224, 222, 222, - 222, 222, 222, 222, 81, 230, 231, 231, 81, 232, 232, 232, 232, 232, 232, - 232, 232, 81, 81, 232, 232, 81, 81, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 81, 232, 232, 232, 232, 232, 232, 232, - 81, 232, 232, 81, 232, 232, 232, 232, 232, 81, 81, 233, 232, 231, 230, - 231, 230, 230, 230, 230, 81, 81, 231, 231, 81, 81, 231, 231, 234, 81, 81, - 81, 81, 81, 81, 81, 81, 230, 231, 81, 81, 81, 81, 232, 232, 81, 232, 232, - 232, 230, 230, 81, 81, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 236, 232, 237, 237, 237, 237, 237, 237, 81, 81, 238, 239, 81, 239, 239, - 239, 239, 239, 239, 81, 81, 81, 239, 239, 239, 81, 239, 239, 239, 239, - 81, 81, 81, 239, 239, 81, 239, 81, 239, 239, 81, 81, 81, 239, 239, 81, - 81, 81, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 81, 81, 81, 81, - 240, 240, 238, 240, 240, 81, 81, 81, 240, 240, 240, 81, 240, 240, 240, - 241, 81, 81, 239, 81, 81, 81, 81, 81, 81, 240, 81, 81, 81, 81, 81, 81, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 244, - 244, 244, 244, 244, 244, 245, 244, 81, 81, 81, 81, 81, 246, 247, 247, - 247, 246, 248, 248, 248, 248, 248, 248, 248, 248, 81, 248, 248, 248, 81, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 81, 81, 81, 248, 246, 246, 246, 247, 247, 247, 247, 81, 246, - 246, 246, 81, 246, 246, 246, 249, 81, 81, 81, 81, 81, 81, 81, 250, 251, - 81, 248, 248, 248, 81, 81, 81, 81, 81, 248, 248, 246, 246, 81, 81, 252, - 252, 252, 252, 252, 252, 252, 252, 252, 252, 81, 81, 81, 81, 81, 81, 81, - 253, 254, 254, 254, 254, 254, 254, 254, 255, 256, 257, 258, 258, 259, - 256, 256, 256, 256, 256, 256, 256, 256, 81, 256, 256, 256, 81, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, - 256, 256, 81, 256, 256, 256, 256, 256, 81, 81, 260, 256, 258, 261, 258, - 258, 258, 258, 258, 81, 261, 258, 258, 81, 258, 258, 257, 262, 81, 81, - 81, 81, 81, 81, 81, 258, 258, 81, 81, 81, 81, 81, 81, 81, 256, 81, 256, - 256, 257, 257, 81, 81, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 81, 256, 256, 81, 81, 81, 81, 81, 264, 264, 265, 265, 81, 266, 266, 266, - 266, 266, 266, 266, 266, 81, 266, 266, 266, 81, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 267, 267, - 266, 265, 265, 265, 264, 264, 264, 264, 81, 265, 265, 265, 81, 265, 265, - 265, 267, 266, 268, 81, 81, 81, 81, 266, 266, 266, 265, 269, 269, 269, - 269, 269, 269, 269, 266, 266, 266, 264, 264, 81, 81, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 271, 266, 266, 266, 266, 266, 266, 81, 81, 272, 272, 81, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 81, 81, 81, 273, 273, 273, 273, 273, 273, 273, 273, 81, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 81, 273, 81, 81, 81, 81, 274, 81, - 81, 81, 81, 272, 272, 272, 275, 275, 275, 81, 275, 81, 272, 272, 272, - 272, 272, 272, 272, 272, 81, 81, 81, 81, 81, 81, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 81, 81, 272, 272, 277, 81, 81, 81, 81, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 279, 278, 278, 279, 279, 279, 279, 280, 280, 281, 81, 81, 81, 81, 282, - 278, 278, 278, 278, 278, 278, 283, 279, 284, 284, 284, 284, 279, 279, - 279, 285, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 81, - 81, 81, 81, 81, 288, 288, 81, 288, 81, 288, 288, 288, 288, 288, 81, 288, - 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 81, 288, 81, 288, 288, 289, 288, 288, 289, 289, 289, 289, 290, 290, - 291, 289, 289, 288, 81, 81, 288, 288, 288, 288, 288, 81, 292, 81, 293, - 293, 293, 293, 289, 289, 81, 81, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 81, 81, 288, 288, 288, 288, 295, 296, 296, 296, 297, 298, 297, - 297, 299, 297, 297, 300, 299, 301, 301, 301, 301, 301, 299, 302, 301, - 302, 302, 302, 303, 303, 302, 302, 302, 302, 302, 302, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 306, 303, 302, 303, 302, 307, 308, 309, 308, 309, 310, - 310, 295, 295, 295, 295, 295, 295, 295, 295, 81, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 81, 81, 81, 81, 311, 312, 313, 314, - 313, 313, 313, 313, 313, 312, 312, 312, 312, 313, 315, 312, 313, 316, - 316, 317, 300, 316, 316, 295, 295, 295, 295, 295, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 81, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 81, 306, 306, 302, 302, 302, 302, 302, 302, 303, - 302, 302, 302, 302, 302, 302, 81, 302, 302, 297, 297, 300, 297, 298, 318, - 318, 318, 318, 299, 299, 81, 81, 81, 81, 81, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 320, 320, 321, 321, 321, 321, 320, 321, - 321, 321, 321, 321, 322, 320, 323, 323, 320, 320, 321, 321, 319, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 325, 325, 326, 326, 326, - 326, 319, 319, 319, 319, 319, 319, 320, 320, 321, 321, 319, 319, 319, - 319, 321, 321, 321, 319, 320, 320, 320, 319, 319, 320, 320, 320, 320, - 320, 320, 320, 319, 319, 319, 321, 321, 321, 321, 319, 319, 319, 319, - 319, 321, 320, 320, 321, 321, 320, 320, 320, 320, 320, 320, 327, 319, - 320, 324, 324, 320, 320, 320, 321, 328, 328, 329, 329, 329, 329, 329, - 329, 329, 329, 329, 329, 329, 329, 329, 329, 81, 329, 81, 81, 81, 81, 81, - 329, 81, 81, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 331, - 332, 330, 330, 330, 333, 333, 333, 333, 333, 333, 333, 333, 334, 334, - 334, 334, 334, 334, 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 81, 336, 336, 336, 336, 81, - 81, 336, 336, 336, 336, 336, 336, 336, 81, 336, 336, 336, 81, 81, 337, - 337, 337, 338, 339, 338, 338, 338, 338, 338, 338, 338, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 81, 81, 81, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 81, 81, 81, 81, 81, 81, 342, 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 81, 81, 343, 343, 343, 343, 343, 343, 81, 81, - 344, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 346, 347, 345, 348, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 350, 351, 81, 81, 81, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 198, 198, 198, 353, 353, 353, 352, 352, 352, 352, 352, 352, - 352, 352, 81, 81, 81, 81, 81, 81, 81, 354, 354, 354, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 354, 81, 354, 354, 354, 354, 355, 355, 356, 81, - 81, 81, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 358, 358, 359, - 198, 198, 81, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 361, 361, - 81, 81, 81, 81, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 81, 362, 362, 362, 81, 363, 363, 81, 81, 81, 81, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 366, 365, 365, - 365, 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 365, - 366, 366, 365, 365, 365, 365, 365, 365, 365, 365, 365, 367, 365, 368, - 368, 369, 370, 368, 371, 368, 372, 364, 373, 81, 81, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 374, 81, 81, 81, 81, 81, 81, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 81, 81, 81, 81, 81, 81, 376, 376, 377, 377, - 378, 379, 380, 376, 381, 381, 376, 382, 382, 382, 383, 81, 384, 384, 384, - 384, 384, 384, 384, 384, 384, 384, 81, 81, 81, 81, 81, 81, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 385, 385, 385, 385, 81, - 81, 81, 81, 81, 81, 81, 385, 385, 385, 385, 385, 382, 382, 385, 385, 387, - 385, 81, 81, 81, 81, 81, 345, 345, 345, 345, 345, 345, 81, 81, 388, 388, - 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 81, 389, - 389, 389, 390, 390, 390, 390, 389, 389, 390, 390, 390, 81, 81, 81, 81, - 390, 390, 389, 390, 390, 390, 390, 390, 390, 391, 392, 393, 81, 81, 81, - 81, 394, 81, 81, 81, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396, - 396, 396, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, - 397, 397, 81, 81, 397, 397, 397, 397, 397, 81, 81, 81, 398, 398, 398, - 398, 398, 398, 398, 398, 398, 398, 398, 398, 81, 81, 81, 81, 398, 398, - 81, 81, 81, 81, 81, 81, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, - 400, 81, 81, 81, 401, 401, 402, 402, 402, 402, 402, 402, 402, 402, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 404, 405, 406, 406, 407, 81, 81, 408, 408, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 410, 411, 410, 411, 411, 411, 411, - 411, 411, 411, 81, 412, 410, 411, 410, 410, 411, 411, 411, 411, 411, 411, - 411, 411, 410, 410, 410, 410, 410, 410, 411, 411, 413, 413, 413, 413, - 413, 413, 413, 413, 81, 81, 414, 415, 415, 415, 415, 415, 415, 415, 415, - 415, 415, 81, 81, 81, 81, 81, 81, 416, 416, 416, 416, 416, 416, 416, 417, - 416, 416, 416, 416, 416, 416, 81, 81, 96, 96, 96, 96, 96, 156, 156, 156, - 156, 156, 156, 96, 96, 156, 418, 81, 419, 419, 419, 419, 420, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 422, - 420, 419, 419, 419, 419, 419, 420, 419, 420, 420, 420, 420, 420, 419, - 420, 423, 421, 421, 421, 421, 421, 421, 421, 81, 81, 81, 81, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 425, 425, 426, 425, 425, 425, - 425, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 428, 429, 428, - 428, 428, 428, 428, 428, 428, 427, 427, 427, 427, 427, 427, 427, 427, - 427, 81, 81, 81, 430, 430, 431, 432, 432, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 431, 430, 430, 430, 430, 431, 431, 430, - 430, 433, 434, 430, 430, 432, 432, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 432, 432, 432, 432, 432, 432, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, 436, 437, 438, 439, 439, 438, - 438, 438, 439, 438, 439, 439, 439, 440, 440, 81, 81, 81, 81, 81, 81, 81, - 81, 441, 441, 441, 441, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 442, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, - 444, 444, 444, 444, 443, 443, 444, 445, 81, 81, 81, 446, 446, 446, 446, - 446, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 81, 81, 81, 442, - 442, 442, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 450, 450, - 450, 450, 450, 450, 451, 451, 93, 81, 81, 81, 81, 81, 81, 81, 329, 329, - 329, 81, 81, 329, 329, 329, 452, 452, 452, 452, 452, 452, 452, 452, 96, - 96, 96, 331, 453, 156, 156, 156, 156, 156, 96, 96, 156, 156, 156, 156, - 96, 454, 453, 453, 453, 453, 453, 453, 453, 455, 455, 455, 455, 156, 455, - 455, 455, 455, 455, 455, 96, 455, 455, 454, 96, 96, 455, 81, 81, 81, 81, - 81, 56, 56, 56, 56, 56, 56, 79, 79, 79, 79, 79, 93, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 82, 82, 82, 82, 82, 59, 59, 59, 59, 82, 82, 82, 82, 82, - 56, 56, 56, 56, 56, 456, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 82, 96, 96, 156, 96, 96, 96, 96, - 96, 96, 96, 156, 96, 96, 457, 458, 156, 459, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 460, 461, 461, - 156, 81, 96, 462, 156, 96, 156, 52, 56, 52, 56, 52, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 52, 56, 79, 79, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, - 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 81, 81, 78, 78, 78, 78, 78, 78, - 81, 81, 81, 78, 81, 78, 81, 78, 81, 78, 463, 463, 463, 463, 463, 463, - 463, 463, 79, 79, 79, 79, 79, 81, 79, 79, 78, 78, 78, 78, 463, 80, 79, - 80, 80, 80, 79, 79, 79, 81, 79, 79, 78, 78, 78, 78, 463, 80, 80, 80, 79, - 79, 79, 79, 81, 81, 79, 79, 78, 78, 78, 78, 81, 80, 80, 80, 78, 78, 78, - 78, 78, 80, 80, 80, 81, 81, 79, 79, 79, 81, 79, 79, 78, 78, 78, 78, 463, - 464, 80, 81, 465, 465, 465, 465, 465, 465, 465, 466, 465, 465, 465, 467, - 468, 469, 470, 471, 472, 473, 474, 472, 475, 476, 38, 84, 477, 478, 479, - 42, 477, 478, 479, 42, 38, 38, 480, 84, 481, 481, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 33, 490, 491, 490, 490, 491, 492, 493, 493, 84, - 42, 50, 38, 494, 494, 480, 495, 495, 84, 84, 84, 496, 479, 497, 494, 494, - 494, 84, 84, 84, 84, 84, 84, 84, 84, 498, 84, 495, 84, 379, 84, 379, 379, - 379, 379, 84, 379, 379, 465, 499, 500, 500, 500, 500, 81, 501, 502, 503, - 504, 505, 505, 505, 505, 505, 505, 506, 59, 81, 81, 47, 506, 506, 506, - 506, 506, 507, 507, 498, 479, 497, 508, 506, 47, 47, 47, 47, 506, 506, - 506, 506, 506, 507, 507, 498, 479, 497, 81, 59, 59, 59, 59, 59, 81, 81, - 81, 282, 282, 282, 282, 282, 282, 282, 509, 282, 510, 282, 282, 36, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 509, 282, 282, 282, 282, 509, - 282, 282, 509, 282, 511, 511, 511, 511, 511, 511, 511, 511, 96, 96, 453, - 453, 96, 96, 96, 96, 453, 453, 453, 96, 96, 418, 418, 418, 418, 96, 418, - 418, 418, 453, 453, 96, 156, 96, 453, 453, 156, 156, 156, 156, 96, 81, - 81, 81, 81, 81, 81, 81, 40, 40, 512, 513, 40, 514, 40, 512, 40, 513, 49, - 512, 512, 512, 49, 49, 512, 512, 512, 515, 40, 512, 516, 40, 498, 512, - 512, 512, 512, 512, 40, 40, 40, 514, 514, 40, 512, 40, 85, 40, 512, 40, - 52, 517, 512, 512, 518, 49, 512, 512, 52, 512, 49, 455, 455, 455, 455, - 49, 40, 40, 49, 49, 512, 512, 498, 498, 498, 498, 498, 512, 49, 49, 49, - 49, 40, 498, 40, 40, 56, 318, 519, 519, 519, 520, 51, 521, 519, 519, 519, - 519, 519, 51, 520, 520, 51, 519, 522, 522, 522, 522, 522, 522, 522, 522, - 522, 522, 522, 522, 523, 523, 523, 523, 522, 522, 523, 523, 523, 523, - 523, 523, 523, 523, 523, 52, 56, 523, 523, 523, 523, 51, 40, 40, 81, 81, - 81, 81, 54, 54, 54, 54, 54, 514, 514, 514, 514, 514, 498, 498, 40, 40, - 40, 40, 498, 40, 40, 498, 40, 40, 498, 40, 40, 40, 40, 40, 40, 40, 498, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 44, 44, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 498, 498, 40, 40, 54, 40, 54, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 44, 40, 40, 40, 40, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 498, 54, 498, 54, 54, 498, 498, 498, 54, 54, 498, - 498, 54, 498, 498, 498, 54, 498, 54, 524, 525, 498, 54, 498, 498, 498, - 498, 54, 498, 498, 54, 54, 54, 54, 498, 498, 54, 498, 54, 498, 54, 54, - 54, 54, 54, 54, 498, 54, 498, 498, 498, 498, 498, 54, 54, 54, 54, 498, - 498, 498, 498, 54, 54, 498, 498, 54, 498, 498, 498, 54, 498, 498, 498, - 498, 498, 54, 498, 498, 498, 498, 498, 54, 54, 498, 498, 54, 54, 54, 54, - 498, 498, 54, 54, 498, 498, 54, 54, 498, 498, 498, 498, 498, 54, 498, - 498, 498, 54, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 54, 498, 498, 498, 498, 498, 498, 498, 526, 479, 497, 479, 497, 40, - 40, 40, 40, 40, 40, 514, 40, 40, 40, 40, 40, 40, 40, 527, 527, 40, 40, - 40, 40, 498, 498, 40, 40, 40, 40, 40, 40, 40, 528, 529, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 40, 498, 40, 40, 40, 40, 40, 40, 40, 40, 318, 40, 40, - 40, 40, 40, 498, 498, 498, 498, 498, 498, 498, 498, 498, 40, 40, 40, 40, - 40, 530, 530, 530, 530, 40, 40, 40, 527, 531, 531, 527, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 81, 40, 40, 40, 81, 81, 81, 81, 81, 51, 51, - 51, 51, 51, 51, 51, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, - 521, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 520, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 40, 40, 40, 40, 514, 514, - 514, 514, 533, 40, 40, 40, 40, 40, 514, 514, 514, 514, 40, 40, 514, 514, - 40, 514, 514, 514, 514, 514, 514, 514, 40, 40, 40, 40, 40, 40, 40, 40, - 514, 514, 40, 40, 514, 54, 40, 40, 40, 40, 514, 514, 40, 40, 514, 54, 40, - 40, 40, 40, 514, 514, 514, 40, 40, 514, 40, 40, 514, 514, 40, 40, 40, 40, - 40, 40, 40, 514, 498, 498, 498, 498, 498, 534, 534, 498, 531, 531, 531, - 531, 40, 514, 514, 40, 40, 514, 40, 40, 40, 40, 514, 514, 40, 40, 40, 40, - 527, 527, 533, 533, 531, 40, 531, 531, 535, 536, 535, 531, 40, 531, 531, - 531, 40, 40, 40, 40, 514, 40, 514, 40, 40, 40, 40, 40, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 530, 40, 40, 40, 40, 514, 514, - 40, 514, 514, 514, 40, 514, 535, 514, 514, 40, 514, 514, 40, 54, 40, 40, - 40, 40, 40, 40, 40, 527, 40, 40, 40, 530, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 514, 514, 40, 530, 40, 40, 40, 40, 40, 40, 40, 40, 530, 530, 318, - 40, 40, 40, 40, 40, 40, 40, 40, 527, 527, 535, 531, 531, 531, 531, 527, - 527, 535, 535, 535, 514, 514, 514, 514, 535, 530, 535, 535, 535, 514, - 535, 527, 514, 514, 514, 535, 535, 514, 514, 535, 514, 514, 535, 535, - 535, 40, 514, 40, 40, 40, 40, 514, 514, 527, 514, 514, 514, 514, 514, - 514, 535, 527, 527, 535, 527, 514, 535, 535, 537, 527, 514, 514, 527, - 535, 535, 531, 531, 531, 531, 531, 530, 40, 40, 531, 531, 538, 538, 536, - 536, 40, 40, 530, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 44, 40, - 40, 40, 40, 40, 40, 530, 40, 530, 40, 40, 40, 40, 530, 530, 530, 40, 539, - 40, 40, 40, 540, 540, 540, 540, 540, 540, 40, 541, 541, 531, 40, 40, 40, - 479, 497, 479, 497, 479, 497, 479, 497, 479, 497, 479, 497, 479, 497, 51, - 51, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 40, 530, - 530, 530, 40, 40, 40, 40, 40, 40, 40, 530, 498, 498, 498, 498, 498, 479, - 497, 498, 498, 498, 498, 498, 498, 498, 16, 31, 16, 31, 16, 31, 16, 31, - 479, 497, 542, 542, 542, 542, 542, 542, 542, 542, 498, 498, 498, 479, - 497, 16, 31, 479, 497, 479, 497, 479, 497, 479, 497, 479, 497, 498, 498, - 498, 498, 498, 498, 498, 479, 497, 479, 497, 498, 498, 498, 498, 498, - 498, 498, 498, 479, 497, 498, 498, 40, 40, 40, 530, 530, 40, 40, 40, 498, - 498, 498, 498, 498, 40, 40, 498, 498, 498, 498, 498, 498, 40, 40, 40, - 530, 40, 40, 40, 40, 539, 514, 514, 40, 40, 40, 40, 81, 81, 40, 40, 40, - 40, 40, 40, 40, 40, 81, 81, 543, 543, 543, 543, 543, 543, 543, 543, 543, - 543, 543, 543, 543, 543, 543, 81, 544, 544, 544, 544, 544, 544, 544, 544, - 544, 544, 544, 544, 544, 544, 544, 81, 52, 56, 52, 52, 52, 56, 56, 52, - 56, 52, 56, 52, 56, 52, 52, 52, 52, 56, 52, 56, 56, 52, 56, 56, 56, 56, - 56, 56, 59, 59, 52, 52, 87, 88, 87, 88, 88, 545, 545, 545, 545, 545, 545, - 87, 88, 87, 88, 546, 546, 546, 87, 88, 81, 81, 81, 81, 81, 547, 548, 548, - 548, 549, 547, 548, 330, 330, 330, 330, 330, 330, 81, 330, 81, 81, 81, - 81, 81, 330, 81, 81, 550, 550, 550, 550, 550, 550, 550, 550, 81, 81, 81, - 81, 81, 81, 81, 551, 552, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 553, 95, 95, 95, 95, 95, 95, 95, 95, 554, 554, 42, 50, 42, 50, - 554, 554, 554, 42, 50, 554, 42, 50, 379, 379, 379, 379, 379, 379, 379, - 379, 84, 474, 555, 379, 556, 84, 42, 50, 84, 84, 42, 50, 479, 497, 479, - 497, 479, 497, 479, 497, 379, 379, 379, 379, 377, 60, 379, 379, 84, 379, - 379, 84, 84, 84, 84, 84, 557, 557, 379, 379, 379, 84, 474, 379, 479, 379, - 379, 379, 379, 379, 379, 379, 379, 84, 379, 84, 379, 379, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 81, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 81, 81, 81, 81, 558, 558, 558, 558, 558, 558, 81, 81, 527, 527, - 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 81, 81, 81, 81, 559, - 560, 560, 561, 527, 562, 563, 564, 528, 529, 528, 529, 528, 529, 528, - 529, 528, 529, 527, 527, 528, 529, 528, 529, 528, 529, 528, 529, 565, - 528, 529, 529, 527, 564, 564, 564, 564, 564, 564, 564, 564, 564, 566, - 567, 568, 569, 570, 570, 571, 572, 572, 572, 572, 573, 527, 527, 564, - 564, 564, 562, 574, 561, 527, 531, 81, 575, 576, 575, 576, 575, 576, 575, - 576, 575, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 576, 576, 576, 575, 576, 576, 576, 576, 576, 576, 576, 575, - 576, 575, 576, 575, 576, 576, 576, 576, 576, 576, 575, 576, 576, 576, - 576, 576, 576, 575, 575, 81, 81, 577, 577, 578, 578, 579, 579, 576, 565, - 580, 581, 580, 581, 580, 581, 580, 581, 580, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 580, 581, - 581, 581, 581, 581, 581, 581, 580, 581, 580, 581, 580, 581, 581, 581, - 581, 581, 581, 580, 581, 581, 581, 581, 581, 581, 580, 580, 581, 581, - 581, 581, 582, 583, 584, 584, 581, 81, 81, 81, 81, 81, 585, 585, 585, - 585, 585, 585, 585, 585, 585, 585, 585, 81, 586, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, - 586, 586, 81, 587, 587, 588, 588, 588, 588, 587, 587, 587, 587, 587, 587, - 587, 587, 587, 587, 585, 585, 585, 81, 81, 81, 81, 81, 580, 580, 580, - 580, 580, 580, 580, 580, 589, 589, 589, 589, 589, 589, 589, 589, 589, - 589, 589, 589, 589, 590, 590, 81, 588, 588, 588, 588, 588, 588, 588, 588, - 588, 588, 587, 587, 587, 587, 587, 587, 591, 591, 591, 591, 591, 591, - 591, 591, 527, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 589, 589, 589, 589, 590, 590, 590, 587, 587, 592, - 592, 592, 592, 592, 592, 592, 587, 587, 587, 587, 527, 527, 527, 527, - 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, - 593, 81, 587, 587, 587, 587, 587, 587, 587, 527, 527, 527, 527, 587, 587, - 587, 587, 587, 587, 587, 587, 587, 587, 587, 527, 527, 594, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, 595, 595, - 595, 595, 595, 595, 595, 595, 595, 596, 596, 596, 596, 596, 596, 596, - 596, 596, 596, 596, 596, 596, 597, 596, 596, 596, 596, 596, 596, 596, 81, - 81, 81, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, - 598, 598, 81, 599, 599, 599, 599, 599, 599, 599, 599, 600, 600, 600, 600, - 600, 600, 601, 601, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 602, 603, 604, 605, 604, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 602, 602, 81, 81, 81, 81, 90, 93, 90, 93, 90, 93, 607, 95, 97, - 97, 97, 608, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 608, 609, 90, 93, - 90, 93, 456, 456, 95, 95, 610, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 610, 610, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 612, 612, 613, 614, 614, 614, 614, 614, 62, 62, 62, 62, 62, 62, 62, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 62, 62, 52, 56, 52, 56, 52, 56, 56, - 56, 52, 56, 52, 56, 52, 56, 59, 56, 56, 56, 56, 56, 56, 56, 56, 52, 56, - 52, 56, 52, 52, 56, 60, 615, 615, 52, 56, 52, 56, 57, 52, 56, 52, 56, 56, - 56, 52, 56, 52, 56, 52, 52, 52, 52, 52, 56, 52, 52, 52, 52, 52, 56, 52, - 56, 81, 81, 52, 56, 52, 52, 52, 81, 81, 81, 81, 81, 81, 81, 81, 57, 59, - 59, 56, 57, 57, 57, 57, 57, 616, 616, 617, 616, 616, 616, 618, 616, 616, - 616, 616, 617, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 619, 619, 617, 617, 619, 620, 620, 620, 620, 81, 81, - 81, 81, 621, 621, 621, 621, 621, 621, 318, 318, 509, 518, 81, 81, 81, 81, - 81, 81, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 623, - 623, 624, 624, 625, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 625, 625, 625, 625, 625, - 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 627, 628, 81, 81, - 81, 81, 81, 81, 81, 81, 629, 629, 630, 630, 630, 630, 630, 630, 630, 630, - 630, 630, 81, 81, 81, 81, 81, 81, 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 195, 195, 195, 195, 195, 195, 200, 200, 200, 195, 632, 195, - 195, 193, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 634, - 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, - 634, 634, 634, 634, 635, 635, 635, 635, 635, 636, 636, 636, 198, 637, - 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, - 638, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 640, 641, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 642, 333, 333, 333, 333, 333, 81, - 81, 81, 643, 643, 643, 644, 645, 645, 645, 645, 645, 645, 645, 645, 645, - 645, 645, 645, 645, 645, 645, 646, 644, 644, 643, 643, 643, 643, 644, - 644, 643, 643, 644, 644, 647, 648, 648, 648, 648, 648, 648, 649, 649, - 649, 648, 648, 648, 648, 81, 61, 650, 650, 650, 650, 650, 650, 650, 650, - 650, 650, 81, 81, 81, 81, 648, 648, 319, 319, 319, 319, 319, 321, 651, - 319, 324, 324, 319, 319, 319, 319, 319, 81, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 653, 653, 653, 653, 653, 653, 654, 654, 653, 653, 654, - 654, 653, 653, 81, 652, 652, 652, 653, 652, 652, 652, 652, 652, 652, 652, - 652, 653, 654, 81, 81, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, - 81, 81, 656, 657, 657, 657, 651, 319, 319, 319, 319, 319, 319, 328, 328, - 328, 319, 320, 321, 320, 319, 319, 658, 658, 658, 658, 658, 658, 658, - 658, 659, 658, 659, 659, 660, 658, 658, 659, 659, 658, 658, 658, 658, - 658, 659, 659, 658, 659, 658, 81, 81, 81, 81, 81, 81, 81, 81, 658, 658, - 661, 662, 662, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, - 664, 665, 665, 664, 664, 666, 666, 663, 667, 667, 664, 668, 81, 81, 336, - 336, 336, 336, 336, 336, 81, 56, 56, 56, 615, 59, 59, 59, 59, 56, 56, 56, - 56, 56, 79, 56, 56, 343, 343, 343, 343, 343, 343, 343, 343, 663, 663, - 663, 664, 664, 665, 664, 664, 665, 664, 664, 666, 664, 668, 81, 81, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 81, 81, 81, 81, 81, 81, 670, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 670, 671, 671, 671, 671, 671, 671, 671, 81, 81, - 81, 81, 334, 334, 334, 334, 334, 334, 334, 81, 81, 81, 81, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 81, 81, 81, 81, 672, 672, 672, 672, 672, - 672, 672, 672, 673, 673, 673, 673, 673, 673, 673, 673, 594, 594, 595, - 595, 595, 595, 595, 595, 56, 56, 56, 56, 56, 56, 56, 81, 81, 81, 81, 101, - 101, 101, 101, 101, 81, 81, 81, 81, 81, 129, 674, 129, 129, 675, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81, 129, 129, - 129, 129, 129, 81, 129, 81, 129, 129, 81, 129, 129, 81, 129, 129, 146, - 146, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, - 676, 676, 676, 81, 81, 81, 81, 81, 81, 81, 81, 81, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 497, 479, 81, 81, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 135, 138, 81, 81, 677, 677, 677, 677, 677, - 677, 677, 677, 678, 560, 560, 678, 678, 679, 679, 528, 529, 680, 81, 81, - 81, 81, 81, 81, 96, 96, 96, 96, 96, 96, 96, 156, 156, 156, 156, 156, 156, - 156, 95, 95, 561, 571, 571, 681, 681, 528, 529, 528, 529, 528, 529, 528, - 529, 528, 529, 528, 529, 528, 529, 528, 529, 561, 561, 528, 529, 561, - 561, 561, 561, 681, 681, 681, 682, 561, 682, 81, 582, 683, 679, 679, 571, - 528, 529, 528, 529, 528, 529, 684, 561, 561, 685, 686, 687, 687, 687, 81, - 561, 688, 689, 561, 81, 81, 81, 81, 146, 146, 146, 146, 146, 81, 81, 499, - 81, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698, - 700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704, - 704, 704, 690, 691, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, - 705, 705, 705, 705, 705, 705, 705, 705, 695, 691, 696, 706, 707, 706, - 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 708, 695, 704, 696, 704, 695, 696, 709, 710, 711, 709, - 712, 713, 714, 714, 714, 714, 714, 714, 714, 714, 714, 715, 713, 713, - 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, - 713, 713, 713, 713, 713, 716, 716, 717, 717, 717, 717, 717, 717, 717, - 717, 717, 717, 717, 717, 717, 717, 717, 81, 81, 81, 717, 717, 717, 717, - 717, 717, 81, 81, 717, 717, 717, 81, 81, 81, 718, 693, 704, 706, 719, - 693, 693, 81, 720, 721, 721, 721, 721, 720, 720, 81, 81, 722, 722, 722, - 723, 514, 81, 81, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, - 724, 81, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 81, 724, 724, - 724, 81, 724, 724, 81, 724, 724, 724, 724, 724, 724, 724, 81, 81, 724, - 724, 724, 81, 81, 81, 81, 81, 198, 379, 198, 81, 81, 81, 81, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 81, 81, 81, 318, - 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 726, - 726, 726, 726, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, - 727, 727, 727, 727, 727, 727, 726, 726, 727, 728, 728, 81, 40, 40, 40, - 40, 81, 81, 81, 81, 727, 81, 81, 81, 81, 81, 81, 81, 318, 318, 318, 318, - 318, 156, 81, 81, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, - 729, 729, 81, 81, 81, 730, 730, 730, 730, 730, 730, 730, 730, 730, 81, - 81, 81, 81, 81, 81, 81, 156, 506, 506, 506, 506, 506, 506, 506, 506, 506, - 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 81, 81, 81, 81, 731, - 731, 731, 731, 731, 731, 731, 731, 732, 732, 732, 732, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 731, 731, 731, 733, 733, 733, 733, 733, 733, 733, - 733, 733, 734, 733, 733, 733, 733, 733, 733, 733, 733, 734, 81, 81, 81, - 81, 81, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, - 735, 736, 736, 736, 736, 736, 81, 81, 81, 81, 81, 737, 737, 737, 737, - 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 81, 738, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, 739, 81, 81, 81, 81, 740, 741, - 741, 741, 741, 741, 81, 81, 742, 742, 742, 742, 742, 742, 742, 742, 743, - 743, 743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, - 744, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, - 745, 81, 81, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 81, 81, - 81, 81, 81, 81, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, - 747, 81, 81, 81, 81, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, - 748, 748, 81, 81, 81, 81, 749, 749, 749, 749, 749, 749, 749, 749, 750, - 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 751, 752, 752, 752, 752, 752, 752, 752, 752, - 752, 752, 752, 752, 752, 752, 752, 81, 752, 752, 752, 752, 752, 752, 81, - 81, 753, 753, 753, 753, 753, 753, 81, 81, 753, 81, 753, 753, 753, 753, - 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, - 753, 753, 81, 753, 753, 81, 81, 81, 753, 81, 81, 753, 754, 754, 754, 754, - 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 81, 755, 756, 756, 756, - 756, 756, 756, 756, 756, 757, 757, 757, 757, 757, 757, 757, 757, 757, - 757, 757, 757, 757, 757, 757, 758, 758, 759, 759, 759, 759, 759, 759, - 759, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 81, 81, 81, 81, 81, 81, 81, 81, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 81, - 762, 762, 81, 81, 81, 81, 81, 763, 763, 763, 763, 763, 764, 764, 764, - 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, 765, - 765, 765, 765, 81, 81, 81, 766, 767, 767, 767, 767, 767, 767, 767, 767, - 767, 767, 81, 81, 81, 81, 81, 768, 769, 769, 769, 769, 769, 769, 769, - 769, 770, 770, 770, 770, 770, 770, 770, 770, 81, 81, 81, 81, 771, 771, - 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 81, 81, 771, 771, 771, - 771, 771, 771, 772, 773, 773, 773, 81, 773, 773, 81, 81, 81, 81, 81, 773, - 774, 773, 775, 772, 772, 772, 772, 81, 772, 772, 772, 81, 772, 772, 772, - 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, - 772, 772, 772, 772, 81, 81, 775, 776, 774, 81, 81, 81, 81, 777, 778, 778, - 778, 778, 778, 778, 778, 778, 778, 81, 81, 81, 81, 81, 81, 81, 779, 779, - 779, 779, 779, 779, 779, 779, 780, 81, 81, 81, 81, 81, 81, 81, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, 782, 783, - 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 785, - 785, 785, 786, 786, 786, 786, 786, 786, 786, 786, 787, 786, 786, 786, - 786, 786, 786, 786, 786, 786, 786, 786, 786, 788, 789, 81, 81, 81, 81, - 790, 790, 790, 790, 790, 791, 791, 791, 791, 791, 791, 792, 81, 793, 793, - 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 81, 81, 81, - 794, 794, 794, 794, 794, 794, 794, 795, 795, 795, 795, 795, 795, 795, - 795, 795, 795, 795, 795, 795, 795, 81, 81, 796, 796, 796, 796, 796, 796, - 796, 796, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 81, 81, - 81, 81, 81, 798, 798, 798, 798, 798, 798, 798, 798, 799, 799, 799, 799, - 799, 799, 799, 799, 799, 799, 81, 81, 81, 81, 81, 81, 81, 800, 800, 800, - 800, 81, 81, 81, 81, 801, 801, 801, 801, 801, 801, 801, 802, 802, 802, - 802, 802, 802, 802, 802, 802, 81, 81, 81, 81, 81, 81, 81, 803, 803, 803, - 803, 803, 803, 803, 803, 803, 803, 803, 81, 81, 81, 81, 81, 804, 804, - 804, 804, 804, 804, 804, 804, 804, 804, 804, 81, 81, 81, 81, 81, 81, 81, - 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 807, 807, 807, 807, 808, 808, 808, 808, 808, 808, - 808, 808, 808, 808, 81, 81, 81, 81, 81, 81, 809, 809, 809, 809, 809, 809, - 809, 809, 809, 809, 809, 809, 809, 809, 809, 81, 810, 810, 810, 810, 810, - 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, 811, 811, 811, 811, - 811, 811, 811, 811, 810, 812, 812, 812, 812, 812, 812, 812, 812, 812, - 812, 812, 812, 812, 812, 813, 813, 814, 814, 814, 813, 814, 813, 813, - 813, 813, 815, 815, 815, 815, 816, 816, 816, 816, 816, 81, 81, 81, 81, - 81, 81, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, - 817, 817, 81, 818, 819, 818, 820, 820, 820, 820, 820, 820, 820, 820, 820, - 820, 820, 820, 820, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 821, 822, 822, 823, 823, 823, 823, 823, 81, 81, 81, - 81, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 824, 825, 825, 825, 825, 825, 825, 825, 825, - 825, 825, 81, 81, 81, 81, 81, 81, 81, 821, 826, 826, 827, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 827, 827, 827, 826, - 826, 826, 826, 827, 827, 829, 830, 831, 831, 832, 833, 833, 833, 833, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 832, 81, 81, 834, 834, 834, 834, - 834, 834, 834, 834, 834, 81, 81, 81, 81, 81, 81, 81, 835, 835, 835, 835, - 835, 835, 835, 835, 835, 835, 81, 81, 81, 81, 81, 81, 836, 836, 836, 837, - 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, - 837, 837, 837, 837, 837, 838, 838, 838, 838, 838, 839, 838, 838, 838, - 838, 838, 838, 840, 840, 81, 841, 841, 841, 841, 841, 841, 841, 841, 841, - 841, 842, 842, 842, 842, 837, 839, 839, 81, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 844, 845, 846, 843, 81, 847, 847, 848, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, - 848, 848, 848, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848, 850, - 849, 849, 849, 849, 851, 851, 852, 851, 847, 853, 847, 847, 852, 81, 81, - 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 849, 855, 849, 851, - 851, 851, 81, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, 81, 81, 81, 857, 857, 857, 857, - 857, 857, 857, 857, 857, 857, 81, 857, 857, 857, 857, 857, 857, 857, 857, - 857, 858, 858, 858, 859, 859, 859, 858, 858, 859, 860, 861, 859, 862, - 862, 863, 862, 862, 863, 859, 81, 864, 864, 864, 864, 864, 864, 864, 81, - 864, 81, 864, 864, 864, 864, 81, 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 81, 864, 864, 865, 81, 81, 81, 81, 81, - 81, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, - 866, 867, 868, 868, 868, 867, 867, 867, 867, 867, 867, 869, 870, 81, 81, - 81, 81, 81, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 81, 81, 81, - 81, 81, 81, 872, 872, 873, 873, 81, 874, 874, 874, 874, 874, 874, 874, - 874, 81, 81, 874, 874, 81, 81, 874, 874, 874, 874, 874, 874, 874, 874, - 874, 874, 874, 874, 874, 874, 81, 874, 874, 874, 874, 874, 874, 874, 81, - 874, 874, 81, 874, 874, 874, 874, 874, 81, 875, 876, 874, 873, 873, 872, - 873, 873, 873, 873, 81, 81, 873, 873, 81, 81, 873, 873, 877, 81, 81, 874, - 81, 81, 81, 81, 81, 81, 873, 81, 81, 81, 81, 81, 874, 874, 874, 874, 874, - 873, 873, 81, 81, 878, 878, 878, 878, 878, 878, 878, 81, 81, 81, 879, - 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 880, 880, - 880, 881, 881, 881, 881, 881, 881, 881, 881, 880, 880, 882, 881, 881, - 880, 883, 879, 879, 879, 879, 884, 884, 884, 884, 885, 886, 886, 886, - 886, 886, 886, 886, 886, 886, 886, 81, 884, 81, 885, 887, 879, 888, 888, - 888, 888, 888, 888, 888, 888, 889, 889, 889, 890, 890, 890, 890, 890, - 890, 889, 890, 889, 889, 889, 889, 890, 890, 889, 891, 892, 888, 888, - 893, 888, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 81, 81, 81, - 81, 81, 81, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 896, 896, 896, 897, 897, 897, 897, 81, 81, 896, 896, 896, - 896, 897, 897, 896, 898, 899, 900, 901, 901, 902, 902, 903, 903, 903, - 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, - 901, 895, 895, 895, 895, 897, 897, 81, 81, 904, 904, 904, 904, 904, 904, - 904, 904, 905, 905, 905, 906, 906, 906, 906, 906, 906, 906, 906, 905, - 905, 906, 905, 907, 906, 908, 908, 909, 904, 81, 81, 81, 910, 910, 910, - 910, 910, 910, 910, 910, 910, 910, 81, 81, 81, 81, 81, 81, 911, 911, 911, - 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 81, 81, 81, 912, 912, - 912, 912, 912, 912, 912, 912, 912, 912, 912, 913, 914, 913, 914, 914, - 913, 913, 913, 913, 913, 913, 915, 916, 912, 81, 81, 81, 81, 81, 81, 81, - 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 81, 81, 81, 81, 81, 81, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 81, 81, 919, 919, - 919, 920, 920, 919, 919, 919, 919, 920, 919, 919, 919, 919, 921, 81, 81, - 81, 81, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 923, 923, 924, - 924, 924, 925, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 927, 927, 927, 928, 928, 928, 928, 928, 928, 928, 928, 928, 927, - 929, 930, 931, 81, 81, 81, 81, 932, 932, 932, 932, 932, 932, 932, 932, - 933, 933, 933, 933, 933, 933, 933, 933, 934, 934, 934, 934, 934, 934, - 934, 934, 934, 934, 935, 935, 935, 935, 935, 935, 935, 935, 935, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 936, 937, 937, 937, 937, 937, - 937, 937, 937, 81, 81, 937, 937, 937, 937, 937, 937, 937, 938, 938, 938, - 939, 939, 939, 939, 81, 81, 939, 939, 938, 938, 938, 938, 940, 937, 941, - 937, 938, 81, 81, 81, 942, 943, 943, 943, 943, 943, 943, 944, 944, 943, - 943, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, - 942, 942, 942, 943, 945, 943, 943, 943, 943, 946, 942, 943, 943, 943, - 943, 947, 948, 949, 949, 949, 949, 947, 948, 945, 950, 951, 951, 951, - 951, 951, 951, 952, 952, 951, 951, 951, 950, 950, 950, 950, 950, 950, - 950, 950, 950, 950, 950, 950, 950, 950, 951, 951, 951, 951, 951, 951, - 951, 951, 951, 951, 951, 951, 951, 952, 951, 953, 954, 954, 954, 950, - 955, 955, 955, 954, 954, 81, 81, 81, 81, 81, 956, 956, 956, 956, 956, - 956, 956, 956, 956, 81, 81, 81, 81, 81, 81, 81, 957, 957, 957, 957, 957, - 957, 957, 957, 957, 81, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, - 957, 957, 957, 958, 959, 959, 959, 959, 959, 959, 959, 81, 959, 959, 959, - 959, 959, 959, 958, 960, 957, 961, 961, 961, 961, 961, 81, 81, 962, 962, - 962, 962, 962, 962, 962, 962, 962, 962, 963, 963, 963, 963, 963, 963, - 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 81, 81, - 81, 964, 965, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, - 966, 966, 81, 81, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, - 967, 967, 967, 81, 968, 967, 967, 967, 967, 967, 967, 967, 968, 967, 967, - 968, 967, 967, 81, 969, 969, 969, 969, 969, 969, 969, 81, 969, 969, 81, - 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - 970, 970, 970, 970, 970, 970, 81, 81, 81, 970, 81, 970, 970, 81, 970, - 970, 970, 971, 970, 972, 972, 969, 970, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 81, 81, 81, 81, 81, 81, 974, 974, 974, 974, 974, 974, - 81, 974, 974, 81, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, - 974, 974, 974, 974, 974, 975, 975, 975, 975, 975, 81, 976, 976, 81, 975, - 975, 976, 975, 977, 974, 81, 81, 81, 81, 81, 81, 81, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 81, 81, 81, 81, 81, 81, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 980, 980, 981, 981, 982, 982, 81, 81, - 81, 81, 81, 81, 81, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 983, 983, 983, - 983, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 984, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 81, 81, 81, 81, - 81, 81, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, - 986, 986, 81, 987, 987, 987, 987, 987, 81, 81, 81, 985, 985, 985, 985, - 81, 81, 81, 81, 988, 988, 988, 988, 988, 988, 988, 988, 989, 989, 989, - 990, 990, 990, 988, 988, 988, 988, 990, 988, 988, 988, 989, 990, 989, - 990, 988, 988, 988, 988, 988, 988, 988, 989, 990, 990, 988, 988, 988, - 988, 988, 988, 988, 988, 988, 988, 988, 81, 991, 991, 991, 991, 991, 991, - 991, 992, 993, 81, 81, 81, 81, 81, 81, 81, 994, 994, 994, 994, 994, 994, - 994, 994, 994, 994, 994, 994, 994, 994, 995, 996, 994, 994, 994, 994, - 994, 994, 994, 81, 610, 81, 81, 81, 81, 81, 81, 81, 997, 997, 997, 997, - 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 81, 998, 998, 998, - 998, 998, 998, 998, 998, 998, 998, 81, 81, 81, 81, 999, 999, 1000, 1000, - 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, - 81, 81, 1001, 1001, 1001, 1001, 1001, 1002, 81, 81, 1003, 1003, 1003, - 1003, 1003, 1003, 1003, 1003, 1004, 1004, 1004, 1004, 1004, 1004, 1004, - 1005, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1007, 1008, 1008, 1008, - 1008, 1005, 1007, 81, 81, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, - 1009, 1009, 81, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 81, 1003, 1003, - 1003, 1003, 1003, 81, 81, 81, 81, 81, 1003, 1003, 1003, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1012, 1012, 1012, 1012, 1012, 1012, 1012, - 1012, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, - 1013, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 81, 81, 81, 81, 81, 1016, - 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 81, 81, 81, - 81, 1017, 1016, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, - 1018, 1018, 1018, 1018, 1018, 1018, 81, 81, 81, 81, 81, 81, 81, 1017, - 1017, 1017, 1017, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, - 1019, 1019, 1019, 1019, 1020, 1021, 582, 1022, 81, 81, 81, 81, 1023, - 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 81, 81, 81, - 81, 81, 581, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 81, 575, 575, 575, 81, 81, 81, 81, 81, 81, 81, 81, 81, 580, - 580, 580, 580, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 81, 81, 81, 81, 1025, 1025, 1025, 1025, 1025, 1025, - 1025, 1025, 1025, 1025, 1025, 81, 81, 81, 81, 81, 1025, 1025, 1025, 1025, - 1025, 81, 81, 81, 1025, 81, 81, 81, 81, 81, 81, 81, 1025, 1025, 81, 81, - 1026, 1027, 1028, 1029, 505, 505, 505, 505, 81, 81, 81, 81, 318, 318, - 318, 318, 318, 318, 81, 81, 318, 318, 318, 318, 318, 318, 318, 81, 81, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 1030, 1030, - 453, 453, 453, 318, 318, 318, 1031, 1030, 1030, 1030, 1030, 1030, 505, - 505, 505, 505, 505, 505, 505, 505, 156, 156, 156, 156, 156, 156, 156, - 156, 318, 318, 96, 96, 96, 96, 96, 156, 156, 318, 318, 318, 318, 318, - 318, 96, 96, 96, 96, 318, 318, 318, 81, 81, 81, 81, 81, 81, 81, 727, 727, - 1032, 1032, 1032, 727, 81, 81, 621, 621, 621, 621, 81, 81, 81, 81, 621, - 81, 81, 81, 81, 81, 81, 81, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 49, 49, 49, 49, 49, - 49, 49, 81, 49, 49, 49, 49, 49, 49, 512, 81, 512, 512, 81, 81, 512, 81, - 81, 512, 512, 81, 81, 512, 512, 512, 512, 81, 512, 512, 49, 49, 81, 49, - 81, 49, 49, 49, 49, 49, 49, 49, 81, 49, 49, 49, 49, 49, 49, 49, 512, 512, - 81, 512, 512, 512, 512, 81, 81, 512, 512, 512, 512, 512, 512, 512, 512, - 81, 512, 512, 512, 512, 512, 512, 512, 81, 49, 49, 512, 512, 81, 512, - 512, 512, 512, 81, 512, 512, 512, 512, 512, 81, 512, 81, 81, 81, 512, - 512, 512, 512, 512, 512, 512, 81, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 81, 81, 512, 1033, 49, 49, 49, 49, 49, 49, 49, 49, 49, 498, 49, - 49, 49, 49, 49, 49, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1033, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 498, 49, 49, 512, 512, 512, 512, 512, - 1033, 49, 49, 49, 49, 49, 49, 49, 49, 49, 498, 49, 49, 49, 49, 49, 49, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 1033, 49, 498, 49, 49, 49, - 49, 49, 49, 49, 49, 512, 49, 81, 81, 1034, 1034, 1034, 1034, 1034, 1034, - 1034, 1034, 1034, 1034, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1035, 1035, 1035, 1035, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1035, 1035, 1035, 1035, 1035, 1035, 1035, - 1035, 1036, 1035, 1035, 1035, 1035, 1035, 1035, 1036, 1035, 1035, 1037, - 1037, 1037, 1037, 1038, 81, 81, 81, 81, 81, 81, 81, 1036, 1036, 1036, - 1036, 1036, 81, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 81, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 81, 81, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 81, - 1039, 1039, 81, 1039, 1039, 1039, 1039, 1039, 81, 81, 81, 81, 81, 1040, - 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, - 81, 81, 81, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 81, 81, 1043, 1043, 1043, 1043, 1043, 1043, 1043, - 1043, 1043, 1043, 81, 81, 81, 81, 1040, 1044, 1045, 1045, 1045, 1045, - 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1046, 1046, 1046, 1046, - 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 81, 81, 81, - 81, 81, 1048, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, - 1049, 1049, 1049, 81, 81, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, - 1050, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 81, 1052, 1052, 1052, - 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1053, 1053, 1053, 1053, 1053, - 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, - 1053, 1054, 1054, 1054, 1054, 1054, 1054, 1055, 1056, 81, 81, 81, 81, - 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 81, 81, 81, - 81, 1058, 1058, 81, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, - 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1060, 1059, - 1059, 1059, 1061, 1059, 1059, 1059, 1059, 81, 81, 81, 1059, 1059, 1059, - 1059, 1059, 1059, 1062, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 81, 81, - 146, 146, 146, 146, 81, 146, 146, 146, 81, 146, 146, 81, 146, 81, 81, - 146, 81, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 81, 146, 146, - 146, 146, 81, 146, 81, 146, 81, 81, 81, 81, 81, 81, 146, 81, 81, 81, 81, - 146, 81, 146, 81, 146, 81, 146, 146, 146, 81, 146, 81, 146, 81, 146, 81, - 146, 81, 146, 146, 146, 146, 81, 146, 81, 146, 146, 81, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 81, 81, 81, 81, 81, 146, 146, 146, 81, 146, - 146, 146, 132, 132, 81, 81, 81, 81, 81, 81, 531, 531, 531, 531, 527, 531, - 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, - 531, 531, 531, 531, 531, 531, 531, 1063, 1063, 531, 531, 531, 531, 531, - 531, 531, 531, 531, 531, 531, 531, 531, 531, 527, 531, 531, 531, 531, - 531, 531, 1063, 1063, 47, 47, 47, 521, 521, 1063, 1063, 1063, 532, 532, - 532, 532, 532, 532, 318, 40, 532, 532, 40, 40, 40, 1063, 1063, 1063, 532, - 532, 532, 532, 532, 532, 1064, 532, 532, 1064, 1064, 1064, 1064, 1064, - 1064, 1064, 1064, 1064, 1064, 532, 532, 532, 532, 532, 532, 532, 532, - 532, 532, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1065, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1066, 587, 587, - 1063, 1063, 1063, 1063, 1063, 587, 587, 587, 587, 1063, 1063, 1063, 1063, - 587, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 587, 587, 1063, 1063, - 1063, 1063, 1063, 1063, 527, 527, 527, 527, 527, 527, 1063, 1063, 527, - 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 527, 527, - 527, 527, 527, 527, 527, 527, 527, 531, 527, 527, 527, 527, 527, 527, - 531, 527, 527, 527, 527, 527, 527, 527, 538, 527, 527, 527, 527, 527, - 527, 531, 531, 531, 531, 531, 531, 531, 531, 40, 40, 531, 531, 527, 527, - 527, 527, 527, 530, 530, 527, 527, 527, 527, 527, 530, 527, 527, 527, - 527, 527, 538, 538, 538, 527, 527, 538, 527, 527, 538, 536, 536, 531, - 531, 527, 527, 531, 531, 531, 527, 531, 531, 531, 527, 527, 527, 1067, - 1067, 1067, 1067, 1067, 527, 527, 527, 527, 527, 527, 527, 531, 527, 531, - 538, 538, 527, 527, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, - 538, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, - 538, 538, 538, 527, 527, 527, 538, 527, 527, 527, 527, 538, 538, 538, - 527, 538, 538, 538, 527, 527, 527, 527, 527, 527, 527, 538, 527, 538, - 527, 527, 527, 527, 527, 527, 530, 527, 530, 527, 530, 527, 527, 527, - 527, 527, 538, 527, 527, 527, 527, 530, 527, 530, 530, 527, 527, 527, - 527, 527, 527, 527, 527, 527, 527, 531, 531, 527, 530, 530, 530, 530, - 530, 530, 530, 527, 527, 527, 527, 527, 527, 527, 527, 530, 530, 530, - 530, 530, 530, 527, 527, 527, 527, 527, 530, 530, 530, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 40, 40, 40, 40, 531, 527, 527, 527, 527, - 531, 531, 531, 531, 531, 536, 536, 531, 531, 531, 531, 538, 531, 531, - 531, 531, 531, 536, 531, 531, 531, 531, 538, 538, 531, 531, 531, 531, - 531, 40, 40, 40, 40, 40, 40, 40, 40, 531, 531, 531, 531, 40, 40, 531, - 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 538, 538, 538, 527, - 527, 527, 538, 538, 538, 538, 538, 40, 40, 40, 40, 40, 40, 540, 540, 540, - 1068, 1068, 1068, 40, 40, 40, 40, 527, 527, 527, 538, 527, 527, 527, 527, - 527, 527, 527, 527, 538, 538, 538, 527, 538, 527, 527, 527, 527, 527, - 531, 531, 531, 531, 531, 531, 538, 531, 531, 531, 527, 527, 527, 531, - 531, 527, 1063, 1063, 531, 531, 531, 527, 527, 1063, 1063, 1063, 531, - 531, 531, 531, 527, 527, 527, 527, 527, 527, 527, 1063, 1063, 1063, 1063, - 1063, 40, 40, 40, 40, 1063, 1063, 1063, 1063, 40, 40, 40, 40, 40, 531, - 531, 531, 531, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 527, 527, 527, - 527, 1063, 1063, 1063, 1063, 40, 40, 1063, 1063, 1063, 1063, 1063, 1063, - 40, 40, 40, 40, 40, 40, 1063, 1063, 40, 40, 40, 40, 1063, 527, 527, 538, - 527, 527, 527, 527, 527, 527, 538, 527, 538, 538, 527, 527, 538, 538, - 538, 527, 527, 527, 1063, 527, 527, 527, 527, 1063, 1063, 1063, 527, 527, - 527, 527, 527, 527, 527, 527, 527, 1063, 1063, 527, 527, 527, 527, 527, - 527, 1063, 1063, 1063, 527, 527, 527, 527, 527, 527, 527, 538, 538, 527, - 538, 538, 527, 538, 527, 527, 527, 527, 527, 527, 527, 1063, 1063, 538, - 538, 538, 527, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, - 538, 538, 527, 527, 1063, 1063, 1063, 1063, 1063, 1063, 81, 81, 594, 594, - 594, 594, 594, 594, 594, 595, 594, 594, 594, 594, 594, 595, 595, 595, - 594, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 81, - 81, 81, 505, 81, 81, 81, 81, 81, 81, 505, 505, 505, 505, 505, 505, 505, - 505, 673, 673, 673, 673, 673, 673, 81, 81, -}; - -/* decomposition data */ -static const unsigned short decomp_data[] = { - 0, 257, 32, 514, 32, 776, 259, 97, 514, 32, 772, 259, 50, 259, 51, 514, - 32, 769, 258, 956, 514, 32, 807, 259, 49, 259, 111, 772, 49, 8260, 52, - 772, 49, 8260, 50, 772, 51, 8260, 52, 512, 65, 768, 512, 65, 769, 512, - 65, 770, 512, 65, 771, 512, 65, 776, 512, 65, 778, 512, 67, 807, 512, 69, - 768, 512, 69, 769, 512, 69, 770, 512, 69, 776, 512, 73, 768, 512, 73, - 769, 512, 73, 770, 512, 73, 776, 512, 78, 771, 512, 79, 768, 512, 79, - 769, 512, 79, 770, 512, 79, 771, 512, 79, 776, 512, 85, 768, 512, 85, - 769, 512, 85, 770, 512, 85, 776, 512, 89, 769, 512, 97, 768, 512, 97, - 769, 512, 97, 770, 512, 97, 771, 512, 97, 776, 512, 97, 778, 512, 99, - 807, 512, 101, 768, 512, 101, 769, 512, 101, 770, 512, 101, 776, 512, - 105, 768, 512, 105, 769, 512, 105, 770, 512, 105, 776, 512, 110, 771, - 512, 111, 768, 512, 111, 769, 512, 111, 770, 512, 111, 771, 512, 111, - 776, 512, 117, 768, 512, 117, 769, 512, 117, 770, 512, 117, 776, 512, - 121, 769, 512, 121, 776, 512, 65, 772, 512, 97, 772, 512, 65, 774, 512, - 97, 774, 512, 65, 808, 512, 97, 808, 512, 67, 769, 512, 99, 769, 512, 67, - 770, 512, 99, 770, 512, 67, 775, 512, 99, 775, 512, 67, 780, 512, 99, - 780, 512, 68, 780, 512, 100, 780, 512, 69, 772, 512, 101, 772, 512, 69, - 774, 512, 101, 774, 512, 69, 775, 512, 101, 775, 512, 69, 808, 512, 101, - 808, 512, 69, 780, 512, 101, 780, 512, 71, 770, 512, 103, 770, 512, 71, - 774, 512, 103, 774, 512, 71, 775, 512, 103, 775, 512, 71, 807, 512, 103, - 807, 512, 72, 770, 512, 104, 770, 512, 73, 771, 512, 105, 771, 512, 73, - 772, 512, 105, 772, 512, 73, 774, 512, 105, 774, 512, 73, 808, 512, 105, - 808, 512, 73, 775, 514, 73, 74, 514, 105, 106, 512, 74, 770, 512, 106, - 770, 512, 75, 807, 512, 107, 807, 512, 76, 769, 512, 108, 769, 512, 76, - 807, 512, 108, 807, 512, 76, 780, 512, 108, 780, 514, 76, 183, 514, 108, - 183, 512, 78, 769, 512, 110, 769, 512, 78, 807, 512, 110, 807, 512, 78, - 780, 512, 110, 780, 514, 700, 110, 512, 79, 772, 512, 111, 772, 512, 79, - 774, 512, 111, 774, 512, 79, 779, 512, 111, 779, 512, 82, 769, 512, 114, - 769, 512, 82, 807, 512, 114, 807, 512, 82, 780, 512, 114, 780, 512, 83, - 769, 512, 115, 769, 512, 83, 770, 512, 115, 770, 512, 83, 807, 512, 115, - 807, 512, 83, 780, 512, 115, 780, 512, 84, 807, 512, 116, 807, 512, 84, - 780, 512, 116, 780, 512, 85, 771, 512, 117, 771, 512, 85, 772, 512, 117, - 772, 512, 85, 774, 512, 117, 774, 512, 85, 778, 512, 117, 778, 512, 85, - 779, 512, 117, 779, 512, 85, 808, 512, 117, 808, 512, 87, 770, 512, 119, - 770, 512, 89, 770, 512, 121, 770, 512, 89, 776, 512, 90, 769, 512, 122, - 769, 512, 90, 775, 512, 122, 775, 512, 90, 780, 512, 122, 780, 258, 115, - 512, 79, 795, 512, 111, 795, 512, 85, 795, 512, 117, 795, 514, 68, 381, - 514, 68, 382, 514, 100, 382, 514, 76, 74, 514, 76, 106, 514, 108, 106, - 514, 78, 74, 514, 78, 106, 514, 110, 106, 512, 65, 780, 512, 97, 780, - 512, 73, 780, 512, 105, 780, 512, 79, 780, 512, 111, 780, 512, 85, 780, - 512, 117, 780, 512, 220, 772, 512, 252, 772, 512, 220, 769, 512, 252, - 769, 512, 220, 780, 512, 252, 780, 512, 220, 768, 512, 252, 768, 512, - 196, 772, 512, 228, 772, 512, 550, 772, 512, 551, 772, 512, 198, 772, - 512, 230, 772, 512, 71, 780, 512, 103, 780, 512, 75, 780, 512, 107, 780, - 512, 79, 808, 512, 111, 808, 512, 490, 772, 512, 491, 772, 512, 439, 780, - 512, 658, 780, 512, 106, 780, 514, 68, 90, 514, 68, 122, 514, 100, 122, - 512, 71, 769, 512, 103, 769, 512, 78, 768, 512, 110, 768, 512, 197, 769, - 512, 229, 769, 512, 198, 769, 512, 230, 769, 512, 216, 769, 512, 248, - 769, 512, 65, 783, 512, 97, 783, 512, 65, 785, 512, 97, 785, 512, 69, - 783, 512, 101, 783, 512, 69, 785, 512, 101, 785, 512, 73, 783, 512, 105, - 783, 512, 73, 785, 512, 105, 785, 512, 79, 783, 512, 111, 783, 512, 79, - 785, 512, 111, 785, 512, 82, 783, 512, 114, 783, 512, 82, 785, 512, 114, - 785, 512, 85, 783, 512, 117, 783, 512, 85, 785, 512, 117, 785, 512, 83, - 806, 512, 115, 806, 512, 84, 806, 512, 116, 806, 512, 72, 780, 512, 104, - 780, 512, 65, 775, 512, 97, 775, 512, 69, 807, 512, 101, 807, 512, 214, - 772, 512, 246, 772, 512, 213, 772, 512, 245, 772, 512, 79, 775, 512, 111, - 775, 512, 558, 772, 512, 559, 772, 512, 89, 772, 512, 121, 772, 259, 104, - 259, 614, 259, 106, 259, 114, 259, 633, 259, 635, 259, 641, 259, 119, - 259, 121, 514, 32, 774, 514, 32, 775, 514, 32, 778, 514, 32, 808, 514, - 32, 771, 514, 32, 779, 259, 611, 259, 108, 259, 115, 259, 120, 259, 661, - 256, 768, 256, 769, 256, 787, 512, 776, 769, 256, 697, 514, 32, 837, 256, - 59, 514, 32, 769, 512, 168, 769, 512, 913, 769, 256, 183, 512, 917, 769, - 512, 919, 769, 512, 921, 769, 512, 927, 769, 512, 933, 769, 512, 937, - 769, 512, 970, 769, 512, 921, 776, 512, 933, 776, 512, 945, 769, 512, - 949, 769, 512, 951, 769, 512, 953, 769, 512, 971, 769, 512, 953, 776, - 512, 965, 776, 512, 959, 769, 512, 965, 769, 512, 969, 769, 258, 946, - 258, 952, 258, 933, 512, 978, 769, 512, 978, 776, 258, 966, 258, 960, - 258, 954, 258, 961, 258, 962, 258, 920, 258, 949, 258, 931, 512, 1045, - 768, 512, 1045, 776, 512, 1043, 769, 512, 1030, 776, 512, 1050, 769, 512, - 1048, 768, 512, 1059, 774, 512, 1048, 774, 512, 1080, 774, 512, 1077, - 768, 512, 1077, 776, 512, 1075, 769, 512, 1110, 776, 512, 1082, 769, 512, - 1080, 768, 512, 1091, 774, 512, 1140, 783, 512, 1141, 783, 512, 1046, - 774, 512, 1078, 774, 512, 1040, 774, 512, 1072, 774, 512, 1040, 776, 512, - 1072, 776, 512, 1045, 774, 512, 1077, 774, 512, 1240, 776, 512, 1241, - 776, 512, 1046, 776, 512, 1078, 776, 512, 1047, 776, 512, 1079, 776, 512, - 1048, 772, 512, 1080, 772, 512, 1048, 776, 512, 1080, 776, 512, 1054, - 776, 512, 1086, 776, 512, 1256, 776, 512, 1257, 776, 512, 1069, 776, 512, - 1101, 776, 512, 1059, 772, 512, 1091, 772, 512, 1059, 776, 512, 1091, - 776, 512, 1059, 779, 512, 1091, 779, 512, 1063, 776, 512, 1095, 776, 512, - 1067, 776, 512, 1099, 776, 514, 1381, 1410, 512, 1575, 1619, 512, 1575, - 1620, 512, 1608, 1620, 512, 1575, 1621, 512, 1610, 1620, 514, 1575, 1652, - 514, 1608, 1652, 514, 1735, 1652, 514, 1610, 1652, 512, 1749, 1620, 512, - 1729, 1620, 512, 1746, 1620, 512, 2344, 2364, 512, 2352, 2364, 512, 2355, - 2364, 512, 2325, 2364, 512, 2326, 2364, 512, 2327, 2364, 512, 2332, 2364, - 512, 2337, 2364, 512, 2338, 2364, 512, 2347, 2364, 512, 2351, 2364, 512, - 2503, 2494, 512, 2503, 2519, 512, 2465, 2492, 512, 2466, 2492, 512, 2479, - 2492, 512, 2610, 2620, 512, 2616, 2620, 512, 2582, 2620, 512, 2583, 2620, - 512, 2588, 2620, 512, 2603, 2620, 512, 2887, 2902, 512, 2887, 2878, 512, - 2887, 2903, 512, 2849, 2876, 512, 2850, 2876, 512, 2962, 3031, 512, 3014, - 3006, 512, 3015, 3006, 512, 3014, 3031, 512, 3142, 3158, 512, 3263, 3285, - 512, 3270, 3285, 512, 3270, 3286, 512, 3270, 3266, 512, 3274, 3285, 512, - 3398, 3390, 512, 3399, 3390, 512, 3398, 3415, 512, 3545, 3530, 512, 3545, - 3535, 512, 3548, 3530, 512, 3545, 3551, 514, 3661, 3634, 514, 3789, 3762, - 514, 3755, 3737, 514, 3755, 3745, 257, 3851, 512, 3906, 4023, 512, 3916, - 4023, 512, 3921, 4023, 512, 3926, 4023, 512, 3931, 4023, 512, 3904, 4021, - 512, 3953, 3954, 512, 3953, 3956, 512, 4018, 3968, 514, 4018, 3969, 512, - 4019, 3968, 514, 4019, 3969, 512, 3953, 3968, 512, 3986, 4023, 512, 3996, - 4023, 512, 4001, 4023, 512, 4006, 4023, 512, 4011, 4023, 512, 3984, 4021, - 512, 4133, 4142, 259, 4316, 512, 6917, 6965, 512, 6919, 6965, 512, 6921, - 6965, 512, 6923, 6965, 512, 6925, 6965, 512, 6929, 6965, 512, 6970, 6965, - 512, 6972, 6965, 512, 6974, 6965, 512, 6975, 6965, 512, 6978, 6965, 259, - 65, 259, 198, 259, 66, 259, 68, 259, 69, 259, 398, 259, 71, 259, 72, 259, - 73, 259, 74, 259, 75, 259, 76, 259, 77, 259, 78, 259, 79, 259, 546, 259, - 80, 259, 82, 259, 84, 259, 85, 259, 87, 259, 97, 259, 592, 259, 593, 259, - 7426, 259, 98, 259, 100, 259, 101, 259, 601, 259, 603, 259, 604, 259, - 103, 259, 107, 259, 109, 259, 331, 259, 111, 259, 596, 259, 7446, 259, - 7447, 259, 112, 259, 116, 259, 117, 259, 7453, 259, 623, 259, 118, 259, - 7461, 259, 946, 259, 947, 259, 948, 259, 966, 259, 967, 261, 105, 261, - 114, 261, 117, 261, 118, 261, 946, 261, 947, 261, 961, 261, 966, 261, - 967, 259, 1085, 259, 594, 259, 99, 259, 597, 259, 240, 259, 604, 259, - 102, 259, 607, 259, 609, 259, 613, 259, 616, 259, 617, 259, 618, 259, - 7547, 259, 669, 259, 621, 259, 7557, 259, 671, 259, 625, 259, 624, 259, - 626, 259, 627, 259, 628, 259, 629, 259, 632, 259, 642, 259, 643, 259, - 427, 259, 649, 259, 650, 259, 7452, 259, 651, 259, 652, 259, 122, 259, - 656, 259, 657, 259, 658, 259, 952, 512, 65, 805, 512, 97, 805, 512, 66, - 775, 512, 98, 775, 512, 66, 803, 512, 98, 803, 512, 66, 817, 512, 98, - 817, 512, 199, 769, 512, 231, 769, 512, 68, 775, 512, 100, 775, 512, 68, - 803, 512, 100, 803, 512, 68, 817, 512, 100, 817, 512, 68, 807, 512, 100, - 807, 512, 68, 813, 512, 100, 813, 512, 274, 768, 512, 275, 768, 512, 274, - 769, 512, 275, 769, 512, 69, 813, 512, 101, 813, 512, 69, 816, 512, 101, - 816, 512, 552, 774, 512, 553, 774, 512, 70, 775, 512, 102, 775, 512, 71, - 772, 512, 103, 772, 512, 72, 775, 512, 104, 775, 512, 72, 803, 512, 104, - 803, 512, 72, 776, 512, 104, 776, 512, 72, 807, 512, 104, 807, 512, 72, - 814, 512, 104, 814, 512, 73, 816, 512, 105, 816, 512, 207, 769, 512, 239, - 769, 512, 75, 769, 512, 107, 769, 512, 75, 803, 512, 107, 803, 512, 75, - 817, 512, 107, 817, 512, 76, 803, 512, 108, 803, 512, 7734, 772, 512, - 7735, 772, 512, 76, 817, 512, 108, 817, 512, 76, 813, 512, 108, 813, 512, - 77, 769, 512, 109, 769, 512, 77, 775, 512, 109, 775, 512, 77, 803, 512, - 109, 803, 512, 78, 775, 512, 110, 775, 512, 78, 803, 512, 110, 803, 512, - 78, 817, 512, 110, 817, 512, 78, 813, 512, 110, 813, 512, 213, 769, 512, - 245, 769, 512, 213, 776, 512, 245, 776, 512, 332, 768, 512, 333, 768, - 512, 332, 769, 512, 333, 769, 512, 80, 769, 512, 112, 769, 512, 80, 775, - 512, 112, 775, 512, 82, 775, 512, 114, 775, 512, 82, 803, 512, 114, 803, - 512, 7770, 772, 512, 7771, 772, 512, 82, 817, 512, 114, 817, 512, 83, - 775, 512, 115, 775, 512, 83, 803, 512, 115, 803, 512, 346, 775, 512, 347, - 775, 512, 352, 775, 512, 353, 775, 512, 7778, 775, 512, 7779, 775, 512, - 84, 775, 512, 116, 775, 512, 84, 803, 512, 116, 803, 512, 84, 817, 512, - 116, 817, 512, 84, 813, 512, 116, 813, 512, 85, 804, 512, 117, 804, 512, - 85, 816, 512, 117, 816, 512, 85, 813, 512, 117, 813, 512, 360, 769, 512, - 361, 769, 512, 362, 776, 512, 363, 776, 512, 86, 771, 512, 118, 771, 512, - 86, 803, 512, 118, 803, 512, 87, 768, 512, 119, 768, 512, 87, 769, 512, - 119, 769, 512, 87, 776, 512, 119, 776, 512, 87, 775, 512, 119, 775, 512, - 87, 803, 512, 119, 803, 512, 88, 775, 512, 120, 775, 512, 88, 776, 512, - 120, 776, 512, 89, 775, 512, 121, 775, 512, 90, 770, 512, 122, 770, 512, - 90, 803, 512, 122, 803, 512, 90, 817, 512, 122, 817, 512, 104, 817, 512, - 116, 776, 512, 119, 778, 512, 121, 778, 514, 97, 702, 512, 383, 775, 512, - 65, 803, 512, 97, 803, 512, 65, 777, 512, 97, 777, 512, 194, 769, 512, - 226, 769, 512, 194, 768, 512, 226, 768, 512, 194, 777, 512, 226, 777, - 512, 194, 771, 512, 226, 771, 512, 7840, 770, 512, 7841, 770, 512, 258, - 769, 512, 259, 769, 512, 258, 768, 512, 259, 768, 512, 258, 777, 512, - 259, 777, 512, 258, 771, 512, 259, 771, 512, 7840, 774, 512, 7841, 774, - 512, 69, 803, 512, 101, 803, 512, 69, 777, 512, 101, 777, 512, 69, 771, - 512, 101, 771, 512, 202, 769, 512, 234, 769, 512, 202, 768, 512, 234, - 768, 512, 202, 777, 512, 234, 777, 512, 202, 771, 512, 234, 771, 512, - 7864, 770, 512, 7865, 770, 512, 73, 777, 512, 105, 777, 512, 73, 803, - 512, 105, 803, 512, 79, 803, 512, 111, 803, 512, 79, 777, 512, 111, 777, - 512, 212, 769, 512, 244, 769, 512, 212, 768, 512, 244, 768, 512, 212, - 777, 512, 244, 777, 512, 212, 771, 512, 244, 771, 512, 7884, 770, 512, - 7885, 770, 512, 416, 769, 512, 417, 769, 512, 416, 768, 512, 417, 768, - 512, 416, 777, 512, 417, 777, 512, 416, 771, 512, 417, 771, 512, 416, - 803, 512, 417, 803, 512, 85, 803, 512, 117, 803, 512, 85, 777, 512, 117, - 777, 512, 431, 769, 512, 432, 769, 512, 431, 768, 512, 432, 768, 512, - 431, 777, 512, 432, 777, 512, 431, 771, 512, 432, 771, 512, 431, 803, - 512, 432, 803, 512, 89, 768, 512, 121, 768, 512, 89, 803, 512, 121, 803, - 512, 89, 777, 512, 121, 777, 512, 89, 771, 512, 121, 771, 512, 945, 787, - 512, 945, 788, 512, 7936, 768, 512, 7937, 768, 512, 7936, 769, 512, 7937, - 769, 512, 7936, 834, 512, 7937, 834, 512, 913, 787, 512, 913, 788, 512, - 7944, 768, 512, 7945, 768, 512, 7944, 769, 512, 7945, 769, 512, 7944, - 834, 512, 7945, 834, 512, 949, 787, 512, 949, 788, 512, 7952, 768, 512, - 7953, 768, 512, 7952, 769, 512, 7953, 769, 512, 917, 787, 512, 917, 788, - 512, 7960, 768, 512, 7961, 768, 512, 7960, 769, 512, 7961, 769, 512, 951, - 787, 512, 951, 788, 512, 7968, 768, 512, 7969, 768, 512, 7968, 769, 512, - 7969, 769, 512, 7968, 834, 512, 7969, 834, 512, 919, 787, 512, 919, 788, - 512, 7976, 768, 512, 7977, 768, 512, 7976, 769, 512, 7977, 769, 512, - 7976, 834, 512, 7977, 834, 512, 953, 787, 512, 953, 788, 512, 7984, 768, - 512, 7985, 768, 512, 7984, 769, 512, 7985, 769, 512, 7984, 834, 512, - 7985, 834, 512, 921, 787, 512, 921, 788, 512, 7992, 768, 512, 7993, 768, - 512, 7992, 769, 512, 7993, 769, 512, 7992, 834, 512, 7993, 834, 512, 959, - 787, 512, 959, 788, 512, 8000, 768, 512, 8001, 768, 512, 8000, 769, 512, - 8001, 769, 512, 927, 787, 512, 927, 788, 512, 8008, 768, 512, 8009, 768, - 512, 8008, 769, 512, 8009, 769, 512, 965, 787, 512, 965, 788, 512, 8016, - 768, 512, 8017, 768, 512, 8016, 769, 512, 8017, 769, 512, 8016, 834, 512, - 8017, 834, 512, 933, 788, 512, 8025, 768, 512, 8025, 769, 512, 8025, 834, - 512, 969, 787, 512, 969, 788, 512, 8032, 768, 512, 8033, 768, 512, 8032, - 769, 512, 8033, 769, 512, 8032, 834, 512, 8033, 834, 512, 937, 787, 512, - 937, 788, 512, 8040, 768, 512, 8041, 768, 512, 8040, 769, 512, 8041, 769, - 512, 8040, 834, 512, 8041, 834, 512, 945, 768, 256, 940, 512, 949, 768, - 256, 941, 512, 951, 768, 256, 942, 512, 953, 768, 256, 943, 512, 959, - 768, 256, 972, 512, 965, 768, 256, 973, 512, 969, 768, 256, 974, 512, - 7936, 837, 512, 7937, 837, 512, 7938, 837, 512, 7939, 837, 512, 7940, - 837, 512, 7941, 837, 512, 7942, 837, 512, 7943, 837, 512, 7944, 837, 512, - 7945, 837, 512, 7946, 837, 512, 7947, 837, 512, 7948, 837, 512, 7949, - 837, 512, 7950, 837, 512, 7951, 837, 512, 7968, 837, 512, 7969, 837, 512, - 7970, 837, 512, 7971, 837, 512, 7972, 837, 512, 7973, 837, 512, 7974, - 837, 512, 7975, 837, 512, 7976, 837, 512, 7977, 837, 512, 7978, 837, 512, - 7979, 837, 512, 7980, 837, 512, 7981, 837, 512, 7982, 837, 512, 7983, - 837, 512, 8032, 837, 512, 8033, 837, 512, 8034, 837, 512, 8035, 837, 512, - 8036, 837, 512, 8037, 837, 512, 8038, 837, 512, 8039, 837, 512, 8040, - 837, 512, 8041, 837, 512, 8042, 837, 512, 8043, 837, 512, 8044, 837, 512, - 8045, 837, 512, 8046, 837, 512, 8047, 837, 512, 945, 774, 512, 945, 772, - 512, 8048, 837, 512, 945, 837, 512, 940, 837, 512, 945, 834, 512, 8118, - 837, 512, 913, 774, 512, 913, 772, 512, 913, 768, 256, 902, 512, 913, - 837, 514, 32, 787, 256, 953, 514, 32, 787, 514, 32, 834, 512, 168, 834, - 512, 8052, 837, 512, 951, 837, 512, 942, 837, 512, 951, 834, 512, 8134, - 837, 512, 917, 768, 256, 904, 512, 919, 768, 256, 905, 512, 919, 837, - 512, 8127, 768, 512, 8127, 769, 512, 8127, 834, 512, 953, 774, 512, 953, - 772, 512, 970, 768, 256, 912, 512, 953, 834, 512, 970, 834, 512, 921, - 774, 512, 921, 772, 512, 921, 768, 256, 906, 512, 8190, 768, 512, 8190, - 769, 512, 8190, 834, 512, 965, 774, 512, 965, 772, 512, 971, 768, 256, - 944, 512, 961, 787, 512, 961, 788, 512, 965, 834, 512, 971, 834, 512, - 933, 774, 512, 933, 772, 512, 933, 768, 256, 910, 512, 929, 788, 512, - 168, 768, 256, 901, 256, 96, 512, 8060, 837, 512, 969, 837, 512, 974, - 837, 512, 969, 834, 512, 8182, 837, 512, 927, 768, 256, 908, 512, 937, - 768, 256, 911, 512, 937, 837, 256, 180, 514, 32, 788, 256, 8194, 256, - 8195, 258, 32, 258, 32, 258, 32, 258, 32, 258, 32, 257, 32, 258, 32, 258, - 32, 258, 32, 257, 8208, 514, 32, 819, 258, 46, 514, 46, 46, 770, 46, 46, - 46, 257, 32, 514, 8242, 8242, 770, 8242, 8242, 8242, 514, 8245, 8245, - 770, 8245, 8245, 8245, 514, 33, 33, 514, 32, 773, 514, 63, 63, 514, 63, - 33, 514, 33, 63, 1026, 8242, 8242, 8242, 8242, 258, 32, 259, 48, 259, - 105, 259, 52, 259, 53, 259, 54, 259, 55, 259, 56, 259, 57, 259, 43, 259, - 8722, 259, 61, 259, 40, 259, 41, 259, 110, 261, 48, 261, 49, 261, 50, - 261, 51, 261, 52, 261, 53, 261, 54, 261, 55, 261, 56, 261, 57, 261, 43, - 261, 8722, 261, 61, 261, 40, 261, 41, 261, 97, 261, 101, 261, 111, 261, - 120, 261, 601, 261, 104, 261, 107, 261, 108, 261, 109, 261, 110, 261, - 112, 261, 115, 261, 116, 514, 82, 115, 770, 97, 47, 99, 770, 97, 47, 115, - 262, 67, 514, 176, 67, 770, 99, 47, 111, 770, 99, 47, 117, 258, 400, 514, - 176, 70, 262, 103, 262, 72, 262, 72, 262, 72, 262, 104, 262, 295, 262, - 73, 262, 73, 262, 76, 262, 108, 262, 78, 514, 78, 111, 262, 80, 262, 81, - 262, 82, 262, 82, 262, 82, 515, 83, 77, 770, 84, 69, 76, 515, 84, 77, - 262, 90, 256, 937, 262, 90, 256, 75, 256, 197, 262, 66, 262, 67, 262, - 101, 262, 69, 262, 70, 262, 77, 262, 111, 258, 1488, 258, 1489, 258, - 1490, 258, 1491, 262, 105, 770, 70, 65, 88, 262, 960, 262, 947, 262, 915, - 262, 928, 262, 8721, 262, 68, 262, 100, 262, 101, 262, 105, 262, 106, - 772, 49, 8260, 55, 772, 49, 8260, 57, 1028, 49, 8260, 49, 48, 772, 49, - 8260, 51, 772, 50, 8260, 51, 772, 49, 8260, 53, 772, 50, 8260, 53, 772, - 51, 8260, 53, 772, 52, 8260, 53, 772, 49, 8260, 54, 772, 53, 8260, 54, - 772, 49, 8260, 56, 772, 51, 8260, 56, 772, 53, 8260, 56, 772, 55, 8260, - 56, 516, 49, 8260, 258, 73, 514, 73, 73, 770, 73, 73, 73, 514, 73, 86, - 258, 86, 514, 86, 73, 770, 86, 73, 73, 1026, 86, 73, 73, 73, 514, 73, 88, - 258, 88, 514, 88, 73, 770, 88, 73, 73, 258, 76, 258, 67, 258, 68, 258, - 77, 258, 105, 514, 105, 105, 770, 105, 105, 105, 514, 105, 118, 258, 118, - 514, 118, 105, 770, 118, 105, 105, 1026, 118, 105, 105, 105, 514, 105, - 120, 258, 120, 514, 120, 105, 770, 120, 105, 105, 258, 108, 258, 99, 258, - 100, 258, 109, 772, 48, 8260, 51, 512, 8592, 824, 512, 8594, 824, 512, - 8596, 824, 512, 8656, 824, 512, 8660, 824, 512, 8658, 824, 512, 8707, - 824, 512, 8712, 824, 512, 8715, 824, 512, 8739, 824, 512, 8741, 824, 514, - 8747, 8747, 770, 8747, 8747, 8747, 514, 8750, 8750, 770, 8750, 8750, - 8750, 512, 8764, 824, 512, 8771, 824, 512, 8773, 824, 512, 8776, 824, - 512, 61, 824, 512, 8801, 824, 512, 8781, 824, 512, 60, 824, 512, 62, 824, - 512, 8804, 824, 512, 8805, 824, 512, 8818, 824, 512, 8819, 824, 512, - 8822, 824, 512, 8823, 824, 512, 8826, 824, 512, 8827, 824, 512, 8834, - 824, 512, 8835, 824, 512, 8838, 824, 512, 8839, 824, 512, 8866, 824, 512, - 8872, 824, 512, 8873, 824, 512, 8875, 824, 512, 8828, 824, 512, 8829, - 824, 512, 8849, 824, 512, 8850, 824, 512, 8882, 824, 512, 8883, 824, 512, - 8884, 824, 512, 8885, 824, 256, 12296, 256, 12297, 263, 49, 263, 50, 263, - 51, 263, 52, 263, 53, 263, 54, 263, 55, 263, 56, 263, 57, 519, 49, 48, - 519, 49, 49, 519, 49, 50, 519, 49, 51, 519, 49, 52, 519, 49, 53, 519, 49, - 54, 519, 49, 55, 519, 49, 56, 519, 49, 57, 519, 50, 48, 770, 40, 49, 41, - 770, 40, 50, 41, 770, 40, 51, 41, 770, 40, 52, 41, 770, 40, 53, 41, 770, - 40, 54, 41, 770, 40, 55, 41, 770, 40, 56, 41, 770, 40, 57, 41, 1026, 40, - 49, 48, 41, 1026, 40, 49, 49, 41, 1026, 40, 49, 50, 41, 1026, 40, 49, 51, - 41, 1026, 40, 49, 52, 41, 1026, 40, 49, 53, 41, 1026, 40, 49, 54, 41, - 1026, 40, 49, 55, 41, 1026, 40, 49, 56, 41, 1026, 40, 49, 57, 41, 1026, - 40, 50, 48, 41, 514, 49, 46, 514, 50, 46, 514, 51, 46, 514, 52, 46, 514, - 53, 46, 514, 54, 46, 514, 55, 46, 514, 56, 46, 514, 57, 46, 770, 49, 48, - 46, 770, 49, 49, 46, 770, 49, 50, 46, 770, 49, 51, 46, 770, 49, 52, 46, - 770, 49, 53, 46, 770, 49, 54, 46, 770, 49, 55, 46, 770, 49, 56, 46, 770, - 49, 57, 46, 770, 50, 48, 46, 770, 40, 97, 41, 770, 40, 98, 41, 770, 40, - 99, 41, 770, 40, 100, 41, 770, 40, 101, 41, 770, 40, 102, 41, 770, 40, - 103, 41, 770, 40, 104, 41, 770, 40, 105, 41, 770, 40, 106, 41, 770, 40, - 107, 41, 770, 40, 108, 41, 770, 40, 109, 41, 770, 40, 110, 41, 770, 40, - 111, 41, 770, 40, 112, 41, 770, 40, 113, 41, 770, 40, 114, 41, 770, 40, - 115, 41, 770, 40, 116, 41, 770, 40, 117, 41, 770, 40, 118, 41, 770, 40, - 119, 41, 770, 40, 120, 41, 770, 40, 121, 41, 770, 40, 122, 41, 263, 65, - 263, 66, 263, 67, 263, 68, 263, 69, 263, 70, 263, 71, 263, 72, 263, 73, - 263, 74, 263, 75, 263, 76, 263, 77, 263, 78, 263, 79, 263, 80, 263, 81, - 263, 82, 263, 83, 263, 84, 263, 85, 263, 86, 263, 87, 263, 88, 263, 89, - 263, 90, 263, 97, 263, 98, 263, 99, 263, 100, 263, 101, 263, 102, 263, - 103, 263, 104, 263, 105, 263, 106, 263, 107, 263, 108, 263, 109, 263, - 110, 263, 111, 263, 112, 263, 113, 263, 114, 263, 115, 263, 116, 263, - 117, 263, 118, 263, 119, 263, 120, 263, 121, 263, 122, 263, 48, 1026, - 8747, 8747, 8747, 8747, 770, 58, 58, 61, 514, 61, 61, 770, 61, 61, 61, - 512, 10973, 824, 261, 106, 259, 86, 259, 11617, 258, 27597, 258, 40863, - 258, 19968, 258, 20008, 258, 20022, 258, 20031, 258, 20057, 258, 20101, - 258, 20108, 258, 20128, 258, 20154, 258, 20799, 258, 20837, 258, 20843, - 258, 20866, 258, 20886, 258, 20907, 258, 20960, 258, 20981, 258, 20992, - 258, 21147, 258, 21241, 258, 21269, 258, 21274, 258, 21304, 258, 21313, - 258, 21340, 258, 21353, 258, 21378, 258, 21430, 258, 21448, 258, 21475, - 258, 22231, 258, 22303, 258, 22763, 258, 22786, 258, 22794, 258, 22805, - 258, 22823, 258, 22899, 258, 23376, 258, 23424, 258, 23544, 258, 23567, - 258, 23586, 258, 23608, 258, 23662, 258, 23665, 258, 24027, 258, 24037, - 258, 24049, 258, 24062, 258, 24178, 258, 24186, 258, 24191, 258, 24308, - 258, 24318, 258, 24331, 258, 24339, 258, 24400, 258, 24417, 258, 24435, - 258, 24515, 258, 25096, 258, 25142, 258, 25163, 258, 25903, 258, 25908, - 258, 25991, 258, 26007, 258, 26020, 258, 26041, 258, 26080, 258, 26085, - 258, 26352, 258, 26376, 258, 26408, 258, 27424, 258, 27490, 258, 27513, - 258, 27571, 258, 27595, 258, 27604, 258, 27611, 258, 27663, 258, 27668, - 258, 27700, 258, 28779, 258, 29226, 258, 29238, 258, 29243, 258, 29247, - 258, 29255, 258, 29273, 258, 29275, 258, 29356, 258, 29572, 258, 29577, - 258, 29916, 258, 29926, 258, 29976, 258, 29983, 258, 29992, 258, 30000, - 258, 30091, 258, 30098, 258, 30326, 258, 30333, 258, 30382, 258, 30399, - 258, 30446, 258, 30683, 258, 30690, 258, 30707, 258, 31034, 258, 31160, - 258, 31166, 258, 31348, 258, 31435, 258, 31481, 258, 31859, 258, 31992, - 258, 32566, 258, 32593, 258, 32650, 258, 32701, 258, 32769, 258, 32780, - 258, 32786, 258, 32819, 258, 32895, 258, 32905, 258, 33251, 258, 33258, - 258, 33267, 258, 33276, 258, 33292, 258, 33307, 258, 33311, 258, 33390, - 258, 33394, 258, 33400, 258, 34381, 258, 34411, 258, 34880, 258, 34892, - 258, 34915, 258, 35198, 258, 35211, 258, 35282, 258, 35328, 258, 35895, - 258, 35910, 258, 35925, 258, 35960, 258, 35997, 258, 36196, 258, 36208, - 258, 36275, 258, 36523, 258, 36554, 258, 36763, 258, 36784, 258, 36789, - 258, 37009, 258, 37193, 258, 37318, 258, 37324, 258, 37329, 258, 38263, - 258, 38272, 258, 38428, 258, 38582, 258, 38585, 258, 38632, 258, 38737, - 258, 38750, 258, 38754, 258, 38761, 258, 38859, 258, 38893, 258, 38899, - 258, 38913, 258, 39080, 258, 39131, 258, 39135, 258, 39318, 258, 39321, - 258, 39340, 258, 39592, 258, 39640, 258, 39647, 258, 39717, 258, 39727, - 258, 39730, 258, 39740, 258, 39770, 258, 40165, 258, 40565, 258, 40575, - 258, 40613, 258, 40635, 258, 40643, 258, 40653, 258, 40657, 258, 40697, - 258, 40701, 258, 40718, 258, 40723, 258, 40736, 258, 40763, 258, 40778, - 258, 40786, 258, 40845, 258, 40860, 258, 40864, 264, 32, 258, 12306, 258, - 21313, 258, 21316, 258, 21317, 512, 12363, 12441, 512, 12365, 12441, 512, - 12367, 12441, 512, 12369, 12441, 512, 12371, 12441, 512, 12373, 12441, - 512, 12375, 12441, 512, 12377, 12441, 512, 12379, 12441, 512, 12381, - 12441, 512, 12383, 12441, 512, 12385, 12441, 512, 12388, 12441, 512, - 12390, 12441, 512, 12392, 12441, 512, 12399, 12441, 512, 12399, 12442, - 512, 12402, 12441, 512, 12402, 12442, 512, 12405, 12441, 512, 12405, - 12442, 512, 12408, 12441, 512, 12408, 12442, 512, 12411, 12441, 512, - 12411, 12442, 512, 12358, 12441, 514, 32, 12441, 514, 32, 12442, 512, - 12445, 12441, 521, 12424, 12426, 512, 12459, 12441, 512, 12461, 12441, - 512, 12463, 12441, 512, 12465, 12441, 512, 12467, 12441, 512, 12469, - 12441, 512, 12471, 12441, 512, 12473, 12441, 512, 12475, 12441, 512, - 12477, 12441, 512, 12479, 12441, 512, 12481, 12441, 512, 12484, 12441, - 512, 12486, 12441, 512, 12488, 12441, 512, 12495, 12441, 512, 12495, - 12442, 512, 12498, 12441, 512, 12498, 12442, 512, 12501, 12441, 512, - 12501, 12442, 512, 12504, 12441, 512, 12504, 12442, 512, 12507, 12441, - 512, 12507, 12442, 512, 12454, 12441, 512, 12527, 12441, 512, 12528, - 12441, 512, 12529, 12441, 512, 12530, 12441, 512, 12541, 12441, 521, - 12467, 12488, 258, 4352, 258, 4353, 258, 4522, 258, 4354, 258, 4524, 258, - 4525, 258, 4355, 258, 4356, 258, 4357, 258, 4528, 258, 4529, 258, 4530, - 258, 4531, 258, 4532, 258, 4533, 258, 4378, 258, 4358, 258, 4359, 258, - 4360, 258, 4385, 258, 4361, 258, 4362, 258, 4363, 258, 4364, 258, 4365, - 258, 4366, 258, 4367, 258, 4368, 258, 4369, 258, 4370, 258, 4449, 258, - 4450, 258, 4451, 258, 4452, 258, 4453, 258, 4454, 258, 4455, 258, 4456, - 258, 4457, 258, 4458, 258, 4459, 258, 4460, 258, 4461, 258, 4462, 258, - 4463, 258, 4464, 258, 4465, 258, 4466, 258, 4467, 258, 4468, 258, 4469, - 258, 4448, 258, 4372, 258, 4373, 258, 4551, 258, 4552, 258, 4556, 258, - 4558, 258, 4563, 258, 4567, 258, 4569, 258, 4380, 258, 4573, 258, 4575, - 258, 4381, 258, 4382, 258, 4384, 258, 4386, 258, 4387, 258, 4391, 258, - 4393, 258, 4395, 258, 4396, 258, 4397, 258, 4398, 258, 4399, 258, 4402, - 258, 4406, 258, 4416, 258, 4423, 258, 4428, 258, 4593, 258, 4594, 258, - 4439, 258, 4440, 258, 4441, 258, 4484, 258, 4485, 258, 4488, 258, 4497, - 258, 4498, 258, 4500, 258, 4510, 258, 4513, 259, 19968, 259, 20108, 259, - 19977, 259, 22235, 259, 19978, 259, 20013, 259, 19979, 259, 30002, 259, - 20057, 259, 19993, 259, 19969, 259, 22825, 259, 22320, 259, 20154, 770, - 40, 4352, 41, 770, 40, 4354, 41, 770, 40, 4355, 41, 770, 40, 4357, 41, - 770, 40, 4358, 41, 770, 40, 4359, 41, 770, 40, 4361, 41, 770, 40, 4363, - 41, 770, 40, 4364, 41, 770, 40, 4366, 41, 770, 40, 4367, 41, 770, 40, - 4368, 41, 770, 40, 4369, 41, 770, 40, 4370, 41, 1026, 40, 4352, 4449, 41, - 1026, 40, 4354, 4449, 41, 1026, 40, 4355, 4449, 41, 1026, 40, 4357, 4449, - 41, 1026, 40, 4358, 4449, 41, 1026, 40, 4359, 4449, 41, 1026, 40, 4361, - 4449, 41, 1026, 40, 4363, 4449, 41, 1026, 40, 4364, 4449, 41, 1026, 40, - 4366, 4449, 41, 1026, 40, 4367, 4449, 41, 1026, 40, 4368, 4449, 41, 1026, - 40, 4369, 4449, 41, 1026, 40, 4370, 4449, 41, 1026, 40, 4364, 4462, 41, - 1794, 40, 4363, 4457, 4364, 4453, 4523, 41, 1538, 40, 4363, 4457, 4370, - 4462, 41, 770, 40, 19968, 41, 770, 40, 20108, 41, 770, 40, 19977, 41, - 770, 40, 22235, 41, 770, 40, 20116, 41, 770, 40, 20845, 41, 770, 40, - 19971, 41, 770, 40, 20843, 41, 770, 40, 20061, 41, 770, 40, 21313, 41, - 770, 40, 26376, 41, 770, 40, 28779, 41, 770, 40, 27700, 41, 770, 40, - 26408, 41, 770, 40, 37329, 41, 770, 40, 22303, 41, 770, 40, 26085, 41, - 770, 40, 26666, 41, 770, 40, 26377, 41, 770, 40, 31038, 41, 770, 40, - 21517, 41, 770, 40, 29305, 41, 770, 40, 36001, 41, 770, 40, 31069, 41, - 770, 40, 21172, 41, 770, 40, 20195, 41, 770, 40, 21628, 41, 770, 40, - 23398, 41, 770, 40, 30435, 41, 770, 40, 20225, 41, 770, 40, 36039, 41, - 770, 40, 21332, 41, 770, 40, 31085, 41, 770, 40, 20241, 41, 770, 40, - 33258, 41, 770, 40, 33267, 41, 263, 21839, 263, 24188, 263, 25991, 263, - 31631, 778, 80, 84, 69, 519, 50, 49, 519, 50, 50, 519, 50, 51, 519, 50, - 52, 519, 50, 53, 519, 50, 54, 519, 50, 55, 519, 50, 56, 519, 50, 57, 519, - 51, 48, 519, 51, 49, 519, 51, 50, 519, 51, 51, 519, 51, 52, 519, 51, 53, - 263, 4352, 263, 4354, 263, 4355, 263, 4357, 263, 4358, 263, 4359, 263, - 4361, 263, 4363, 263, 4364, 263, 4366, 263, 4367, 263, 4368, 263, 4369, - 263, 4370, 519, 4352, 4449, 519, 4354, 4449, 519, 4355, 4449, 519, 4357, - 4449, 519, 4358, 4449, 519, 4359, 4449, 519, 4361, 4449, 519, 4363, 4449, - 519, 4364, 4449, 519, 4366, 4449, 519, 4367, 4449, 519, 4368, 4449, 519, - 4369, 4449, 519, 4370, 4449, 1287, 4366, 4449, 4535, 4352, 4457, 1031, - 4364, 4462, 4363, 4468, 519, 4363, 4462, 263, 19968, 263, 20108, 263, - 19977, 263, 22235, 263, 20116, 263, 20845, 263, 19971, 263, 20843, 263, - 20061, 263, 21313, 263, 26376, 263, 28779, 263, 27700, 263, 26408, 263, - 37329, 263, 22303, 263, 26085, 263, 26666, 263, 26377, 263, 31038, 263, - 21517, 263, 29305, 263, 36001, 263, 31069, 263, 21172, 263, 31192, 263, - 30007, 263, 22899, 263, 36969, 263, 20778, 263, 21360, 263, 27880, 263, - 38917, 263, 20241, 263, 20889, 263, 27491, 263, 19978, 263, 20013, 263, - 19979, 263, 24038, 263, 21491, 263, 21307, 263, 23447, 263, 23398, 263, - 30435, 263, 20225, 263, 36039, 263, 21332, 263, 22812, 519, 51, 54, 519, - 51, 55, 519, 51, 56, 519, 51, 57, 519, 52, 48, 519, 52, 49, 519, 52, 50, - 519, 52, 51, 519, 52, 52, 519, 52, 53, 519, 52, 54, 519, 52, 55, 519, 52, - 56, 519, 52, 57, 519, 53, 48, 514, 49, 26376, 514, 50, 26376, 514, 51, - 26376, 514, 52, 26376, 514, 53, 26376, 514, 54, 26376, 514, 55, 26376, - 514, 56, 26376, 514, 57, 26376, 770, 49, 48, 26376, 770, 49, 49, 26376, - 770, 49, 50, 26376, 522, 72, 103, 778, 101, 114, 103, 522, 101, 86, 778, - 76, 84, 68, 263, 12450, 263, 12452, 263, 12454, 263, 12456, 263, 12458, - 263, 12459, 263, 12461, 263, 12463, 263, 12465, 263, 12467, 263, 12469, - 263, 12471, 263, 12473, 263, 12475, 263, 12477, 263, 12479, 263, 12481, - 263, 12484, 263, 12486, 263, 12488, 263, 12490, 263, 12491, 263, 12492, - 263, 12493, 263, 12494, 263, 12495, 263, 12498, 263, 12501, 263, 12504, - 263, 12507, 263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, - 263, 12516, 263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, - 263, 12524, 263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, - 1034, 12450, 12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, - 12450, 12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, - 12531, 12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, - 12456, 12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, - 12458, 12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, - 1034, 12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, - 12460, 12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, - 12462, 12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, - 12523, 12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, - 12512, 1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, - 12525, 12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, - 12512, 12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, - 12463, 12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, - 12490, 778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, - 12469, 12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, - 12475, 12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, - 522, 12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, - 12494, 778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, - 12540, 12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, - 12524, 12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, - 12523, 522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, - 12483, 12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, - 12471, 12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, - 12540, 12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, - 12523, 12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, - 12505, 12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, - 12488, 522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, - 12523, 778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, - 12510, 12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, - 1290, 12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, - 12531, 522, 12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, - 12513, 12460, 1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, - 12488, 12523, 778, 12516, 12540, 12489, 778, 12516, 12540, 12523, 778, - 12518, 12450, 12531, 1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, - 778, 12523, 12500, 12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, - 12512, 1290, 12524, 12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, - 514, 48, 28857, 514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, - 28857, 514, 53, 28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, - 514, 57, 28857, 770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, - 28857, 770, 49, 51, 28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, - 49, 54, 28857, 770, 49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, - 28857, 770, 50, 48, 28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, - 50, 51, 28857, 770, 50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, - 65, 85, 778, 98, 97, 114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, - 100, 109, 178, 778, 100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, - 26157, 21644, 522, 22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, - 20250, 31038, 522, 112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, - 522, 107, 65, 522, 75, 66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, - 1034, 107, 99, 97, 108, 522, 112, 70, 522, 110, 70, 522, 956, 70, 522, - 956, 103, 522, 109, 103, 522, 107, 103, 522, 72, 122, 778, 107, 72, 122, - 778, 77, 72, 122, 778, 71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, - 522, 109, 8467, 522, 100, 8467, 522, 107, 8467, 522, 102, 109, 522, 110, - 109, 522, 956, 109, 522, 109, 109, 522, 99, 109, 522, 107, 109, 778, 109, - 109, 178, 778, 99, 109, 178, 522, 109, 178, 778, 107, 109, 178, 778, 109, - 109, 179, 778, 99, 109, 179, 522, 109, 179, 778, 107, 109, 179, 778, 109, - 8725, 115, 1034, 109, 8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, - 77, 80, 97, 778, 71, 80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, - 115, 1546, 114, 97, 100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, - 522, 956, 115, 522, 109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, - 522, 109, 86, 522, 107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, - 956, 87, 522, 109, 87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, - 937, 1034, 97, 46, 109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, - 1034, 67, 8725, 107, 103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, - 522, 104, 97, 522, 72, 80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, - 107, 116, 522, 108, 109, 522, 108, 110, 778, 108, 111, 103, 522, 108, - 120, 522, 109, 98, 778, 109, 105, 108, 778, 109, 111, 108, 522, 80, 72, - 1034, 112, 46, 109, 46, 778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, - 83, 118, 522, 87, 98, 778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, - 26085, 514, 50, 26085, 514, 51, 26085, 514, 52, 26085, 514, 53, 26085, - 514, 54, 26085, 514, 55, 26085, 514, 56, 26085, 514, 57, 26085, 770, 49, - 48, 26085, 770, 49, 49, 26085, 770, 49, 50, 26085, 770, 49, 51, 26085, - 770, 49, 52, 26085, 770, 49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, - 26085, 770, 49, 56, 26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, - 50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, - 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, - 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, - 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, 294, - 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, 256, - 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, - 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, - 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, - 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, - 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, - 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, - 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, - 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, - 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, - 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, - 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, - 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, - 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, - 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, - 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, - 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, - 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, - 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, - 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, - 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, - 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, - 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, - 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, - 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, - 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, - 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, - 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, - 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, - 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, - 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, - 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, - 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, - 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, - 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, - 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, - 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, - 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, - 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, - 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, - 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, - 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, - 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, - 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, - 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, - 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, - 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, - 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, - 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, - 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, 256, - 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, 256, - 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, 256, - 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, 256, - 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, 256, - 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, 256, - 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, 256, - 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, 256, - 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, 256, - 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, 256, - 38911, 256, 38971, 256, 24693, 256, 55376, 57070, 256, 33304, 256, 20006, - 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, - 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, - 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, - 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, - 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, - 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, - 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, - 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, - 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, - 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, - 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, - 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, - 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, - 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, - 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, - 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 55370, 56394, 256, - 55370, 56388, 256, 55372, 57301, 256, 15261, 256, 16408, 256, 16441, 256, - 55380, 56905, 256, 55383, 56528, 256, 55391, 57043, 256, 40771, 256, - 40846, 514, 102, 102, 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, - 770, 102, 102, 108, 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, - 1396, 1381, 514, 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, - 1460, 512, 1522, 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, - 1499, 262, 1500, 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, - 1473, 512, 1513, 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, - 1463, 512, 1488, 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, - 512, 1491, 1468, 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, - 1496, 1468, 512, 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, - 1468, 512, 1502, 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, - 512, 1508, 1468, 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, - 1513, 1468, 512, 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, - 1471, 512, 1508, 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, - 268, 1659, 269, 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, - 1662, 267, 1664, 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, - 269, 1658, 270, 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, - 1657, 268, 1657, 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, - 270, 1700, 267, 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, - 1668, 269, 1668, 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, - 267, 1670, 268, 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, - 1671, 270, 1671, 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, - 268, 1678, 267, 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, - 1681, 267, 1705, 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, - 269, 1711, 270, 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, - 1713, 268, 1713, 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, - 268, 1723, 269, 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, - 1729, 269, 1729, 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, - 267, 1746, 268, 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, - 1709, 270, 1709, 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, - 268, 1736, 267, 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, - 1737, 268, 1737, 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, - 270, 1609, 523, 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, - 1749, 523, 1574, 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, - 523, 1574, 1734, 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, - 1574, 1744, 524, 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, - 1609, 525, 1574, 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, - 1574, 1580, 523, 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, - 1610, 523, 1576, 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, - 523, 1576, 1609, 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, - 1578, 1582, 523, 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, - 1580, 523, 1579, 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, - 523, 1580, 1605, 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, - 1582, 1581, 523, 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, - 1582, 523, 1587, 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, - 523, 1590, 1581, 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, - 1591, 1605, 523, 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, - 1580, 523, 1594, 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, - 523, 1601, 1605, 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, - 1602, 1605, 523, 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, - 1580, 523, 1603, 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, - 523, 1603, 1609, 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, - 1604, 1582, 523, 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, - 1580, 523, 1605, 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, - 523, 1605, 1610, 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, - 1606, 1605, 523, 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, - 1605, 523, 1607, 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, - 523, 1610, 1582, 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, - 1584, 1648, 523, 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, - 32, 1613, 1617, 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616, - 1617, 779, 32, 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574, - 1605, 524, 1574, 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585, - 524, 1576, 1586, 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524, - 1576, 1610, 524, 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578, - 1606, 524, 1578, 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586, - 524, 1579, 1605, 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524, - 1601, 1609, 524, 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603, - 1575, 524, 1603, 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610, - 524, 1604, 1605, 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524, - 1605, 1605, 524, 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606, - 1606, 524, 1606, 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585, - 524, 1610, 1586, 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524, - 1610, 1610, 525, 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574, - 1605, 525, 1574, 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582, - 525, 1576, 1605, 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525, - 1578, 1582, 525, 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580, - 1581, 525, 1580, 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580, - 525, 1582, 1605, 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525, - 1587, 1605, 525, 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590, - 1580, 525, 1590, 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581, - 525, 1592, 1605, 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525, - 1594, 1605, 525, 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601, - 1605, 525, 1602, 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581, - 525, 1603, 1582, 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525, - 1604, 1581, 525, 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605, - 1580, 525, 1605, 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580, - 525, 1606, 1581, 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525, - 1607, 1580, 525, 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610, - 1581, 525, 1610, 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605, - 526, 1574, 1607, 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526, - 1578, 1607, 526, 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587, - 1607, 526, 1588, 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605, - 526, 1604, 1605, 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526, - 1610, 1607, 782, 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600, - 1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593, - 1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610, - 523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523, - 1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589, - 1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580, - 523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523, - 1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591, - 1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610, - 524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524, - 1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582, - 1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609, - 524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524, - 1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590, - 1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605, - 525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526, - 1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588, - 1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611, - 781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781, - 1578, 1581, 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781, - 1578, 1605, 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781, - 1580, 1605, 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781, - 1587, 1581, 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780, - 1587, 1605, 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780, - 1587, 1605, 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781, - 1589, 1581, 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781, - 1588, 1581, 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781, - 1588, 1605, 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780, - 1590, 1581, 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780, - 1591, 1605, 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780, - 1591, 1605, 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781, - 1593, 1605, 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780, - 1594, 1605, 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781, - 1601, 1582, 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780, - 1604, 1581, 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781, - 1604, 1580, 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781, - 1604, 1582, 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781, - 1605, 1581, 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781, - 1605, 1580, 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781, - 1605, 1582, 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781, - 1607, 1605, 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780, - 1606, 1580, 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780, - 1606, 1605, 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781, - 1610, 1605, 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780, - 1578, 1580, 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780, - 1578, 1605, 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780, - 1580, 1581, 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780, - 1589, 1581, 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780, - 1604, 1580, 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780, - 1610, 1580, 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780, - 1602, 1605, 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781, - 1604, 1581, 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781, - 1606, 1580, 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780, - 1603, 1605, 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780, - 1580, 1581, 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780, - 1601, 1605, 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781, - 1593, 1580, 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780, - 1606, 1580, 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035, - 1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581, - 1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604, - 1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589, - 1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, - 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580, - 1604, 1575, 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265, - 12289, 265, 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265, - 12311, 265, 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265, - 40, 265, 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265, - 12305, 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265, - 12301, 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254, - 258, 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289, - 271, 46, 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41, - 271, 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42, - 271, 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37, - 271, 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613, - 523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32, - 1616, 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618, - 526, 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571, - 267, 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269, - 1574, 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576, - 270, 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270, - 1578, 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580, - 269, 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267, - 1582, 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584, - 268, 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268, - 1587, 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588, - 267, 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269, - 1590, 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592, - 268, 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270, - 1593, 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601, - 269, 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267, - 1603, 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604, - 270, 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268, - 1606, 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607, - 267, 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269, - 1610, 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524, - 1604, 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604, - 1575, 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264, - 40, 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264, - 48, 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264, - 56, 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264, - 64, 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264, - 72, 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264, - 80, 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264, - 88, 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264, - 96, 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103, - 264, 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110, - 264, 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117, - 264, 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124, - 264, 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272, - 12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272, - 12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272, - 12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272, - 12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272, - 12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272, - 12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272, - 12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272, - 12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272, - 12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272, - 12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272, - 12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272, - 12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272, - 12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272, - 12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272, - 12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272, - 12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272, - 12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272, - 12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272, - 12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264, - 163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272, - 8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 55300, - 56473, 55300, 56506, 512, 55300, 56475, 55300, 56506, 512, 55300, 56485, - 55300, 56506, 512, 55300, 56625, 55300, 56615, 512, 55300, 56626, 55300, - 56615, 512, 55300, 57159, 55300, 57150, 512, 55300, 57159, 55300, 57175, - 512, 55301, 56505, 55301, 56506, 512, 55301, 56505, 55301, 56496, 512, - 55301, 56505, 55301, 56509, 512, 55301, 56760, 55301, 56751, 512, 55301, - 56761, 55301, 56751, 512, 55348, 56663, 55348, 56677, 512, 55348, 56664, - 55348, 56677, 512, 55348, 56671, 55348, 56686, 512, 55348, 56671, 55348, - 56687, 512, 55348, 56671, 55348, 56688, 512, 55348, 56671, 55348, 56689, - 512, 55348, 56671, 55348, 56690, 512, 55348, 56761, 55348, 56677, 512, - 55348, 56762, 55348, 56677, 512, 55348, 56763, 55348, 56686, 512, 55348, - 56764, 55348, 56686, 512, 55348, 56763, 55348, 56687, 512, 55348, 56764, - 55348, 56687, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, - 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, - 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, - 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, - 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, - 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, - 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, - 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, - 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, - 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, - 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, - 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, - 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, - 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, - 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, 68, - 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, 262, - 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, 262, - 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, - 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, - 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, - 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, - 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, - 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, - 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, - 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, - 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, - 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 73, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, - 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, - 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, - 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, - 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, - 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, - 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, - 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, - 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, - 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, - 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, - 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, - 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, - 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, - 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, - 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, - 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, - 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, - 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, - 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, - 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, - 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, - 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, - 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, - 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, - 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, - 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, - 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, - 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, - 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, - 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, - 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, - 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, - 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, - 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, - 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, - 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, - 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, - 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, - 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, - 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, - 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, - 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, - 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, - 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, - 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, - 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, - 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, - 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, - 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, - 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, - 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, - 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, - 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, - 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, - 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, - 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, - 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, - 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, - 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, - 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, - 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, - 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, - 982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, - 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, - 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, - 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, - 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, - 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, - 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 1575, 262, 1576, 262, - 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, - 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, - 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, - 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, - 1722, 262, 1697, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, - 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, - 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, - 262, 1582, 262, 1590, 262, 1594, 262, 1580, 262, 1581, 262, 1610, 262, - 1604, 262, 1606, 262, 1587, 262, 1593, 262, 1589, 262, 1602, 262, 1588, - 262, 1582, 262, 1590, 262, 1594, 262, 1722, 262, 1647, 262, 1576, 262, - 1580, 262, 1607, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1605, - 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, - 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1592, 262, 1594, - 262, 1646, 262, 1697, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, - 1607, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, - 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, - 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, - 262, 1590, 262, 1592, 262, 1594, 262, 1576, 262, 1580, 262, 1583, 262, - 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, - 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, - 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, - 262, 1592, 262, 1594, 514, 48, 46, 514, 48, 44, 514, 49, 44, 514, 50, 44, - 514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, 44, 514, 56, - 44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, 67, 41, 770, - 40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, 41, 770, 40, - 72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, 770, 40, 76, - 41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, 40, 80, 41, - 770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, 84, 41, 770, - 40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, 41, 770, 40, - 89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, 263, 82, 519, - 67, 68, 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, 266, 69, 266, - 70, 266, 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, 266, 77, 266, - 78, 266, 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, 266, 85, 266, - 86, 266, 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, 77, 86, 522, - 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 515, 77, 67, 515, 77, - 68, 515, 77, 82, 522, 68, 74, 522, 12411, 12363, 522, 12467, 12467, 266, - 12469, 266, 25163, 266, 23383, 266, 21452, 266, 12487, 266, 20108, 266, - 22810, 266, 35299, 266, 22825, 266, 20132, 266, 26144, 266, 28961, 266, - 26009, 266, 21069, 266, 24460, 266, 20877, 266, 26032, 266, 21021, 266, - 32066, 266, 29983, 266, 36009, 266, 22768, 266, 21561, 266, 28436, 266, - 25237, 266, 25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, - 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, - 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, - 21106, 266, 21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, - 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, - 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, - 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, - 21487, 256, 20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, - 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, - 256, 20687, 256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, - 20836, 256, 20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, - 256, 55361, 56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, - 20917, 256, 55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, - 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, - 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, - 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, - 256, 21375, 256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, - 55362, 57187, 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, - 256, 21576, 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, - 256, 21859, 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, - 256, 21954, 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, - 256, 20999, 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, - 256, 22578, 256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, - 22775, 256, 22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, - 256, 55365, 57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, - 23142, 256, 14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, - 55366, 56776, 256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, - 57112, 256, 23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, - 23648, 256, 23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, - 256, 55367, 56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, - 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, - 14434, 256, 55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, - 256, 24266, 256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, - 57137, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, - 256, 55384, 56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, - 24525, 256, 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, - 24724, 256, 55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, - 256, 24908, 256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, - 256, 25054, 256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, - 256, 25265, 256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, - 25340, 256, 25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, - 256, 25541, 256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, - 256, 25719, 256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, - 26083, 256, 26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, - 15076, 256, 20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, - 17369, 256, 26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, - 55372, 57283, 256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, - 256, 55373, 56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, - 26946, 256, 27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, - 256, 15384, 256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, - 27506, 256, 27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, - 56587, 256, 55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, - 27853, 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, - 28009, 256, 28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, - 256, 28270, 256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, - 28153, 256, 28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, - 28729, 256, 28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, - 28791, 256, 28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, - 29084, 256, 55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, - 56840, 256, 29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, - 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, - 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, - 29988, 256, 55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, - 55368, 56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, - 55380, 56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, - 55380, 56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, - 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, - 16534, 256, 55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, - 256, 55381, 56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, - 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, - 55382, 56700, 256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, - 16898, 256, 55382, 57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, - 56448, 256, 31954, 256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, - 55383, 57222, 256, 32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, - 256, 17204, 256, 55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, - 57049, 256, 32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, - 256, 55385, 56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, - 32880, 256, 55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, - 256, 33086, 256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, - 57235, 256, 55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, - 256, 33425, 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, - 256, 33469, 256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, - 33635, 256, 33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, - 33619, 256, 33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, - 56683, 256, 55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, - 256, 55388, 57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, - 256, 55387, 57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, - 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, - 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, - 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, - 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, - 256, 55390, 56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, - 35722, 256, 35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, - 256, 36215, 256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, - 256, 36336, 256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, - 256, 55393, 56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, - 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, - 256, 37909, 256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, - 55395, 56695, 256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 55396, - 56645, 256, 55396, 56858, 256, 19054, 256, 19062, 256, 38880, 256, 55397, - 56330, 256, 19122, 256, 55397, 56470, 256, 38923, 256, 38923, 256, 38953, - 256, 55397, 56758, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, - 39362, 256, 39422, 256, 19406, 256, 55398, 57136, 256, 39698, 256, 40000, - 256, 40189, 256, 19662, 256, 19693, 256, 40295, 256, 55400, 56526, 256, - 19704, 256, 55400, 56581, 256, 55400, 56846, 256, 55400, 56977, 256, - 40635, 256, 19798, 256, 40697, 256, 40702, 256, 40709, 256, 40719, 256, - 40726, 256, 40763, 256, 55401, 56832, -}; - -/* index tables for the decomposition data */ -#define DECOMP_SHIFT1 6 -#define DECOMP_SHIFT2 4 -static const unsigned char decomp_index0[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 16, 5, 5, 5, 5, 17, 18, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 20, - 5, 5, 5, 5, 5, 21, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 23, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const unsigned short decomp_index1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 26, 27, 0, 0, 0, 0, 0, 28, 0, 0, 29, 30, 31, 32, 33, 34, 35, 0, - 36, 37, 38, 0, 39, 0, 40, 0, 41, 0, 0, 0, 0, 42, 43, 44, 45, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, 0, 0, - 0, 49, 50, 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, 0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 0, 0, 0, - 0, 0, 54, 55, 0, 0, 0, 0, 0, 56, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 58, 59, 0, 0, 0, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, - 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 67, 0, 68, 0, 0, 69, 0, 0, 0, 70, - 71, 72, 73, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 79, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, - 82, 83, 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, 84, 85, 86, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 0, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 0, 131, 132, 133, 134, 0, 0, 0, - 0, 0, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, 146, 0, - 0, 0, 147, 0, 148, 149, 150, 0, 151, 152, 153, 0, 154, 0, 0, 0, 155, 0, - 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 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, 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 168, 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, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 171, 0, 0, 0, 0, 0, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 0, 0, 187, 0, 0, 188, 189, 190, 191, 192, 0, - 193, 194, 195, 196, 197, 0, 198, 0, 0, 0, 199, 200, 201, 202, 203, 204, - 205, 0, 0, 0, 0, 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, - 0, 0, 0, 0, 0, 240, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 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, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 0, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 0, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 0, 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, 315, - 0, 316, 0, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, 0, 0, 0, 0, 0, 0, - 347, 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, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 350, 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, 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, 351, 352, 0, 0, 0, 0, 353, 354, 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, 0, 0, 0, 0, 0, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 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, 0, 0, 0, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 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, 0, 0, 0, 0, 0, 0, 0, 431, 432, 433, 434, 435, 0, 436, 0, - 0, 437, 0, 0, 0, 0, 0, 0, 438, 439, 440, 441, 442, 443, 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, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, - 474, 475, 476, 477, 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, 0, -}; - -static const unsigned short decomp_index2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 6, 0, 0, 0, 0, 8, 0, 0, 11, 13, 15, 18, 0, 0, 20, 23, 25, 0, 27, - 31, 35, 0, 39, 42, 45, 48, 51, 54, 0, 57, 60, 63, 66, 69, 72, 75, 78, 81, - 0, 84, 87, 90, 93, 96, 99, 0, 0, 102, 105, 108, 111, 114, 0, 0, 117, 120, - 123, 126, 129, 132, 0, 135, 138, 141, 144, 147, 150, 153, 156, 159, 0, - 162, 165, 168, 171, 174, 177, 0, 0, 180, 183, 186, 189, 192, 0, 195, 198, - 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, - 243, 0, 0, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, - 282, 285, 288, 291, 294, 297, 300, 303, 0, 0, 306, 309, 312, 315, 318, - 321, 324, 327, 330, 0, 333, 336, 339, 342, 345, 348, 0, 351, 354, 357, - 360, 363, 366, 369, 372, 0, 0, 375, 378, 381, 384, 387, 390, 393, 0, 0, - 396, 399, 402, 405, 408, 411, 0, 0, 414, 417, 420, 423, 426, 429, 432, - 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 0, 0, 468, 471, - 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, - 516, 519, 522, 525, 528, 531, 534, 537, 539, 542, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 545, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, - 590, 593, 596, 599, 602, 605, 608, 611, 614, 617, 620, 623, 0, 626, 629, - 632, 635, 638, 641, 0, 0, 644, 647, 650, 653, 656, 659, 662, 665, 668, - 671, 674, 677, 680, 683, 686, 689, 0, 0, 692, 695, 698, 701, 704, 707, - 710, 713, 716, 719, 722, 725, 728, 731, 734, 737, 740, 743, 746, 749, - 752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, - 794, 797, 0, 0, 800, 803, 0, 0, 0, 0, 0, 0, 806, 809, 812, 815, 818, 821, - 824, 827, 830, 833, 836, 839, 842, 845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 848, 850, 852, 854, 856, 858, 860, 862, 864, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 866, 869, 872, 875, 878, 881, 0, 0, 884, 886, 888, - 890, 892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 894, 896, 0, 898, 900, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, 0, 0, 905, 0, 0, 0, - 908, 0, 0, 0, 0, 0, 910, 913, 916, 919, 921, 924, 927, 0, 930, 0, 933, - 936, 939, 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, 942, 945, 948, 951, 954, 957, 960, 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, 963, 966, 969, 972, 975, - 0, 978, 980, 982, 984, 987, 990, 992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, - 996, 998, 0, 1000, 1002, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 1006, 1009, 0, - 1012, 0, 0, 0, 1015, 0, 0, 0, 0, 1018, 1021, 1024, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, 0, - 0, 0, 0, 0, 1033, 1036, 0, 1039, 0, 0, 0, 1042, 0, 0, 0, 0, 1045, 1048, - 1051, 0, 0, 0, 0, 0, 0, 0, 1054, 1057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1060, - 1063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1066, 1069, 1072, 1075, 0, - 0, 1078, 1081, 0, 0, 1084, 1087, 1090, 1093, 1096, 1099, 0, 0, 1102, - 1105, 1108, 1111, 1114, 1117, 0, 0, 1120, 1123, 1126, 1129, 1132, 1135, - 1138, 1141, 1144, 1147, 1150, 1153, 0, 0, 1156, 1159, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 1168, - 1171, 1174, 1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1180, 1183, - 1186, 1189, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 1204, 0, 0, 1207, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1210, 1213, 1216, - 1219, 1222, 1225, 1228, 1231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1234, - 1237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 1243, 0, 1246, - 0, 0, 0, 1249, 0, 0, 1252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1255, 1258, 1261, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, - 0, 0, 1270, 1273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1276, - 1279, 0, 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1285, 1288, 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1294, 0, 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 1300, 1303, 0, 1306, - 1309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 1315, 1318, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1321, 0, 1324, 1327, 1330, 0, 0, 0, 0, - 1333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 1342, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, 1347, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1350, 0, 0, 0, 0, 1353, 0, 0, 0, 0, 1356, 0, 0, - 0, 0, 1359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1365, 0, 1368, 1371, 1374, 1377, 1380, 0, 0, 0, 0, 0, 0, 0, - 1383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1389, 0, 0, 0, 0, 1392, 0, 0, 0, 0, 1395, 0, 0, 0, 0, - 1398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0, 1412, 0, 1415, 0, - 1418, 0, 1421, 0, 0, 0, 1424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1427, 0, 1430, 0, 0, 1433, 1436, 0, 1439, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1442, 1444, 1446, 0, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, - 1464, 1466, 1468, 0, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, - 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 0, 1506, - 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, - 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, - 1556, 1558, 1560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1562, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, 1566, 1568, 1570, - 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, 1594, - 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, - 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1641, 1644, - 1647, 1650, 1653, 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, - 1683, 1686, 1689, 1692, 1695, 1698, 1701, 1704, 1707, 1710, 1713, 1716, - 1719, 1722, 1725, 1728, 1731, 1734, 1737, 1740, 1743, 1746, 1749, 1752, - 1755, 1758, 1761, 1764, 1767, 1770, 1773, 1776, 1779, 1782, 1785, 1788, - 1791, 1794, 1797, 1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, - 1827, 1830, 1833, 1836, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, - 1863, 1866, 1869, 1872, 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, - 1899, 1902, 1905, 1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932, - 1935, 1938, 1941, 1944, 1947, 1950, 1953, 1956, 1959, 1962, 1965, 1968, - 1971, 1974, 1977, 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, - 2007, 2010, 2013, 2016, 2019, 2022, 2025, 2028, 2031, 2034, 2037, 2040, - 2043, 2046, 2049, 2052, 2055, 2058, 2061, 2064, 2067, 2070, 2073, 2076, - 2079, 2082, 2085, 2088, 2091, 2094, 2097, 2100, 2103, 0, 0, 0, 0, 2106, - 2109, 2112, 2115, 2118, 2121, 2124, 2127, 2130, 2133, 2136, 2139, 2142, - 2145, 2148, 2151, 2154, 2157, 2160, 2163, 2166, 2169, 2172, 2175, 2178, - 2181, 2184, 2187, 2190, 2193, 2196, 2199, 2202, 2205, 2208, 2211, 2214, - 2217, 2220, 2223, 2226, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, - 2253, 2256, 2259, 2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, 2286, - 2289, 2292, 2295, 2298, 2301, 2304, 2307, 2310, 2313, 2316, 2319, 2322, - 2325, 2328, 2331, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, - 2361, 2364, 2367, 2370, 2373, 0, 0, 0, 0, 0, 0, 2376, 2379, 2382, 2385, - 2388, 2391, 2394, 2397, 2400, 2403, 2406, 2409, 2412, 2415, 2418, 2421, - 2424, 2427, 2430, 2433, 2436, 2439, 0, 0, 2442, 2445, 2448, 2451, 2454, - 2457, 0, 0, 2460, 2463, 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, - 2490, 2493, 2496, 2499, 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, - 2526, 2529, 2532, 2535, 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, - 2562, 2565, 2568, 2571, 0, 0, 2574, 2577, 2580, 2583, 2586, 2589, 0, 0, - 2592, 2595, 2598, 2601, 2604, 2607, 2610, 2613, 0, 2616, 0, 2619, 0, - 2622, 0, 2625, 2628, 2631, 2634, 2637, 2640, 2643, 2646, 2649, 2652, - 2655, 2658, 2661, 2664, 2667, 2670, 2673, 2676, 2679, 2681, 2684, 2686, - 2689, 2691, 2694, 2696, 2699, 2701, 2704, 2706, 2709, 0, 0, 2711, 2714, - 2717, 2720, 2723, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, - 2753, 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, - 2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, - 2825, 2828, 2831, 2834, 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, - 2861, 2864, 2867, 0, 2870, 2873, 2876, 2879, 2882, 2885, 2887, 2890, - 2893, 2895, 2898, 2901, 2904, 2907, 2910, 0, 2913, 2916, 2919, 2922, - 2924, 2927, 2929, 2932, 2935, 2938, 2941, 2944, 2947, 2950, 0, 0, 2952, - 2955, 2958, 2961, 2964, 2967, 0, 2969, 2972, 2975, 2978, 2981, 2984, - 2987, 2989, 2992, 2995, 2998, 3001, 3004, 3007, 3010, 3012, 3015, 3018, - 3020, 0, 0, 3022, 3025, 3028, 0, 3031, 3034, 3037, 3040, 3042, 3045, - 3047, 3050, 3052, 0, 3055, 3057, 3059, 3061, 3063, 3065, 3067, 3069, - 3071, 3073, 3075, 0, 0, 0, 0, 0, 0, 3077, 0, 0, 0, 0, 0, 3079, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3082, 3084, 3087, 0, 0, 0, 0, 0, 0, 0, 0, - 3091, 0, 0, 0, 3093, 3096, 0, 3100, 3103, 0, 0, 0, 0, 3107, 0, 3110, 0, - 0, 0, 0, 0, 0, 0, 0, 3113, 3116, 3119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3122, 0, 0, 0, 0, 0, 0, 0, 3127, 3129, 3131, 0, 0, 3133, 3135, - 3137, 3139, 3141, 3143, 3145, 3147, 3149, 3151, 3153, 3155, 3157, 3159, - 3161, 3163, 3165, 3167, 3169, 3171, 3173, 3175, 3177, 3179, 3181, 3183, - 3185, 0, 3187, 3189, 3191, 3193, 3195, 3197, 3199, 3201, 3203, 3205, - 3207, 3209, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3213, 0, 0, 0, 0, 0, - 0, 0, 3216, 3220, 3224, 3226, 0, 3229, 3233, 3237, 0, 3239, 3242, 3244, - 3246, 3248, 3250, 3252, 3254, 3256, 3258, 3260, 0, 3262, 3264, 0, 0, - 3267, 3269, 3271, 3273, 3275, 0, 0, 3277, 3280, 3284, 0, 3287, 0, 3289, - 0, 3291, 0, 3293, 3295, 3297, 3299, 0, 3301, 3303, 3305, 0, 3307, 3309, - 3311, 3313, 3315, 3317, 3319, 0, 3321, 3325, 3327, 3329, 3331, 3333, 0, - 0, 0, 0, 3335, 3337, 3339, 3341, 3343, 0, 0, 0, 0, 0, 0, 3345, 3349, - 3353, 3358, 3362, 3366, 3370, 3374, 3378, 3382, 3386, 3390, 3394, 3398, - 3402, 3406, 3409, 3411, 3414, 3418, 3421, 3423, 3426, 3430, 3435, 3438, - 3440, 3443, 3447, 3449, 3451, 3453, 3455, 3457, 3460, 3464, 3467, 3469, - 3472, 3476, 3481, 3484, 3486, 3489, 3493, 3495, 3497, 3499, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3505, 3508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3514, 3517, 3520, 0, 0, 0, 0, - 3523, 0, 0, 0, 0, 3526, 0, 0, 3529, 0, 0, 0, 0, 0, 0, 0, 3532, 0, 3535, - 0, 0, 0, 0, 0, 3538, 3541, 0, 3545, 3548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3552, 0, 0, 3555, 0, 0, 3558, 0, 3561, 0, 0, 0, 0, 0, - 0, 3564, 0, 3567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3570, 3573, 3576, 3579, - 3582, 0, 0, 3585, 3588, 0, 0, 3591, 3594, 0, 0, 0, 0, 0, 0, 3597, 3600, - 0, 0, 3603, 3606, 0, 0, 3609, 3612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3615, 3618, 3621, 3624, 3627, 3630, 3633, 3636, 0, 0, - 0, 0, 0, 0, 3639, 3642, 3645, 3648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3651, 3653, 0, 0, 0, 0, 0, 3655, 3657, 3659, 3661, 3663, 3665, 3667, - 3669, 3671, 3673, 3676, 3679, 3682, 3685, 3688, 3691, 3694, 3697, 3700, - 3703, 3706, 3710, 3714, 3718, 3722, 3726, 3730, 3734, 3738, 3742, 3747, - 3752, 3757, 3762, 3767, 3772, 3777, 3782, 3787, 3792, 3797, 3800, 3803, - 3806, 3809, 3812, 3815, 3818, 3821, 3824, 3828, 3832, 3836, 3840, 3844, - 3848, 3852, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, 3892, - 3896, 3900, 3904, 3908, 3912, 3916, 3920, 3924, 3928, 3932, 3936, 3940, - 3944, 3948, 3952, 3956, 3960, 3964, 3968, 3972, 3974, 3976, 3978, 3980, - 3982, 3984, 3986, 3988, 3990, 3992, 3994, 3996, 3998, 4000, 4002, 4004, - 4006, 4008, 4010, 4012, 4014, 4016, 4018, 4020, 4022, 4024, 4026, 4028, - 4030, 4032, 4034, 4036, 4038, 4040, 4042, 4044, 4046, 4048, 4050, 4052, - 4054, 4056, 4058, 4060, 4062, 4064, 4066, 4068, 4070, 4072, 4074, 4076, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 0, 0, 0, - 0, 0, 4083, 4087, 4090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4097, - 4099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4103, 0, 0, 0, 4105, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4107, 4109, 4111, 4113, 4115, 4117, 4119, 4121, - 4123, 4125, 4127, 4129, 4131, 4133, 4135, 4137, 4139, 4141, 4143, 4145, - 4147, 4149, 4151, 4153, 4155, 4157, 4159, 4161, 4163, 4165, 4167, 4169, - 4171, 4173, 4175, 4177, 4179, 4181, 4183, 4185, 4187, 4189, 4191, 4193, - 4195, 4197, 4199, 4201, 4203, 4205, 4207, 4209, 4211, 4213, 4215, 4217, - 4219, 4221, 4223, 4225, 4227, 4229, 4231, 4233, 4235, 4237, 4239, 4241, - 4243, 4245, 4247, 4249, 4251, 4253, 4255, 4257, 4259, 4261, 4263, 4265, - 4267, 4269, 4271, 4273, 4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, - 4291, 4293, 4295, 4297, 4299, 4301, 4303, 4305, 4307, 4309, 4311, 4313, - 4315, 4317, 4319, 4321, 4323, 4325, 4327, 4329, 4331, 4333, 4335, 4337, - 4339, 4341, 4343, 4345, 4347, 4349, 4351, 4353, 4355, 4357, 4359, 4361, - 4363, 4365, 4367, 4369, 4371, 4373, 4375, 4377, 4379, 4381, 4383, 4385, - 4387, 4389, 4391, 4393, 4395, 4397, 4399, 4401, 4403, 4405, 4407, 4409, - 4411, 4413, 4415, 4417, 4419, 4421, 4423, 4425, 4427, 4429, 4431, 4433, - 4435, 4437, 4439, 4441, 4443, 4445, 4447, 4449, 4451, 4453, 4455, 4457, - 4459, 4461, 4463, 4465, 4467, 4469, 4471, 4473, 4475, 4477, 4479, 4481, - 4483, 4485, 4487, 4489, 4491, 4493, 4495, 4497, 4499, 4501, 4503, 4505, - 4507, 4509, 4511, 4513, 4515, 4517, 4519, 4521, 4523, 4525, 4527, 4529, - 4531, 4533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4535, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4537, 0, 4539, 4541, 4543, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4545, 0, 4548, 0, 4551, 0, - 4554, 0, 4557, 0, 4560, 0, 4563, 0, 4566, 0, 4569, 0, 4572, 0, 4575, 0, - 4578, 0, 0, 4581, 0, 4584, 0, 4587, 0, 0, 0, 0, 0, 0, 4590, 4593, 0, - 4596, 4599, 0, 4602, 4605, 0, 4608, 4611, 0, 4614, 4617, 0, 0, 0, 0, 0, - 0, 4620, 0, 0, 0, 0, 0, 0, 4623, 4626, 0, 4629, 4632, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4635, 0, 4638, 0, 4641, 0, 4644, 0, 4647, 0, 4650, 0, - 4653, 0, 4656, 0, 4659, 0, 4662, 0, 4665, 0, 4668, 0, 0, 4671, 0, 4674, - 0, 4677, 0, 0, 0, 0, 0, 0, 4680, 4683, 0, 4686, 4689, 0, 4692, 4695, 0, - 4698, 4701, 0, 4704, 4707, 0, 0, 0, 0, 0, 0, 4710, 0, 0, 4713, 4716, - 4719, 4722, 0, 0, 0, 4725, 4728, 0, 4731, 4733, 4735, 4737, 4739, 4741, - 4743, 4745, 4747, 4749, 4751, 4753, 4755, 4757, 4759, 4761, 4763, 4765, - 4767, 4769, 4771, 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, 4789, - 4791, 4793, 4795, 4797, 4799, 4801, 4803, 4805, 4807, 4809, 4811, 4813, - 4815, 4817, 4819, 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, 4837, - 4839, 4841, 4843, 4845, 4847, 4849, 4851, 4853, 4855, 4857, 4859, 4861, - 4863, 4865, 4867, 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, 4885, - 4887, 4889, 4891, 4893, 4895, 4897, 4899, 4901, 4903, 4905, 4907, 4909, - 4911, 4913, 4915, 4917, 0, 0, 0, 4919, 4921, 4923, 4925, 4927, 4929, - 4931, 4933, 4935, 4937, 4939, 4941, 4943, 4945, 4947, 4951, 4955, 4959, - 4963, 4967, 4971, 4975, 4979, 4983, 4987, 4991, 4995, 4999, 5003, 5008, - 5013, 5018, 5023, 5028, 5033, 5038, 5043, 5048, 5053, 5058, 5063, 5068, - 5073, 5078, 5086, 0, 5093, 5097, 5101, 5105, 5109, 5113, 5117, 5121, - 5125, 5129, 5133, 5137, 5141, 5145, 5149, 5153, 5157, 5161, 5165, 5169, - 5173, 5177, 5181, 5185, 5189, 5193, 5197, 5201, 5205, 5209, 5213, 5217, - 5221, 5225, 5229, 5233, 5237, 5239, 5241, 5243, 0, 0, 0, 0, 0, 0, 0, 0, - 5245, 5249, 5252, 5255, 5258, 5261, 5264, 5267, 5270, 5273, 5276, 5279, - 5282, 5285, 5288, 5291, 5294, 5296, 5298, 5300, 5302, 5304, 5306, 5308, - 5310, 5312, 5314, 5316, 5318, 5320, 5322, 5325, 5328, 5331, 5334, 5337, - 5340, 5343, 5346, 5349, 5352, 5355, 5358, 5361, 5364, 5370, 5375, 0, - 5378, 5380, 5382, 5384, 5386, 5388, 5390, 5392, 5394, 5396, 5398, 5400, - 5402, 5404, 5406, 5408, 5410, 5412, 5414, 5416, 5418, 5420, 5422, 5424, - 5426, 5428, 5430, 5432, 5434, 5436, 5438, 5440, 5442, 5444, 5446, 5448, - 5450, 5452, 5454, 5456, 5458, 5460, 5462, 5464, 5466, 5468, 5470, 5472, - 5474, 5476, 5479, 5482, 5485, 5488, 5491, 5494, 5497, 5500, 5503, 5506, - 5509, 5512, 5515, 5518, 5521, 5524, 5527, 5530, 5533, 5536, 5539, 5542, - 5545, 5548, 5552, 5556, 5560, 5563, 5567, 5570, 5574, 5576, 5578, 5580, - 5582, 5584, 5586, 5588, 5590, 5592, 5594, 5596, 5598, 5600, 5602, 5604, - 5606, 5608, 5610, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, - 5630, 5632, 5634, 5636, 5638, 5640, 5642, 5644, 5646, 5648, 5650, 5652, - 5654, 5656, 5658, 5660, 5662, 5664, 5666, 0, 5668, 5673, 5678, 5683, - 5687, 5692, 5696, 5700, 5706, 5711, 5715, 5719, 5723, 5728, 5733, 5737, - 5741, 5744, 5748, 5753, 5758, 5761, 5767, 5774, 5780, 5784, 5790, 5796, - 5801, 5805, 5809, 5813, 5818, 5824, 5829, 5833, 5837, 5841, 5844, 5847, - 5850, 5853, 5857, 5861, 5867, 5871, 5876, 5882, 5886, 5889, 5892, 5898, - 5903, 5909, 5913, 5919, 5922, 5926, 5930, 5934, 5938, 5942, 5947, 5951, - 5954, 5958, 5962, 5966, 5971, 5975, 5979, 5983, 5989, 5994, 5997, 6003, - 6006, 6011, 6016, 6020, 6024, 6028, 6033, 6036, 6040, 6045, 6048, 6054, - 6058, 6061, 6064, 6067, 6070, 6073, 6076, 6079, 6082, 6085, 6088, 6092, - 6096, 6100, 6104, 6108, 6112, 6116, 6120, 6124, 6128, 6132, 6136, 6140, - 6144, 6148, 6152, 6155, 6158, 6162, 6165, 6168, 6171, 6175, 6179, 6182, - 6185, 6188, 6191, 6194, 6199, 6202, 6205, 6208, 6211, 6214, 6217, 6220, - 6223, 6227, 6232, 6235, 6238, 6241, 6244, 6247, 6250, 6253, 6257, 6261, - 6265, 6269, 6272, 6275, 6278, 6281, 6284, 6287, 6290, 6293, 6296, 6299, - 6303, 6307, 6310, 6314, 6318, 6322, 6325, 6329, 6333, 6338, 6341, 6345, - 6349, 6353, 6357, 6363, 6370, 6373, 6376, 6379, 6382, 6385, 6388, 6391, - 6394, 6397, 6400, 6403, 6406, 6409, 6412, 6415, 6418, 6421, 6424, 6429, - 6432, 6435, 6438, 6443, 6447, 6450, 6453, 6456, 6459, 6462, 6465, 6468, - 6471, 6474, 6477, 6481, 6484, 6487, 6491, 6495, 6498, 6503, 6507, 6510, - 6513, 6516, 6519, 6523, 6527, 6530, 6533, 6536, 6539, 6542, 6545, 6548, - 6551, 6554, 6558, 6562, 6566, 6570, 6574, 6578, 6582, 6586, 6590, 6594, - 6598, 6602, 6606, 6610, 6614, 6618, 6622, 6626, 6630, 6634, 6638, 6642, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6646, 6648, 0, 0, 6650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6652, 6654, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656, 6658, 6660, - 6662, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, - 6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, - 6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, - 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, - 6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, - 6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, - 6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, - 6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, - 6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, - 6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, - 6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, - 6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, - 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, - 6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, - 6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, - 7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, - 7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, - 7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, - 7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, - 7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, - 7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, - 7166, 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 7188, - 7190, 7192, 7194, 7196, 7198, 7200, 7202, 0, 0, 7204, 0, 7206, 0, 0, - 7208, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 0, 7228, 0, - 7230, 0, 0, 7232, 7234, 0, 0, 0, 7236, 7238, 7240, 7242, 7244, 7246, - 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, - 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, - 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318, - 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, - 7344, 7346, 7348, 7350, 7352, 7354, 7356, 7358, 7360, 7362, 7364, 7366, - 7368, 7371, 0, 0, 7373, 7375, 7377, 7379, 7381, 7383, 7385, 7387, 7389, - 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, 7411, 7413, - 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, 7437, - 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, 7459, 7461, - 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, 7483, 7485, - 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, 7507, 7509, - 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, 7531, 7533, - 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, 7555, 7557, - 7559, 7561, 7563, 7566, 7569, 7572, 7574, 7576, 7578, 7581, 7584, 7587, - 7589, 0, 0, 0, 0, 0, 0, 7591, 7594, 7597, 7600, 7604, 7608, 7611, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7614, 7617, 7620, 7623, 7626, 0, 0, 0, 0, - 0, 7629, 0, 7632, 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, - 7653, 7655, 7658, 7661, 7664, 7667, 7670, 7673, 7676, 7679, 7682, 7685, - 7688, 7691, 0, 7694, 7697, 7700, 7703, 7706, 0, 7709, 0, 7712, 7715, 0, - 7718, 7721, 0, 7724, 7727, 7730, 7733, 7736, 7739, 7742, 7745, 7748, - 7751, 7754, 7756, 7758, 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, - 7776, 7778, 7780, 7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, - 7800, 7802, 7804, 7806, 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, - 7824, 7826, 7828, 7830, 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, - 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, - 7872, 7874, 7876, 7878, 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, - 7896, 7898, 7900, 7902, 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, - 7920, 7922, 7924, 7926, 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, - 7944, 7946, 7948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, 7968, 7970, 7972, - 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, 7990, 7992, 7994, 7996, - 7999, 8002, 8005, 8008, 8011, 8014, 8017, 8020, 8023, 8026, 8029, 8032, - 8035, 8038, 8041, 8044, 8047, 8050, 8052, 8054, 8056, 8058, 8061, 8064, - 8067, 8070, 8073, 8076, 8079, 8082, 8085, 8088, 8091, 8094, 8097, 8100, - 8103, 8106, 8109, 8112, 8115, 8118, 8121, 8124, 8127, 8130, 8133, 8136, - 8139, 8142, 8145, 8148, 8151, 8154, 8157, 8160, 8163, 8166, 8169, 8172, - 8175, 8178, 8181, 8184, 8187, 8190, 8193, 8196, 8199, 8202, 8205, 8208, - 8211, 8214, 8217, 8220, 8223, 8226, 8229, 8232, 8235, 8238, 8241, 8244, - 8247, 8250, 8253, 8256, 8259, 8262, 8265, 8268, 8271, 8274, 8277, 8280, - 8283, 8286, 8289, 8292, 8295, 8298, 8301, 8304, 8307, 8310, 8313, 8316, - 8319, 8322, 8325, 8328, 8331, 8334, 8337, 8340, 8344, 8348, 8352, 8356, - 8360, 8364, 8367, 8370, 8373, 8376, 8379, 8382, 8385, 8388, 8391, 8394, - 8397, 8400, 8403, 8406, 8409, 8412, 8415, 8418, 8421, 8424, 8427, 8430, - 8433, 8436, 8439, 8442, 8445, 8448, 8451, 8454, 8457, 8460, 8463, 8466, - 8469, 8472, 8475, 8478, 8481, 8484, 8487, 8490, 8493, 8496, 8499, 8502, - 8505, 8508, 8511, 8514, 8517, 8520, 8523, 8526, 8529, 8532, 8535, 8538, - 8541, 8544, 8547, 8550, 8553, 8556, 8559, 8562, 8565, 8568, 8571, 8574, - 8577, 8580, 8583, 8586, 8589, 8592, 8595, 8598, 8601, 8604, 8607, 8610, - 8613, 8616, 8619, 8622, 8625, 8628, 8631, 8634, 8637, 8640, 8643, 8646, - 8649, 8652, 8655, 8658, 8661, 8664, 8667, 8670, 8673, 8676, 8679, 8682, - 8685, 8688, 8691, 8694, 8697, 8700, 8703, 8706, 8709, 8712, 8715, 8718, - 8721, 8724, 8727, 8730, 8733, 8736, 8739, 8742, 8745, 8748, 8751, 8754, - 8757, 8760, 8763, 8766, 8769, 8772, 8775, 8778, 8781, 8784, 8787, 8790, - 8794, 8798, 8802, 8805, 8808, 8811, 8814, 8817, 8820, 8823, 8826, 8829, - 8832, 8835, 8838, 8841, 8844, 8847, 8850, 8853, 8856, 8859, 8862, 8865, - 8868, 8871, 8874, 8877, 8880, 8883, 8886, 8889, 8892, 8895, 8898, 8901, - 8904, 8907, 8910, 8913, 8916, 8919, 8922, 8925, 8928, 8931, 8934, 8937, - 8940, 8943, 8946, 8949, 8952, 8955, 8958, 8961, 8964, 8967, 8970, 8973, - 8976, 8979, 8982, 8985, 8988, 8991, 8994, 8997, 9000, 9003, 9006, 9009, - 9012, 9015, 9018, 0, 0, 9021, 9025, 9029, 9033, 9037, 9041, 9045, 9049, - 9053, 9057, 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, - 9101, 9105, 9109, 9113, 9117, 9121, 9125, 9129, 9133, 9137, 9141, 9145, - 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, 9181, 9185, 9189, 9193, - 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9233, 9237, 9241, - 9245, 9249, 9253, 9257, 9261, 9265, 9269, 9273, 0, 0, 9277, 9281, 9285, - 9289, 9293, 9297, 9301, 9305, 9309, 9313, 9317, 9321, 9325, 9329, 9333, - 9337, 9341, 9345, 9349, 9353, 9357, 9361, 9365, 9369, 9373, 9377, 9381, - 9385, 9389, 9393, 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, - 9433, 9437, 9441, 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, - 9481, 9485, 9489, 0, 0, 0, 0, 0, 0, 0, 0, 9493, 9497, 9501, 9506, 9511, - 9516, 9521, 9526, 9531, 9536, 9540, 9559, 9568, 0, 0, 0, 9573, 9575, - 9577, 9579, 9581, 9583, 9585, 9587, 9589, 9591, 0, 0, 0, 0, 0, 0, 9593, - 9595, 9597, 9599, 9601, 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, - 9619, 9621, 9623, 9625, 9627, 9629, 9631, 9633, 0, 0, 9635, 9637, 9639, - 9641, 9643, 9645, 9647, 9649, 9651, 9653, 9655, 9657, 0, 9659, 9661, - 9663, 9665, 9667, 9669, 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, - 9687, 9689, 9691, 9693, 9695, 0, 9697, 9699, 9701, 9703, 0, 0, 0, 0, - 9705, 9708, 9711, 0, 9714, 0, 9717, 9720, 9723, 9726, 9729, 9732, 9735, - 9738, 9741, 9744, 9747, 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, - 9765, 9767, 9769, 9771, 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, - 9789, 9791, 9793, 9795, 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, - 9813, 9815, 9817, 9819, 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, - 9837, 9839, 9841, 9843, 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, - 9861, 9863, 9865, 9867, 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, - 9885, 9887, 9889, 9891, 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, - 9909, 9911, 9913, 9915, 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, - 9933, 9935, 9937, 9939, 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, - 9957, 9959, 9961, 9963, 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9979, - 9981, 9984, 9987, 9990, 9993, 9996, 9999, 10002, 0, 0, 0, 0, 10005, - 10007, 10009, 10011, 10013, 10015, 10017, 10019, 10021, 10023, 10025, - 10027, 10029, 10031, 10033, 10035, 10037, 10039, 10041, 10043, 10045, - 10047, 10049, 10051, 10053, 10055, 10057, 10059, 10061, 10063, 10065, - 10067, 10069, 10071, 10073, 10075, 10077, 10079, 10081, 10083, 10085, - 10087, 10089, 10091, 10093, 10095, 10097, 10099, 10101, 10103, 10105, - 10107, 10109, 10111, 10113, 10115, 10117, 10119, 10121, 10123, 10125, - 10127, 10129, 10131, 10133, 10135, 10137, 10139, 10141, 10143, 10145, - 10147, 10149, 10151, 10153, 10155, 10157, 10159, 10161, 10163, 10165, - 10167, 10169, 10171, 10173, 10175, 10177, 10179, 10181, 10183, 10185, - 10187, 10189, 10191, 10193, 10195, 10197, 10199, 10201, 10203, 10205, - 10207, 10209, 10211, 10213, 10215, 10217, 10219, 10221, 10223, 10225, - 10227, 10229, 10231, 10233, 10235, 10237, 10239, 10241, 10243, 10245, - 10247, 10249, 10251, 10253, 10255, 10257, 10259, 10261, 10263, 10265, - 10267, 10269, 10271, 10273, 10275, 10277, 10279, 10281, 10283, 10285, - 10287, 10289, 10291, 10293, 10295, 10297, 10299, 10301, 10303, 10305, - 10307, 10309, 10311, 10313, 10315, 10317, 10319, 10321, 10323, 10325, - 10327, 10329, 10331, 10333, 10335, 10337, 10339, 10341, 10343, 10345, - 10347, 10349, 10351, 10353, 10355, 10357, 10359, 10361, 10363, 10365, - 10367, 10369, 10371, 10373, 10375, 10377, 10379, 10381, 10383, 0, 0, 0, - 10385, 10387, 10389, 10391, 10393, 10395, 0, 0, 10397, 10399, 10401, - 10403, 10405, 10407, 0, 0, 10409, 10411, 10413, 10415, 10417, 10419, 0, - 0, 10421, 10423, 10425, 0, 0, 0, 10427, 10429, 10431, 10433, 10435, - 10437, 10439, 0, 10441, 10443, 10445, 10447, 10449, 10451, 10453, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 10455, 0, 10460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10470, 10475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10480, 10485, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10490, 10495, 0, 10500, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10505, 10510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10515, 10520, 10525, 10530, 10535, 10540, 10545, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10550, 10555, 10560, - 10565, 10570, 10575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10580, - 10582, 10584, 10586, 10588, 10590, 10592, 10594, 10596, 10598, 10600, - 10602, 10604, 10606, 10608, 10610, 10612, 10614, 10616, 10618, 10620, - 10622, 10624, 10626, 10628, 10630, 10632, 10634, 10636, 10638, 10640, - 10642, 10644, 10646, 10648, 10650, 10652, 10654, 10656, 10658, 10660, - 10662, 10664, 10666, 10668, 10670, 10672, 10674, 10676, 10678, 10680, - 10682, 10684, 10686, 10688, 10690, 10692, 10694, 10696, 10698, 10700, - 10702, 10704, 10706, 10708, 10710, 10712, 10714, 10716, 10718, 10720, - 10722, 10724, 10726, 10728, 10730, 10732, 10734, 10736, 10738, 10740, - 10742, 10744, 10746, 10748, 0, 10750, 10752, 10754, 10756, 10758, 10760, - 10762, 10764, 10766, 10768, 10770, 10772, 10774, 10776, 10778, 10780, - 10782, 10784, 10786, 10788, 10790, 10792, 10794, 10796, 10798, 10800, - 10802, 10804, 10806, 10808, 10810, 10812, 10814, 10816, 10818, 10820, - 10822, 10824, 10826, 10828, 10830, 10832, 10834, 10836, 10838, 10840, - 10842, 10844, 10846, 10848, 10850, 10852, 10854, 10856, 10858, 10860, - 10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, 10880, - 10882, 10884, 10886, 10888, 10890, 0, 10892, 10894, 0, 0, 10896, 0, 0, - 10898, 10900, 0, 0, 10902, 10904, 10906, 10908, 0, 10910, 10912, 10914, - 10916, 10918, 10920, 10922, 10924, 10926, 10928, 10930, 10932, 0, 10934, - 0, 10936, 10938, 10940, 10942, 10944, 10946, 10948, 0, 10950, 10952, - 10954, 10956, 10958, 10960, 10962, 10964, 10966, 10968, 10970, 10972, - 10974, 10976, 10978, 10980, 10982, 10984, 10986, 10988, 10990, 10992, - 10994, 10996, 10998, 11000, 11002, 11004, 11006, 11008, 11010, 11012, - 11014, 11016, 11018, 11020, 11022, 11024, 11026, 11028, 11030, 11032, - 11034, 11036, 11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, - 11054, 11056, 11058, 11060, 11062, 11064, 11066, 11068, 11070, 11072, - 11074, 11076, 11078, 0, 11080, 11082, 11084, 11086, 0, 0, 11088, 11090, - 11092, 11094, 11096, 11098, 11100, 11102, 0, 11104, 11106, 11108, 11110, - 11112, 11114, 11116, 0, 11118, 11120, 11122, 11124, 11126, 11128, 11130, - 11132, 11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, - 11152, 11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, - 11172, 0, 11174, 11176, 11178, 11180, 0, 11182, 11184, 11186, 11188, - 11190, 0, 11192, 0, 0, 0, 11194, 11196, 11198, 11200, 11202, 11204, - 11206, 0, 11208, 11210, 11212, 11214, 11216, 11218, 11220, 11222, 11224, - 11226, 11228, 11230, 11232, 11234, 11236, 11238, 11240, 11242, 11244, - 11246, 11248, 11250, 11252, 11254, 11256, 11258, 11260, 11262, 11264, - 11266, 11268, 11270, 11272, 11274, 11276, 11278, 11280, 11282, 11284, - 11286, 11288, 11290, 11292, 11294, 11296, 11298, 11300, 11302, 11304, - 11306, 11308, 11310, 11312, 11314, 11316, 11318, 11320, 11322, 11324, - 11326, 11328, 11330, 11332, 11334, 11336, 11338, 11340, 11342, 11344, - 11346, 11348, 11350, 11352, 11354, 11356, 11358, 11360, 11362, 11364, - 11366, 11368, 11370, 11372, 11374, 11376, 11378, 11380, 11382, 11384, - 11386, 11388, 11390, 11392, 11394, 11396, 11398, 11400, 11402, 11404, - 11406, 11408, 11410, 11412, 11414, 11416, 11418, 11420, 11422, 11424, - 11426, 11428, 11430, 11432, 11434, 11436, 11438, 11440, 11442, 11444, - 11446, 11448, 11450, 11452, 11454, 11456, 11458, 11460, 11462, 11464, - 11466, 11468, 11470, 11472, 11474, 11476, 11478, 11480, 11482, 11484, - 11486, 11488, 11490, 11492, 11494, 11496, 11498, 11500, 11502, 11504, - 11506, 11508, 11510, 11512, 11514, 11516, 11518, 11520, 11522, 11524, - 11526, 11528, 11530, 11532, 11534, 11536, 11538, 11540, 11542, 11544, - 11546, 11548, 11550, 11552, 11554, 11556, 11558, 11560, 11562, 11564, - 11566, 11568, 11570, 11572, 11574, 11576, 11578, 11580, 11582, 11584, - 11586, 11588, 11590, 11592, 11594, 11596, 11598, 11600, 11602, 11604, - 11606, 11608, 11610, 11612, 11614, 11616, 11618, 11620, 11622, 11624, - 11626, 11628, 11630, 11632, 11634, 11636, 11638, 11640, 11642, 11644, - 11646, 11648, 11650, 11652, 11654, 11656, 11658, 11660, 11662, 11664, - 11666, 11668, 11670, 11672, 11674, 11676, 11678, 11680, 11682, 11684, - 11686, 11688, 11690, 11692, 11694, 11696, 11698, 11700, 11702, 11704, - 11706, 11708, 11710, 11712, 11714, 11716, 11718, 11720, 11722, 11724, - 11726, 11728, 11730, 11732, 11734, 11736, 11738, 11740, 11742, 11744, - 11746, 11748, 11750, 11752, 11754, 11756, 11758, 11760, 11762, 11764, - 11766, 11768, 11770, 11772, 11774, 11776, 11778, 11780, 11782, 11784, - 11786, 11788, 11790, 11792, 11794, 11796, 11798, 11800, 11802, 11804, - 11806, 11808, 11810, 11812, 11814, 11816, 11818, 11820, 11822, 11824, - 11826, 11828, 11830, 11832, 11834, 11836, 11838, 11840, 11842, 11844, - 11846, 11848, 11850, 11852, 11854, 11856, 11858, 11860, 11862, 11864, - 11866, 11868, 11870, 11872, 11874, 11876, 11878, 11880, 11882, 11884, - 11886, 0, 0, 11888, 11890, 11892, 11894, 11896, 11898, 11900, 11902, - 11904, 11906, 11908, 11910, 11912, 11914, 11916, 11918, 11920, 11922, - 11924, 11926, 11928, 11930, 11932, 11934, 11936, 11938, 11940, 11942, - 11944, 11946, 11948, 11950, 11952, 11954, 11956, 11958, 11960, 11962, - 11964, 11966, 11968, 11970, 11972, 11974, 11976, 11978, 11980, 11982, - 11984, 11986, 11988, 11990, 11992, 11994, 11996, 11998, 12000, 12002, - 12004, 12006, 12008, 12010, 12012, 12014, 12016, 12018, 12020, 12022, - 12024, 12026, 12028, 12030, 12032, 12034, 12036, 12038, 12040, 12042, - 12044, 12046, 12048, 12050, 12052, 12054, 12056, 12058, 12060, 12062, - 12064, 12066, 12068, 12070, 12072, 12074, 12076, 12078, 12080, 12082, - 12084, 12086, 12088, 12090, 12092, 12094, 12096, 12098, 12100, 12102, - 12104, 12106, 12108, 12110, 12112, 12114, 12116, 12118, 12120, 12122, - 12124, 12126, 12128, 12130, 12132, 12134, 12136, 12138, 12140, 12142, - 12144, 12146, 12148, 12150, 12152, 12154, 12156, 12158, 12160, 12162, - 12164, 12166, 12168, 12170, 12172, 12174, 12176, 12178, 12180, 12182, - 12184, 12186, 12188, 12190, 12192, 12194, 12196, 12198, 12200, 12202, - 12204, 12206, 12208, 12210, 12212, 12214, 12216, 12218, 12220, 12222, - 12224, 12226, 12228, 12230, 12232, 12234, 12236, 12238, 12240, 12242, - 12244, 12246, 12248, 12250, 12252, 12254, 12256, 12258, 12260, 12262, - 12264, 12266, 12268, 12270, 12272, 12274, 12276, 12278, 12280, 12282, - 12284, 12286, 12288, 12290, 12292, 12294, 12296, 12298, 12300, 12302, - 12304, 12306, 12308, 12310, 12312, 12314, 12316, 12318, 12320, 12322, - 12324, 12326, 12328, 12330, 12332, 12334, 12336, 12338, 12340, 12342, - 12344, 12346, 12348, 12350, 12352, 12354, 12356, 12358, 12360, 12362, - 12364, 12366, 12368, 12370, 12372, 12374, 12376, 12378, 12380, 12382, - 12384, 12386, 12388, 12390, 12392, 12394, 12396, 12398, 12400, 12402, - 12404, 12406, 12408, 12410, 12412, 12414, 12416, 12418, 12420, 12422, - 12424, 12426, 12428, 12430, 12432, 12434, 12436, 12438, 12440, 12442, - 12444, 12446, 12448, 12450, 12452, 12454, 12456, 12458, 12460, 12462, - 12464, 12466, 12468, 12470, 0, 0, 12472, 12474, 12476, 12478, 12480, - 12482, 12484, 12486, 12488, 12490, 12492, 12494, 12496, 12498, 12500, - 12502, 12504, 12506, 12508, 12510, 12512, 12514, 12516, 12518, 12520, - 12522, 12524, 12526, 12528, 12530, 12532, 12534, 12536, 12538, 12540, - 12542, 12544, 12546, 12548, 12550, 12552, 12554, 12556, 12558, 12560, - 12562, 12564, 12566, 12568, 12570, 12572, 12574, 12576, 12578, 0, 12580, - 12582, 12584, 12586, 12588, 12590, 12592, 12594, 12596, 12598, 12600, - 12602, 12604, 12606, 12608, 12610, 12612, 12614, 12616, 12618, 12620, - 12622, 12624, 12626, 12628, 12630, 12632, 0, 12634, 12636, 0, 12638, 0, - 0, 12640, 0, 12642, 12644, 12646, 12648, 12650, 12652, 12654, 12656, - 12658, 12660, 0, 12662, 12664, 12666, 12668, 0, 12670, 0, 12672, 0, 0, 0, - 0, 0, 0, 12674, 0, 0, 0, 0, 12676, 0, 12678, 0, 12680, 0, 12682, 12684, - 12686, 0, 12688, 12690, 0, 12692, 0, 0, 12694, 0, 12696, 0, 12698, 0, - 12700, 0, 12702, 0, 12704, 12706, 0, 12708, 0, 0, 12710, 12712, 12714, - 12716, 0, 12718, 12720, 12722, 12724, 12726, 12728, 12730, 0, 12732, - 12734, 12736, 12738, 0, 12740, 12742, 12744, 12746, 0, 12748, 0, 12750, - 12752, 12754, 12756, 12758, 12760, 12762, 12764, 12766, 12768, 0, 12770, - 12772, 12774, 12776, 12778, 12780, 12782, 12784, 12786, 12788, 12790, - 12792, 12794, 12796, 12798, 12800, 12802, 0, 0, 0, 0, 0, 12804, 12806, - 12808, 0, 12810, 12812, 12814, 12816, 12818, 0, 12820, 12822, 12824, - 12826, 12828, 12830, 12832, 12834, 12836, 12838, 12840, 12842, 12844, - 12846, 12848, 12850, 12852, 0, 0, 0, 0, 12854, 12857, 12860, 12863, - 12866, 12869, 12872, 12875, 12878, 12881, 12884, 0, 0, 0, 0, 0, 12887, - 12891, 12895, 12899, 12903, 12907, 12911, 12915, 12919, 12923, 12927, - 12931, 12935, 12939, 12943, 12947, 12951, 12955, 12959, 12963, 12967, - 12971, 12975, 12979, 12983, 12987, 12991, 12995, 12997, 12999, 13002, 0, - 13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021, 13023, - 13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041, 13043, - 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13060, 13063, 13066, - 13069, 13073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13076, 13079, 13082, 0, 0, 0, - 13085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13088, 13091, 13094, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13096, 13098, 13100, 13102, 13104, - 13106, 13108, 13110, 13112, 13114, 13116, 13118, 13120, 13122, 13124, - 13126, 13128, 13130, 13132, 13134, 13136, 13138, 13140, 13142, 13144, - 13146, 13148, 13150, 13152, 13154, 13156, 13158, 13160, 13162, 13164, - 13166, 13168, 13170, 13172, 13174, 13176, 13178, 13180, 13182, 0, 0, 0, - 0, 13184, 13188, 13192, 13196, 13200, 13204, 13208, 13212, 13216, 0, 0, - 0, 0, 0, 0, 0, 13220, 13222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13224, 13226, 13228, 13230, 13233, 13235, 13237, 13239, 13241, 13243, - 13245, 13247, 13249, 13251, 13254, 13256, 13258, 13260, 13262, 13265, - 13267, 13269, 13271, 13274, 13276, 13278, 13280, 13282, 13284, 13287, - 13289, 13291, 13293, 13295, 13297, 13299, 13301, 13303, 13305, 13307, - 13309, 13311, 13313, 13315, 13317, 13319, 13321, 13323, 13325, 13327, - 13329, 13331, 13333, 13336, 13338, 13340, 13342, 13345, 13347, 13349, - 13351, 13353, 13355, 13357, 13359, 13361, 13363, 13365, 13367, 13369, - 13371, 13373, 13375, 13377, 13379, 13381, 13383, 13385, 13387, 13389, - 13391, 13393, 13395, 13397, 13399, 13401, 13403, 13405, 13407, 13409, - 13412, 13414, 13416, 13418, 13420, 13422, 13424, 13427, 13430, 13432, - 13434, 13436, 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13453, - 13455, 13457, 13459, 13461, 13464, 13466, 13468, 13470, 13472, 13474, - 13476, 13478, 13480, 13482, 13485, 13487, 13490, 13492, 13494, 13496, - 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13515, 13517, - 13519, 13521, 13523, 13525, 13528, 13530, 13533, 13536, 13538, 13540, - 13542, 13544, 13547, 13550, 13552, 13554, 13556, 13558, 13560, 13562, - 13564, 13566, 13568, 13570, 13572, 13575, 13577, 13579, 13581, 13583, - 13585, 13587, 13589, 13591, 13593, 13595, 13597, 13599, 13601, 13603, - 13605, 13607, 13609, 13611, 13613, 13616, 13618, 13620, 13622, 13624, - 13626, 13629, 13631, 13633, 13635, 13637, 13639, 13641, 13643, 13645, - 13647, 13649, 13651, 13654, 13656, 13658, 13660, 13662, 13664, 13666, - 13668, 13670, 13672, 13674, 13676, 13678, 13680, 13682, 13684, 13686, - 13688, 13690, 13693, 13695, 13697, 13699, 13701, 13703, 13706, 13708, - 13710, 13712, 13714, 13716, 13718, 13720, 13722, 13725, 13727, 13729, - 13731, 13734, 13736, 13738, 13740, 13742, 13744, 13746, 13749, 13752, - 13755, 13757, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, - 13776, 13778, 13780, 13783, 13785, 13787, 13789, 13791, 13793, 13795, - 13798, 13800, 13802, 13805, 13808, 13810, 13812, 13814, 13816, 13818, - 13820, 13822, 13824, 13826, 13829, 13831, 13834, 13836, 13839, 13841, - 13843, 13845, 13848, 13850, 13852, 13855, 13858, 13860, 13862, 13864, - 13866, 13868, 13870, 13872, 13874, 13876, 13878, 13880, 13882, 13884, - 13887, 13889, 13892, 13894, 13897, 13899, 13902, 13905, 13908, 13910, - 13912, 13914, 13917, 13920, 13923, 13926, 13928, 13930, 13932, 13934, - 13936, 13938, 13940, 13942, 13945, 13947, 13949, 13951, 13953, 13956, - 13958, 13961, 13964, 13966, 13968, 13970, 13972, 13974, 13976, 13979, - 13982, 13985, 13987, 13989, 13992, 13994, 13996, 13998, 14001, 14003, - 14005, 14007, 14009, 14011, 14014, 14016, 14018, 14020, 14022, 14024, - 14026, 14029, 14032, 14034, 14037, 14039, 14042, 14044, 14046, 14048, - 14051, 14054, 14056, 14059, 14061, 14064, 14066, 14068, 14070, 14072, - 14074, 14076, 14079, 14082, 14085, 14088, 14090, 14092, 14094, 14096, - 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14115, 14117, - 14119, 14121, 14123, 14125, 14127, 14129, 14131, 14133, 14135, 14137, - 14139, 14142, 14145, 14148, 14150, 14152, 14154, 14156, 14159, 14161, - 14164, 14166, 14168, 14171, 14174, 14176, 14178, 14180, 14182, 14184, - 14186, 14188, 14190, 14192, 14194, 14196, 14198, 14200, 14202, 14204, - 14206, 14208, 14210, 14212, 14215, 14217, 14219, 14221, 14223, 14225, - 14228, 14231, 14233, 14235, 14237, 14239, 14241, 14243, 14246, 14248, - 14250, 14252, 14254, 14257, 14260, 14262, 14264, 14266, 14269, 14271, - 14273, 14276, 14279, 14281, 14283, 14285, 14288, 14290, 14292, 14294, - 14296, 14298, 14300, 14302, 14305, 14307, 14309, 14311, 14314, 14316, - 14318, 14320, 14322, 14325, 14328, 14330, 14332, 14334, 14337, 14339, - 14342, 14344, 14346, 14348, 14351, 14353, 14355, 14357, 14359, 14361, - 14363, 14365, 14368, 14370, 14372, 14374, 14376, 14378, 14380, 14383, - 14385, 14388, 14391, 14394, 14396, 14398, 14400, 14402, 14404, 14406, - 14408, 14410, 0, 0, -}; - -/* NFC pairs */ -#define COMP_SHIFT1 2 -#define COMP_SHIFT2 1 -static const unsigned short comp_index0[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, - 5, 6, 7, 0, 0, 0, 0, 8, 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, - 15, 16, 17, 0, 0, 0, 0, 18, 19, 20, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, - 23, 24, 25, 26, 0, 0, 0, 0, 27, 28, 29, 30, 0, 0, 0, 0, 31, 32, 33, 34, - 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, 0, 0, 0, 40, 41, 42, - 43, 0, 0, 0, 0, 44, 45, 46, 0, 0, 0, 0, 0, 47, 48, 49, 50, 0, 0, 0, 51, - 52, 53, 54, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 57, 58, 59, 60, 0, 0, - 0, 0, 61, 62, 63, 0, 0, 0, 0, 0, 64, 65, 66, 67, 0, 0, 0, 68, 69, 70, 71, - 0, 0, 0, 0, 72, 0, 73, 0, 0, 0, 0, 0, 74, 0, 75, 0, 0, 0, 0, 0, 76, 0, 0, - 0, 0, 0, 0, 77, 78, 79, 0, 0, 0, 0, 0, 80, 81, 82, 83, 0, 0, 0, 0, 84, - 85, 86, 0, 0, 0, 0, 0, 87, 88, 0, 89, 0, 0, 0, 90, 91, 0, 92, 0, 0, 0, 0, - 0, 93, 94, 95, 0, 0, 0, 0, 96, 97, 98, 99, 0, 0, 0, 0, 100, 0, 0, 0, 0, - 0, 0, 101, 102, 0, 103, 0, 0, 0, 0, 104, 105, 106, 107, 0, 0, 0, 0, 108, - 109, 110, 111, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 114, 115, 116, 117, - 0, 0, 0, 0, 118, 119, 120, 121, 0, 0, 0, 0, 122, 0, 123, 0, 0, 0, 0, 124, - 125, 126, 127, 128, 0, 0, 0, 129, 130, 131, 132, 0, 0, 0, 0, 133, 134, 0, - 0, 0, 0, 0, 0, 135, 136, 137, 138, 0, 0, 0, 139, 140, 141, 142, 0, 0, 0, - 0, 0, 143, 144, 145, 0, 0, 0, 0, 146, 147, 148, 149, 0, 0, 0, 0, 150, 0, - 151, 0, 0, 0, 0, 152, 153, 154, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, - 156, 157, 158, 0, 0, 0, 0, 0, 159, 160, 161, 162, 0, 0, 0, 163, 0, 0, 0, - 164, 0, 0, 0, 165, 166, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 168, - 0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, - 172, 173, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0, 0, 0, - 0, 0, 177, 178, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, - 0, 0, 0, 181, 182, 183, 0, 0, 0, 0, 0, 184, 185, 0, 0, 0, 0, 0, 0, 186, - 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 188, 189, 0, 0, 0, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, - 0, 194, 195, 0, 0, 0, 0, 0, 0, 196, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, - 0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 200, 201, 202, 0, 0, 0, 0, 0, 203, - 204, 0, 0, 0, 0, 0, 0, 205, 206, 0, 0, 0, 0, 0, 0, 207, 0, 0, 0, 0, 0, 0, - 208, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, - 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, - 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, - 0, 0, 0, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 220, 221, 222, 0, 0, 0, 0, 0, 223, 224, 225, 0, 0, 0, 0, - 0, 226, 227, 228, 0, 0, 0, 0, 0, 229, 230, 231, 0, 0, 0, 0, 0, 0, 232, 0, - 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 235, 0, - 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, - 241, 0, 0, 0, 0, 0, 0, 242, 0, 243, 244, 0, 0, 0, 0, 245, 246, 0, 0, 0, - 0, 0, 247, 0, 248, 0, 249, 0, 0, 0, 250, 251, 252, 0, 0, 0, 0, 0, 253, 0, - 254, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 256, 257, 258, 0, 0, 0, 0, 0, - 259, 0, 260, 0, 261, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 263, 0, - 0, 0, 264, 265, 266, 0, 267, 0, 0, 0, 268, 0, 269, 0, 0, 0, 0, 0, 270, 0, - 271, 272, 0, 0, 0, 0, 273, 274, 0, 275, 0, 0, 0, 276, 0, 277, 0, 0, 0, 0, - 0, 0, 0, 278, 0, 0, 0, 0, 0, 279, 280, 281, 282, 0, 0, 0, 0, 283, 284, 0, - 285, 0, 0, 0, 286, 0, 0, 0, 287, 0, 0, 0, 288, 0, 0, 0, 289, 0, 0, 0, 0, - 0, 0, 290, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, - 0, 293, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 298, 299, 0, 0, 0, - 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, - 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 305, 0, - 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 0, 308, - 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, - 311, 312, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, - 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, - 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, - 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 323, 0, - 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, - 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, - 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, 0, 334, 0, 0, - 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 336, 337, 0, 0, 0, 0, 0, 0, 0, - 338, 0, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, - 0, 341, 0, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, - 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, - 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 350, 0, - 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 353, - 0, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, - 356, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, - 0, 359, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 361, 0, 362, 0, 0, 0, - 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 365, 0, - 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 0, 0, 0, 0, 0, 369, 370, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, - 372, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, - 0, 375, 0, 0, 376, 0, 0, 0, 0, 377, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 379, - 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, - 382, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 385, 0, - 0, 386, 0, 0, 0, 0, 387, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, - 0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, - 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 395, 0, 0, 0, 0, 0, - 0, 0, 396, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 400, 0, 0, 0, 0, 401, 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, - 403, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, - 0, 406, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 409, - 0, 0, 410, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, - 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 419, 0, 0, 420, 0, - 0, 0, 0, 421, 0, 0, 422, 0, 0, 0, 423, 0, 0, 0, 424, 0, 0, 0, 425, 0, 0, - 0, 426, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, 429, 0, - 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 432, 0, 0, 0, 0, - 433, 0, 0, 434, 0, 0, 0, 435, 0, 0, 0, 436, 0, 0, 0, 437, 0, 0, 0, 438, - 0, 0, 0, 439, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, - 442, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, - 0, 445, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 447, 0, 0, 0, 448, 0, 0, 0, - 449, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, - 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 455, 0, - 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 458, - 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 461, 0, 0, - 0, 462, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 465, 0, - 0, 0, 466, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, - 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, - 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 474, 0, - 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 477, - 0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, - 480, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, - 0, 483, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, - 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, - 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 494, - 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, - 497, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, - 0, 500, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, - 0, 0, 503, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, - 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 508, 0, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, - 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, - 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, - 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, 0, 0, 0, 0, 0, 519, 0, - 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, 0, 0, 522, - 0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, - 525, 0, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 528, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 533, 0, 0, 0, - 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 536, 0, 0, - 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 539, - 0, 0, 0, 0, 0, 0, 540, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, - 542, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, - 0, 545, 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, 0, 0, - 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, - 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, - 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 556, - 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, - 559, 0, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, - 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 564, -}; - -static const unsigned short comp_index1[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, - 0, 11, 12, 0, 13, 0, 0, 0, 0, 0, 0, 14, 15, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 17, 18, 0, 19, 0, 20, 0, 0, 0, 0, 21, 0, 0, 0, 22, 0, 23, 0, 0, 24, 0, - 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 33, 34, 0, 35, 0, 36, 37, 38, 0, 0, - 0, 0, 0, 39, 0, 0, 0, 40, 41, 42, 43, 0, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, - 0, 46, 0, 47, 0, 48, 0, 0, 49, 0, 50, 0, 51, 0, 0, 52, 53, 54, 55, 56, - 57, 58, 0, 59, 0, 0, 60, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, 64, 0, 0, - 65, 0, 66, 0, 0, 67, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 69, 0, 0, 70, 0, 71, - 72, 0, 73, 0, 74, 0, 0, 75, 0, 0, 0, 0, 76, 0, 0, 77, 78, 0, 79, 0, 80, - 0, 0, 81, 0, 82, 83, 0, 84, 0, 0, 0, 0, 0, 85, 86, 87, 88, 89, 90, 91, 0, - 92, 0, 0, 93, 0, 0, 0, 94, 0, 0, 95, 0, 0, 0, 96, 0, 0, 97, 0, 98, 99, 0, - 100, 0, 101, 0, 0, 102, 0, 103, 104, 0, 105, 0, 106, 0, 0, 107, 0, 108, - 0, 0, 0, 109, 0, 110, 0, 0, 111, 0, 112, 113, 0, 114, 0, 0, 0, 0, 0, 115, - 116, 117, 118, 119, 120, 121, 0, 122, 123, 0, 124, 125, 0, 0, 0, 126, 0, - 0, 127, 0, 0, 128, 129, 0, 130, 131, 0, 0, 0, 0, 0, 132, 0, 0, 0, 133, - 134, 135, 136, 137, 0, 0, 0, 138, 0, 0, 139, 140, 0, 141, 0, 142, 0, 0, - 143, 0, 0, 0, 0, 144, 0, 145, 146, 147, 148, 149, 150, 151, 0, 152, 153, - 0, 154, 0, 0, 155, 0, 0, 0, 0, 156, 157, 0, 0, 0, 0, 0, 158, 159, 0, 160, - 0, 161, 162, 0, 0, 0, 163, 0, 164, 0, 0, 165, 0, 166, 167, 0, 168, 0, - 169, 170, 171, 172, 173, 174, 175, 0, 176, 0, 177, 178, 179, 0, 0, 0, 0, - 0, 180, 0, 0, 0, 181, 182, 183, 184, 0, 185, 186, 0, 0, 0, 0, 0, 187, 0, - 188, 0, 189, 0, 0, 190, 0, 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, - 199, 200, 0, 201, 0, 0, 202, 203, 0, 0, 0, 204, 0, 0, 0, 205, 0, 0, 0, 0, - 0, 206, 0, 0, 0, 0, 207, 0, 0, 208, 0, 209, 0, 0, 210, 0, 211, 0, 0, 0, - 0, 212, 0, 0, 213, 0, 214, 215, 0, 216, 0, 217, 0, 0, 218, 219, 0, 0, 0, - 0, 0, 0, 220, 221, 0, 222, 0, 223, 0, 0, 224, 0, 225, 226, 0, 227, 0, 0, - 0, 0, 0, 228, 229, 230, 231, 232, 233, 234, 0, 235, 0, 0, 236, 0, 0, 0, - 237, 0, 0, 238, 0, 0, 0, 239, 0, 0, 240, 0, 241, 242, 0, 243, 0, 244, 0, - 0, 245, 0, 0, 0, 0, 0, 246, 247, 0, 248, 0, 249, 0, 0, 250, 0, 251, 0, 0, - 0, 252, 0, 253, 0, 0, 254, 0, 255, 256, 0, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 266, 0, 267, 268, 0, 0, 0, 269, 0, 0, 270, 0, 0, - 0, 0, 0, 0, 271, 272, 0, 273, 274, 0, 0, 0, 275, 0, 276, 0, 0, 0, 277, - 278, 279, 280, 281, 0, 0, 0, 282, 0, 0, 283, 284, 0, 285, 0, 286, 0, 0, - 287, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 289, 0, 290, 0, 0, 0, 0, 291, 292, - 0, 0, 293, 0, 0, 0, 0, 294, 295, 0, 0, 0, 0, 0, 0, 296, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 299, 300, 0, 0, 301, 0, 0, 302, 0, 0, 0, 0, 0, 0, 303, 304, - 0, 0, 305, 0, 0, 306, 0, 307, 308, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, 0, - 0, 0, 311, 0, 312, 0, 0, 313, 0, 0, 0, 0, 0, 314, 315, 0, 0, 316, 0, 0, - 0, 0, 317, 318, 0, 0, 0, 0, 0, 0, 319, 0, 320, 0, 0, 0, 0, 321, 0, 0, - 322, 323, 0, 0, 324, 0, 0, 325, 0, 0, 0, 0, 0, 0, 326, 327, 0, 0, 328, 0, - 0, 329, 0, 330, 331, 0, 0, 0, 0, 0, 332, 333, 0, 0, 0, 0, 0, 0, 334, 0, - 335, 0, 0, 336, 0, 0, 0, 0, 0, 337, 338, 0, 0, 339, 0, 0, 340, 341, 0, 0, - 342, 0, 0, 343, 0, 0, 0, 0, 0, 0, 344, 0, 0, 345, 0, 0, 346, 0, 0, 0, 0, - 0, 347, 0, 0, 348, 0, 0, 349, 0, 0, 350, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, - 352, 0, 353, 0, 0, 354, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 356, 357, 0, 0, - 358, 0, 0, 0, 359, 0, 0, 360, 361, 0, 0, 362, 0, 0, 0, 363, 0, 0, 364, - 365, 0, 0, 366, 0, 0, 0, 367, 0, 0, 368, 369, 0, 0, 370, 0, 0, 0, 371, 0, - 0, 0, 372, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 374, 0, 0, 375, 0, 0, 376, 0, - 0, 377, 0, 0, 0, 0, 0, 0, 378, 0, 0, 379, 0, 0, 380, 0, 0, 0, 0, 0, 381, - 0, 382, 0, 383, 384, 0, 0, 0, 0, 0, 0, 385, 386, 0, 0, 0, 0, 0, 0, 387, - 0, 0, 0, 388, 0, 0, 389, 0, 0, 390, 0, 0, 0, 0, 391, 0, 392, 393, 0, 0, - 0, 394, 0, 0, 0, 395, 0, 0, 396, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 398, 0, - 399, 400, 0, 0, 0, 401, 0, 0, 0, 402, 0, 0, 403, 0, 0, 404, 0, 0, 0, 0, - 0, 0, 405, 0, 0, 406, 0, 0, 0, 0, 407, 0, 408, 0, 0, 0, 0, 409, 0, 0, - 410, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 414, 0, 0, 0, 0, 0, - 0, 415, 416, 0, 417, 418, 0, 0, 0, 419, 0, 0, 420, 0, 0, 0, 0, 421, 0, 0, - 422, 0, 0, 423, 0, 0, 0, 424, 0, 425, 426, 0, 0, 0, 427, 0, 0, 0, 0, 0, - 0, 428, 429, 0, 0, 0, 0, 0, 0, 430, 0, 0, 431, 0, 0, 0, 0, 432, 0, 433, - 0, 0, 0, 0, 434, 0, 435, 0, 0, 0, 0, 0, 0, 436, 437, 0, 0, 438, 0, 0, - 439, 0, 440, 441, 0, 0, 0, 442, 0, 0, 443, 0, 444, 445, 0, 446, 447, 0, - 0, 448, 0, 0, 0, 449, 0, 450, 451, 0, 0, 0, 452, 0, 0, 0, 0, 0, 453, 0, - 454, 455, 0, 456, 457, 0, 0, 0, 0, 0, 0, 458, 0, 0, 459, 0, 460, 461, 0, - 0, 0, 462, 0, 0, 463, 0, 464, 465, 0, 466, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 470, 471, 0, 0, 0, 472, 0, 0, 0, 0, 0, 473, 0, 474, 475, 0, 476, 477, - 0, 0, 0, 0, 0, 0, 478, 0, 0, 479, 0, 0, 480, 0, 0, 0, 0, 0, 481, 0, 0, - 482, 0, 0, 0, 483, 0, 0, 484, 0, 0, 485, 0, 0, 0, 0, 0, 0, 486, 0, 0, - 487, 488, 0, 489, 0, 0, 490, 0, 0, 0, 0, 0, 0, 491, 0, 0, 492, 0, 0, 493, - 0, 0, 0, 494, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 497, 0, 0, 0, - 498, 499, 0, 0, 0, 500, 0, 0, 0, 0, 0, 501, 502, 0, 503, 0, 0, 0, 504, 0, - 0, 0, 505, 0, 0, 506, 507, 0, 0, 0, 0, 0, 508, 0, 0, 0, 509, 510, 0, 0, - 0, 0, 0, 511, 0, 0, 0, 512, 513, 0, 514, 0, 0, 0, 0, 515, 0, 0, 516, 0, - 0, 517, 0, 0, 0, 0, 0, 0, 518, 0, 0, 519, 0, 0, 520, 0, 0, 521, 0, 0, 0, - 0, 0, 0, 522, 0, 0, 523, 0, 0, 524, 0, 0, 525, 0, 0, 0, 0, 0, 0, 526, 0, - 0, 0, 527, 0, 0, 528, 0, 0, 529, 0, 0, 530, 0, 0, 0, 531, 0, 0, 0, 0, 0, - 0, 532, 533, 534, 0, 0, 0, 0, 0, 535, 536, 0, 0, 0, 0, 0, 537, 0, 0, 538, - 0, 0, 539, 0, 0, 0, 0, 0, 0, 540, 0, 541, 0, 0, 0, 0, 0, 542, 543, 0, 0, - 0, 0, 0, 544, 0, 0, 545, 0, 0, 546, 0, 0, 0, 0, 0, 0, 547, 0, 0, 548, 0, - 0, 549, 0, 0, 550, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 552, 553, 0, 0, 0, 0, - 0, 554, 0, 0, 555, 0, 0, 556, 0, 0, 0, 0, 0, 0, 557, 0, 0, 558, 0, 0, - 559, 0, 0, 560, 0, 0, 0, 0, 561, 0, 0, 562, 0, 0, 0, 0, 0, 0, 563, 0, 0, - 564, 0, 0, 565, 0, 0, 0, 0, 0, 566, 567, 0, 0, 0, 0, 0, 568, 0, 0, 569, - 0, 0, 570, 0, 0, 0, 0, 0, 0, 571, 0, 0, 572, 0, 0, 573, 0, 0, 574, 0, 0, - 0, 0, 575, 0, 0, 0, 0, 0, 576, 577, 0, 0, 0, 0, 0, 578, 0, 0, 579, 0, 0, - 580, 0, 0, 0, 0, 0, 0, 581, 0, 0, 582, 0, 0, 583, 0, 0, 584, 0, 0, 0, 0, - 585, 0, 0, 0, 0, 0, 586, 587, 0, 0, 0, 0, 0, 588, 0, 0, 0, 0, 589, 0, - 590, 0, 0, 0, 0, 591, 0, 592, 0, 0, 0, 0, 593, 0, 0, 594, 0, 0, 0, 0, 0, - 0, 595, 0, 0, 596, 0, 0, 597, 0, 0, 0, 0, 0, 598, 599, 0, 0, 0, 0, 0, - 600, 0, 0, 0, 0, 601, 0, 602, 0, 0, 0, 0, 603, 0, 604, 0, 0, 0, 0, 605, - 0, 0, 0, 0, 0, 606, 0, 0, 607, 0, 0, 608, 0, 0, 609, 0, 0, 0, 0, 0, 0, - 610, 0, 0, 611, 0, 0, 612, 0, 0, 0, 0, 613, 0, 614, 0, 0, 0, 0, 615, 0, - 0, 0, 0, 0, 616, 0, 0, 617, 0, 0, 618, 0, 0, 619, 0, 0, 0, 0, 0, 0, 620, - 0, 0, 621, 0, 0, 622, 0, 0, 623, 0, 0, 0, 0, 0, 0, 624, 0, 0, 625, 0, 0, - 626, 0, 0, 0, 0, 627, 0, 628, 0, 0, 0, 0, 0, 0, 629, 0, 0, 630, 0, 0, 0, - 0, 631, 0, 632, 0, 0, 0, 0, 0, 633, 0, 0, 634, 0, 0, 635, 0, 0, 636, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 638, 0, 0, 639, 0, 0, 640, 0, 0, 0, 0, 0, 0, - 641, 0, 0, 642, 0, 0, 643, 0, 0, 644, 0, 0, 0, 0, 0, 0, 645, 0, 0, 646, - 0, 0, 647, 0, 0, 648, 0, 0, 0, 0, 0, 0, 649, 0, 0, 650, 0, 0, 651, 0, 0, - 652, 0, 0, 0, 0, 0, 0, 653, 0, 0, 654, 0, 0, 655, 0, 0, 656, 0, 0, 0, 0, - 0, 0, 657, 0, 0, 658, 0, 0, 659, 0, 0, 660, 0, 0, 0, 0, 0, 0, 661, 0, 0, - 662, 0, 0, 663, 0, 0, 664, 0, 0, 0, 0, 0, 0, 665, 0, 0, 666, 0, 0, 667, - 0, 0, 668, 0, 0, 0, 0, 0, 0, 669, 0, 0, 670, 0, 0, 671, 0, 0, 672, 0, 0, - 0, 0, 0, 0, 673, 0, 0, 0, 674, 0, 0, 675, 0, 0, 676, 0, 0, 677, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 679, 0, 0, 680, 0, 0, 681, 0, 0, 0, 0, 0, 0, 682, 0, - 0, 683, 0, 0, 684, 0, 0, 685, 0, 0, 0, 0, 0, 0, 686, 0, 0, 687, 0, 0, - 688, 0, 0, 689, 0, 0, 0, 0, 0, 0, 690, 0, 0, 691, 0, 0, 692, 0, 0, 693, - 0, 0, 0, 0, 0, 0, 694, 0, 0, 695, 0, 0, 696, 0, 0, 697, 0, 0, 0, 0, 0, 0, - 698, 0, 0, 699, 0, 0, 700, 0, 0, 701, 0, 0, 0, 0, 0, 0, 702, 0, 0, 703, - 0, 0, 704, 0, 0, 705, 0, 0, 0, 0, 0, 0, 706, 0, 0, 707, 0, 0, 708, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 710, 0, 0, 711, 0, 0, 712, 0, 0, 713, 0, 0, 0, 0, - 0, 0, 714, 0, 0, 715, 0, 0, 716, 0, 0, 717, 0, 0, 0, 0, 0, 0, 718, 0, 0, - 719, 0, 0, 720, 0, 0, 721, 0, 0, 0, 722, 0, 0, 0, 0, 0, 0, 723, 0, 0, - 724, 0, 0, 725, 0, 0, 726, 0, 0, 0, 727, 0, 0, 0, 728, 729, 0, 0, 730, 0, - 0, 0, 0, 0, 0, 731, -}; - -static const unsigned int comp_data[] = { - 0, 0, 0, 8814, 0, 8800, 0, 8815, 192, 193, 194, 195, 256, 258, 550, 196, - 7842, 197, 0, 461, 512, 514, 0, 7840, 0, 7680, 260, 0, 7682, 0, 0, 7684, - 7686, 0, 0, 262, 264, 0, 266, 0, 0, 268, 0, 199, 7690, 0, 0, 270, 0, - 7692, 0, 7696, 0, 7698, 7694, 0, 200, 201, 202, 7868, 274, 276, 278, 203, - 7866, 0, 0, 282, 516, 518, 0, 7864, 0, 552, 280, 7704, 0, 7706, 7710, 0, - 0, 500, 284, 0, 7712, 286, 288, 0, 0, 486, 0, 290, 292, 0, 7714, 7718, 0, - 542, 0, 7716, 0, 7720, 7722, 0, 204, 205, 206, 296, 298, 300, 304, 207, - 7880, 0, 0, 463, 520, 522, 0, 7882, 302, 0, 0, 7724, 308, 0, 0, 7728, 0, - 488, 0, 7730, 0, 310, 7732, 0, 0, 313, 0, 317, 0, 7734, 0, 315, 0, 7740, - 7738, 0, 0, 7742, 7744, 0, 0, 7746, 504, 323, 0, 209, 7748, 0, 0, 327, 0, - 7750, 0, 325, 0, 7754, 7752, 0, 210, 211, 212, 213, 332, 334, 558, 214, - 7886, 0, 336, 465, 524, 526, 416, 7884, 490, 0, 0, 7764, 7766, 0, 0, 340, - 7768, 0, 0, 344, 528, 530, 0, 7770, 0, 342, 7774, 0, 0, 346, 348, 0, - 7776, 0, 0, 352, 0, 7778, 536, 350, 7786, 0, 0, 356, 0, 7788, 538, 354, - 0, 7792, 7790, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, - 467, 532, 534, 431, 7908, 7794, 0, 370, 7798, 0, 7796, 0, 7804, 0, 7806, - 7808, 7810, 372, 0, 7814, 7812, 0, 7816, 7818, 7820, 7922, 221, 374, - 7928, 562, 0, 7822, 376, 7926, 0, 0, 7924, 0, 377, 7824, 0, 379, 0, 0, - 381, 0, 7826, 7828, 0, 224, 225, 226, 227, 257, 259, 551, 228, 7843, 229, - 0, 462, 513, 515, 0, 7841, 0, 7681, 261, 0, 7683, 0, 0, 7685, 7687, 0, 0, - 263, 265, 0, 267, 0, 0, 269, 0, 231, 7691, 0, 0, 271, 0, 7693, 0, 7697, - 0, 7699, 7695, 0, 232, 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, - 283, 517, 519, 0, 7865, 0, 553, 281, 7705, 0, 7707, 7711, 0, 0, 501, 285, - 0, 7713, 287, 289, 0, 0, 487, 0, 291, 293, 0, 7715, 7719, 0, 543, 0, - 7717, 0, 7721, 7723, 0, 7830, 0, 236, 237, 238, 297, 299, 301, 0, 239, - 7881, 0, 0, 464, 521, 523, 0, 7883, 303, 0, 0, 7725, 309, 0, 0, 496, 0, - 7729, 0, 489, 0, 7731, 0, 311, 7733, 0, 0, 314, 0, 318, 0, 7735, 0, 316, - 0, 7741, 7739, 0, 0, 7743, 7745, 0, 0, 7747, 505, 324, 0, 241, 7749, 0, - 0, 328, 0, 7751, 0, 326, 0, 7755, 7753, 0, 242, 243, 244, 245, 333, 335, - 559, 246, 7887, 0, 337, 466, 525, 527, 417, 7885, 491, 0, 0, 7765, 7767, - 0, 0, 341, 7769, 0, 0, 345, 529, 531, 0, 7771, 0, 343, 7775, 0, 0, 347, - 349, 0, 7777, 0, 0, 353, 0, 7779, 537, 351, 7787, 7831, 0, 357, 0, 7789, - 539, 355, 0, 7793, 7791, 0, 249, 250, 251, 361, 363, 365, 0, 252, 7911, - 367, 369, 468, 533, 535, 432, 7909, 7795, 0, 371, 7799, 0, 7797, 0, 7805, - 0, 7807, 7809, 7811, 373, 0, 7815, 7813, 0, 7832, 0, 7817, 7819, 7821, - 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, 7833, 0, 7925, 0, 378, - 7825, 0, 380, 0, 0, 382, 0, 7827, 7829, 0, 8173, 901, 8129, 0, 7846, - 7844, 0, 7850, 7848, 0, 478, 0, 0, 506, 0, 508, 482, 0, 0, 7688, 7872, - 7870, 0, 7876, 7874, 0, 0, 7726, 7890, 7888, 0, 7894, 7892, 0, 0, 7756, - 556, 0, 0, 7758, 554, 0, 0, 510, 475, 471, 469, 0, 0, 473, 7847, 7845, 0, - 7851, 7849, 0, 479, 0, 0, 507, 0, 509, 483, 0, 0, 7689, 7873, 7871, 0, - 7877, 7875, 0, 0, 7727, 7891, 7889, 0, 7895, 7893, 0, 0, 7757, 557, 0, 0, - 7759, 555, 0, 0, 511, 476, 472, 470, 0, 0, 474, 7856, 7854, 0, 7860, - 7858, 0, 7857, 7855, 0, 7861, 7859, 0, 7700, 7702, 7701, 7703, 7760, - 7762, 7761, 7763, 7780, 0, 7781, 0, 7782, 0, 7783, 0, 0, 7800, 0, 7801, - 0, 7802, 0, 7803, 7835, 0, 7900, 7898, 0, 7904, 7902, 0, 0, 7906, 7901, - 7899, 0, 7905, 7903, 0, 0, 7907, 7914, 7912, 0, 7918, 7916, 0, 0, 7920, - 7915, 7913, 0, 7919, 7917, 0, 0, 7921, 0, 494, 492, 0, 493, 0, 480, 0, - 481, 0, 0, 7708, 0, 7709, 560, 0, 561, 0, 0, 495, 8122, 902, 8121, 8120, - 7944, 7945, 0, 8124, 8136, 904, 7960, 7961, 8138, 905, 7976, 7977, 0, - 8140, 8154, 906, 8153, 8152, 0, 938, 7992, 7993, 8184, 908, 8008, 8009, - 0, 8172, 8170, 910, 8169, 8168, 0, 939, 0, 8025, 8186, 911, 8040, 8041, - 0, 8188, 0, 8116, 0, 8132, 8048, 940, 8113, 8112, 7936, 7937, 8118, 8115, - 8050, 941, 7952, 7953, 8052, 942, 7968, 7969, 8134, 8131, 8054, 943, - 8145, 8144, 0, 970, 7984, 7985, 8150, 0, 8056, 972, 8000, 8001, 8164, - 8165, 8058, 973, 8161, 8160, 0, 971, 8016, 8017, 8166, 0, 8060, 974, - 8032, 8033, 8182, 8179, 8146, 912, 8151, 0, 8162, 944, 8167, 0, 0, 8180, - 0, 979, 0, 980, 0, 1031, 0, 1232, 0, 1234, 0, 1027, 1024, 0, 0, 1238, 0, - 1025, 0, 1217, 0, 1244, 0, 1246, 1037, 0, 1250, 1049, 0, 1252, 0, 1036, - 0, 1254, 1262, 1038, 0, 1264, 1266, 0, 0, 1268, 0, 1272, 0, 1260, 0, - 1233, 0, 1235, 0, 1107, 1104, 0, 0, 1239, 0, 1105, 0, 1218, 0, 1245, 0, - 1247, 1117, 0, 1251, 1081, 0, 1253, 0, 1116, 0, 1255, 1263, 1118, 0, - 1265, 1267, 0, 0, 1269, 0, 1273, 0, 1261, 0, 1111, 1142, 0, 1143, 0, 0, - 1242, 0, 1243, 0, 1258, 0, 1259, 1570, 1571, 1573, 0, 0, 1572, 0, 1574, - 0, 1730, 0, 1747, 0, 1728, 0, 2345, 0, 2353, 0, 2356, 2507, 2508, 2891, - 2888, 2892, 0, 2964, 0, 0, 3018, 3020, 0, 0, 3019, 0, 3144, 0, 3264, - 3274, 3271, 3272, 0, 0, 3275, 0, 3402, 3404, 0, 0, 3403, 0, 3546, 3548, - 3550, 0, 3549, 4134, 0, 0, 6918, 0, 6920, 0, 6922, 0, 6924, 0, 6926, 0, - 6930, 0, 6971, 0, 6973, 0, 6976, 0, 6977, 0, 6979, 7736, 0, 7737, 0, - 7772, 0, 7773, 0, 7784, 0, 7785, 0, 7852, 0, 0, 7862, 7853, 0, 0, 7863, - 7878, 0, 7879, 0, 7896, 0, 7897, 0, 7938, 7940, 7942, 8064, 7939, 7941, - 7943, 8065, 0, 8066, 0, 8067, 0, 8068, 0, 8069, 0, 8070, 0, 8071, 7946, - 7948, 7950, 8072, 7947, 7949, 7951, 8073, 0, 8074, 0, 8075, 0, 8076, 0, - 8077, 0, 8078, 0, 8079, 7954, 7956, 7955, 7957, 7962, 7964, 7963, 7965, - 7970, 7972, 7974, 8080, 7971, 7973, 7975, 8081, 0, 8082, 0, 8083, 0, - 8084, 0, 8085, 0, 8086, 0, 8087, 7978, 7980, 7982, 8088, 7979, 7981, - 7983, 8089, 0, 8090, 0, 8091, 0, 8092, 0, 8093, 0, 8094, 0, 8095, 7986, - 7988, 7990, 0, 7987, 7989, 7991, 0, 7994, 7996, 7998, 0, 7995, 7997, - 7999, 0, 8002, 8004, 8003, 8005, 8010, 8012, 8011, 8013, 8018, 8020, - 8022, 0, 8019, 8021, 8023, 0, 8027, 8029, 8031, 0, 8034, 8036, 8038, - 8096, 8035, 8037, 8039, 8097, 0, 8098, 0, 8099, 0, 8100, 0, 8101, 0, - 8102, 0, 8103, 8042, 8044, 8046, 8104, 8043, 8045, 8047, 8105, 0, 8106, - 0, 8107, 0, 8108, 0, 8109, 0, 8110, 0, 8111, 0, 8114, 0, 8130, 0, 8178, - 0, 8119, 8141, 8142, 8143, 0, 0, 8135, 0, 8183, 8157, 8158, 8159, 0, 0, - 8602, 0, 8603, 0, 8622, 0, 8653, 0, 8655, 0, 8654, 0, 8708, 0, 8713, 0, - 8716, 0, 8740, 0, 8742, 0, 8769, 0, 8772, 0, 8775, 0, 8777, 0, 8813, 0, - 8802, 0, 8816, 0, 8817, 0, 8820, 0, 8821, 0, 8824, 0, 8825, 0, 8832, 0, - 8833, 0, 8928, 0, 8929, 0, 8836, 0, 8837, 0, 8840, 0, 8841, 0, 8930, 0, - 8931, 0, 8876, 0, 8877, 0, 8878, 0, 8879, 0, 8938, 0, 8939, 0, 8940, 0, - 8941, 12436, 0, 12364, 0, 12366, 0, 12368, 0, 12370, 0, 12372, 0, 12374, - 0, 12376, 0, 12378, 0, 12380, 0, 12382, 0, 12384, 0, 12386, 0, 12389, 0, - 12391, 0, 12393, 0, 12400, 12401, 12403, 12404, 12406, 12407, 12409, - 12410, 12412, 12413, 12446, 0, 12532, 0, 12460, 0, 12462, 0, 12464, 0, - 12466, 0, 12468, 0, 12470, 0, 12472, 0, 12474, 0, 12476, 0, 12478, 0, - 12480, 0, 12482, 0, 12485, 0, 12487, 0, 12489, 0, 12496, 12497, 12499, - 12500, 12502, 12503, 12505, 12506, 12508, 12509, 12535, 0, 12536, 0, - 12537, 0, 12538, 0, 12542, 0, 69786, 0, 69788, 0, 69803, 0, 0, 69934, 0, - 69935, 70475, 70476, 70844, 70843, 70846, 0, 0, 71098, 0, 71099, -}; - diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 94106faee..9ec2d8563 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -127,15 +127,15 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED #endif +extern "C" hb_unicode_funcs_t *hb_ucd_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); -extern "C" hb_unicode_funcs_t *hb_ucdn_get_unicode_funcs (); hb_unicode_funcs_t * hb_unicode_funcs_get_default () { -#if !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_UCDN) - return hb_ucdn_get_unicode_funcs (); +#if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD) + return hb_ucd_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) return hb_glib_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) @@ -148,7 +148,7 @@ hb_unicode_funcs_get_default () #if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL) #error "Could not find any Unicode functions implementation, you have to provide your own" -#error "Consider building hb-ucdn.c. If you absolutely want to build without any, check the code." +#error "Consider building hb-ucd.cc. If you absolutely want to build without any, check the code." #endif /** From 226ab06ec110f4cbd56b39ce0d05d349dfec35b9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 23 May 2019 20:39:04 -0400 Subject: [PATCH 373/617] [ucd] Add URL to dependencies --- src/gen-ucd-table.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 5c1bbdb75..3d5b8d26c 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -8,6 +8,9 @@ if len (sys.argv) != 2: print("usage: ./gen-ucd-table ucd.nonunihan.grouped.xml", file=sys.stderr) sys.exit(1) + +# https://github.com/harfbuzz/packtab +# https://github.com/harfbuzz/youseedy import youseedy, packTab ucdxml = youseedy.load_ucdxml(sys.argv[1]) From b567d4ea14cc6ec0e8efc64a4993a9b0461adb20 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 23 May 2019 21:36:42 -0400 Subject: [PATCH 374/617] Fix build after UCDN -> UCD --- CMakeLists.txt | 14 ------------ configure.ac | 18 +-------------- docs/usermanual-install-harfbuzz.xml | 34 +++++++--------------------- 3 files changed, 9 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8d12c163..4ffabad10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,6 @@ endif () ## HarfBuzz build configurations option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF) option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF) -option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON) option(HB_HAVE_GLIB "Enable glib unicode functions" OFF) option(HB_HAVE_ICU "Enable icu unicode functions" OFF) if (APPLE) @@ -70,7 +69,6 @@ option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and if (HB_CHECK) set (BUILD_SHARED_LIBS ON) set (HB_BUILD_UTILS ON) - set (HB_BUILTIN_UCDN ON) set (HB_HAVE_ICU) set (HB_HAVE_GLIB ON) #set (HB_HAVE_GOBJECT ON) @@ -160,7 +158,6 @@ endfunction () file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES) file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES) -file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES) extract_make_variable(HB_BASE_sources ${SRCSOURCES}) add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/") @@ -191,9 +188,6 @@ add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/") extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES}) add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/") -extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES}) -add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/") - file(READ configure.ac CONFIGUREAC) string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC}) @@ -295,14 +289,6 @@ if (HB_HAVE_GRAPHITE2) mark_as_advanced(GRAPHITE2_INCLUDE_DIR GRAPHITE2_LIBRARY) endif () -if (HB_BUILTIN_UCDN) - include_directories(src/hb-ucdn) - add_definitions(-DHAVE_UCDN) - - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc) - list(APPEND project_extra_sources ${LIBHB_UCDN_sources}) -endif () - if (HB_HAVE_GLIB) add_definitions(-DHAVE_GLIB) diff --git a/configure.ac b/configure.ac index 8444e3bf2..e835f498c 100644 --- a/configure.ac +++ b/configure.ac @@ -300,21 +300,6 @@ AM_CONDITIONAL(HAVE_ICU_BUILTIN, $have_icu && test "x$with_icu" = "xbuiltin") dnl =========================================================================== -AC_ARG_WITH(ucdn, - [AS_HELP_STRING([--with-ucdn=@<:@yes/no@:>@], - [Use builtin UCDN library @<:@default=yes@:>@])],, - [with_ucdn=yes]) -have_ucdn=false -if test "x$with_ucdn" = "xyes"; then - have_ucdn=true -fi -if $have_ucdn; then - AC_DEFINE(HAVE_UCDN, 1, [Have UCDN Unicode functions]) -fi -AM_CONDITIONAL(HAVE_UCDN, $have_ucdn) - -dnl ========================================================================== - AC_ARG_WITH(graphite2, [AS_HELP_STRING([--with-graphite2=@<:@yes/no/auto@:>@], [Use the graphite2 library @<:@default=no@:>@])],, @@ -497,7 +482,6 @@ AC_CONFIG_FILES([ Makefile src/Makefile src/harfbuzz-config.cmake -src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile @@ -525,7 +509,7 @@ AC_MSG_NOTICE([ Build configuration: Unicode callbacks (you want at least one): - Builtin (UCDN): ${have_ucdn} + Builtin true Glib: ${have_glib} ICU: ${have_icu} diff --git a/docs/usermanual-install-harfbuzz.xml b/docs/usermanual-install-harfbuzz.xml index a1e7ab012..2b61ce81d 100644 --- a/docs/usermanual-install-harfbuzz.xml +++ b/docs/usermanual-install-harfbuzz.xml @@ -246,7 +246,7 @@ Use GLib. (Default = auto) - + This option enables or disables usage of the GLib library. The default setting is to check for the @@ -297,7 +297,7 @@ Use Fontconfig. (Default = auto) - + This option enables or disables usage of the Fontconfig library, which provides font-matching functions and @@ -317,7 +317,7 @@ Use the ICU library. (Default = auto) - + This option enables or disables usage of the International Components for @@ -330,30 +330,12 @@ - - --with-ucdn - - - Use HarfBuzz's built-in UCDN library. (Default = auto) - - - The HarfBuzz source tree includes a Unicode - Database and Normalization (UCDN) library - that provides access to basic character properties in - the Unicode Character Database (UCD) as well as low-level - normalization functions. HarfBuzz can be built without - this UCDN support if the usage of a different UCDN - library is desired. - - - - --with-graphite2 Use the Graphite2 library. (Default = no) - + This option enables or disables usage of the Graphite2 library, which provides support for the Graphite shaping @@ -367,7 +349,7 @@ Use the FreeType library. (Default = auto) - + This option enables or disables usage of the FreeType font-rendering library. The default setting is to check for the @@ -384,7 +366,7 @@ Use the Uniscribe library (experimental). (Default = no) - + This option enables or disables usage of the Uniscribe font-rendering library. Uniscribe is available on @@ -400,7 +382,7 @@ Use the DirectWrite library (experimental). (Default = no) - + This option enables or disables usage of the DirectWrite font-rendering library. DirectWrite is available on @@ -416,7 +398,7 @@ Use the CoreText library. (Default = no) - + This option enables or disables usage of the CoreText library. CoreText is available on macOS and iOS systems. From c96c6b287ff1d96da6a50a8cb3f641fe8705e5f7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 23 May 2019 21:37:17 -0400 Subject: [PATCH 375/617] One more --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e70d36d9c..18da0a913 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -220,7 +220,7 @@ jobs: # - checkout # - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python libnsl || true # - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner - # - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H. + # - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H. # - run: make -Cbuild -j32 # - run: CTEST_OUTPUT_ON_FAILURE=1 make -Cbuild test # - run: make -Cbuild install From 13b3cd307e7dedea3b419fb06d81a008e49ccff6 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Fri, 24 May 2019 10:10:12 -0700 Subject: [PATCH 376/617] [subset] Address @behdad review feedback --- src/hb-ot-glyf-table.hh | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 92382defc..ee5246ecd 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -89,14 +89,14 @@ struct glyf unsigned num_offsets = padded_offsets.len () + 1; bool use_short_loca = max_offset < 0x1FFFF; unsigned entry_size = use_short_loca ? 2 : 4; - char *loca_prime_data = (char *) calloc(entry_size, num_offsets); + char *loca_prime_data = (char *) calloc (entry_size, num_offsets); if (unlikely (!loca_prime_data)) return false; if (use_short_loca) - _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, num_offsets)); else - _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, num_offsets)); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, entry_size * num_offsets, @@ -111,24 +111,22 @@ struct glyf return result; } - template + hb_requires (hb_is_sink_of (IteratorOut, unsigned))> static void _write_loca (IteratorIn it, unsigned right_shift, IteratorOut dest) { unsigned int offset = 0; + dest << 0; + it | hb_map ([=, &offset] (unsigned int padded_size) { - unsigned result = offset >> right_shift; - DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); offset += padded_size; - return result; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); + return offset >> right_shift; }) | hb_sink (dest) ; - DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); - dest << (offset >> right_shift); } // requires source of SubsetGlyph complains the identifier isn't declared From e66253283385aa67eb9c5ab627139a56f9ae5a71 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Fri, 24 May 2019 10:39:56 -0700 Subject: [PATCH 377/617] [subset] Cppcheck complaints --- test/api/hb-test.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/api/hb-test.h b/test/api/hb-test.h index d44e8da41..b866e442a 100644 --- a/test/api/hb-test.h +++ b/test/api/hb-test.h @@ -179,8 +179,8 @@ static inline void hb_test_assert_blobs_equal (hb_blob_t *expected_blob, hb_blob { int expected = *(raw_expected + i); int actual = *(raw_actual + i); - if (expected != actual) fprintf(stderr, "+%d %02x != %02x\n", i, expected, actual); - else fprintf(stderr, "+%d %02x\n", i, expected); + if (expected != actual) fprintf(stderr, "+%u %02x != %02x\n", i, expected, actual); + else fprintf(stderr, "+%u %02x\n", i, expected); } } g_assert_cmpint(0, ==, memcmp(raw_expected, raw_actual, expected_length)); From 1197bef26c63ee896bea3fab5788635cb0fc9d18 Mon Sep 17 00:00:00 2001 From: Rod Sheeter Date: Fri, 24 May 2019 10:52:49 -0700 Subject: [PATCH 378/617] [subset] Per code review, use hb_array to avoid duplicated type name --- src/hb-ot-glyf-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index ee5246ecd..6113dbcf8 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -94,9 +94,9 @@ struct glyf if (unlikely (!loca_prime_data)) return false; if (use_short_loca) - _write_loca (padded_offsets, 1, hb_array_t ((HBUINT16*) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, 1, hb_array ((HBUINT16*) loca_prime_data, num_offsets)); else - _write_loca (padded_offsets, 0, hb_array_t ((HBUINT32*) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, 0, hb_array ((HBUINT32*) loca_prime_data, num_offsets)); hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, entry_size * num_offsets, From 1fffe51a295b6106a442bed8107d305c325bef05 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 10:52:09 -0400 Subject: [PATCH 379/617] [blob] Shuffle --- src/hb-blob.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-blob.h b/src/hb-blob.h index d1d9134ac..f80e9af2d 100644 --- a/src/hb-blob.h +++ b/src/hb-blob.h @@ -71,6 +71,9 @@ hb_blob_create (const char *data, void *user_data, hb_destroy_func_t destroy); +HB_EXTERN hb_blob_t * +hb_blob_create_from_file (const char *file_name); + /* Always creates with MEMORY_MODE_READONLY. * Even if the parent blob is writable, we don't * want the user of the sub-blob to be able to @@ -123,9 +126,6 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length); HB_EXTERN char * hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length); -HB_EXTERN hb_blob_t * -hb_blob_create_from_file (const char *file_name); - HB_END_DECLS #endif /* HB_BLOB_H */ From 487879e013758aef2c7f824033a40cd56361d240 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 12:37:53 -0400 Subject: [PATCH 380/617] Don't compile in UCD if HB_NO_UCD defined --- src/hb-ucd.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc index e744664ad..134e043d8 100644 --- a/src/hb-ucd.cc +++ b/src/hb-ucd.cc @@ -205,5 +205,8 @@ hb_ucd_get_unicode_funcs (); hb_unicode_funcs_t * hb_ucd_get_unicode_funcs () { +#ifdef HB_NO_UCD + return hb_unicode_funcs_get_empty (); +#endif return static_ucd_funcs.get_unconst (); } From d100ccad02b038719472b2cc733940ffb0374cd1 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sun, 19 May 2019 10:01:20 -0400 Subject: [PATCH 381/617] [use] Allow multiple FMs in a cluster --- src/gen-use-table.py | 12 +- src/hb-ot-shape-complex-use-machine.hh | 567 ++++++++++++------------- src/hb-ot-shape-complex-use-machine.rl | 14 +- src/hb-ot-shape-complex-use-table.cc | 38 +- src/hb-ot-shape-complex-use.hh | 11 +- 5 files changed, 315 insertions(+), 327 deletions(-) diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 164f8027f..c86bdbbdc 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -320,7 +320,11 @@ use_positions = { 'H': None, 'HVM': None, 'B': None, - 'FM': None, + 'FM': { + 'Abv': [Top], + 'Blw': [Bottom], + 'Pst': [Not_Applicable], + }, 'SUB': None, } @@ -359,15 +363,9 @@ def map_to_use(data): # the nasalization marks, maybe only for U+1CE9..U+1CF1. if U == 0x1CED: UISC = Tone_Mark - # TODO: https://github.com/harfbuzz/harfbuzz/issues/525 - if U == 0x1A7F: UISC = Consonant_Final - # TODO: https://github.com/harfbuzz/harfbuzz/issues/1105 if U == 0x11134: UISC = Gemination_Mark - # TODO: https://github.com/harfbuzz/harfbuzz/pull/1399 - if U == 0x111C9: UISC = Consonant_Final - values = [k for k,v in items if v(U,UISC,UGC)] assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values) USE = values[0] diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index f83e09fbc..39c20dec8 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -36,39 +36,39 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, - 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, - 8u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, - 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, - 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, 1u, 44u, 8u, 44u, 41u, 42u, 42u, 42u, - 21u, 42u, 1u, 5u, 0 + 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 47u, 21u, 21u, 11u, 47u, 11u, 47u, + 1u, 15u, 1u, 1u, 11u, 47u, 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, + 45u, 46u, 46u, 46u, 24u, 47u, 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, + 22u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, 11u, 47u, 1u, 47u, 11u, 47u, 13u, 21u, + 4u, 4u, 13u, 13u, 11u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 11u, 47u, 11u, 47u, + 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 47u, + 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, + 22u, 47u, 11u, 47u, 1u, 47u, 1u, 15u, 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, + 1u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 21u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 33, 15, 1, 33, 45, 1, 37, 37, - 15, 1, 37, 37, 32, 19, 19, 19, - 32, 32, 32, 37, 37, 37, 37, 37, - 37, 37, 37, 39, 37, 9, 1, 1, - 37, 37, 2, 1, 37, 37, 37, 32, - 19, 19, 19, 32, 32, 32, 37, 37, - 37, 37, 37, 37, 37, 37, 39, 15, - 1, 9, 1, 33, 44, 37, 2, 1, - 22, 5 + 33, 15, 1, 33, 48, 1, 37, 37, + 15, 1, 37, 26, 25, 24, 23, 22, + 2, 1, 24, 24, 24, 25, 25, 25, + 26, 26, 26, 26, 37, 47, 37, 9, + 1, 1, 37, 37, 2, 1, 37, 37, + 26, 25, 24, 23, 22, 2, 1, 24, + 24, 24, 25, 25, 25, 26, 26, 26, + 26, 37, 47, 15, 1, 9, 1, 33, + 47, 37, 2, 1, 22, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 34, 50, 52, 86, 132, 134, 172, - 210, 226, 228, 266, 304, 337, 357, 377, - 397, 430, 463, 496, 534, 572, 610, 648, - 686, 724, 762, 800, 840, 878, 888, 890, - 892, 930, 968, 971, 973, 1011, 1049, 1087, - 1120, 1140, 1160, 1180, 1213, 1246, 1279, 1317, - 1355, 1393, 1431, 1469, 1507, 1545, 1583, 1623, - 1639, 1641, 1651, 1653, 1687, 1732, 1770, 1773, - 1775, 1798 + 0, 34, 50, 52, 86, 135, 137, 175, + 213, 229, 231, 269, 296, 322, 347, 371, + 394, 397, 399, 424, 449, 474, 500, 526, + 552, 579, 606, 633, 660, 698, 746, 784, + 794, 796, 798, 836, 874, 877, 879, 917, + 955, 982, 1008, 1033, 1057, 1080, 1083, 1085, + 1110, 1135, 1160, 1186, 1212, 1238, 1265, 1292, + 1319, 1346, 1384, 1432, 1448, 1450, 1460, 1462, + 1496, 1544, 1582, 1585, 1587, 1610 }; static const char _use_syllable_machine_indicies[] = { @@ -83,247 +83,226 @@ static const char _use_syllable_machine_indicies[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 7, 8, - 9, 7, 10, 11, 9, 9, 12, 9, - 9, 3, 13, 14, 9, 15, 7, 7, - 16, 17, 9, 9, 18, 19, 20, 21, - 22, 23, 24, 18, 25, 26, 27, 28, - 29, 30, 9, 31, 32, 33, 9, 34, - 35, 36, 37, 9, 39, 38, 41, 40, - 40, 42, 1, 40, 40, 43, 40, 40, - 40, 40, 40, 44, 45, 46, 47, 48, - 49, 50, 51, 45, 52, 44, 53, 54, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 60, 40, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 61, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 53, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 60, 40, 42, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, - 63, 62, 42, 62, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 53, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 60, 40, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 40, 40, - 40, 40, 40, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 46, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 57, 58, 59, - 40, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 47, 48, 49, 40, 41, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 48, 49, - 40, 41, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 49, 40, 41, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 47, 48, 49, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 57, 58, 59, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 58, 59, 40, 41, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 47, - 48, 49, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 59, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 46, - 47, 48, 49, 40, 40, 40, 40, 40, - 40, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 46, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 47, 48, - 49, 40, 40, 40, 40, 40, 40, 40, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 46, 40, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 46, 47, 48, 49, 40, - 40, 40, 40, 40, 40, 40, 40, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 46, 40, 41, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 40, 51, 45, - 40, 40, 40, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 46, 40, - 41, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 45, 46, - 47, 48, 49, 40, 64, 45, 40, 40, - 40, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 46, 40, 41, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 45, 46, 47, 48, - 49, 40, 40, 45, 40, 40, 40, 54, - 55, 56, 40, 57, 58, 59, 40, 40, - 40, 40, 46, 40, 41, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 45, 46, 47, 48, 49, 50, - 51, 45, 40, 40, 40, 54, 55, 56, - 40, 57, 58, 59, 40, 40, 40, 40, - 46, 40, 41, 40, 40, 42, 1, 40, - 40, 43, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 40, 53, 54, 55, 56, 40, 57, - 58, 59, 40, 40, 40, 40, 60, 40, - 42, 62, 62, 62, 62, 62, 62, 41, - 62, 62, 62, 62, 62, 62, 63, 62, - 62, 62, 62, 62, 62, 62, 46, 47, - 48, 49, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 57, 58, 59, 62, - 41, 40, 40, 42, 1, 40, 40, 43, - 40, 40, 40, 40, 40, 40, 45, 46, - 47, 48, 49, 50, 51, 45, 52, 44, - 53, 54, 55, 56, 40, 57, 58, 59, - 40, 40, 40, 40, 60, 40, 66, 65, - 65, 65, 65, 65, 65, 65, 67, 65, - 10, 68, 66, 65, 41, 40, 40, 42, - 1, 40, 40, 43, 40, 40, 40, 40, - 40, 69, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 44, 53, 54, 55, 56, - 40, 57, 58, 59, 40, 70, 71, 40, - 60, 40, 41, 40, 40, 42, 1, 40, - 40, 43, 40, 40, 40, 40, 40, 40, - 45, 46, 47, 48, 49, 50, 51, 45, - 52, 44, 53, 54, 55, 56, 40, 57, - 58, 59, 40, 70, 71, 40, 60, 40, - 70, 71, 72, 71, 72, 12, 73, 73, - 3, 6, 73, 73, 74, 73, 73, 73, - 73, 73, 75, 18, 19, 20, 21, 22, - 23, 24, 18, 25, 27, 27, 28, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 37, 73, 12, 73, 73, 3, 6, - 73, 73, 74, 73, 73, 73, 73, 73, - 73, 18, 19, 20, 21, 22, 23, 24, - 18, 25, 27, 27, 28, 29, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 37, - 73, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 73, 73, 73, 73, - 73, 73, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 19, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 19, 20, - 21, 22, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 31, 32, 33, 73, - 12, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 20, 21, 22, 73, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 21, 22, 73, - 12, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 22, 73, 12, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 20, 21, 22, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 31, 32, 33, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 32, 33, 73, 12, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 33, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 19, 20, - 21, 22, 73, 73, 73, 73, 73, 73, - 28, 29, 30, 73, 31, 32, 33, 73, - 73, 73, 73, 19, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 19, 20, 21, 22, - 73, 73, 73, 73, 73, 73, 73, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 19, 73, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 19, 20, 21, 22, 73, 73, - 73, 73, 73, 73, 73, 73, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 19, - 73, 12, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 73, 24, 18, 73, - 73, 73, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 19, 73, 12, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 18, 19, 20, - 21, 22, 73, 76, 18, 73, 73, 73, - 28, 29, 30, 73, 31, 32, 33, 73, - 73, 73, 73, 19, 73, 12, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 18, 19, 20, 21, 22, - 73, 73, 18, 73, 73, 73, 28, 29, - 30, 73, 31, 32, 33, 73, 73, 73, - 73, 19, 73, 12, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 18, 19, 20, 21, 22, 23, 24, - 18, 73, 73, 73, 28, 29, 30, 73, - 31, 32, 33, 73, 73, 73, 73, 19, - 73, 12, 73, 73, 3, 6, 73, 73, - 74, 73, 73, 73, 73, 73, 73, 18, - 19, 20, 21, 22, 23, 24, 18, 25, - 73, 27, 28, 29, 30, 73, 31, 32, - 33, 73, 73, 73, 73, 37, 73, 3, - 73, 73, 73, 73, 73, 73, 12, 73, - 73, 73, 73, 73, 73, 4, 73, 73, - 73, 73, 73, 73, 73, 19, 20, 21, - 22, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 31, 32, 33, 73, 3, + 9, 7, 10, 11, 9, 9, 9, 9, + 9, 3, 12, 13, 9, 14, 7, 7, + 15, 16, 9, 9, 17, 18, 19, 20, + 21, 22, 23, 17, 24, 25, 26, 27, + 28, 29, 9, 30, 31, 32, 9, 33, + 34, 35, 36, 37, 38, 39, 9, 41, + 40, 43, 1, 42, 42, 44, 42, 42, + 42, 42, 42, 45, 46, 47, 48, 49, + 50, 51, 52, 46, 53, 45, 54, 55, + 56, 57, 42, 58, 59, 60, 42, 42, + 42, 42, 61, 62, 63, 64, 42, 43, + 1, 42, 42, 44, 42, 42, 42, 42, + 42, 65, 46, 47, 48, 49, 50, 51, + 52, 46, 53, 54, 54, 55, 56, 57, + 42, 58, 59, 60, 42, 42, 42, 42, + 61, 62, 63, 64, 42, 43, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 67, 66, 43, 66, 43, + 1, 42, 42, 44, 42, 42, 42, 42, + 42, 42, 46, 47, 48, 49, 50, 51, + 52, 46, 53, 54, 54, 55, 56, 57, + 42, 58, 59, 60, 42, 42, 42, 42, + 61, 62, 63, 64, 42, 46, 47, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 55, 56, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 47, 62, 63, 64, 42, + 47, 48, 49, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 58, 59, + 60, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 48, 49, 50, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 62, + 63, 64, 42, 49, 50, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 62, + 63, 64, 42, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 62, 63, 42, 63, 42, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 58, 59, 60, 42, + 42, 42, 42, 42, 62, 63, 64, 42, + 48, 49, 50, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 59, 60, + 42, 42, 42, 42, 42, 62, 63, 64, + 42, 48, 49, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 60, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 47, 48, 49, 50, 42, 42, + 42, 42, 42, 42, 55, 56, 57, 42, + 58, 59, 60, 42, 42, 42, 42, 47, + 62, 63, 64, 42, 47, 48, 49, 50, + 42, 42, 42, 42, 42, 42, 42, 56, + 57, 42, 58, 59, 60, 42, 42, 42, + 42, 47, 62, 63, 64, 42, 47, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 42, 42, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 47, 62, 63, 64, 42, + 46, 47, 48, 49, 50, 42, 52, 46, + 42, 42, 42, 55, 56, 57, 42, 58, + 59, 60, 42, 42, 42, 42, 47, 62, + 63, 64, 42, 46, 47, 48, 49, 50, + 42, 68, 46, 42, 42, 42, 55, 56, + 57, 42, 58, 59, 60, 42, 42, 42, + 42, 47, 62, 63, 64, 42, 46, 47, + 48, 49, 50, 42, 42, 46, 42, 42, + 42, 55, 56, 57, 42, 58, 59, 60, + 42, 42, 42, 42, 47, 62, 63, 64, + 42, 46, 47, 48, 49, 50, 51, 52, + 46, 42, 42, 42, 55, 56, 57, 42, + 58, 59, 60, 42, 42, 42, 42, 47, + 62, 63, 64, 42, 43, 1, 42, 42, + 44, 42, 42, 42, 42, 42, 42, 46, + 47, 48, 49, 50, 51, 52, 46, 53, + 42, 54, 55, 56, 57, 42, 58, 59, + 60, 42, 42, 42, 42, 61, 62, 63, + 64, 42, 43, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 67, 66, 66, 66, 66, 66, 66, 66, + 47, 48, 49, 50, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 58, 59, + 60, 66, 66, 66, 66, 66, 62, 63, + 64, 66, 43, 1, 42, 42, 44, 42, + 42, 42, 42, 42, 42, 46, 47, 48, + 49, 50, 51, 52, 46, 53, 45, 54, + 55, 56, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 61, 62, 63, 64, 42, + 70, 69, 69, 69, 69, 69, 69, 69, + 71, 69, 10, 72, 70, 69, 43, 1, + 42, 42, 44, 42, 42, 42, 42, 42, + 73, 46, 47, 48, 49, 50, 51, 52, + 46, 53, 45, 54, 55, 56, 57, 42, + 58, 59, 60, 42, 74, 75, 42, 61, + 62, 63, 64, 42, 43, 1, 42, 42, + 44, 42, 42, 42, 42, 42, 42, 46, + 47, 48, 49, 50, 51, 52, 46, 53, + 45, 54, 55, 56, 57, 42, 58, 59, + 60, 42, 74, 75, 42, 61, 62, 63, + 64, 42, 74, 75, 76, 75, 76, 3, + 6, 77, 77, 78, 77, 77, 77, 77, + 77, 79, 17, 18, 19, 20, 21, 22, + 23, 17, 24, 26, 26, 27, 28, 29, + 77, 30, 31, 32, 77, 77, 77, 77, + 36, 37, 38, 39, 77, 3, 6, 77, + 77, 78, 77, 77, 77, 77, 77, 77, + 17, 18, 19, 20, 21, 22, 23, 17, + 24, 26, 26, 27, 28, 29, 77, 30, + 31, 32, 77, 77, 77, 77, 36, 37, + 38, 39, 77, 17, 18, 19, 20, 21, + 77, 77, 77, 77, 77, 77, 27, 28, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 18, 37, 38, 39, 77, 18, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 30, 31, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 19, 20, 21, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 4, 77, 78, - 73, 14, 73, 73, 73, 73, 73, 73, - 73, 79, 73, 14, 73, 6, 77, 77, + 77, 77, 77, 77, 77, 37, 38, 39, + 77, 20, 21, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 37, 38, 39, + 77, 21, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 37, 38, 77, 38, 77, 19, 20, 21, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 6, 77, 8, - 73, 73, 73, 8, 73, 73, 12, 73, - 73, 3, 6, 14, 73, 74, 73, 73, - 73, 73, 73, 73, 18, 19, 20, 21, - 22, 23, 24, 18, 25, 26, 27, 28, - 29, 30, 73, 31, 32, 33, 73, 34, - 35, 73, 37, 73, 12, 73, 73, 3, - 6, 73, 73, 74, 73, 73, 73, 73, - 73, 73, 18, 19, 20, 21, 22, 23, - 24, 18, 25, 26, 27, 28, 29, 30, - 73, 31, 32, 33, 73, 73, 73, 73, - 37, 73, 34, 35, 73, 35, 73, 70, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 70, 71, 72, 8, 77, - 77, 77, 8, 77, 0 + 77, 77, 30, 31, 32, 77, 77, 77, + 77, 77, 37, 38, 39, 77, 19, 20, + 21, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 31, 32, 77, 77, + 77, 77, 77, 37, 38, 39, 77, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 18, 19, 20, 21, 77, 77, 77, 77, + 77, 77, 27, 28, 29, 77, 30, 31, + 32, 77, 77, 77, 77, 18, 37, 38, + 39, 77, 18, 19, 20, 21, 77, 77, + 77, 77, 77, 77, 77, 28, 29, 77, + 30, 31, 32, 77, 77, 77, 77, 18, + 37, 38, 39, 77, 18, 19, 20, 21, + 77, 77, 77, 77, 77, 77, 77, 77, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 18, 37, 38, 39, 77, 17, 18, + 19, 20, 21, 77, 23, 17, 77, 77, + 77, 27, 28, 29, 77, 30, 31, 32, + 77, 77, 77, 77, 18, 37, 38, 39, + 77, 17, 18, 19, 20, 21, 77, 80, + 17, 77, 77, 77, 27, 28, 29, 77, + 30, 31, 32, 77, 77, 77, 77, 18, + 37, 38, 39, 77, 17, 18, 19, 20, + 21, 77, 77, 17, 77, 77, 77, 27, + 28, 29, 77, 30, 31, 32, 77, 77, + 77, 77, 18, 37, 38, 39, 77, 17, + 18, 19, 20, 21, 22, 23, 17, 77, + 77, 77, 27, 28, 29, 77, 30, 31, + 32, 77, 77, 77, 77, 18, 37, 38, + 39, 77, 3, 6, 77, 77, 78, 77, + 77, 77, 77, 77, 77, 17, 18, 19, + 20, 21, 22, 23, 17, 24, 77, 26, + 27, 28, 29, 77, 30, 31, 32, 77, + 77, 77, 77, 36, 37, 38, 39, 77, + 3, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 4, 77, + 77, 77, 77, 77, 77, 77, 18, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 30, 31, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 3, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 4, 81, + 82, 77, 13, 77, 77, 77, 77, 77, + 77, 77, 83, 77, 13, 77, 6, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 6, 81, + 8, 77, 77, 77, 8, 77, 77, 77, + 77, 77, 3, 6, 13, 77, 78, 77, + 77, 77, 77, 77, 77, 17, 18, 19, + 20, 21, 22, 23, 17, 24, 25, 26, + 27, 28, 29, 77, 30, 31, 32, 77, + 33, 34, 77, 36, 37, 38, 39, 77, + 3, 6, 77, 77, 78, 77, 77, 77, + 77, 77, 77, 17, 18, 19, 20, 21, + 22, 23, 17, 24, 25, 26, 27, 28, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 36, 37, 38, 39, 77, 33, 34, + 77, 34, 77, 74, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 74, + 75, 76, 8, 81, 81, 81, 8, 81, + 0 }; static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 36, 2, 4, 1, 5, - 6, 4, 29, 32, 4, 55, 56, 59, - 60, 64, 38, 39, 40, 41, 42, 49, - 50, 52, 61, 53, 46, 47, 48, 43, - 44, 45, 62, 63, 65, 54, 4, 4, - 4, 4, 7, 0, 28, 11, 12, 13, - 14, 15, 22, 23, 25, 26, 19, 20, - 21, 16, 17, 18, 27, 10, 4, 9, - 24, 4, 30, 31, 4, 33, 34, 35, - 4, 4, 3, 37, 51, 4, 57, 58 + 4, 8, 4, 38, 2, 4, 1, 5, + 6, 4, 31, 34, 59, 60, 63, 64, + 68, 40, 41, 42, 43, 44, 53, 54, + 56, 65, 57, 50, 51, 52, 47, 48, + 49, 66, 67, 69, 58, 45, 46, 4, + 4, 4, 4, 7, 0, 30, 11, 12, + 13, 14, 15, 24, 25, 27, 28, 21, + 22, 23, 18, 19, 20, 29, 16, 17, + 4, 10, 4, 9, 26, 4, 32, 33, + 4, 35, 36, 37, 4, 4, 3, 39, + 55, 4, 61, 62 }; static const char _use_syllable_machine_trans_actions[] = { 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 7, 9, 10, 0, 10, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 11, 12, - 13, 14, 7, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, 15, 0, - 0, 16, 0, 0, 17, 7, 0, 0, - 18, 19, 0, 3, 0, 20, 0, 0 + 7, 8, 0, 7, 9, 0, 9, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 10, + 11, 12, 13, 7, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 14, 7, 15, 0, 0, 16, 0, 0, + 17, 7, 0, 0, 18, 19, 0, 3, + 0, 20, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -335,7 +314,7 @@ static const char _use_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 + 0, 0, 0, 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -347,19 +326,19 @@ static const char _use_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 + 0, 0, 0, 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 39, 41, 41, - 63, 63, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 63, 41, 66, 69, 66, - 41, 41, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 78, - 74, 74, 74, 78, 74, 74, 74, 74, - 73, 78 + 1, 3, 3, 6, 0, 41, 43, 43, + 67, 67, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 67, 43, 70, + 73, 70, 43, 43, 77, 77, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 82, 78, 78, 78, 82, + 78, 78, 78, 78, 77, 82 }; static const int use_syllable_machine_start = 4; @@ -373,7 +352,7 @@ static const int use_syllable_machine_en_main = 4; -#line 146 "hb-ot-shape-complex-use-machine.rl" +#line 150 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -392,7 +371,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 396 "hb-ot-shape-complex-use-machine.hh" +#line 375 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -400,7 +379,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 166 "hb-ot-shape-complex-use-machine.rl" +#line 170 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -408,7 +387,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 412 "hb-ot-shape-complex-use-machine.hh" +#line 391 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -422,7 +401,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 426 "hb-ot-shape-complex-use-machine.hh" +#line 405 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -445,59 +424,59 @@ _eof_trans: {te = p+1;} break; case 12: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 14: -#line 137 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; - case 9: -#line 141 "hb-ot-shape-complex-use-machine.rl" + case 10: +#line 145 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 8: -#line 142 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 11: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 15: -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 140 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 13: -#line 137 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; case 17: -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 142 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; case 16: -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 143 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; case 18: -#line 140 "hb-ot-shape-complex-use-machine.rl" +#line 144 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; case 19: -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 145 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 20: -#line 142 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 137 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; case 4: -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 145 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 2: @@ -515,16 +494,16 @@ _eof_trans: case 3: #line 1 "NONE" {te = p+1;} -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 145 "hb-ot-shape-complex-use-machine.rl" {act = 7;} break; - case 10: + case 9: #line 1 "NONE" {te = p+1;} -#line 142 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" {act = 8;} break; -#line 528 "hb-ot-shape-complex-use-machine.hh" +#line 507 "hb-ot-shape-complex-use-machine.hh" } _again: @@ -533,7 +512,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 537 "hb-ot-shape-complex-use-machine.hh" +#line 516 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -549,7 +528,7 @@ _again: } -#line 174 "hb-ot-shape-complex-use-machine.rl" +#line 178 "hb-ot-shape-complex-use-machine.rl" } diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index 82803da0c..2a1b90d8f 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -49,7 +49,7 @@ N = 4; # BASE_NUM GB = 5; # BASE_OTHER CGJ = 6; # CGJ #F = 7; # CONS_FINAL -FM = 8; # CONS_FINAL_MOD +#FM = 8; # CONS_FINAL_MOD #M = 9; # CONS_MED #CM = 10; # CONS_MOD SUB = 11; # CONS_SUB @@ -66,6 +66,8 @@ S = 19; # SYM VS = 21; # VARIATION_SELECTOR #V = 36; # VOWEL #VM = 40; # VOWEL_MOD +CS = 43; # CONS_WITH_STACKER +HVM = 44; # HALANT_OR_VOWEL_MODIFIER FAbv = 24; # CONS_FINAL_ABOVE FBlw = 25; # CONS_FINAL_BELOW @@ -86,9 +88,9 @@ VMPst = 39; # VOWEL_MOD_POST VMPre = 23; # VOWEL_MOD_PRE SMAbv = 41; # SYM_MOD_ABOVE SMBlw = 42; # SYM_MOD_BELOW -CS = 43; # CONS_WITH_STACKER - -HVM = 44; # HALANT_OR_VOWEL_MODIFIER +FMAbv = 45; # CONS_FINAL_MOD UIPC = Top +FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom +FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102 @@ -98,7 +100,8 @@ consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?; dependent_vowels = VPre* VAbv* VBlw* VPst*; vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*; -final_consonants = FAbv* FBlw* FPst* FM?; +final_consonants = FAbv* FBlw* FPst*; +final_modifiers = FMAbv* FMBlw* | FMPst?; complex_syllable_tail = consonant_modifiers @@ -106,6 +109,7 @@ complex_syllable_tail = dependent_vowels vowel_modifiers final_consonants + final_modifiers ; number_joiner_terminated_cluster_tail = (HN N VS?)* HN; numeral_cluster_tail = (HN N VS?)+; diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index c065ff289..93b815217 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -22,7 +22,6 @@ #define B USE_B /* BASE */ #define CGJ USE_CGJ /* CGJ */ #define CS USE_CS /* CONS_WITH_STACKER */ -#define FM USE_FM /* CONS_FINAL_MOD */ #define GB USE_GB /* BASE_OTHER */ #define H USE_H /* HALANT */ #define HN USE_HN /* HALANT_NUM */ @@ -43,6 +42,9 @@ #define FBlw USE_FBlw #define FPst USE_FPst #define FAbv USE_FAbv +#define FMBlw USE_FMBlw +#define FMPst USE_FMPst +#define FMAbv USE_FMAbv #define MPre USE_MPre #define MBlw USE_MBlw #define MPst USE_MPst @@ -75,7 +77,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Latin-1 Supplement */ /* 00A0 */ GB, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, - /* 00B0 */ O, O, FM, FM, O, O, O, O, O, O, O, O, O, O, O, O, + /* 00B0 */ O, O, FMPst, FMPst, O, O, O, O, O, O, O, O, O, O, O, O, /* 00C0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 00D0 */ O, O, O, O, O, O, O, GB, @@ -108,7 +110,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPst, VPst, H, IND, O, /* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B, /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, FM, O, + /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, FMAbv, O, /* Gurmukhi */ @@ -204,7 +206,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Tibetan */ VBlw, VBlw, O, O, O, O, O, O, /* 0F20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 0F30 */ B, B, B, B, O, FM, O, FM, O, CMAbv, O, O, O, O, VPst, VPre, + /* 0F30 */ B, B, B, B, O, FMBlw, O, FMBlw, O, CMAbv, O, O, O, O, VPst, VPre, /* 0F40 */ B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, B, /* 0F50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0F60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, @@ -213,7 +215,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 0F90 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 0FA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 0FB0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, O, O, - /* 0FC0 */ O, O, O, O, O, O, FM, O, + /* 0FC0 */ O, O, O, O, O, O, FMBlw, O, #define use_offset_0x1000u 1536 @@ -260,8 +262,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPst, VPst, - /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM, - /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, FM, O, O, + /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FMAbv, FAbv, CMAbv, FMAbv, FMAbv, + /* 17D0 */ FMAbv, VAbv, H, FMAbv, O, O, O, O, O, O, O, O, B, FMAbv, O, O, /* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, #define use_offset_0x1900u 1936 @@ -272,7 +274,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1900 */ GB, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, O, /* 1920 */ VAbv, VAbv, VBlw, VPst, VPst, VAbv, VAbv, VAbv, VAbv, SUB, SUB, SUB, O, O, O, O, - /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FM, O, O, O, O, + /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FMBlw, O, O, O, O, /* 1940 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B, /* Tai Le */ @@ -304,7 +306,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O, /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, - /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FM, FM, O, O, FBlw, + /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FMAbv, FMAbv, O, O, FMBlw, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -341,7 +343,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1C00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1C20 */ B, B, B, B, SUB, SUB, VPst, VPre, VPre, VPst, VPst, VPst, VBlw, FAbv, FAbv, FAbv, - /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FM, CMBlw, O, O, O, O, O, O, O, O, + /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FMAbv, CMBlw, O, O, O, O, O, O, O, O, /* 1C40 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, B, B, #define use_offset_0x1cd0u 2688 @@ -357,7 +359,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Combining Diacritical Marks Supplement */ - O, O, O, FM, O, O, O, O, + O, O, O, FMAbv, O, O, O, O, #define use_offset_0x2008u 2744 @@ -372,8 +374,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Superscripts and Subscripts */ - /* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O, - /* 2080 */ O, O, FM, FM, FM, O, O, O, + /* 2070 */ O, O, O, O, FMPst, O, O, O, O, O, O, O, O, O, O, O, + /* 2080 */ O, O, FMPst, FMPst, FMPst, O, O, O, #define use_offset_0x20f0u 2800 @@ -547,7 +549,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, - /* 111C0 */ H, B, R, R, O, O, O, O, GB, FBlw, CMBlw, VAbv, VBlw, O, O, O, + /* 111C0 */ H, B, R, R, O, O, O, O, GB, FMBlw, CMBlw, VAbv, VBlw, O, O, O, /* 111D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* Sinhala Archaic Numbers */ @@ -600,7 +602,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O, - /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FM, B, + /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FMAbv, B, /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, @@ -683,7 +685,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B, /* 11A10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 11A30 */ B, B, B, FM, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, + /* 11A30 */ B, B, B, FMBlw, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, /* 11A40 */ O, O, O, O, O, GB, O, H, O, O, O, O, O, O, O, O, /* Soyombo */ @@ -809,7 +811,6 @@ hb_use_get_category (hb_codepoint_t u) #undef B #undef CGJ #undef CS -#undef FM #undef GB #undef H #undef HN @@ -830,6 +831,9 @@ hb_use_get_category (hb_codepoint_t u) #undef FBlw #undef FPst #undef FAbv +#undef FMBlw +#undef FMPst +#undef FMAbv #undef MPre #undef MBlw #undef MPst diff --git a/src/hb-ot-shape-complex-use.hh b/src/hb-ot-shape-complex-use.hh index ab56e1b8f..b52b853cd 100644 --- a/src/hb-ot-shape-complex-use.hh +++ b/src/hb-ot-shape-complex-use.hh @@ -68,6 +68,10 @@ enum use_category_t { USE_VS = 21, /* VARIATION_SELECTOR */ // USE_V = 36, /* VOWEL */ // USE_VM = 40, /* VOWEL_MOD */ + USE_CS = 43, /* CONS_WITH_STACKER */ + + /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ + USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ USE_FAbv = 24, /* CONS_FINAL_ABOVE */ USE_FBlw = 25, /* CONS_FINAL_BELOW */ @@ -88,10 +92,9 @@ enum use_category_t { USE_VMPre = 23, /* VOWEL_MOD_PRE */ USE_SMAbv = 41, /* SYM_MOD_ABOVE */ USE_SMBlw = 42, /* SYM_MOD_BELOW */ - USE_CS = 43, /* CONS_WITH_STACKER */ - - /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ - USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ + USE_FMAbv = 45, /* CONS_FINAL_MOD UIPC = Top */ + USE_FMBlw = 46, /* CONS_FINAL_MOD UIPC = Bottom */ + USE_FMPst = 47, /* CONS_FINAL_MOD UIPC = Not_Applicable */ }; HB_INTERNAL USE_TABLE_ELEMENT_TYPE From 240540ff9a463cf386ae5755471a5621b94290df Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Fri, 24 May 2019 20:13:35 +0100 Subject: [PATCH 382/617] Usermanual-buffers-chapter: explain ICU fallback for Ufuncs. --- docs/usermanual-buffers-language-script-and-direction.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index b66f2709c..57f3920a7 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -302,7 +302,9 @@ At build time, HarfBuzz looks first for the GLib library. If it is found, HarfBuzz will use GLib's Unicode functions by - default. If there is no GLib, HarfBuzz will fall back to its own + default. If there is no GLib, HarfBuzz will look for the + International Components for Unicode (ICU) library. If neither + GLib nor ICU is found, HarfBuzz will fall back to its own internal, lightweight set of Unicode functions instead. From e1a5ce6aa661251e998df7b3612a1d5d39e28827 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 24 May 2019 10:58:52 -0700 Subject: [PATCH 383/617] Fix fuzzer crash testcase Add a check for stringOffSet(uint16) overflow, return early if overflow happens --- src/hb-ot-name-table.hh | 2 +- ...minimized-hb-subset-fuzzer-5077547978588160 | Bin 0 -> 339602 bytes ...minimized-hb-subset-fuzzer-5761434614497280 | Bin 0 -> 532 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5077547978588160 create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5761434614497280 diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 6c75cc398..4eda46789 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -186,7 +186,7 @@ struct name auto snap = c->snapshot (); this->nameRecordZ.serialize (c, this->count); - this->stringOffset = c->length (); + if (unlikely (!c->check_assign (this->stringOffset, c->length ()))) return_trace (false); c->revert (snap); const void *dst_string_pool = &(this + this->stringOffset); diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5077547978588160 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5077547978588160 new file mode 100644 index 0000000000000000000000000000000000000000..37bb009553bdeb13e063af538c8ba5fb7c5c8aab GIT binary patch literal 339602 zcmeI#&ud&o902g|Zk8Gs?M0E2)7FDj1gYB7MltphZwkeWplm?fOJgIw3QaB*`~&(2 zST`}LXm&YOu^M6K59rJ|oX z%QjM~=fAI)>hVS1Y1Lo;@!++H=6m^YeRsc8+}n)WUK9})sC~1snd%>;`t=yC z|I+UJ>8!GTtFb*=f8_eD<~w88kH+Ek@08acsXz2QtBsup7Z0Mnb?5G044qXyRV1YJ z1drq4n^DY}y4}eqqzl$}w>rZ&UduO*C+qF~=I!>)>Q%O;z|;pY(TDk~SO2&d?ZJ<| zVkI%L3EnNA_DQ_-cKl6U(VrL~JkZ-HX~Q zn{jzUADOwQ|8Q(iuNpMA8@0{7Xie$qvs)gCyn*GEo*w@`oEnk~?0LIo?9JKpUL5QG z=P)iTsN+qzP40P{Q(ELouJF9K$oQAw8Mnx6qu|iz=cJ&V;q!Bvpq%)@JI}Vfmioq& zab0xf;5pCes=k+lDbBoK+Eca2f}`v3+i;%4Y`01$&cddQguUtI;e;g4X;xJG`Jc|} zgT_woEB#b-bFL^xCu~E*_jB`kojm`Xe6;^|CvGR7KH+G(($GA&oJr>|`Y-Y7`i;-7 zKVJUhqqMgY?Xsj9%jvgL9(g<7DEG>>#7fFGQ^AF@;+2$NF6ZjylzC(YQO(tJ%PcOn z^4u@d!=<%UwauFsVlBPG)s)NWxAZtwF8}`--=+WUYqxHHd2=J5lnQfkE7f|G_SfR$ zPh$P^8}aF-Ts@_e`rzHY<*}hAt-kVOOdZ`$9WjGxIF**ovjNG!j!evYPpvlt#-2!Ip~VIdM2p%j=fiznrL+yW`zIy<7kFs_HosQc&dE zrbc`eDg38B!3U|ddi0CwLiybX>GhPYb^oqz{v_>GH*f3=svLd)T-G1q$A Date: Fri, 24 May 2019 20:30:22 +0100 Subject: [PATCH 384/617] Usermanual-buffers-chapter: trim out fallback-of-ufuncs talk and just mention that stuff exists if you care to go find it. --- ...manual-buffers-language-script-and-direction.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index 57f3920a7..e9585c467 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -300,12 +300,13 @@ decomposing code points. - At build time, HarfBuzz looks first for the GLib library. If - it is found, HarfBuzz will use GLib's Unicode functions by - default. If there is no GLib, HarfBuzz will look for the - International Components for Unicode (ICU) library. If neither - GLib nor ICU is found, HarfBuzz will fall back to its own - internal, lightweight set of Unicode functions instead. + HarfBuzz includes its own internal, lightweight set of Unicode + functions. At build time, it is also possible to compile support + for some other options, such as the Unicode functions provided + by GLib or the International Components for Unicode (ICU) + library. Generally, this option is only of interest for client + programs that have specific integration requirements or that do + a significant amount of customization. If your program has access to other Unicode functions, however, From 1da089179b9bd06f071f967d128819e85998b809 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 15:41:34 -0400 Subject: [PATCH 385/617] Put back Since: tags for hb_color_get_* --- src/hb-common.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index 6429b8347..71791dba1 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -1166,7 +1166,7 @@ hb_variation_to_string (hb_variation_t *variation, * * Return value: Alpha channel value of the given color * - * Since: REPLACEME + * Since: 2.1.0 */ uint8_t (hb_color_get_alpha) (hb_color_t color) @@ -1180,7 +1180,7 @@ uint8_t * * Return value: Red channel value of the given color * - * Since: REPLACEME + * Since: 2.1.0 */ uint8_t (hb_color_get_red) (hb_color_t color) @@ -1194,7 +1194,7 @@ uint8_t * * Return value: Green channel value of the given color * - * Since: REPLACEME + * Since: 2.1.0 */ uint8_t (hb_color_get_green) (hb_color_t color) @@ -1208,7 +1208,7 @@ uint8_t * * Return value: Blue channel value of the given color * - * Since: REPLACEME + * Since: 2.1.0 */ uint8_t (hb_color_get_blue) (hb_color_t color) From 5fd3ece5237ac6a4ee95b2665b5e20102ed176bb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 15:56:15 -0400 Subject: [PATCH 386/617] 2.5.0 --- Makefile.am | 2 +- NEWS | 14 ++++++++++++++ configure.ac | 2 +- src/hb-version.h | 4 ++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index f9f6e3630..a66e2c828 100644 --- a/Makefile.am +++ b/Makefile.am @@ -71,7 +71,7 @@ dist-clear-sticky-bits: chmod -R a-s $(distdir) -tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.bz2 +tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.xz sha256_file = $(tar_file).sha256 gpg_file = $(sha256_file).asc $(sha256_file): $(tar_file) diff --git a/NEWS b/NEWS index f3e424fbc..752ebf78e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,17 @@ +Overview of changes leading to 2.5.0 +Friday, May 24, 2019 +==================================== +- This release does not include much functional changes, but includes major internal + code-base changes. We now require C++11. Support for gcc 4.8 and earlier has been + dropped. +- New hb-config.hh facility for compiling smaller library for embedded and web usecases. +- New Unicode Character Databse implementation that is half the size of previously-used + UCDN. +- Subsetter improvements. +- Improved documentation, thanks to Nathan Willis. +- Misc shaping fixes. + + Overview of changes leading to 2.4.0 Monday, March 25, 2019 ==================================== diff --git a/configure.ac b/configure.ac index e835f498c..e53928a8f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.4.0], + [2.5.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-version.h b/src/hb-version.h index 783e37b08..ec6e67ebd 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -37,10 +37,10 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 -#define HB_VERSION_MINOR 4 +#define HB_VERSION_MINOR 5 #define HB_VERSION_MICRO 0 -#define HB_VERSION_STRING "2.4.0" +#define HB_VERSION_STRING "2.5.0" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From f93a5e6a7dad4fde2bf61c241bf32da678525c8b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 17:02:38 -0400 Subject: [PATCH 387/617] [win] Add mingw-ldd.py Part of https://github.com/harfbuzz/harfbuzz/issues/1728 --- mingw-ldd.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 mingw-ldd.py diff --git a/mingw-ldd.py b/mingw-ldd.py new file mode 100755 index 000000000..1d659efa4 --- /dev/null +++ b/mingw-ldd.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Copied from https://github.com/xantares/mingw-ldd/blob/master/mingw-ldd.py +# Modified to point to right prefix location on Fedora. + +# WTFPL - Do What the Fuck You Want to Public License +from __future__ import print_function +import pefile +import os +import sys + + +def get_dependency(filename): + deps = [] + pe = pefile.PE(filename) + for imp in pe.DIRECTORY_ENTRY_IMPORT: + deps.append(imp.dll.decode()) + return deps + + +def dep_tree(root, prefix=None): + if not prefix: + arch = get_arch(root) + #print('Arch =', arch) + prefix = '/usr/'+arch+'-w64-mingw32/sys-root/mingw/bin' + #print('Using default prefix', prefix) + dep_dlls = dict() + + def dep_tree_impl(root, prefix): + for dll in get_dependency(root): + if dll in dep_dlls: + continue + full_path = os.path.join(prefix, dll) + if os.path.exists(full_path): + dep_dlls[dll] = full_path + dep_tree_impl(full_path, prefix=prefix) + else: + dep_dlls[dll] = 'not found' + + dep_tree_impl(root, prefix) + return (dep_dlls) + + +def get_arch(filename): + type2arch= {pefile.OPTIONAL_HEADER_MAGIC_PE: 'i686', + pefile.OPTIONAL_HEADER_MAGIC_PE_PLUS: 'x86_64'} + pe = pefile.PE(filename) + try: + return type2arch[pe.PE_TYPE] + except KeyError: + sys.stderr.write('Error: unknown architecture') + sys.exit(1) + +if __name__ == '__main__': + filename = sys.argv[1] + for dll, full_path in dep_tree(filename).items(): + print(' ' * 7, dll, '=>', full_path) + From 97ba206bed341dc7c915a86531512b1e0617303d Mon Sep 17 00:00:00 2001 From: Nathan Willis Date: Sat, 25 May 2019 12:26:50 +0100 Subject: [PATCH 388/617] Usermanual; minor. --- ...al-buffers-language-script-and-direction.xml | 2 +- docs/usermanual-opentype-features.xml | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index e9585c467..2865426f2 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -215,7 +215,7 @@ bottom-to-top (HB_DIRECTION_BTT). For the script property, HarfBuzz uses identifiers based on the ISO-15924 + url="https://unicode.org/iso15924/">ISO 15924 standard. For languages, HarfBuzz uses tags based on the IETF BCP 47 standard. diff --git a/docs/usermanual-opentype-features.xml b/docs/usermanual-opentype-features.xml index 242ac8e1f..3eedab3d4 100644 --- a/docs/usermanual-opentype-features.xml +++ b/docs/usermanual-opentype-features.xml @@ -66,15 +66,15 @@ The algorithms used for complex scripts can be quite involved; HarfBuzz tries - to be 100% compatible with the OpenType Layout specification + to be compatible with the OpenType Layout specification and, wherever there is any ambiguity, HarfBuzz attempts to replicate the output of Microsoft's Uniscribe engine. See the Microsoft - Typeography pages for more detail. + Typography pages for more detail. - In general, though, all that you need to know if that - hb-shape() returns the results of shaping + In general, though, all that you need to know is that + hb_shape() returns the results of shaping in the same buffer that you provided. The buffer's content type will now be set to HB_BUFFER_CONTENT_TYPE_GLYPHS, indicating @@ -194,7 +194,10 @@ Just like we enabled the dlig feature by setting its value to 1, you would disable a feature by setting its - value to 0. + value to 0. Some + features can take other value settings; + be sure you read the full specification of each feature tag to + understand what it does and how to control it.
@@ -212,7 +215,7 @@ mix of tables, or one of the tables might simply be broken for the script you need to shape. So, sometimes, you might not want to rely on HarfBuzz's process for deciding what to do, and - just tell hb-shape what you want it to try. + just tell hb_shape() what you want it to try. hb_shape_full() is an alternate shaping @@ -243,7 +246,7 @@ Internally, HarfBuzz uses a structure called a shape plan to track its decisions about how to shape the contents of a - buffer. The hb-shape function builds up the shape plan by + buffer. The hb_shape() function builds up the shape plan by examining segment properties and by inspecting the contents of the font. From 5cf2e648a67e1af20a23e010c86e8812a74ff7a4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 11:15:15 -0400 Subject: [PATCH 389/617] [mingw] Update for Fedora mingw installation location Also adds --with-uniscribe by default. Part of https://github.com/harfbuzz/harfbuzz/issues/1728 --- mingw32.sh | 9 +++++---- mingw64.sh | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/mingw32.sh b/mingw32.sh index 67744051c..25c86a879 100755 --- a/mingw32.sh +++ b/mingw32.sh @@ -14,9 +14,10 @@ unset PKG_CONFIG_PATH # Removed -static from the following export CFLAGS="-static-libgcc" export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS="-I$HOME/.local/$target/include -O2" +export CPPFLAGS="-I$HOME/.local/$target/include" export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig -export PATH=$HOME/.local/$target/bin:$PATH +export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ +export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ +export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target "$@" +../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe "$@" diff --git a/mingw64.sh b/mingw64.sh index 49a143179..2b891f8dc 100755 --- a/mingw64.sh +++ b/mingw64.sh @@ -14,9 +14,10 @@ unset PKG_CONFIG_PATH # Removed -static from the following export CFLAGS="-static-libgcc" export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS="-I$HOME/.local/$target/include -O2" +export CPPFLAGS="-I$HOME/.local/$target/include" export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig -export PATH=$HOME/.local/$target/bin:$PATH +export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ +export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ +export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target "$@" +../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe "$@" From c68b4264880c0f99bcb579345e51ce54e799655b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 11:17:56 -0400 Subject: [PATCH 390/617] [mingw] Update for recent change --- README.wine.md | 2 +- RELEASING.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.wine.md b/README.wine.md index 799eb631f..34214299f 100644 --- a/README.wine.md +++ b/README.wine.md @@ -20,7 +20,7 @@ steps are recommended: 5. `NOCONFIGURE=1 ./autogen.sh && mkdir winbuild && cd winbuild` -6. `../mingw32.sh --with-uniscribe && cd ..` +6. `../mingw32.sh && cd ..` 7. `make -Cwinbuild` diff --git a/RELEASING.md b/RELEASING.md index 5dcce5884..c82fc55a9 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -48,8 +48,8 @@ HarfBuzz release walk-through checklist: a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`, - b. Run `../mingw32.sh --with-uniscribe` script to configure harfbuzz with mingw - in a subdirector (eg. winbuild/), + b. Run `../mingw32.sh` script to configure harfbuzz with mingw in a subdirectory + (eg. winbuild/), c. make From 77a1b6b7c3bd5490ffa5bb48a8b52d9c4c18e669 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 11:18:40 -0400 Subject: [PATCH 391/617] [mingw] Rename README.wine --- Makefile.am | 2 +- README.wine.md => README.mingw.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename README.wine.md => README.mingw.md (100%) diff --git a/Makefile.am b/Makefile.am index a66e2c828..d01bd9cf4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ EXTRA_DIST = \ autogen.sh \ harfbuzz.doap \ README.python.md \ - README.wine.md \ + README.mingw.md \ BUILD.md \ RELEASING.md \ CMakeLists.txt \ diff --git a/README.wine.md b/README.mingw.md similarity index 100% rename from README.wine.md rename to README.mingw.md From 7b716cbbe6de2902ca6b1f67024b3f8cdb41340c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 11:37:23 -0400 Subject: [PATCH 392/617] [ming2] Update instructions Part of https://github.com/harfbuzz/harfbuzz/issues/1728 Only left to write how to create a win32 bundle. --- README.mingw.md | 44 +++++++++++++++++++++++----------------- RELEASING.md | 54 ++++++------------------------------------------- 2 files changed, 32 insertions(+), 66 deletions(-) diff --git a/README.mingw.md b/README.mingw.md index 34214299f..76d1a8754 100644 --- a/README.mingw.md +++ b/README.mingw.md @@ -4,37 +4,45 @@ implementation and that specially is important where OpenType specification is or wasn't that clear. For having access to Uniscribe on Linux/macOS these steps are recommended: -1. Install Wine from your favorite package manager. +1. Install Wine from your favorite package manager. On Fedora that's `dnf install wine`. 2. And `mingw-w64` compiler. - With `brew` on macOS, you can have it like `brew install mingw-w64` + With `brew` on macOS, you can have it like `brew install mingw-w64`. + On Fedora, with `dnf install mingw32-gcc-c++`, or `dnf install mingw64-gcc-c++` for the + 64-bit Windows. -3. Download and put [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) - on your `~/.local/i686-w64-mingw32`. - -4. Replace all the instances of `/home/behdad/.local/i586-mingw32msvc` - and `/home/behdad/.local/i686-w64-mingw32` with `<$HOME>/.local/i686-w64-mingw32` - on that folder. (`<$HOME>` replace it with `/home/XXX` or `/Users/XXX` on macOS) - - Probably you shouldn't replace the ones are inside binaries. +3. Install cross-compiled dependency packages. Alternatively see [^1] below. + On Fedora that would be `dnf install mingw32-glib2 mingw32-cairo mingw32-freetype` + for 32-bit, or `dnf install mingw64-glib2 mingw64-cairo mingw64-freetype` for 64-bit. 5. `NOCONFIGURE=1 ./autogen.sh && mkdir winbuild && cd winbuild` -6. `../mingw32.sh && cd ..` +6. Run `../mingw32.sh` for 32-bit build, or `../mingw64.sh` for 64-bit. This configures + HarfBuzz for cross-compiling. It enables Uniscribe backend as well. -7. `make -Cwinbuild` +7. `make` -Now you can use hb-shape using `wine winbuild/util/hb-shape.exe` but if you like to -to use the original Uniscribe, +Now you can use hb-shape using `wine util/hb-shape.exe` but if you like to shape with +the Microsoft Uniscribe, 8. Bring a 32bit version of `usp10.dll` for yourself from `C:\Windows\SysWOW64\usp10.dll` of your - Windows installation (assuming you have a 64-bit installation, otherwise `C:\Windows\System32\usp10.dll`) - that it is not a DirectWrite proxy ([for more info](https://en.wikipedia.org/wiki/Uniscribe)). + Windows installation (assuming you have a 64-bit installation, otherwise + `C:\Windows\System32\usp10.dll`) that it is not a DirectWrite proxy + ([for more info](https://en.wikipedia.org/wiki/Uniscribe)). Rule of thumb, your `usp10.dll` should have a size more than 500kb, otherwise it is designed to work with DirectWrite which Wine can't work with its original one. + You want a Uniscribe from Windows 7 or older. - Put the dll on the folder you are going to run the next command, + Put the DLL in the folder you are going to run the next command, -9. `WINEDLLOVERRIDES="usp10=n" wine winbuild/util/hb-shape.exe fontname.ttf -u 0061,0062,0063 --shaper=uniscribe` +9. `WINEDLLOVERRIDES="usp10=n" wine util/hb-shape.exe fontname.ttf -u 0061,0062,0063 --shaper=uniscribe` (`0061,0062,0063` means `abc`, use test/shaping/hb-unicode-decode to generate ones you need) + + +[^1] Download and put [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) + in your `~/.local/i686-w64-mingw32`. Then replace all the instances of + `/home/behdad/.local/i586-mingw32msvc` and `/home/behdad/.local/i686-w64-mingw32` + with `<$HOME>/.local/i686-w64-mingw32` on that folder. + (`<$HOME>` replace it with `/home/XXX` or `/Users/XXX` on macOS) + You shouldn't replace the instances of those inside binary files. diff --git a/RELEASING.md b/RELEASING.md index c82fc55a9..bcc639058 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -46,27 +46,21 @@ HarfBuzz release walk-through checklist: 10. Build win32 bundle. - a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`, + a. Build Win32 binaries. See [README.mingw.md](README.mingw.md). - b. Run `../mingw32.sh` script to configure harfbuzz with mingw in a subdirectory - (eg. winbuild/), - - c. make - - d. Back in the parent directory, run `./UPDATE.sh`(available below) to build win32 - bundle. + b. TODO. 11. Copy all artefacts to users.freedesktop.org and move them into `/srv/www.freedesktop.org/www/software/harfbuzz/release` There should be four files. Eg.: ``` --rw-r--r-- 1 behdad eng 1592693 Jul 18 11:25 harfbuzz-1.4.7.tar.bz2 --rw-r--r-- 1 behdad eng 89 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256 --rw-r--r-- 1 behdad eng 339 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256.asc +-rw-r--r-- 1 behdad eng 1592693 Jul 18 11:25 harfbuzz-1.4.7.tar.xz +-rw-r--r-- 1 behdad eng 89 Jul 18 11:34 harfbuzz-1.4.7.tar.xz.sha256 +-rw-r--r-- 1 behdad eng 339 Jul 18 11:34 harfbuzz-1.4.7.tar.xz.sha256.asc -rw-r--r-- 1 behdad eng 2895619 Jul 18 11:34 harfbuzz-1.4.7-win32.zip ``` -12. While doing that, quickly double-check the size of the .tar.bz2 and .zip +12. While doing that, quickly double-check the size of the .tar.xz and .zip files against their previous releases to make sure nothing bad happened. They should be in the ballpark, perhaps slightly larger. Sometimes they do shrink, that's not by itself a stopper. @@ -76,39 +70,3 @@ HarfBuzz release walk-through checklist: 14. Go to GitHub release page [here](https://github.com/harfbuzz/harfbuzz/releases), edit the tag, upload artefacts and NEWS entry and save. - - -## UPDATE.sh -```bash -#!/bin/bash - -v=$1 - -if test "x$v" = x; then - echo "usage: UPDATE.sh micro-version" - exit 1 -fi - -dir_prefix=harfbuzz-1.4. -dir_suffix=-win32 -dir=$dir_prefix$v$dir_suffix -dir_old=$dir_prefix$((v-1))$dir_suffix -if test -d "$dir"; then - echo "New dir $dir exists; not overwriting" - exit 1 -fi -if ! test -d "$dir_old"; then - echo "Old dir $dir_old does NOT exist; aborting" - exit 1 -fi -set -ex -cp -a "$dir_old" "$dir.tmp" -rm -f "$dir.tmp"/GDX32.dll -rm -f "$dir.tmp"/usp10.dll -cp ../winbuild/src/.libs/libharfbuzz-0.dll{,.def} $dir.tmp/ -cp ../winbuild/util/.libs/hb-{shape,view}.exe $dir.tmp/ -i686-w64-mingw32-strip $dir.tmp/{hb-shape.exe,hb-view.exe,libharfbuzz-0.dll} -mv $dir.tmp $dir -zip -r $dir.zip $dir -echo Bundle $dir.zip ready -``` From 0e6b7f7cd51d7376f21a422881cb4eb542360b0b Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 25 May 2019 20:27:29 +0430 Subject: [PATCH 393/617] [ci] Build mingw on Fedora and store .exe outputs --- .circleci/config.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 18da0a913..292bdb76f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -192,14 +192,22 @@ jobs: - run: make -j32 - run: make check || .ci/fail.sh | asan_symbolize | c++filt - fedora-O0-debug-outoftreebuild: + fedora-O0-debug-outoftreebuild-mingw: docker: - image: fedora steps: - checkout - - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python || true + - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python wine mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 - - run: mkdir build && cd build && ../configure && make && (make check || ../.ci/fail.sh) + - run: mkdir build && cd build && ../configure && make -j32 && (make check || ../.ci/fail.sh) + - run: mkdir winbuild32 && cd winbuild32 && ../mingw32.sh --without-icu && make -j32 + - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh --without-icu && make -j32 + - store_artifacts: + path: winbuild32/util + destination: win32 + - store_artifacts: + path: winbuild64/util + destination: win64 cmake-gcc: docker: @@ -308,7 +316,7 @@ workflows: - clang-msan - clang-tsan - clang-ubsan - - fedora-O0-debug-outoftreebuild + - fedora-O0-debug-outoftreebuild-mingw # cmake based builds - cmake-gcc From ccfe642c0cdc9fbc8280669e3e8b01dc5eb682d8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:08:05 -0400 Subject: [PATCH 394/617] [mingw] Force off ICU If cross-compiled ICU is not available, we might end up finding the native ICU via icu-config. That's distracting. --- mingw32.sh | 2 +- mingw64.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mingw32.sh b/mingw32.sh index 25c86a879..27c8d8ae3 100755 --- a/mingw32.sh +++ b/mingw32.sh @@ -20,4 +20,4 @@ export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-roo export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe "$@" +../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" diff --git a/mingw64.sh b/mingw64.sh index 2b891f8dc..5e913f337 100755 --- a/mingw64.sh +++ b/mingw64.sh @@ -20,4 +20,4 @@ export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-roo export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe "$@" +../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" From 309a9d8ffb499f89738864acef596685ca495150 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 25 May 2019 20:40:03 +0430 Subject: [PATCH 395/617] [ci] Remove --without-icu now that we have it in ./mingw{32,64} scripts --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 292bdb76f..2b65910d1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -200,8 +200,8 @@ jobs: - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python wine mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 - run: mkdir build && cd build && ../configure && make -j32 && (make check || ../.ci/fail.sh) - - run: mkdir winbuild32 && cd winbuild32 && ../mingw32.sh --without-icu && make -j32 - - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh --without-icu && make -j32 + - run: mkdir winbuild32 && cd winbuild32 && ../mingw32.sh && make -j32 + - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh && make -j32 - store_artifacts: path: winbuild32/util destination: win32 From a0a75a7c701932f4533b104eeb3c6087d01aa2ae Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:16:28 -0400 Subject: [PATCH 396/617] [mingw] More --- Makefile.am | 8 +++++++- mingw-configure.sh | 29 +++++++++++++++++++++++++++++ mingw32.sh | 25 ++----------------------- mingw64.sh | 25 ++----------------------- 4 files changed, 40 insertions(+), 47 deletions(-) create mode 100755 mingw-configure.sh diff --git a/Makefile.am b/Makefile.am index d01bd9cf4..31ad96559 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,12 +9,18 @@ SUBDIRS = src util test docs EXTRA_DIST = \ autogen.sh \ harfbuzz.doap \ - README.python.md \ + README.md \ README.mingw.md \ + README.python.md \ BUILD.md \ RELEASING.md \ + TESTING.md \ CMakeLists.txt \ replace-enum-strings.cmake \ + mingw-configure.sh \ + mingw-ldd.py \ + mingw32.sh \ + mingw64.sh \ $(NULL) MAINTAINERCLEANFILES = \ diff --git a/mingw-configure.sh b/mingw-configure.sh new file mode 100755 index 000000000..0c3ec3489 --- /dev/null +++ b/mingw-configure.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +case $1 in + i686 | x86_64) ;; + *) echo "Usage: $0 i686|x86_64" >&2; exit 1 ;; +esac + +target=$1-w64-mingw32 +shift + +unset CC +unset CXX +unset CPP +unset LD +unset LDFLAGS +unset CFLAGS +unset CXXFLAGS +unset PKG_CONFIG_PATH + +# Removed -static from the following +export CFLAGS="-static-libgcc" +export CXXFLAGS="-static-libgcc -static-libstdc++" +export CPPFLAGS="-I$HOME/.local/$target/include" +export LDFLAGS=-L$HOME/.local/$target/lib +export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ +export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ +export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH + +../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" diff --git a/mingw32.sh b/mingw32.sh index 27c8d8ae3..b673678cd 100755 --- a/mingw32.sh +++ b/mingw32.sh @@ -1,23 +1,2 @@ -#!/bin/bash - -target=i686-w64-mingw32 - -unset CC -unset CXX -unset CPP -unset LD -unset LDFLAGS -unset CFLAGS -unset CXXFLAGS -unset PKG_CONFIG_PATH - -# Removed -static from the following -export CFLAGS="-static-libgcc" -export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS="-I$HOME/.local/$target/include" -export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ -export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ -export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH - -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" +#!/bin/sh +exec "`dirname "$0"`/mingw-configure.sh" i686 "$@" diff --git a/mingw64.sh b/mingw64.sh index 5e913f337..5bc46e569 100755 --- a/mingw64.sh +++ b/mingw64.sh @@ -1,23 +1,2 @@ -#!/bin/bash - -target=x86_64-w64-mingw32 - -unset CC -unset CXX -unset CPP -unset LD -unset LDFLAGS -unset CFLAGS -unset CXXFLAGS -unset PKG_CONFIG_PATH - -# Removed -static from the following -export CFLAGS="-static-libgcc" -export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS="-I$HOME/.local/$target/include" -export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ -export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ -export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH - -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" +#!/bin/sh +exec "`dirname "$0"`/mingw-configure.sh" x86_64 "$@" From c41ed54b169c16fb9862e88ddf127ae68c1561e9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:35:09 -0400 Subject: [PATCH 397/617] [mingw] Add "make dist-win" to toplevel Makefile --- Makefile.am | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 31ad96559..26ebdc6e7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -66,8 +66,6 @@ DISTCHECK_CONFIGURE_FLAGS = \ --enable-introspection \ $(NULL) -# TODO: Copy infrastructure from cairo - # TAR_OPTIONS is not set as env var for 'make dist'. How to fix that? TAR_OPTIONS = --owner=0 --group=0 @@ -76,7 +74,6 @@ dist-hook: dist-clear-sticky-bits dist-clear-sticky-bits: chmod -R a-s $(distdir) - tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.xz sha256_file = $(tar_file).sha256 gpg_file = $(sha256_file).asc @@ -88,5 +85,18 @@ $(gpg_file): $(sha256_file) release-files: $(tar_file) $(sha256_file) $(gpg_file) +dist-win: + @case $(host_triplet) in *-w64-mingw32) ;; *) echo "Error: Requires mingw build. See README.mingw.md.">&2; exit 1 ;; esac + @DIR=$(PACKAGE_TARNAME)-$(VERSION)-win`case $(host_triplet) in i686-*) echo 32 ;; x86_64-*) echo 64 ;; esac`; \ + $(RM) -r $$DIR; $(MKDIR_P) $$DIR || exit 1; \ + cp util/.libs/hb-{shape,view,subset}.exe $$DIR && \ + $(top_srcdir)/mingw-ldd.py $$DIR/hb-view.exe | grep -v 'not found' | cut -d '>' -f 2 | xargs cp -t $$DIR && \ + cp src/.libs/libharfbuzz{,-subset}-0.dll $$DIR && \ + chmod a+x $$DIR/*.{exe,dll} && \ + $(STRIP) $$DIR/*.{exe,dll} && \ + zip -r $$DIR.zip $$DIR && \ + $(RM) -r $$DIR && \ + echo "$$DIR.zip is ready." + -include $(top_srcdir)/git.mk From f3b132187fc734cbb3705b405361c8bad9a72582 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:42:38 -0400 Subject: [PATCH 398/617] [mingw] Some more tweaks It now survives ./config.status --recheck as well. https://github.com/harfbuzz/harfbuzz/issues/1728 --- mingw-configure.sh | 37 ++++++++++++++++++------------------- mingw32.sh | 2 +- mingw64.sh | 2 +- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/mingw-configure.sh b/mingw-configure.sh index 0c3ec3489..3281ce382 100755 --- a/mingw-configure.sh +++ b/mingw-configure.sh @@ -8,22 +8,21 @@ esac target=$1-w64-mingw32 shift -unset CC -unset CXX -unset CPP -unset LD -unset LDFLAGS -unset CFLAGS -unset CXXFLAGS -unset PKG_CONFIG_PATH - -# Removed -static from the following -export CFLAGS="-static-libgcc" -export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS="-I$HOME/.local/$target/include" -export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ -export PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ -export PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH - -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target --with-uniscribe --without-icu "$@" +exec "$(dirname "$0")"/configure \ + --build=`../config.guess` \ + --host=$target \ + --prefix=$HOME/.local/$target \ + CC= \ + CXX= \ + CPP= \ + LD= \ + CFLAGS="-static-libgcc" \ + CXXFLAGS="-static-libgcc -static-libstdc++" \ + CPPFLAGS="-I$HOME/.local/$target/include" \ + LDFLAGS=-L$HOME/.local/$target/lib \ + PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ \ + PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ \ + PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH \ + --without-icu \ + --with-uniscribe \ + "$@" diff --git a/mingw32.sh b/mingw32.sh index b673678cd..77edffa98 100755 --- a/mingw32.sh +++ b/mingw32.sh @@ -1,2 +1,2 @@ #!/bin/sh -exec "`dirname "$0"`/mingw-configure.sh" i686 "$@" +exec "$(dirname "$0")"/mingw-configure.sh i686 "$@" diff --git a/mingw64.sh b/mingw64.sh index 5bc46e569..28724a48e 100755 --- a/mingw64.sh +++ b/mingw64.sh @@ -1,2 +1,2 @@ #!/bin/sh -exec "`dirname "$0"`/mingw-configure.sh" x86_64 "$@" +exec "$(dirname "$0")"/mingw-configure.sh x86_64 "$@" From a5d1b0bdaa0183e2bd310640f5867426096e0b18 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:45:40 -0400 Subject: [PATCH 399/617] Look for pthread even if win32 https://github.com/harfbuzz/harfbuzz/issues/1728 --- configure.ac | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index e53928a8f..a80b7e8b4 100644 --- a/configure.ac +++ b/configure.ac @@ -134,9 +134,7 @@ AC_MSG_RESULT([$hb_os_win32]) AM_CONDITIONAL(OS_WIN32, test "$hb_os_win32" = "yes") have_pthread=false -if test "$hb_os_win32" = no; then - AX_PTHREAD([have_pthread=true]) -fi +AX_PTHREAD([have_pthread=true]) if $have_pthread; then AC_DEFINE(HAVE_PTHREAD, 1, [Have POSIX threads]) fi From 210f93c143d0fa2a7b293a6ffd138b3e01cab7c0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:49:20 -0400 Subject: [PATCH 400/617] [mutex] Prefer pthread over windows https://github.com/harfbuzz/harfbuzz/issues/1728 --- src/hb-mutex.hh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hb-mutex.hh b/src/hb-mutex.hh index a760e7317..cbbfa2681 100644 --- a/src/hb-mutex.hh +++ b/src/hb-mutex.hh @@ -48,6 +48,17 @@ /* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */ +#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__)) + +#include +typedef pthread_mutex_t hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER +#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr) +#define hb_mutex_impl_lock(M) pthread_mutex_lock (M) +#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M) +#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M) + + #elif !defined(HB_NO_MT) && defined(_WIN32) #include @@ -63,17 +74,6 @@ typedef CRITICAL_SECTION hb_mutex_impl_t; #define hb_mutex_impl_finish(M) DeleteCriticalSection (M) -#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__)) - -#include -typedef pthread_mutex_t hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER -#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr) -#define hb_mutex_impl_lock(M) pthread_mutex_lock (M) -#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M) -#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M) - - #elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) From 941c1b6d711b8528d0f5faa5655b09ea74f7dfb4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:52:16 -0400 Subject: [PATCH 401/617] [mingw] Update instructions https://github.com/harfbuzz/harfbuzz/issues/1728 --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index bcc639058..360aea764 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -48,7 +48,7 @@ HarfBuzz release walk-through checklist: a. Build Win32 binaries. See [README.mingw.md](README.mingw.md). - b. TODO. + b. Run "make dist-win" to build Win32 bundle. 11. Copy all artefacts to users.freedesktop.org and move them into `/srv/www.freedesktop.org/www/software/harfbuzz/release` There should be four From 85b68a42af541bc91f2851389ac09b012a6d3aa1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 12:59:01 -0400 Subject: [PATCH 402/617] [atomic] Fix warnings https://bugzilla.mozilla.org/show_bug.cgi?id=1554306 --- src/hb-atomic.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index a82ce6cf3..e58ec7570 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -216,7 +216,7 @@ static_assert ((sizeof (long) == sizeof (void *)), ""); #define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */ -#define _hb_memory_barrier() +#define _hb_memory_barrier() do {} while (0) #define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) From 9158cab3f9f9e1a4941c1dbf0aa71455ceb00da6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 25 May 2019 22:33:02 +0430 Subject: [PATCH 403/617] [ci] Store dist-win result instead --- .circleci/config.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2b65910d1..529fc6331 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -200,14 +200,13 @@ jobs: - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python wine mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 - run: mkdir build && cd build && ../configure && make -j32 && (make check || ../.ci/fail.sh) - - run: mkdir winbuild32 && cd winbuild32 && ../mingw32.sh && make -j32 - - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh && make -j32 + - run: pip install pefile + - run: mkdir winbuild32 && cd winbuild32 && ../mingw32.sh && make -j32 && make dist-win && cp harfbuzz-*-win32.zip harfbuzz-win32.zip + - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh && make -j32 && make dist-win && cp harfbuzz-*-win64.zip harfbuzz-win64.zip - store_artifacts: - path: winbuild32/util - destination: win32 + path: winbuild32/harfbuzz-win32.zip - store_artifacts: - path: winbuild64/util - destination: win64 + path: winbuild64/harfbuzz-win64.zip cmake-gcc: docker: From 9b75da4299adb5487519ddf96e99949b1dad2d5c Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 25 May 2019 22:46:10 +0430 Subject: [PATCH 404/617] [ci] minor --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 529fc6331..039445720 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -205,8 +205,10 @@ jobs: - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh && make -j32 && make dist-win && cp harfbuzz-*-win64.zip harfbuzz-win64.zip - store_artifacts: path: winbuild32/harfbuzz-win32.zip + destination: win32 - store_artifacts: path: winbuild64/harfbuzz-win64.zip + destination: win64 cmake-gcc: docker: From 52aa6c57c5a4b18807a1329549dface90b148f22 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 25 May 2019 22:55:06 +0430 Subject: [PATCH 405/617] [ci] minor --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 039445720..e81f187f7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -205,10 +205,10 @@ jobs: - run: mkdir winbuild64 && cd winbuild64 && ../mingw64.sh && make -j32 && make dist-win && cp harfbuzz-*-win64.zip harfbuzz-win64.zip - store_artifacts: path: winbuild32/harfbuzz-win32.zip - destination: win32 + destination: harfbuzz-win32.zip - store_artifacts: path: winbuild64/harfbuzz-win64.zip - destination: win64 + destination: harfbuzz-win64.zip cmake-gcc: docker: From 771712b3ca97035ba5690e65bd7e63a852286159 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 15:58:45 -0400 Subject: [PATCH 406/617] [ucd] Update for recent packTab No need for separate youseedy package. --- src/gen-ucd-table.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 3d5b8d26c..03d051617 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -10,11 +10,11 @@ if len (sys.argv) != 2: # https://github.com/harfbuzz/packtab -# https://github.com/harfbuzz/youseedy -import youseedy, packTab +import packTab +import packTab.ucdxml -ucdxml = youseedy.load_ucdxml(sys.argv[1]) -ucd = youseedy.ucdxml_get_repertoire(ucdxml) +ucdxml = packTab.ucdxml.load_ucdxml(sys.argv[1]) +ucd = packTab.ucdxml.ucdxml_get_repertoire(ucdxml) gc = [u['gc'] for u in ucd] From ad17a8bdd571c7b275f9735e3602a8068f12934f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 25 May 2019 16:33:21 -0400 Subject: [PATCH 407/617] [ucd] Update for latest packTab --- src/gen-ucd-table.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 03d051617..3f821802d 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -88,9 +88,9 @@ print('#include "hb.hh"') print() code = packTab.Code('_hb_ucd') -sc_array, _, _ = code.addArray('hb_script_t', 'sc_map', sc_array) -dm1_array, _, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) -dm2_array, _, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) +sc_array, _ = code.addArray('hb_script_t', 'sc_map', sc_array) +dm1_array, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) +dm2_array, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) code.print_c(linkage='static inline') for compression in (DEFAULT, COMPACT): From 179570d4cae9aefcd91d540b8865a81d569b3358 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 May 2019 13:08:07 -0400 Subject: [PATCH 408/617] [atomic] Fix warning, second time Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1554306 --- src/hb-atomic.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index e58ec7570..45413d5e7 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -227,7 +227,7 @@ static_assert ((sizeof (long) == sizeof (void *)), ""); #define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) -#define _hb_memory_barrier() +#define _hb_memory_barrier() do {} while (0) #define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) From d64fb9db520d77eb7bb40ceda4e20be5e602bf91 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sun, 26 May 2019 11:05:54 -0400 Subject: [PATCH 409/617] [use] Allow U+1A60 TAI THAM SIGN SAKOT after vowel --- src/gen-use-table.py | 7 +- src/hb-ot-shape-complex-use-machine.hh | 609 +++++++++--------- src/hb-ot-shape-complex-use-machine.rl | 20 +- src/hb-ot-shape-complex-use-table.cc | 4 +- src/hb-ot-shape-complex-use.cc | 3 + src/hb-ot-shape-complex-use.hh | 2 + ...c01fede4debd4b7794ccb1b16cdb9987ea7571.ttf | Bin 0 -> 1144 bytes ...565cabd5208d345d0ed4fda7ae742917d846a5.ttf | Bin 1056 -> 0 bytes .../data/in-house/tests/use-syllable.tests | 5 +- 9 files changed, 351 insertions(+), 299 deletions(-) create mode 100644 test/shaping/data/in-house/fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf delete mode 100644 test/shaping/data/in-house/fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf diff --git a/src/gen-use-table.py b/src/gen-use-table.py index c86bdbbdc..820838cf8 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -214,7 +214,9 @@ def is_CONS_SUB(U, UISC, UGC): def is_CONS_WITH_STACKER(U, UISC, UGC): return UISC == Consonant_With_Stacker def is_HALANT(U, UISC, UGC): - return UISC in [Virama, Invisible_Stacker] and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC) + return (UISC in [Virama, Invisible_Stacker] + and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC) + and not is_SAKOT(U, UISC, UGC)) def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC): # https://github.com/harfbuzz/harfbuzz/issues/1102 # https://github.com/harfbuzz/harfbuzz/issues/1379 @@ -240,6 +242,8 @@ def is_Reserved(U, UISC, UGC): return UGC == 'Cn' def is_REPHA(U, UISC, UGC): return UISC in [Consonant_Preceding_Repha, Consonant_Prefixed] +def is_SAKOT(U, UISC, UGC): + return U == 0x1A60 def is_SYM(U, UISC, UGC): if U == 0x25CC: return False #SPEC-DRAFT #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter @@ -279,6 +283,7 @@ use_mapping = { 'Rsv': is_Reserved, 'R': is_REPHA, 'S': is_SYM, + 'Sk': is_SAKOT, 'SM': is_SYM_MOD, 'VS': is_VARIATION_SELECTOR, 'V': is_VOWEL, diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index 39c20dec8..01fe3d788 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -36,39 +36,42 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 47u, 21u, 21u, 11u, 47u, 11u, 47u, - 1u, 15u, 1u, 1u, 11u, 47u, 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, - 45u, 46u, 46u, 46u, 24u, 47u, 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, - 22u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, 11u, 47u, 1u, 47u, 11u, 47u, 13u, 21u, - 4u, 4u, 13u, 13u, 11u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 11u, 47u, 11u, 47u, - 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 47u, - 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, - 22u, 47u, 11u, 47u, 1u, 47u, 1u, 15u, 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, - 1u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 21u, 42u, 1u, 5u, 0 + 12u, 48u, 1u, 15u, 1u, 1u, 12u, 48u, 1u, 1u, 0u, 48u, 21u, 21u, 11u, 48u, + 11u, 48u, 1u, 15u, 1u, 1u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, + 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, + 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, + 1u, 48u, 11u, 48u, 13u, 21u, 4u, 4u, 13u, 13u, 11u, 48u, 11u, 48u, 41u, 42u, + 42u, 42u, 11u, 48u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, + 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u, + 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 1u, 48u, 1u, 15u, + 4u, 4u, 13u, 21u, 13u, 13u, 12u, 48u, 1u, 48u, 11u, 48u, 41u, 42u, 42u, 42u, + 21u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 33, 15, 1, 33, 48, 1, 37, 37, - 15, 1, 37, 26, 25, 24, 23, 22, - 2, 1, 24, 24, 24, 25, 25, 25, - 26, 26, 26, 26, 37, 47, 37, 9, - 1, 1, 37, 37, 2, 1, 37, 37, - 26, 25, 24, 23, 22, 2, 1, 24, - 24, 24, 25, 25, 25, 26, 26, 26, - 26, 37, 47, 15, 1, 9, 1, 33, - 47, 37, 2, 1, 22, 5 + 37, 15, 1, 37, 1, 49, 1, 38, + 38, 15, 1, 38, 27, 26, 24, 23, + 22, 2, 1, 25, 25, 25, 1, 25, + 26, 26, 26, 27, 27, 27, 27, 38, + 48, 38, 9, 1, 1, 38, 38, 2, + 1, 38, 38, 27, 26, 24, 23, 22, + 2, 1, 25, 25, 25, 25, 26, 26, + 26, 27, 27, 27, 27, 38, 48, 15, + 1, 9, 1, 37, 48, 38, 2, 1, + 22, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 34, 50, 52, 86, 135, 137, 175, - 213, 229, 231, 269, 296, 322, 347, 371, - 394, 397, 399, 424, 449, 474, 500, 526, - 552, 579, 606, 633, 660, 698, 746, 784, - 794, 796, 798, 836, 874, 877, 879, 917, - 955, 982, 1008, 1033, 1057, 1080, 1083, 1085, - 1110, 1135, 1160, 1186, 1212, 1238, 1265, 1292, - 1319, 1346, 1384, 1432, 1448, 1450, 1460, 1462, - 1496, 1544, 1582, 1585, 1587, 1610 + 0, 38, 54, 56, 94, 96, 146, 148, + 187, 226, 242, 244, 283, 311, 338, 363, + 387, 410, 413, 415, 441, 467, 493, 495, + 521, 548, 575, 602, 630, 658, 686, 714, + 753, 802, 841, 851, 853, 855, 894, 933, + 936, 938, 977, 1016, 1044, 1071, 1096, 1120, + 1143, 1146, 1148, 1174, 1200, 1226, 1252, 1279, + 1306, 1333, 1361, 1389, 1417, 1445, 1484, 1533, + 1549, 1551, 1561, 1563, 1601, 1650, 1689, 1692, + 1694, 1717 }; static const char _use_syllable_machine_indicies[] = { @@ -76,237 +79,252 @@ static const char _use_syllable_machine_indicies[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 3, 2, 2, 2, 2, 2, + 1, 0, 0, 0, 1, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 3, 2, 6, 5, 5, 5, + 2, 2, 2, 2, 4, 2, 3, 2, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 7, 8, - 9, 7, 10, 11, 9, 9, 9, 9, - 9, 3, 12, 13, 9, 14, 7, 7, - 15, 16, 9, 9, 17, 18, 19, 20, - 21, 22, 23, 17, 24, 25, 26, 27, - 28, 29, 9, 30, 31, 32, 9, 33, - 34, 35, 36, 37, 38, 39, 9, 41, - 40, 43, 1, 42, 42, 44, 42, 42, - 42, 42, 42, 45, 46, 47, 48, 49, - 50, 51, 52, 46, 53, 45, 54, 55, - 56, 57, 42, 58, 59, 60, 42, 42, - 42, 42, 61, 62, 63, 64, 42, 43, - 1, 42, 42, 44, 42, 42, 42, 42, - 42, 65, 46, 47, 48, 49, 50, 51, - 52, 46, 53, 54, 54, 55, 56, 57, - 42, 58, 59, 60, 42, 42, 42, 42, - 61, 62, 63, 64, 42, 43, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 67, 66, 43, 66, 43, - 1, 42, 42, 44, 42, 42, 42, 42, - 42, 42, 46, 47, 48, 49, 50, 51, - 52, 46, 53, 54, 54, 55, 56, 57, - 42, 58, 59, 60, 42, 42, 42, 42, - 61, 62, 63, 64, 42, 46, 47, 48, - 49, 50, 42, 42, 42, 42, 42, 42, - 55, 56, 57, 42, 58, 59, 60, 42, - 42, 42, 42, 47, 62, 63, 64, 42, - 47, 48, 49, 50, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 58, 59, - 60, 42, 42, 42, 42, 42, 62, 63, - 64, 42, 48, 49, 50, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 62, - 63, 64, 42, 49, 50, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 62, - 63, 64, 42, 50, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 62, 63, - 64, 42, 62, 63, 42, 63, 42, 48, - 49, 50, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 58, 59, 60, 42, - 42, 42, 42, 42, 62, 63, 64, 42, - 48, 49, 50, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 59, 60, - 42, 42, 42, 42, 42, 62, 63, 64, - 42, 48, 49, 50, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 60, 42, 42, 42, 42, 42, 62, 63, - 64, 42, 47, 48, 49, 50, 42, 42, - 42, 42, 42, 42, 55, 56, 57, 42, - 58, 59, 60, 42, 42, 42, 42, 47, - 62, 63, 64, 42, 47, 48, 49, 50, - 42, 42, 42, 42, 42, 42, 42, 56, - 57, 42, 58, 59, 60, 42, 42, 42, - 42, 47, 62, 63, 64, 42, 47, 48, - 49, 50, 42, 42, 42, 42, 42, 42, - 42, 42, 57, 42, 58, 59, 60, 42, - 42, 42, 42, 47, 62, 63, 64, 42, - 46, 47, 48, 49, 50, 42, 52, 46, - 42, 42, 42, 55, 56, 57, 42, 58, - 59, 60, 42, 42, 42, 42, 47, 62, - 63, 64, 42, 46, 47, 48, 49, 50, - 42, 68, 46, 42, 42, 42, 55, 56, - 57, 42, 58, 59, 60, 42, 42, 42, - 42, 47, 62, 63, 64, 42, 46, 47, - 48, 49, 50, 42, 42, 46, 42, 42, - 42, 55, 56, 57, 42, 58, 59, 60, - 42, 42, 42, 42, 47, 62, 63, 64, - 42, 46, 47, 48, 49, 50, 51, 52, - 46, 42, 42, 42, 55, 56, 57, 42, - 58, 59, 60, 42, 42, 42, 42, 47, - 62, 63, 64, 42, 43, 1, 42, 42, - 44, 42, 42, 42, 42, 42, 42, 46, - 47, 48, 49, 50, 51, 52, 46, 53, - 42, 54, 55, 56, 57, 42, 58, 59, - 60, 42, 42, 42, 42, 61, 62, 63, - 64, 42, 43, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 67, 66, 66, 66, 66, 66, 66, 66, - 47, 48, 49, 50, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 58, 59, - 60, 66, 66, 66, 66, 66, 62, 63, - 64, 66, 43, 1, 42, 42, 44, 42, - 42, 42, 42, 42, 42, 46, 47, 48, - 49, 50, 51, 52, 46, 53, 45, 54, - 55, 56, 57, 42, 58, 59, 60, 42, - 42, 42, 42, 61, 62, 63, 64, 42, - 70, 69, 69, 69, 69, 69, 69, 69, - 71, 69, 10, 72, 70, 69, 43, 1, - 42, 42, 44, 42, 42, 42, 42, 42, - 73, 46, 47, 48, 49, 50, 51, 52, - 46, 53, 45, 54, 55, 56, 57, 42, - 58, 59, 60, 42, 74, 75, 42, 61, - 62, 63, 64, 42, 43, 1, 42, 42, - 44, 42, 42, 42, 42, 42, 42, 46, - 47, 48, 49, 50, 51, 52, 46, 53, - 45, 54, 55, 56, 57, 42, 58, 59, - 60, 42, 74, 75, 42, 61, 62, 63, - 64, 42, 74, 75, 76, 75, 76, 3, - 6, 77, 77, 78, 77, 77, 77, 77, - 77, 79, 17, 18, 19, 20, 21, 22, - 23, 17, 24, 26, 26, 27, 28, 29, - 77, 30, 31, 32, 77, 77, 77, 77, - 36, 37, 38, 39, 77, 3, 6, 77, - 77, 78, 77, 77, 77, 77, 77, 77, - 17, 18, 19, 20, 21, 22, 23, 17, - 24, 26, 26, 27, 28, 29, 77, 30, - 31, 32, 77, 77, 77, 77, 36, 37, - 38, 39, 77, 17, 18, 19, 20, 21, - 77, 77, 77, 77, 77, 77, 27, 28, - 29, 77, 30, 31, 32, 77, 77, 77, - 77, 18, 37, 38, 39, 77, 18, 19, - 20, 21, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 30, 31, 32, 77, - 77, 77, 77, 77, 37, 38, 39, 77, - 19, 20, 21, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 37, 38, 39, - 77, 20, 21, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 37, 38, 39, - 77, 21, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 37, 38, 39, 77, - 37, 38, 77, 38, 77, 19, 20, 21, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 30, 31, 32, 77, 77, 77, - 77, 77, 37, 38, 39, 77, 19, 20, - 21, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 31, 32, 77, 77, - 77, 77, 77, 37, 38, 39, 77, 19, - 20, 21, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 32, 77, - 77, 77, 77, 77, 37, 38, 39, 77, - 18, 19, 20, 21, 77, 77, 77, 77, - 77, 77, 27, 28, 29, 77, 30, 31, - 32, 77, 77, 77, 77, 18, 37, 38, - 39, 77, 18, 19, 20, 21, 77, 77, - 77, 77, 77, 77, 77, 28, 29, 77, - 30, 31, 32, 77, 77, 77, 77, 18, - 37, 38, 39, 77, 18, 19, 20, 21, - 77, 77, 77, 77, 77, 77, 77, 77, - 29, 77, 30, 31, 32, 77, 77, 77, - 77, 18, 37, 38, 39, 77, 17, 18, - 19, 20, 21, 77, 23, 17, 77, 77, - 77, 27, 28, 29, 77, 30, 31, 32, - 77, 77, 77, 77, 18, 37, 38, 39, - 77, 17, 18, 19, 20, 21, 77, 80, - 17, 77, 77, 77, 27, 28, 29, 77, - 30, 31, 32, 77, 77, 77, 77, 18, - 37, 38, 39, 77, 17, 18, 19, 20, - 21, 77, 77, 17, 77, 77, 77, 27, - 28, 29, 77, 30, 31, 32, 77, 77, - 77, 77, 18, 37, 38, 39, 77, 17, - 18, 19, 20, 21, 22, 23, 17, 77, - 77, 77, 27, 28, 29, 77, 30, 31, - 32, 77, 77, 77, 77, 18, 37, 38, - 39, 77, 3, 6, 77, 77, 78, 77, - 77, 77, 77, 77, 77, 17, 18, 19, - 20, 21, 22, 23, 17, 24, 77, 26, - 27, 28, 29, 77, 30, 31, 32, 77, - 77, 77, 77, 36, 37, 38, 39, 77, - 3, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 4, 77, - 77, 77, 77, 77, 77, 77, 18, 19, - 20, 21, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 30, 31, 32, 77, - 77, 77, 77, 77, 37, 38, 39, 77, - 3, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 4, 81, - 82, 77, 13, 77, 77, 77, 77, 77, - 77, 77, 83, 77, 13, 77, 6, 81, + 6, 5, 5, 5, 6, 5, 7, 5, + 8, 9, 10, 8, 11, 12, 10, 10, + 10, 10, 10, 3, 13, 14, 10, 15, + 8, 8, 16, 17, 10, 10, 18, 19, + 20, 21, 22, 23, 24, 18, 25, 26, + 27, 28, 29, 30, 10, 31, 32, 33, + 10, 34, 35, 36, 37, 38, 39, 40, + 13, 10, 42, 41, 44, 1, 43, 43, + 45, 43, 43, 43, 43, 43, 46, 47, + 48, 49, 50, 51, 52, 53, 47, 54, + 46, 55, 56, 57, 58, 43, 59, 60, + 61, 43, 43, 43, 43, 62, 63, 64, + 65, 1, 43, 44, 1, 43, 43, 45, + 43, 43, 43, 43, 43, 66, 47, 48, + 49, 50, 51, 52, 53, 47, 54, 55, + 55, 56, 57, 58, 43, 59, 60, 61, + 43, 43, 43, 43, 62, 63, 64, 65, + 1, 43, 44, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 68, 67, 44, 67, 44, 1, 43, 43, + 45, 43, 43, 43, 43, 43, 43, 47, + 48, 49, 50, 51, 52, 53, 47, 54, + 55, 55, 56, 57, 58, 43, 59, 60, + 61, 43, 43, 43, 43, 62, 63, 64, + 65, 1, 43, 47, 48, 49, 50, 51, + 43, 43, 43, 43, 43, 43, 56, 57, + 58, 43, 59, 60, 61, 43, 43, 43, + 43, 48, 63, 64, 65, 69, 43, 48, + 49, 50, 51, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 59, 60, 61, + 43, 43, 43, 43, 43, 63, 64, 65, + 69, 43, 49, 50, 51, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 63, + 64, 65, 43, 50, 51, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 63, + 64, 65, 43, 51, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 63, 64, + 65, 43, 63, 64, 43, 64, 43, 49, + 50, 51, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 59, 60, 61, 43, + 43, 43, 43, 43, 63, 64, 65, 69, + 43, 49, 50, 51, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 60, + 61, 43, 43, 43, 43, 43, 63, 64, + 65, 69, 43, 49, 50, 51, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 61, 43, 43, 43, 43, 43, + 63, 64, 65, 69, 43, 71, 70, 49, + 50, 51, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 63, 64, 65, 69, + 43, 48, 49, 50, 51, 43, 43, 43, + 43, 43, 43, 56, 57, 58, 43, 59, + 60, 61, 43, 43, 43, 43, 48, 63, + 64, 65, 69, 43, 48, 49, 50, 51, + 43, 43, 43, 43, 43, 43, 43, 57, + 58, 43, 59, 60, 61, 43, 43, 43, + 43, 48, 63, 64, 65, 69, 43, 48, + 49, 50, 51, 43, 43, 43, 43, 43, + 43, 43, 43, 58, 43, 59, 60, 61, + 43, 43, 43, 43, 48, 63, 64, 65, + 69, 43, 47, 48, 49, 50, 51, 43, + 53, 47, 43, 43, 43, 56, 57, 58, + 43, 59, 60, 61, 43, 43, 43, 43, + 48, 63, 64, 65, 69, 43, 47, 48, + 49, 50, 51, 43, 72, 47, 43, 43, + 43, 56, 57, 58, 43, 59, 60, 61, + 43, 43, 43, 43, 48, 63, 64, 65, + 69, 43, 47, 48, 49, 50, 51, 43, + 43, 47, 43, 43, 43, 56, 57, 58, + 43, 59, 60, 61, 43, 43, 43, 43, + 48, 63, 64, 65, 69, 43, 47, 48, + 49, 50, 51, 52, 53, 47, 43, 43, + 43, 56, 57, 58, 43, 59, 60, 61, + 43, 43, 43, 43, 48, 63, 64, 65, + 69, 43, 44, 1, 43, 43, 45, 43, + 43, 43, 43, 43, 43, 47, 48, 49, + 50, 51, 52, 53, 47, 54, 43, 55, + 56, 57, 58, 43, 59, 60, 61, 43, + 43, 43, 43, 62, 63, 64, 65, 1, + 43, 44, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 68, + 67, 67, 67, 67, 67, 67, 67, 48, + 49, 50, 51, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 59, 60, 61, + 67, 67, 67, 67, 67, 63, 64, 65, + 69, 67, 44, 1, 43, 43, 45, 43, + 43, 43, 43, 43, 43, 47, 48, 49, + 50, 51, 52, 53, 47, 54, 46, 55, + 56, 57, 58, 43, 59, 60, 61, 43, + 43, 43, 43, 62, 63, 64, 65, 1, + 43, 74, 73, 73, 73, 73, 73, 73, + 73, 75, 73, 11, 76, 74, 73, 44, + 1, 43, 43, 45, 43, 43, 43, 43, + 43, 77, 47, 48, 49, 50, 51, 52, + 53, 47, 54, 46, 55, 56, 57, 58, + 43, 59, 60, 61, 43, 78, 79, 43, + 62, 63, 64, 65, 1, 43, 44, 1, + 43, 43, 45, 43, 43, 43, 43, 43, + 43, 47, 48, 49, 50, 51, 52, 53, + 47, 54, 46, 55, 56, 57, 58, 43, + 59, 60, 61, 43, 78, 79, 43, 62, + 63, 64, 65, 1, 43, 78, 79, 80, + 79, 80, 3, 6, 81, 81, 82, 81, + 81, 81, 81, 81, 83, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 27, 27, + 28, 29, 30, 81, 31, 32, 33, 81, + 81, 81, 81, 37, 38, 39, 40, 6, + 81, 3, 6, 81, 81, 82, 81, 81, + 81, 81, 81, 81, 18, 19, 20, 21, + 22, 23, 24, 18, 25, 27, 27, 28, + 29, 30, 81, 31, 32, 33, 81, 81, + 81, 81, 37, 38, 39, 40, 6, 81, + 18, 19, 20, 21, 22, 81, 81, 81, + 81, 81, 81, 28, 29, 30, 81, 31, + 32, 33, 81, 81, 81, 81, 19, 38, + 39, 40, 84, 81, 19, 20, 21, 22, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 31, 32, 33, 81, 81, 81, + 81, 81, 38, 39, 40, 84, 81, 20, + 21, 22, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 38, 39, 40, 81, + 21, 22, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 6, 81, - 8, 77, 77, 77, 8, 77, 77, 77, - 77, 77, 3, 6, 13, 77, 78, 77, - 77, 77, 77, 77, 77, 17, 18, 19, - 20, 21, 22, 23, 17, 24, 25, 26, - 27, 28, 29, 77, 30, 31, 32, 77, - 33, 34, 77, 36, 37, 38, 39, 77, - 3, 6, 77, 77, 78, 77, 77, 77, - 77, 77, 77, 17, 18, 19, 20, 21, - 22, 23, 17, 24, 25, 26, 27, 28, - 29, 77, 30, 31, 32, 77, 77, 77, - 77, 36, 37, 38, 39, 77, 33, 34, - 77, 34, 77, 74, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 74, - 75, 76, 8, 81, 81, 81, 8, 81, - 0 + 81, 81, 81, 81, 38, 39, 40, 81, + 22, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 38, 39, 40, 81, 38, + 39, 81, 39, 81, 20, 21, 22, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 31, 32, 33, 81, 81, 81, 81, + 81, 38, 39, 40, 84, 81, 20, 21, + 22, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 32, 33, 81, 81, + 81, 81, 81, 38, 39, 40, 84, 81, + 20, 21, 22, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 33, + 81, 81, 81, 81, 81, 38, 39, 40, + 84, 81, 20, 21, 22, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 38, + 39, 40, 84, 81, 19, 20, 21, 22, + 81, 81, 81, 81, 81, 81, 28, 29, + 30, 81, 31, 32, 33, 81, 81, 81, + 81, 19, 38, 39, 40, 84, 81, 19, + 20, 21, 22, 81, 81, 81, 81, 81, + 81, 81, 29, 30, 81, 31, 32, 33, + 81, 81, 81, 81, 19, 38, 39, 40, + 84, 81, 19, 20, 21, 22, 81, 81, + 81, 81, 81, 81, 81, 81, 30, 81, + 31, 32, 33, 81, 81, 81, 81, 19, + 38, 39, 40, 84, 81, 18, 19, 20, + 21, 22, 81, 24, 18, 81, 81, 81, + 28, 29, 30, 81, 31, 32, 33, 81, + 81, 81, 81, 19, 38, 39, 40, 84, + 81, 18, 19, 20, 21, 22, 81, 85, + 18, 81, 81, 81, 28, 29, 30, 81, + 31, 32, 33, 81, 81, 81, 81, 19, + 38, 39, 40, 84, 81, 18, 19, 20, + 21, 22, 81, 81, 18, 81, 81, 81, + 28, 29, 30, 81, 31, 32, 33, 81, + 81, 81, 81, 19, 38, 39, 40, 84, + 81, 18, 19, 20, 21, 22, 23, 24, + 18, 81, 81, 81, 28, 29, 30, 81, + 31, 32, 33, 81, 81, 81, 81, 19, + 38, 39, 40, 84, 81, 3, 6, 81, + 81, 82, 81, 81, 81, 81, 81, 81, + 18, 19, 20, 21, 22, 23, 24, 18, + 25, 81, 27, 28, 29, 30, 81, 31, + 32, 33, 81, 81, 81, 81, 37, 38, + 39, 40, 6, 81, 3, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 4, 81, 81, 81, 81, 81, + 81, 81, 19, 20, 21, 22, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 31, 32, 33, 81, 81, 81, 81, 81, + 38, 39, 40, 84, 81, 3, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 4, 86, 87, 81, 14, + 81, 81, 81, 81, 81, 81, 81, 88, + 81, 14, 81, 6, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 6, 86, 86, 86, 6, + 86, 9, 81, 81, 81, 9, 81, 81, + 81, 81, 81, 3, 6, 14, 81, 82, + 81, 81, 81, 81, 81, 81, 18, 19, + 20, 21, 22, 23, 24, 18, 25, 26, + 27, 28, 29, 30, 81, 31, 32, 33, + 81, 34, 35, 81, 37, 38, 39, 40, + 6, 81, 3, 6, 81, 81, 82, 81, + 81, 81, 81, 81, 81, 18, 19, 20, + 21, 22, 23, 24, 18, 25, 26, 27, + 28, 29, 30, 81, 31, 32, 33, 81, + 81, 81, 81, 37, 38, 39, 40, 6, + 81, 34, 35, 81, 35, 81, 78, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 78, 79, 80, 9, 86, 86, + 86, 9, 86, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 38, 2, 4, 1, 5, - 6, 4, 31, 34, 59, 60, 63, 64, - 68, 40, 41, 42, 43, 44, 53, 54, - 56, 65, 57, 50, 51, 52, 47, 48, - 49, 66, 67, 69, 58, 45, 46, 4, - 4, 4, 4, 7, 0, 30, 11, 12, - 13, 14, 15, 24, 25, 27, 28, 21, - 22, 23, 18, 19, 20, 29, 16, 17, - 4, 10, 4, 9, 26, 4, 32, 33, - 4, 35, 36, 37, 4, 4, 3, 39, - 55, 4, 61, 62 + 5, 9, 5, 41, 2, 5, 1, 53, + 6, 7, 5, 34, 37, 63, 64, 67, + 68, 72, 43, 44, 45, 46, 47, 57, + 58, 60, 69, 61, 54, 55, 56, 50, + 51, 52, 70, 71, 73, 62, 48, 49, + 5, 5, 5, 5, 8, 0, 33, 12, + 13, 14, 15, 16, 27, 28, 30, 31, + 24, 25, 26, 19, 20, 21, 32, 17, + 18, 5, 11, 5, 10, 22, 5, 23, + 29, 5, 35, 36, 5, 38, 39, 40, + 5, 5, 3, 42, 4, 59, 5, 65, + 66 }; static const char _use_syllable_machine_trans_actions[] = { - 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 7, 9, 0, 9, 3, + 1, 0, 2, 3, 0, 4, 0, 5, + 0, 5, 8, 0, 5, 9, 0, 9, + 3, 0, 5, 5, 0, 0, 0, 5, + 5, 5, 3, 3, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 3, 0, 0, + 10, 11, 12, 13, 5, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 10, - 11, 12, 13, 7, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 14, 7, 15, 0, 0, 16, 0, 0, - 17, 7, 0, 0, 18, 19, 0, 3, - 0, 20, 0, 0 + 0, 14, 5, 15, 0, 0, 16, 0, + 0, 17, 0, 0, 18, 5, 0, 0, + 19, 20, 0, 3, 0, 5, 21, 0, + 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 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, @@ -314,11 +332,12 @@ static const char _use_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, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 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, @@ -326,33 +345,35 @@ static const char _use_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, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 41, 43, 43, - 67, 67, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 67, 43, 70, - 73, 70, 43, 43, 77, 77, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 82, 78, 78, 78, 82, - 78, 78, 78, 78, 77, 82 + 1, 3, 3, 6, 6, 0, 42, 44, + 44, 68, 68, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 71, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 68, 44, 74, 77, 74, 44, 44, 81, + 81, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 87, + 82, 82, 82, 87, 82, 82, 82, 82, + 81, 87 }; -static const int use_syllable_machine_start = 4; -static const int use_syllable_machine_first_final = 4; +static const int use_syllable_machine_start = 5; +static const int use_syllable_machine_first_final = 5; static const int use_syllable_machine_error = -1; -static const int use_syllable_machine_en_main = 4; +static const int use_syllable_machine_en_main = 5; #line 38 "hb-ot-shape-complex-use-machine.rl" -#line 150 "hb-ot-shape-complex-use-machine.rl" +#line 162 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -371,7 +392,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 375 "hb-ot-shape-complex-use-machine.hh" +#line 396 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -379,7 +400,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 170 "hb-ot-shape-complex-use-machine.rl" +#line 182 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -387,7 +408,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 391 "hb-ot-shape-complex-use-machine.hh" +#line 412 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -397,11 +418,11 @@ find_syllables (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 6: + case 7: #line 1 "NONE" {ts = p;} break; -#line 405 "hb-ot-shape-complex-use-machine.hh" +#line 426 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -419,73 +440,77 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 7: + case 5: #line 1 "NONE" {te = p+1;} break; case 12: -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 150 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 14: -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 153 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; case 10: -#line 145 "hb-ot-shape-complex-use-machine.rl" +#line 157 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 8: -#line 146 "hb-ot-shape-complex-use-machine.rl" +#line 158 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 11: -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 150 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 15: -#line 140 "hb-ot-shape-complex-use-machine.rl" +#line 151 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; + case 16: +#line 152 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (sakot_terminated_cluster); }} + break; case 13: -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 153 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; - case 17: -#line 142 "hb-ot-shape-complex-use-machine.rl" + case 18: +#line 154 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; - case 16: -#line 143 "hb-ot-shape-complex-use-machine.rl" + case 17: +#line 155 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 18: -#line 144 "hb-ot-shape-complex-use-machine.rl" + case 19: +#line 156 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 19: -#line 145 "hb-ot-shape-complex-use-machine.rl" + case 20: +#line 157 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 20: -#line 146 "hb-ot-shape-complex-use-machine.rl" + case 21: +#line 158 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 141 "hb-ot-shape-complex-use-machine.rl" +#line 153 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; case 4: -#line 145 "hb-ot-shape-complex-use-machine.rl" +#line 157 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 2: #line 1 "NONE" { switch( act ) { - case 7: + case 8: {{p = ((te))-1;} found_syllable (broken_cluster); } break; - case 8: + case 9: {{p = ((te))-1;} found_syllable (non_cluster); } break; } @@ -494,25 +519,25 @@ _eof_trans: case 3: #line 1 "NONE" {te = p+1;} -#line 145 "hb-ot-shape-complex-use-machine.rl" - {act = 7;} +#line 157 "hb-ot-shape-complex-use-machine.rl" + {act = 8;} break; case 9: #line 1 "NONE" {te = p+1;} -#line 146 "hb-ot-shape-complex-use-machine.rl" - {act = 8;} +#line 158 "hb-ot-shape-complex-use-machine.rl" + {act = 9;} break; -#line 507 "hb-ot-shape-complex-use-machine.hh" +#line 532 "hb-ot-shape-complex-use-machine.hh" } _again: switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 5: + case 6: #line 1 "NONE" {ts = 0;} break; -#line 516 "hb-ot-shape-complex-use-machine.hh" +#line 541 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -528,7 +553,7 @@ _again: } -#line 178 "hb-ot-shape-complex-use-machine.rl" +#line 190 "hb-ot-shape-complex-use-machine.rl" } diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index 2a1b90d8f..aca7ea683 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -68,6 +68,7 @@ VS = 21; # VARIATION_SELECTOR #VM = 40; # VOWEL_MOD CS = 43; # CONS_WITH_STACKER HVM = 44; # HALANT_OR_VOWEL_MODIFIER +Sk = 48; # SAKOT FAbv = 24; # CONS_FINAL_ABOVE FBlw = 25; # CONS_FINAL_BELOW @@ -92,7 +93,7 @@ FMAbv = 45; # CONS_FINAL_MOD UIPC = Top FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable -h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102 +h = H | HVM | Sk; # Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729 consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; @@ -103,11 +104,16 @@ vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*; final_consonants = FAbv* FBlw* FPst*; final_modifiers = FMAbv* FMBlw* | FMPst?; -complex_syllable_tail = +complex_syllable_start = (R | CS)? (B | GB) VS?; +complex_syllable_middle = consonant_modifiers medial_consonants dependent_vowels vowel_modifiers + (Sk B)* +; +complex_syllable_tail = + complex_syllable_middle final_consonants final_modifiers ; @@ -116,12 +122,17 @@ numeral_cluster_tail = (HN N VS?)+; symbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+; virama_terminated_cluster = - (R|CS)? (B | GB) VS? + complex_syllable_start consonant_modifiers ZWJ?.h.ZWJ? ; +sakot_terminated_cluster = + complex_syllable_start + complex_syllable_middle + Sk +; standard_cluster = - (R|CS)? (B | GB) VS? + complex_syllable_start complex_syllable_tail ; broken_cluster = @@ -138,6 +149,7 @@ other = any; main := |* independent_cluster => { found_syllable (independent_cluster); }; virama_terminated_cluster => { found_syllable (virama_terminated_cluster); }; + sakot_terminated_cluster => { found_syllable (sakot_terminated_cluster); }; standard_cluster => { found_syllable (standard_cluster); }; number_joiner_terminated_cluster => { found_syllable (number_joiner_terminated_cluster); }; numeral_cluster => { found_syllable (numeral_cluster); }; diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index 93b815217..024746989 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -33,6 +33,7 @@ #define Rsv USE_Rsv /* Reserved */ #define S USE_S /* SYM */ #define SUB USE_SUB /* CONS_SUB */ +#define Sk USE_Sk /* SAKOT */ #define VS USE_VS /* VARIATION_SELECTOR */ #define WJ USE_WJ /* Word_Joiner */ #define ZWJ USE_ZWJ /* ZWJ */ @@ -305,7 +306,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O, - /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, + /* 1A60 */ Sk, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FMAbv, FMAbv, O, O, FMBlw, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -822,6 +823,7 @@ hb_use_get_category (hb_codepoint_t u) #undef Rsv #undef S #undef SUB +#undef Sk #undef VS #undef WJ #undef ZWJ diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index cbaa519c4..2cc5ea278 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -246,6 +246,7 @@ data_destroy_use (void *data) enum syllable_type_t { independent_cluster, virama_terminated_cluster, + sakot_terminated_cluster, standard_cluster, number_joiner_terminated_cluster, numeral_cluster, @@ -337,6 +338,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, break; case virama_terminated_cluster: + case sakot_terminated_cluster: case standard_cluster: case number_joiner_terminated_cluster: case numeral_cluster: @@ -443,6 +445,7 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) /* Only a few syllable types need reordering. */ if (unlikely (!(FLAG_UNSAFE (syllable_type) & (FLAG (virama_terminated_cluster) | + FLAG (sakot_terminated_cluster) | FLAG (standard_cluster) | FLAG (broken_cluster) | 0)))) diff --git a/src/hb-ot-shape-complex-use.hh b/src/hb-ot-shape-complex-use.hh index b52b853cd..ce6645ecd 100644 --- a/src/hb-ot-shape-complex-use.hh +++ b/src/hb-ot-shape-complex-use.hh @@ -73,6 +73,8 @@ enum use_category_t { /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ + USE_Sk = 48, /* SAKOT */ + USE_FAbv = 24, /* CONS_FINAL_ABOVE */ USE_FBlw = 25, /* CONS_FINAL_BELOW */ USE_FPst = 26, /* CONS_FINAL_POST */ diff --git a/test/shaping/data/in-house/fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf b/test/shaping/data/in-house/fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf new file mode 100644 index 0000000000000000000000000000000000000000..945d69834c2d35c6f3cf45c45a14b613292f041f GIT binary patch literal 1144 zcmaJ>&ubGw6#iy+^TSwU#0navS+RjCTHEvowzSYT)p`&bj7pn}U6VAaBxy)fX)jvE zlN9V9;7LUA9udT&sD~gz1JYX2gFz31QuI=g^_$IBtF>;J`QG=Q0mFY;#ni#{xq*O$QS4;Od#e8+b6lXPEF8Wt_|jYQ2L10CT>*l#%>CcnuRzBGQ8Ka)F>_a_s_7Ur>Q)vEPf6PDTj|aUJR}qiK8}R;-#WSZ<%KEAV2#wpD}>v2AUGkAwZcVe3vy4`UK}%%Xq^q>x4tI+_s2 zVPc3k)ru}!gD`M~9tqlVM*)|Rq;HW~&eBR@ns3>leu}F(>JkgolibnG5wS6ZP8>rA z$9nV&^eJG9(dAB^8Jn3`XLZ(RKBVWrJ{McB2vumpA)LbHn$AtM_O}hzu%pYy{u*|+ z*w`j9)DaFdq+tIQtJ5Cdjn_^hh#oZHD4&{Q0&*O7o+|pcl=B$^p@}JG7&D62`PdDhFB_GOCp*?~{UL)_#=Bta^V{3(cjr@47m^5(- z*U9gYcjnE-5;|~*e1zO6nEAA4rtdxT(+A&5#Y(lg`m(|Ni{w!V_(c>OVn@|clDZau;fqW2^k|$K9hN z-*H&`s!SWQoBdGOGi3#6a*kE8cTP-*9D1+|KfqOmlvEtsDuLaW&p)|!=-3sjtPb*- zd`F+>Efil66s%Xm#h&ba#&0n;cQu7&-)Nw&8P+focBa2~XW04Fu2l>#XSF*obEV5bqVsGq#?g`m%N%oL2@fV5SwjdhN7nza zak1A=9DSRupF|NQETN2fWROJ_2KtahKQY8p3F0!P2uwVnMT)ZWDB~W|w5>ABO-dOo zAV-@ru5qMWo&8yFSjYc9o}7?E z6S{D Date: Tue, 28 May 2019 13:48:39 +0430 Subject: [PATCH 410/617] [test] minor style improve --- test/subset/run-tests.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index 7bc8e3aa7..5d221e6bb 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Runs a subsetting test suite. Compares the results of subsetting via harfbuz +# Runs a subsetting test suite. Compares the results of subsetting via harfbuzz # to subsetting via fonttools. from __future__ import print_function, division, absolute_import @@ -16,18 +16,18 @@ import tempfile from subset_test_suite import SubsetTestSuite # https://stackoverflow.com/a/377028 -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) +def which (program): + def is_exe (fpath): + return os.path.isfile (fpath) and os.access (fpath, os.X_OK) - fpath, _ = os.path.split(program) + fpath, _ = os.path.split (program) if fpath: - if is_exe(program): + if is_exe (program): return program else: - for path in os.environ["PATH"].split(os.pathsep): - exe_file = os.path.join(path, program) - if is_exe(exe_file): + for path in os.environ["PATH"].split (os.pathsep): + exe_file = os.path.join (path, program) + if is_exe (exe_file): return exe_file return None @@ -36,7 +36,7 @@ fonttools = which ("fonttools") ots_sanitize = which ("ots-sanitize") if not fonttools: - print("fonttools is not present, skipping test.") + print ("fonttools is not present, skipping test.") sys.exit (77) def cmd(command): @@ -50,7 +50,7 @@ def read_binary (file_path): with open (file_path, 'rb') as f: return f.read () -def fail_test(test, cli_args, message): +def fail_test (test, cli_args, message): print ('ERROR: %s' % message) print ('Test State:') print (' test.font_path %s' % os.path.abspath (test.font_path)) @@ -61,8 +61,8 @@ def fail_test(test, cli_args, message): print (' expected_file %s' % os.path.abspath (expected_file)) return 1 -def run_test(test, should_check_ots): - out_file = os.path.join(tempfile.mkdtemp (), test.get_font_name () + '-subset' + test.get_font_extension ()) +def run_test (test, should_check_ots): + out_file = os.path.join (tempfile.mkdtemp (), test.get_font_name () + '-subset' + test.get_font_extension ()) cli_args = [hb_subset, "--font-file=" + test.font_path, "--output-file=" + out_file, @@ -76,11 +76,11 @@ def run_test(test, should_check_ots): return fail_test (test, cli_args, "%s returned %d" % (' '.join (cli_args), return_code)) expected_ttx, return_code = run_ttx (os.path.join (test_suite.get_output_directory (), - test.get_font_name ())) + test.get_font_name ())) if return_code: return fail_test (test, cli_args, "ttx (expected) returned %d" % (return_code)) - actual_ttx, return_code = run_ttx(out_file) + actual_ttx, return_code = run_ttx (out_file) if return_code: return fail_test (test, cli_args, "ttx (actual) returned %d" % (return_code)) @@ -92,7 +92,7 @@ def run_test(test, should_check_ots): for line in unified_diff (expected_ttx.splitlines (1), actual_ttx.splitlines (1)): sys.stdout.write (line) sys.stdout.flush () - return fail_test(test, cli_args, 'ttx for expected and actual does not match.') + return fail_test (test, cli_args, 'ttx for expected and actual does not match.') if should_check_ots: print ("Checking output with ots-sanitize.") @@ -103,7 +103,7 @@ def run_test(test, should_check_ots): def run_ttx (file): print ("fonttools ttx %s" % file) - return cmd([fonttools, "ttx", "-q", "-o-", file]) + return cmd ([fonttools, "ttx", "-q", "-o-", file]) def strip_check_sum (ttx_string): return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]', @@ -124,7 +124,7 @@ def check_ots (path): return True args = sys.argv[1:] -if not args or sys.argv[1].find('hb-subset') == -1 or not os.path.exists (sys.argv[1]): +if not args or sys.argv[1].find ('hb-subset') == -1 or not os.path.exists (sys.argv[1]): print ("First argument does not seem to point to usable hb-subset.") sys.exit (1) hb_subset, args = args[0], args[1:] @@ -139,7 +139,7 @@ fails = 0 for path in args: with io.open (path, mode="r", encoding="utf-8") as f: print ("Running tests in " + path) - test_suite = SubsetTestSuite (path, f.read()) + test_suite = SubsetTestSuite (path, f.read ()) for test in test_suite.tests (): fails += run_test (test, has_ots) From 8a133718472d152fa1f69ec52862b019b71b371f Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 28 May 2019 13:54:45 +0430 Subject: [PATCH 411/617] [test] minor, fix copyright nothing important, fixing a copy paste error inconsistency --- test/api/test-aat-layout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/test-aat-layout.c b/test/api/test-aat-layout.c index 1384556a8..d9dd8a3c2 100644 --- a/test/api/test-aat-layout.c +++ b/test/api/test-aat-layout.c @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Google, Inc. + * Copyright © 2018 Ebrahim Byagowi * * This is part of HarfBuzz, a text shaping library. * From da9d43171ba4ae0a78c92e9de83498fd2f513c8b Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Tue, 28 May 2019 21:50:17 +0700 Subject: [PATCH 412/617] Fix some typos. --- docs/usermanual-clusters.xml | 4 ++-- docs/usermanual-fonts-and-faces.xml | 2 +- src/hb-ot-math.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/usermanual-clusters.xml b/docs/usermanual-clusters.xml index b8d919133..a7b16580a 100644 --- a/docs/usermanual-clusters.xml +++ b/docs/usermanual-clusters.xml @@ -158,7 +158,7 @@ For left-to-right scripts (LTR) and top-to-bottom scripts (TTB), HarfBuzz will preserve the monotonic property: client programs - are guaranteed that monotonically increasing initial clulster + are guaranteed that monotonically increasing initial cluster values will be returned as monotonically increasing final cluster values. @@ -167,7 +167,7 @@ the directionality of the buffer itself is reversed for final output as a matter of design. Therefore, HarfBuzz inverts the monotonic property: client programs are guaranteed that - monotonically increasing initial clulster values will be + monotonically increasing initial cluster values will be returned as monotonically decreasing final cluster values. diff --git a/docs/usermanual-fonts-and-faces.xml b/docs/usermanual-fonts-and-faces.xml index c1787bddf..b87f0e5e8 100644 --- a/docs/usermanual-fonts-and-faces.xml +++ b/docs/usermanual-fonts-and-faces.xml @@ -37,7 +37,7 @@ An hb_face_t represents a face in HarfBuzz. This data type is a wrapper around an hb_blob_t blob that holds the contents of a binary - fotn file. Since HarfBuzz supports TrueType Collections and + font file. Since HarfBuzz supports TrueType Collections and OpenType Collections (each of which can include multiple typefaces), a HarfBuzz face also requires an index number specifying which typeface in the file you want to use. Most of diff --git a/src/hb-ot-math.h b/src/hb-ot-math.h index d88aef8e9..805519543 100644 --- a/src/hb-ot-math.h +++ b/src/hb-ot-math.h @@ -158,7 +158,7 @@ typedef enum { /*< flags >*/ * hb_ot_math_glyph_part_t: * @glyph: The glyph index of the variant part * @start_connector_length: The length of the connector on the starting side of the variant part - * @end_connection_length: The length of the conector on the ending side of the variant part + * @end_connection_length: The length of the connector on the ending side of the variant part * @full_advance: The total advance of the part * @flags: #hb_ot_math_glyph_part_flags_t flags for the part * From 88f9dab366491af144da316384991e74af443226 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 29 May 2019 01:55:31 +0430 Subject: [PATCH 413/617] [ci] Clean up and add disabled bots of other msvc versions (#1733) --- appveyor.yml | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 21d4ea798..5884bc68d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,6 +19,29 @@ environment: configuration: Debug + # Build only + # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + # compiler: msvc2 + # generator: Visual Studio 12 + # platform: Win32 + # configuration: Release + # triplet: x86-windows + + # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + # compiler: msvc2 + # generator: Visual Studio 15 + # platform: Win32 + # configuration: Release + # triplet: x86-windows + + # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + # compiler: msvc2 + # generator: Visual Studio 16 + # platform: Win32 + # configuration: Release + # triplet: x86-windows + + - compiler: msys2 MINGW_PREFIX: /mingw64 MINGW_CHOST: x86_64-w64-mingw32 @@ -30,30 +53,26 @@ environment: install: -# - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "pacman --noconfirm --force -Sy && pacman --noconfirm --force -S pacman-mirrors && pacman --force -Syu --noconfirm"' - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "pacman --noconfirm --force -S --needed mingw-w64-$MSYS2_ARCH-{gcc,freetype,cairo,icu,gettext,gobject-introspection,gcc,gcc-libs,glib2,graphite2,pkg-config,python2}"' - - C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-x86_64-ragel" - - set PATH=%PATH%;C:\msys64\mingw64\bin # msys2 is added just for having "ragel" on PATH - - 'if "%compiler%"=="cygwin" %CYGWIN_PREFIX%\setup-%CYGWIN_ARCH%.exe -g -q -P cygwin-devel,libfreetype-devel,libcairo-devel,libicu-devel,gcc,gcc-g++,gobject-introspection,libglib2.0-devel,libgraphite2-devel,pkg-config,python2' - 'if "%compiler%"=="msvc" if not "%platform%"=="ARM" vcpkg install glib:%triplet% freetype:%triplet% cairo:%triplet%' build_script: - - 'if "%compiler%"=="msvc" md build' - - 'if "%compiler%"=="msvc" cd build' + - 'if "%compiler%"=="msvc" if "%platform%"=="ARM" cmake -Bbuild -H. -DHB_HAVE_UNISCRIBE=ON -DHB_HAVE_DIRECTWRITE=ON -G "%generator%"' + - 'if "%compiler%"=="msvc" if not "%platform%"=="ARM" cmake -Bbuild -H. -DHB_HAVE_UNISCRIBE=ON -DHB_HAVE_DIRECTWRITE=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -DHB_BUILD_UTILS=ON -G "%generator%" -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake' + - 'if "%compiler%"=="msvc" set PATH=%PATH%;C:\Program Files (x86)\MSBuild\14.0\Bin' - - - 'if "%compiler%"=="msvc" if "%platform%"=="ARM" cmake -DHB_HAVE_UNISCRIBE=ON -DHB_HAVE_DIRECTWRITE=ON -G "%generator%" ../' - - 'if "%compiler%"=="msvc" if not "%platform%"=="ARM" cmake -DHB_HAVE_UNISCRIBE=ON -DHB_HAVE_DIRECTWRITE=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -DHB_BUILD_UTILS=ON -G "%generator%" -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake ../' - + - 'if "%compiler%"=="msvc" cd build' - 'if "%compiler%"=="msvc" msbuild harfbuzz.sln /p:Configuration=%configuration% /p:Platform=%platform%' - 'if "%compiler%"=="msvc" if not "%platform%"=="ARM" ctest --output-on-failure -C %configuration%' + - 'if "%compiler%"=="msvc2" cmake -G "%generator%" -Bbuild -H.' + - 'if "%compiler%"=="msvc2" cmake --build build --config %configuration%' + - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "curl https://raw.githubusercontent.com/mirror/mingw-w64/023eb04c396d4e8d8fcf604cfababc53dae13398/mingw-w64-headers/include/dwrite_1.h > %MINGW_PREFIX%/%MINGW_CHOST%/include/dwrite_1.h"' - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "cd $APPVEYOR_BUILD_FOLDER; PATH=$PATH:/mingw64/bin:/mingw32/bin; ./autogen.sh --with-uniscribe --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 --with-directwrite --build=%MINGW_CHOST% --host=%MINGW_CHOST% --prefix=%MINGW_PREFIX%; make -j3 check || .ci/fail.sh"' cache: - c:\tools\vcpkg\installed\ - - '%CYGWIN_PREFIX%\var\cache\setup' notifications: - provider: Email From 87dd4bff1c42f1845fb3d11477e5de210121d48e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 May 2019 11:26:17 -0400 Subject: [PATCH 414/617] [math] Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER To HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER. Added a deprecated macro. Fixes https://github.com/harfbuzz/harfbuzz/issues/1734 --- src/hb-ot-deprecated.h | 4 ++++ src/hb-ot-math-table.hh | 2 +- src/hb-ot-math.h | 2 +- test/api/test-ot-math.c | 16 ++++++++-------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-deprecated.h b/src/hb-ot-deprecated.h index bce51b71e..bc72f8a70 100644 --- a/src/hb-ot-deprecated.h +++ b/src/hb-ot-deprecated.h @@ -40,6 +40,10 @@ HB_BEGIN_DECLS #ifndef HB_DISABLE_DEPRECATED +/* https://github.com/harfbuzz/harfbuzz/issues/1734 */ +#define HB_MATH_GLYPH_PART_FLAG_EXTENDER HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER + + /* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */ HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t hb_ot_layout_table_choose_script (hb_face_t *face, diff --git a/src/hb-ot-math-table.hh b/src/hb-ot-math-table.hh index dd6226404..0b16e0b9b 100644 --- a/src/hb-ot-math-table.hh +++ b/src/hb-ot-math-table.hh @@ -462,7 +462,7 @@ struct MathGlyphPartRecord out.end_connector_length = font->em_scale (endConnectorLength, scale); out.full_advance = font->em_scale (fullAdvance, scale); - static_assert ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER == + static_assert ((unsigned int) HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER == (unsigned int) PartFlags::Extender, ""); out.flags = (hb_ot_math_glyph_part_flags_t) diff --git a/src/hb-ot-math.h b/src/hb-ot-math.h index 805519543..7b2befbce 100644 --- a/src/hb-ot-math.h +++ b/src/hb-ot-math.h @@ -151,7 +151,7 @@ typedef struct hb_ot_math_glyph_variant_t { * Since: 1.3.3 */ typedef enum { /*< flags >*/ - HB_MATH_GLYPH_PART_FLAG_EXTENDER = 0x00000001u /* Extender glyph */ + HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER = 0x00000001u /* Extender glyph */ } hb_ot_math_glyph_part_flags_t; /** diff --git a/test/api/test-ot-math.c b/test/api/test-ot-math.c index 7f500157e..000b0a2c5 100644 --- a/test/api/test-ot-math.c +++ b/test/api/test-ot-math.c @@ -629,19 +629,19 @@ test_get_glyph_assembly (void) g_assert_cmpint(parts[0].start_connector_length, ==, 800); g_assert_cmpint(parts[0].end_connector_length, ==, 384); g_assert_cmpint(parts[0].full_advance, ==, 2000); - g_assert(!(parts[0].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER)); + g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER)); g_assert(hb_font_get_glyph_from_name (hb_font, "horizontal", -1, &glyph)); g_assert_cmpint(parts[1].glyph, ==, glyph); g_assert_cmpint(parts[1].start_connector_length, ==, 524); g_assert_cmpint(parts[1].end_connector_length, ==, 800); g_assert_cmpint(parts[1].full_advance, ==, 2000); - g_assert(parts[1].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER); + g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER); g_assert(hb_font_get_glyph_from_name (hb_font, "right", -1, &glyph)); g_assert_cmpint(parts[2].glyph, ==, glyph); g_assert_cmpint(parts[2].start_connector_length, ==, 316); g_assert_cmpint(parts[2].end_connector_length, ==, 454); g_assert_cmpint(parts[2].full_advance, ==, 2000); - g_assert(!(parts[2].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER)); + g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER)); g_assert(hb_font_get_glyph_from_name (hb_font, "arrowdown", -1, &glyph)); offset = 0; @@ -662,20 +662,20 @@ test_get_glyph_assembly (void) g_assert_cmpint(parts[0].start_connector_length, ==, 365); g_assert_cmpint(parts[0].end_connector_length, ==, 158); g_assert_cmpint(parts[0].full_advance, ==, 1000); - g_assert(!(parts[0].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER)); + g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER)); g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph)); g_assert_cmpint(parts[1].glyph, ==, glyph); g_assert_cmpint(parts[1].glyph, ==, glyph); g_assert_cmpint(parts[1].start_connector_length, ==, 227); g_assert_cmpint(parts[1].end_connector_length, ==, 365); g_assert_cmpint(parts[1].full_advance, ==, 1000); - g_assert(parts[1].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER); + g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER); g_assert(hb_font_get_glyph_from_name (hb_font, "center", -1, &glyph)); g_assert_cmpint(parts[2].glyph, ==, glyph); g_assert_cmpint(parts[2].start_connector_length, ==, 54); g_assert_cmpint(parts[2].end_connector_length, ==, 158); g_assert_cmpint(parts[2].full_advance, ==, 1000); - g_assert(!(parts[2].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER)); + g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER)); g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph)); g_assert_cmpint(parts[3].glyph, ==, glyph); g_assert_cmpint(parts[3].glyph, ==, glyph); @@ -683,13 +683,13 @@ test_get_glyph_assembly (void) g_assert_cmpint(parts[3].start_connector_length, ==, 400); g_assert_cmpint(parts[3].end_connector_length, ==, 296); g_assert_cmpint(parts[3].full_advance, ==, 1000); - g_assert(parts[1].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER); + g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER); g_assert(hb_font_get_glyph_from_name (hb_font, "top", -1, &glyph)); g_assert_cmpint(parts[4].glyph, ==, glyph); g_assert_cmpint(parts[4].start_connector_length, ==, 123); g_assert_cmpint(parts[4].end_connector_length, ==, 192); g_assert_cmpint(parts[4].full_advance, ==, 1000); - g_assert(!(parts[4].flags & HB_MATH_GLYPH_PART_FLAG_EXTENDER)); + g_assert(!(parts[4].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER)); closeFont(); From 926044162472aeca8f5032b11b544d38be587110 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 14:34:34 -0700 Subject: [PATCH 415/617] [serialize] Pass offset to serialize_copy() --- src/hb-open-type.hh | 12 ++++++++---- src/hb-ot-layout-common.hh | 4 ++-- src/hb-ot-layout-gsubgpos.hh | 2 +- src/hb-ot-name-table.hh | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 896f7a015..a2521dcea 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -320,17 +320,21 @@ struct OffsetTo : Offset /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */ template - bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts&&... ds) + bool serialize_copy (hb_serialize_context_t *c, + const OffsetTo& src, + const void *src_base, + const void *dst_base, + Ts&&... ds) { *this = 0; - if (has_null && &src == _hb_has_null::get_null ()) + if (src.is_null ()) return false; c->push (); - bool ret = c->copy (src, hb_forward (ds)...); + bool ret = c->copy (src_base+src, hb_forward (ds)...); - c->add_link (*this, c->pop_pack (), base); + c->add_link (*this, c->pop_pack (), dst_base); return ret; } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index bd728ecad..b1f4d06ab 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -279,10 +279,10 @@ struct Script TRACE_SUBSET (this); auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->defaultLangSys.serialize_copy (c->serializer, this+defaultLangSys, out); + out->defaultLangSys.serialize_copy (c->serializer, defaultLangSys, this, out); unsigned int count = langSys.len; for (unsigned int i = 0; i < count; i++) - out->langSys.arrayZ[i].offset.serialize_copy (c->serializer, this+langSys[i].offset, out); + out->langSys.arrayZ[i].offset.serialize_copy (c->serializer, langSys[i].offset, this, out); return_trace (true); } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 7d395b5d8..987689d3b 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2695,7 +2695,7 @@ struct GSUBGPOS out); if (version.to_int () >= 0x00010001u) - out->featureVars.serialize_copy (c->serializer, this+featureVars, out); + out->featureVars.serialize_copy (c->serializer, featureVars, this, out); return_trace (true); } diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 4eda46789..68d7b3a65 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -104,7 +104,7 @@ struct NameRecord TRACE_SERIALIZE (this); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - out->offset.serialize_copy (c, src_base + offset, dst_base, length); + out->offset.serialize_copy (c, offset, src_base, dst_base, length); return_trace (out); } From 1834cf86d40abfbb536db1edb366c90318ba49fc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 14:39:32 -0700 Subject: [PATCH 416/617] [serialize] Pass offset to serialize_subset() --- src/hb-open-type.hh | 14 +++++++++----- src/hb-ot-layout-common.hh | 4 ++-- src/hb-ot-layout-gdef-table.hh | 12 ++++++------ src/hb-ot-layout-gsubgpos.hh | 7 ++++--- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index a2521dcea..de2d25638 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -298,20 +298,24 @@ struct OffsetTo : Offset } template - bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts&&... ds) + bool serialize_subset (hb_subset_context_t *c, + const OffsetTo& src, + const void *src_base, + const void *dst_base, + Ts&&... ds) { *this = 0; - if (has_null && &src == _hb_has_null::get_null ()) + if (src.is_null ()) return false; auto *s = c->serializer; s->push (); - bool ret = c->dispatch (src, hb_forward (ds)...); + bool ret = c->dispatch (src_base+src, hb_forward (ds)...); if (ret || !has_null) - s->add_link (*this, s->pop_pack (), base); + s->add_link (*this, s->pop_pack (), dst_base); else s->pop_discard (); @@ -683,7 +687,7 @@ struct OffsetListOf : OffsetArrayOf if (unlikely (!out)) return_trace (false); unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) - out->arrayZ[i].serialize_subset (c, (*this)[i], out); + out->arrayZ[i].serialize_subset (c, this->arrayZ[i], this, out); return_trace (true); } diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index b1f4d06ab..f801f5af8 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -142,7 +142,7 @@ struct RecordListOf : RecordArrayOf if (unlikely (!out)) return_trace (false); unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) - out->get_offset (i).serialize_subset (c, (*this)[i], out); + out->get_offset (i).serialize_subset (c, this->get_offset (i), this, out); return_trace (true); } @@ -732,7 +732,7 @@ struct Lookup OffsetArrayOf& out_subtables = out->get_subtables (); unsigned int count = subTable.len; for (unsigned int i = 0; i < count; i++) - out_subtables[i].serialize_subset (c, this+subtables[i], out, get_type ()); + out_subtables[i].serialize_subset (c, subtables[i], this, out, get_type ()); return_trace (true); } diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index ac1bddb2e..0fca9947d 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -442,16 +442,16 @@ struct GDEF auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->glyphClassDef.serialize_subset (c, this+glyphClassDef, out); - out->attachList = 0;//TODO(subset) serialize_subset (c, this+attachList, out); - out->ligCaretList = 0;//TODO(subset) serialize_subset (c, this+ligCaretList, out); - out->markAttachClassDef.serialize_subset (c, this+markAttachClassDef, out); + out->glyphClassDef.serialize_subset (c, glyphClassDef, this, out); + out->attachList = 0;//TODO(subset) serialize_subset (c, attachList, this, out); + out->ligCaretList = 0;//TODO(subset) serialize_subset (c, ligCaretList, this, out); + out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, out); if (version.to_int () >= 0x00010002u) - out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, this+markGlyphSetsDef, out); + out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, markGlyphSetsDef, this, out); if (version.to_int () >= 0x00010003u) - out->varStore = 0;// TODO(subset) serialize_subset (c, this+varStore, out); + out->varStore = 0;// TODO(subset) serialize_subset (c, varStore, this, out); return_trace (true); } diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 987689d3b..4bc3d7e15 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2684,14 +2684,15 @@ struct GSUBGPOS auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->scriptList.serialize_subset (c, this+scriptList, out); - out->featureList.serialize_subset (c, this+featureList, out); + out->scriptList.serialize_subset (c, scriptList, this, out); + out->featureList.serialize_subset (c, featureList, this, out); typedef OffsetListOf TLookupList; /* TODO Use intersects() to count how many subtables survive? */ CastR> (out->lookupList) .serialize_subset (c, - this+CastR> (lookupList), + CastR> (lookupList), + this, out); if (version.to_int () >= 0x00010001u) From 2dbdec66a17af94fffc50949e4712465aada9a68 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 15:38:11 -0700 Subject: [PATCH 417/617] [gsub] Porting serialize to iterators --- src/hb-ot-layout-gsub-table.hh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 0e1966e98..e08f48ebd 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -87,8 +87,7 @@ struct SingleSubstFormat1 } template + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator glyphs, unsigned delta) @@ -339,8 +338,10 @@ struct Sequence return_trace (true); } + template bool serialize (hb_serialize_context_t *c, - hb_array_t subst) + Iterator subst) { TRACE_SERIALIZE (this); return_trace (substitute.serialize (c, subst)); @@ -515,8 +516,10 @@ struct AlternateSet return_trace (true); } + template bool serialize (hb_serialize_context_t *c, - hb_array_t alts) + Iterator alts) { TRACE_SERIALIZE (this); return_trace (alternates.serialize (c, alts)); @@ -729,9 +732,11 @@ struct Ligature return_trace (true); } + template bool serialize (hb_serialize_context_t *c, GlyphID ligature, - hb_array_t components /* Starting from second */) + Iterator components /* Starting from second */) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); From 2ad4ba7bc04fbbd886a2da6fbc55a4e13468d878 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 15:48:54 -0700 Subject: [PATCH 418/617] [gsub] Minor --- src/hb-ot-layout-gsub-table.hh | 40 ++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index e08f48ebd..f532f9dff 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -180,7 +180,7 @@ struct SingleSubstFormat2 template + hb_codepoint_pair_t))> bool serialize (hb_serialize_context_t *c, Iterator it) { @@ -1287,7 +1287,7 @@ struct SubstLookup : Lookup HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); SubTable& serialize_subtable (hb_serialize_context_t *c, - unsigned int i) + unsigned int i) { return get_subtables ()[i].serialize (c, this); } bool serialize_single (hb_serialize_context_t *c, @@ -1297,9 +1297,8 @@ struct SubstLookup : Lookup { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false); - - return_trace (serialize_subtable (c, 0).u.single - .serialize (c, hb_zip (glyphs, substitutes))); + return_trace (serialize_subtable (c, 0).u.single. + serialize (c, hb_zip (glyphs, substitutes))); } bool serialize_multiple (hb_serialize_context_t *c, @@ -1310,10 +1309,11 @@ struct SubstLookup : Lookup { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false); - return_trace (serialize_subtable (c, 0).u.multiple.serialize (c, - glyphs, - substitute_len_list, - substitute_glyphs_list)); + return_trace (serialize_subtable (c, 0).u.multiple. + serialize (c, + glyphs, + substitute_len_list, + substitute_glyphs_list)); } bool serialize_alternate (hb_serialize_context_t *c, @@ -1324,10 +1324,11 @@ struct SubstLookup : Lookup { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Alternate, lookup_props, 1))) return_trace (false); - return_trace (serialize_subtable (c, 0).u.alternate.serialize (c, - glyphs, - alternate_len_list, - alternate_glyphs_list)); + return_trace (serialize_subtable (c, 0).u.alternate. + serialize (c, + glyphs, + alternate_len_list, + alternate_glyphs_list)); } bool serialize_ligature (hb_serialize_context_t *c, @@ -1340,12 +1341,13 @@ struct SubstLookup : Lookup { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Ligature, lookup_props, 1))) return_trace (false); - return_trace (serialize_subtable (c, 0).u.ligature.serialize (c, - first_glyphs, - ligature_per_first_glyph_count_list, - ligatures_list, - component_count_list, - component_list)); + return_trace (serialize_subtable (c, 0).u.ligature. + serialize (c, + first_glyphs, + ligature_per_first_glyph_count_list, + ligatures_list, + component_count_list, + component_list)); } template From 49879adbfc57c3173a25bbc55afc0796ee71b6da Mon Sep 17 00:00:00 2001 From: rsheeter Date: Fri, 31 May 2019 15:14:44 -0700 Subject: [PATCH 419/617] [subset] Correct calculation of max offset; fixes bug where loca would erroneously be short --- src/hb-ot-glyf-table.hh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 6113dbcf8..1ac9f6ba2 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -85,7 +85,7 @@ struct glyf static bool _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) { - unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); + unsigned max_offset = + padded_offsets | hb_reduce(hb_add, 0); unsigned num_offsets = padded_offsets.len () + 1; bool use_short_loca = max_offset < 0x1FFFF; unsigned entry_size = use_short_loca ? 2 : 4; @@ -93,6 +93,8 @@ struct glyf if (unlikely (!loca_prime_data)) return false; + DEBUG_MSG(SUBSET, nullptr, "loca entry_size %d num_offsets %d max_offset %d size %d", entry_size, num_offsets, max_offset, entry_size * num_offsets); + if (use_short_loca) _write_loca (padded_offsets, 1, hb_array ((HBUINT16*) loca_prime_data, num_offsets)); else @@ -164,6 +166,7 @@ struct glyf | hb_map (&SubsetGlyph::padded_size) ; + if (c->serializer->in_error ()) return_trace (false); return_trace (c->serializer->check_success (_add_loca_and_head (c->plan, padded_offsets))); } From 92fde3dea282d308fad2b8e93cd638aa813c6f2a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 20:16:25 -0700 Subject: [PATCH 420/617] Whitespace --- src/hb-algs.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 007db9e40..5fe9b0321 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -807,7 +807,7 @@ struct hb_bitwise_and static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; template auto - operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); struct hb_bitwise_or @@ -815,7 +815,7 @@ struct hb_bitwise_or static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; template auto - operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) } HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor @@ -823,7 +823,7 @@ struct hb_bitwise_xor static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; template auto - operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) } HB_FUNCOBJ (hb_bitwise_xor); struct hb_bitwise_sub @@ -831,7 +831,7 @@ struct hb_bitwise_sub static constexpr bool passthru_left = true; static constexpr bool passthru_right = false; template auto - operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } HB_FUNCOBJ (hb_bitwise_sub); From 66381fb73f21e8e3c1c14b196e64d1004be303c7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 20:20:43 -0700 Subject: [PATCH 421/617] [ci] Enable other versions of Visual Studio https://github.com/harfbuzz/harfbuzz/issues/1730 --- appveyor.yml | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5884bc68d..6eb1b822d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,11 +2,13 @@ platform: x64 environment: matrix: + - compiler: msvc generator: Visual Studio 14 platform: Win32 configuration: Debug triplet: x86-windows + - compiler: msvc generator: Visual Studio 14 Win64 platform: x64 @@ -20,32 +22,34 @@ environment: # Build only - # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - # compiler: msvc2 - # generator: Visual Studio 12 - # platform: Win32 - # configuration: Release - # triplet: x86-windows - # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - # compiler: msvc2 - # generator: Visual Studio 15 - # platform: Win32 - # configuration: Release - # triplet: x86-windows + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + compiler: msvc2 + generator: Visual Studio 12 + platform: Win32 + configuration: Release + triplet: x86-windows - # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - # compiler: msvc2 - # generator: Visual Studio 16 - # platform: Win32 - # configuration: Release - # triplet: x86-windows + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + compiler: msvc2 + generator: Visual Studio 15 + platform: Win32 + configuration: Release + triplet: x86-windows + + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + compiler: msvc2 + generator: Visual Studio 16 + platform: Win32 + configuration: Release + triplet: x86-windows - compiler: msys2 MINGW_PREFIX: /mingw64 MINGW_CHOST: x86_64-w64-mingw32 MSYS2_ARCH: x86_64 + - compiler: msys2 MINGW_PREFIX: /mingw32 MINGW_CHOST: i686-w64-mingw32 From 5a1b5c0a8b91a2291e7327e84acba2406a14414e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 21:08:39 -0700 Subject: [PATCH 422/617] Try fixing VS builds Hopefully fixes https://github.com/harfbuzz/harfbuzz/issues/1730 --- src/hb-algs.hh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 5fe9b0321..7f5e4d8ff 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -169,7 +169,12 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN #define HB_PARTIALIZE(Pos) \ template \ - auto operator () (_T&& _v) const HB_AUTO_RETURN (hb_partial (this, hb_forward<_T> (_v))) \ + auto operator () (_T&& _v) const HB_AUTO_RETURN \ + (hb_partial ( \ + /* The following ugly line is a hack hacky replacement for "this". */ \ + /* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ + const_cast *> (this), \ + hb_forward<_T> (_v))) \ static_assert (true, "") From 8aaecbb5832568135f6149254ed9e17ac4310341 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 21:41:40 -0700 Subject: [PATCH 423/617] Second VS fix try https://github.com/harfbuzz/harfbuzz/issues/1730 --- src/hb-algs.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 7f5e4d8ff..6e6217b4b 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -171,9 +171,9 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN template \ auto operator () (_T&& _v) const HB_AUTO_RETURN \ (hb_partial ( \ - /* The following ugly line is a hack hacky replacement for "this". */ \ + /* The following ugly line is a hacky replacement for "this". */ \ /* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ - const_cast *> (this), \ + &*this, \ hb_forward<_T> (_v))) \ static_assert (true, "") From aba3888d933474a874d2f3ff02397b523846466c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 22:11:27 -0700 Subject: [PATCH 424/617] Third try at fixing VS build https://github.com/harfbuzz/harfbuzz/issues/1730 --- src/hb-algs.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 6e6217b4b..d195c7722 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -173,7 +173,7 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN (hb_partial ( \ /* The following ugly line is a hacky replacement for "this". */ \ /* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ - &*this, \ + (true?this:nullptr), \ hb_forward<_T> (_v))) \ static_assert (true, "") From f387a09742bd8e4a7a8da6db954339609839a113 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 22:12:23 -0700 Subject: [PATCH 425/617] [ci] Disable VS 2013 That one doesn't even understand constexpr. --- appveyor.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 6eb1b822d..7a29ecb89 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,12 +23,12 @@ environment: # Build only - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - compiler: msvc2 - generator: Visual Studio 12 - platform: Win32 - configuration: Release - triplet: x86-windows + #- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + # compiler: msvc2 + # generator: Visual Studio 12 + # platform: Win32 + # configuration: Release + # triplet: x86-windows - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 compiler: msvc2 From 619f5f1eb9e5e2a4f326f89c9e3e05b01f9c042f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 22:31:35 -0700 Subject: [PATCH 426/617] Fourth try at building VS bots Based on https://github.com/harfbuzz/harfbuzz/issues/1730#issuecomment-497151210 --- src/hb-algs.hh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index d195c7722..38104fdb8 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -167,15 +167,21 @@ template auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN (( hb_partial_t (a, v) )) +/* The following hacky replacement version is to make Visual Stuiod build:. */ \ +/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ +#ifdef _MSC_VER +#define HB_PARTIALIZE(Pos) \ + template \ + decltype(auto) operator () (_T&& _v) const \ + { return hb_partial (this, hb_forward<_T> (_v)); } \ + static_assert (true, "") +#else #define HB_PARTIALIZE(Pos) \ template \ auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial ( \ - /* The following ugly line is a hacky replacement for "this". */ \ - /* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ - (true?this:nullptr), \ - hb_forward<_T> (_v))) \ + (hb_partial (this, hb_forward<_T> (_v))) \ static_assert (true, "") +#endif struct From 10e3cb9246ab3d288af4effe484f4d8beb2243d6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 22:56:37 -0700 Subject: [PATCH 427/617] [docs] Fix dist --- docs/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Makefile.am b/docs/Makefile.am index 878a4723c..f4bf2fdbc 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -75,6 +75,7 @@ content_files= \ usermanual-what-is-harfbuzz.xml \ usermanual-install-harfbuzz.xml \ usermanual-getting-started.xml \ + usermanual-glyph-information.xml \ usermanual-shaping-concepts.xml \ usermanual-object-model.xml \ usermanual-buffers-language-script-and-direction.xml \ From 93c455567fe3d92a7efe65bf0e9ac2af794e2c4f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 31 May 2019 22:53:27 -0700 Subject: [PATCH 428/617] 2.5.1 --- NEWS | 11 +++++++++++ configure.ac | 2 +- src/hb-version.h | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 752ebf78e..51929738a 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,14 @@ +Overview of changes leading to 2.5.1 +Friday, May 31, 2019 +==================================== +- Fix build with various versions of Visual Studio. +- Improved documentation, thanks to Nathan Willis. +- Bugfix in subsetting glyf table. +- Improved scripts for cross-compiling for Windows using mingw. +- Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER to HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER. + A deprecated macro is added for backwards-compatibility. + + Overview of changes leading to 2.5.0 Friday, May 24, 2019 ==================================== diff --git a/configure.ac b/configure.ac index a80b7e8b4..6a68df79e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.5.0], + [2.5.1], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-version.h b/src/hb-version.h index ec6e67ebd..1eca37a58 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 #define HB_VERSION_MINOR 5 -#define HB_VERSION_MICRO 0 +#define HB_VERSION_MICRO 1 -#define HB_VERSION_STRING "2.5.0" +#define HB_VERSION_STRING "2.5.1" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From c91f3fa3eaf77fa255292c779f88da4feaaae8a0 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 1 Jun 2019 10:55:37 +0430 Subject: [PATCH 429/617] [dwrite] Replace REPLACEME with release version the symbol had --- src/hb-directwrite.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 057ae3305..b135c49e9 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -951,7 +951,7 @@ hb_directwrite_face_create (IDWriteFontFace *font_face) * * Return value: DirectWrite IDWriteFontFace object corresponding to the given input * -* Since: REPLACEME +* Since: 2.5.0 **/ IDWriteFontFace * hb_directwrite_face_get_font_face (hb_face_t *face) From faf69e03f5ab9f3926442525f6c6e30fbc7a93d5 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 1 Jun 2019 11:02:25 +0430 Subject: [PATCH 430/617] [ci] Install ragel on appveyor mingw bots Hopefully autotools timestamps issues will go --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 7a29ecb89..236bb1b12 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -57,7 +57,7 @@ environment: install: - - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "pacman --noconfirm --force -S --needed mingw-w64-$MSYS2_ARCH-{gcc,freetype,cairo,icu,gettext,gobject-introspection,gcc,gcc-libs,glib2,graphite2,pkg-config,python2}"' + - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "pacman --noconfirm --force -S --needed mingw-w64-$MSYS2_ARCH-{gcc,freetype,cairo,icu,gettext,gobject-introspection,gcc,gcc-libs,glib2,graphite2,pkg-config,python2,ragel}"' - 'if "%compiler%"=="msvc" if not "%platform%"=="ARM" vcpkg install glib:%triplet% freetype:%triplet% cairo:%triplet%' build_script: From 97b92685775983a280f335423263a6a8d82c3941 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 1 Jun 2019 21:25:09 +0430 Subject: [PATCH 431/617] [ci] Downgrade Travis distribution upon Behdad request --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d788263ef..703fac25c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ # Build Configuration for Travis -dist: xenial +dist: trusty language: cpp From 33d38e793e2e4882337e5f42fbbae7d00d343940 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 2 Jun 2019 00:19:57 +0430 Subject: [PATCH 432/617] Use a unified bsearch (#1741) A part of #593 --- src/hb-aat-layout.cc | 10 +++++----- src/hb-algs.hh | 29 ++++------------------------- src/hb-ot-post-table.hh | 4 ++-- src/hb-ot-var-mvar-table.hh | 6 +++--- 4 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 22cbd7338..35ba611a9 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -139,11 +139,11 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) return nullptr; #endif - return (const hb_aat_feature_mapping_t *) bsearch (&tag, - feature_mappings, - ARRAY_LENGTH (feature_mappings), - sizeof (feature_mappings[0]), - hb_aat_feature_mapping_t::cmp); + return (const hb_aat_feature_mapping_t *) hb_bsearch (&tag, + feature_mappings, + ARRAY_LENGTH (feature_mappings), + sizeof (feature_mappings[0]), + hb_aat_feature_mapping_t::cmp); } diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 38104fdb8..cd0416d7c 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -603,40 +603,19 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) /* * Sort and search. */ - +template static inline void * hb_bsearch (const void *key, const void *base, size_t nmemb, size_t size, - int (*compar)(const void *_key, const void *_item)) + int (*compar)(const void *_key, const void *_item, Ts... args), + Ts... args) { int min = 0, max = (int) nmemb - 1; while (min <= max) { int mid = (min + max) / 2; const void *p = (const void *) (((const char *) base) + (mid * size)); - int c = compar (key, p); - if (c < 0) - max = mid - 1; - else if (c > 0) - min = mid + 1; - else - return (void *) p; - } - return nullptr; -} - -static inline void * -hb_bsearch_r (const void *key, const void *base, - size_t nmemb, size_t size, - int (*compar)(const void *_key, const void *_item, void *_arg), - void *arg) -{ - int min = 0, max = (int) nmemb - 1; - while (min <= max) - { - int mid = ((unsigned int) min + (unsigned int) max) / 2; - const void *p = (const void *) (((const char *) base) + (mid * size)); - int c = compar (key, p, arg); + int c = compar (key, p, args...); if (c < 0) max = mid - 1; else if (c > 0) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 12e08316a..970bbe68a 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -168,8 +168,8 @@ struct post } hb_bytes_t st (name, len); - const uint16_t *gid = (const uint16_t *) hb_bsearch_r (hb_addressof (st), gids, count, - sizeof (gids[0]), cmp_key, (void *) this); + const uint16_t *gid = (const uint16_t *) hb_bsearch (hb_addressof (st), gids, count, + sizeof (gids[0]), cmp_key, (void *) this); if (gid) { *glyph = *gid; diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index 0dd63e510..5a9d2afb7 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -77,9 +77,9 @@ struct MVAR const int *coords, unsigned int coord_count) const { const VariationValueRecord *record; - record = (VariationValueRecord *) bsearch (&tag, valuesZ.arrayZ, - valueRecordCount, valueRecordSize, - tag_compare); + record = (VariationValueRecord *) hb_bsearch (&tag, valuesZ.arrayZ, + valueRecordCount, valueRecordSize, + tag_compare); if (!record) return 0.; From 8278ff7dce41e6694eba15a7c94a0c0eb3bca427 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 2 Jun 2019 00:36:30 +0430 Subject: [PATCH 433/617] minor --- src/hb-algs.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index cd0416d7c..699ac0240 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -607,15 +607,15 @@ template static inline void * hb_bsearch (const void *key, const void *base, size_t nmemb, size_t size, - int (*compar)(const void *_key, const void *_item, Ts... args), - Ts... args) + int (*compar)(const void *_key, const void *_item, Ts... _ds), + Ts... ds) { int min = 0, max = (int) nmemb - 1; while (min <= max) { int mid = (min + max) / 2; const void *p = (const void *) (((const char *) base) + (mid * size)); - int c = compar (key, p, args...); + int c = compar (key, p, ds...); if (c < 0) max = mid - 1; else if (c > 0) From 7c14b9014587e1423ef7481058e48dae84a65fce Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 2 Jun 2019 13:51:26 +0430 Subject: [PATCH 434/617] [ci] revert to xenial It should've done in a branch --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 703fac25c..d788263ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ # Build Configuration for Travis -dist: trusty +dist: xenial language: cpp From 5846884f86cae61c1b0c369c81427712fb97ed83 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Mon, 3 Jun 2019 15:00:25 +0700 Subject: [PATCH 435/617] test: Use nullptr in C++ code. (#1744) --- src/test-ot-color.cc | 8 ++++---- test/fuzzing/hb-shape-fuzzer.cc | 6 +++--- test/fuzzing/hb-subset-fuzzer.cc | 2 +- util/options-subset.cc | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test-ot-color.cc b/src/test-ot-color.cc index 4050a664d..26931fed3 100644 --- a/src/test-ot-color.cc +++ b/src/test-ot-color.cc @@ -133,7 +133,7 @@ layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int unsigned glyph_count = hb_face_get_glyph_count (face); for (hb_codepoint_t gid = 0; gid < glyph_count; ++gid) { - unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, NULL, NULL); + unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, nullptr, nullptr); if (!num_layers) continue; @@ -169,7 +169,7 @@ layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int unsigned int palette_count = hb_ot_color_palette_get_count (face); for (unsigned int palette = 0; palette < palette_count; palette++) { - unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, NULL, NULL); + unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, nullptr, nullptr); if (!num_colors) continue; @@ -271,14 +271,14 @@ main (int argc, char **argv) FILE *font_name_file = fopen ("out/.dumped_font_name", "r"); - if (font_name_file != NULL) + if (font_name_file != nullptr) { fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n"); exit (1); } font_name_file = fopen ("out/.dumped_font_name", "w"); - if (font_name_file == NULL) + if (font_name_file == nullptr) { fprintf (stderr, "./out is not accessible as a folder, create it please\n"); exit (1); diff --git a/test/fuzzing/hb-shape-fuzzer.cc b/test/fuzzing/hb-shape-fuzzer.cc index 5723db90c..64a6b12df 100644 --- a/test/fuzzing/hb-shape-fuzzer.cc +++ b/test/fuzzing/hb-shape-fuzzer.cc @@ -10,7 +10,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { hb_blob_t *blob = hb_blob_create ((const char *)data, size, - HB_MEMORY_MODE_READONLY, NULL, NULL); + HB_MEMORY_MODE_READONLY, nullptr, nullptr); hb_face_t *face = hb_face_create (blob, 0); hb_font_t *font = hb_font_create (face); hb_ot_font_set_funcs (font); @@ -21,7 +21,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) hb_buffer_t *buffer = hb_buffer_create (); hb_buffer_add_utf8 (buffer, text, -1, 0, -1); hb_buffer_guess_segment_properties (buffer); - hb_shape (font, buffer, NULL, 0); + hb_shape (font, buffer, nullptr, 0); hb_buffer_destroy (buffer); } @@ -34,7 +34,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) hb_buffer_t *buffer = hb_buffer_create (); hb_buffer_add_utf32 (buffer, text32, sizeof (text32) / sizeof (text32[0]), 0, -1); hb_buffer_guess_segment_properties (buffer); - hb_shape (font, buffer, NULL, 0); + hb_shape (font, buffer, nullptr, 0); hb_buffer_destroy (buffer); /* Misc calls on face. */ diff --git a/test/fuzzing/hb-subset-fuzzer.cc b/test/fuzzing/hb-subset-fuzzer.cc index 42ef0071e..73c95b2a6 100644 --- a/test/fuzzing/hb-subset-fuzzer.cc +++ b/test/fuzzing/hb-subset-fuzzer.cc @@ -53,7 +53,7 @@ trySubset (hb_face_t *face, extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { hb_blob_t *blob = hb_blob_create ((const char *)data, size, - HB_MEMORY_MODE_READONLY, NULL, NULL); + HB_MEMORY_MODE_READONLY, nullptr, nullptr); hb_face_t *face = hb_face_create (blob, 0); /* Just test this API here quickly. */ diff --git a/util/options-subset.cc b/util/options-subset.cc index f5c2229e1..b2f4db087 100644 --- a/util/options-subset.cc +++ b/util/options-subset.cc @@ -115,7 +115,7 @@ parse_drop_tables (const char *name, else hb_set_del (drop_tables, tag); - s = strtok(NULL, ", "); + s = strtok(nullptr, ", "); } return true; From 760eb1bf9398bd37103ca879e825fad9bef4bfdd Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 3 Jun 2019 05:48:04 -0700 Subject: [PATCH 436/617] Reapply possible bsearch overflow fix Originally introduced in 21ede86 (#1314) but as it wasn't applied to hb_bsearch accidentally removed while merging hb_bsearch_r to it. --- src/hb-algs.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 699ac0240..0b34f7106 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -613,7 +613,7 @@ hb_bsearch (const void *key, const void *base, int min = 0, max = (int) nmemb - 1; while (min <= max) { - int mid = (min + max) / 2; + int mid = ((unsigned int) min + (unsigned int) max) / 2; const void *p = (const void *) (((const char *) base) + (mid * size)); int c = compar (key, p, ds...); if (c < 0) From be82a2fc0c7ad3553f2e6dc8082a3255cb6c917c Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Mon, 3 Jun 2019 15:52:23 -0700 Subject: [PATCH 437/617] parenthesized cond-exp in CFF2FDSelect::sanitize --- src/hb-ot-cff2-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh index a7b0ba9be..74acc771a 100644 --- a/src/hb-ot-cff2-table.hh +++ b/src/hb-ot-cff2-table.hh @@ -56,11 +56,11 @@ struct CFF2FDSelect TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && (format == 0 || format == 3 || format == 4) && - (format == 0)? + ((format == 0)? u.format0.sanitize (c, fdcount): ((format == 3)? u.format3.sanitize (c, fdcount): - u.format4.sanitize (c, fdcount)))); + u.format4.sanitize (c, fdcount))))); } bool serialize (hb_serialize_context_t *c, const CFF2FDSelect &src, unsigned int num_glyphs) From 65e66a2d371f42d018b1a22f31a6428d19a90284 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Mon, 3 Jun 2019 16:31:41 -0700 Subject: [PATCH 438/617] added test data --- ...ase-minimized-harfbuzz_fuzzer-6252118652092416 | Bin 0 -> 126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6252118652092416 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6252118652092416 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6252118652092416 new file mode 100644 index 0000000000000000000000000000000000000000..e2dd6a3893cb87376b5820ab9b782c5c5a174a3e GIT binary patch literal 126 zcmZQzWME)mW@Iq=x4rHk8$%}pkbjsy~0qW)>v!sFW5ZX5SFJ!K2di3JidHK;S ACjbBd literal 0 HcmV?d00001 From 12febd68d694cc1bae44b0b672d88bf9fbe8568d Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Mon, 3 Jun 2019 16:40:03 -0700 Subject: [PATCH 439/617] added parentheses to FDSelect::sanitize as well --- src/hb-ot-cff-common.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index ddec517a1..55ae10efe 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -655,9 +655,9 @@ struct FDSelect { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && (format == 0 || format == 3) && - (format == 0)? + ((format == 0)? u.format0.sanitize (c, fdcount): - u.format3.sanitize (c, fdcount))); + u.format3.sanitize (c, fdcount)))); } bool serialize (hb_serialize_context_t *c, const FDSelect &src, unsigned int num_glyphs) From 209491fc37c46281e063c3e6707d686d5f2b2ba4 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 29 May 2019 14:03:17 -0700 Subject: [PATCH 440/617] [subset] Hmtx/vmtx tables to use subset2 and new iterator frameworks --- src/hb-ot-hmtx-table.hh | 111 +++++++++++++++++++--------------------- src/hb-subset.cc | 6 +-- 2 files changed, 57 insertions(+), 60 deletions(-) diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index b3a97109b..754a37628 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -86,74 +86,71 @@ struct hmtxvmtx return result; } - bool subset (hb_subset_plan_t *plan) const + template + void serialize (hb_serialize_context_t *c, + Iterator it, + unsigned num_advances) { - typename T::accelerator_t _mtx; - _mtx.init (plan->source); + unsigned idx = 0; + + it + | hb_apply ([c, &idx, num_advances] (const hb_item_type& _) + { + if (idx < num_advances) + { + LongMetric lm; + lm.advance = _.first; + lm.sb = _.second; + if (unlikely (!c->embed (&lm))) return; + } + else + { + FWORD *sb = c->allocate_size (FWORD::static_size); + if (unlikely (!sb)) return; + *sb = _.second; + } + idx++; + }) + ; + } - /* All the trailing glyphs with the same advance can use one LongMetric - * and just keep LSB */ - unsigned int num_output_glyphs = plan->num_output_glyphs (); - unsigned int num_advances = _mtx.num_advances_for_subset (plan); + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); - /* alloc the new table */ - size_t dest_sz = num_advances * 4 - + (num_output_glyphs - num_advances) * 2; - void *dest = (void *) malloc (dest_sz); - if (unlikely (!dest)) - { - return false; - } - DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances); - DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", - HB_UNTAG(T::tableTag), num_advances, num_output_glyphs - num_advances, (unsigned int) dest_sz); + T *table_prime = c->serializer->start_embed (); + if (unlikely (!table_prime)) return_trace (false); + + accelerator_t _mtx; + _mtx.init (c->plan->source); + unsigned num_advances = _mtx.num_advances_for_subset (c->plan); + + auto it = + + hb_range (c->plan->num_output_glyphs ()) + | hb_map ([c, &_mtx] (unsigned _) + { + hb_codepoint_t old_gid; + if (c->plan->old_gid_for_new_gid (_, &old_gid)) + return hb_pair (_mtx.get_advance (old_gid), _mtx.get_side_bearing (old_gid)); + else + return hb_pair (0u, 0u); + }) + ; - // Copy everything over - char * dest_pos = (char *) dest; + table_prime->serialize (c->serializer, it, num_advances); - bool failed = false; - for (unsigned int i = 0; i < num_output_glyphs; i++) - { - unsigned int side_bearing = 0; - unsigned int advance = 0; - hb_codepoint_t old_gid; - if (plan->old_gid_for_new_gid (i, &old_gid)) - { - // Glyph is not an empty glyph so copy advance and side bearing - // from the input font. - side_bearing = _mtx.get_side_bearing (old_gid); - advance = _mtx.get_advance (old_gid); - } - - bool has_advance = i < num_advances; - if (has_advance) - { - ((LongMetric *) dest_pos)->advance = advance; - ((LongMetric *) dest_pos)->sb = side_bearing; - } - else - { - *((FWORD *) dest_pos) = side_bearing; - } - dest_pos += (has_advance ? 4 : 2); - } _mtx.fini (); + if (unlikely (c->serializer->ran_out_of_room || c->serializer->in_error ())) + return_trace (false); + // Amend header num hmetrics - if (failed || unlikely (!subset_update_header (plan, num_advances))) + if (unlikely (!subset_update_header (c->plan, num_advances))) { - free (dest); - return false; + return_trace (false); } - hb_blob_t *result = hb_blob_create ((const char *)dest, - dest_sz, - HB_MEMORY_MODE_READONLY, - dest, - free); - bool success = plan->add_table (T::tableTag, result); - hb_blob_destroy (result); - return success; + return_trace (true); } struct accelerator_t diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 794369550..ddd88f7e3 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -67,7 +67,7 @@ template static bool _subset2 (hb_subset_plan_t *plan) { - bool result = true; + bool result = false; hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table (plan->source); const TableType *table = source_blob->as (); @@ -172,13 +172,13 @@ _subset_table (hb_subset_plan_t *plan, DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx"); return true; case HB_OT_TAG_hmtx: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_vhea: DEBUG_MSG(SUBSET, nullptr, "skip vhea handled by vmtx"); return true; case HB_OT_TAG_vmtx: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_maxp: result = _subset (plan); From 2e16593b70688dfcee1788f38c6af03c5a589f6e Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 1 Jun 2019 20:54:46 -0400 Subject: [PATCH 441/617] [myanmar] Make medial_group match the OT spec Sometime between [July 2018] and [January 2019], the OpenType Myanmar grammar changed: one asat is now allowed after a medial ya, before any other medial consonant. [July 2018]: http://web.archive.org/web/20180711011550/https://docs.microsoft.com/en-us/typography/script-development/myanmar [January 2019]: http://web.archive.org/web/20190115044451/https://docs.microsoft.com/en-us/typography/script-development/myanmar This also reverts commit 439b05867c0856a81fa8f9bea3a7465b4b4bdd91, which allowed an asat immediately after a medial ra. --- src/hb-ot-shape-complex-myanmar-machine.hh | 249 +++++++++++---------- src/hb-ot-shape-complex-myanmar-machine.rl | 2 +- 2 files changed, 129 insertions(+), 122 deletions(-) diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index d03832fa7..b7b04cb6d 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -36,31 +36,31 @@ static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, - 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, - 1u, 32u, 8u, 8u, 0 + 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, + 3u, 29u, 1u, 32u, 1u, 32u, 8u, 8u, 0 }; static const char _myanmar_syllable_machine_key_spans[] = { 32, 28, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, 16, 27, 27, 27, - 27, 27, 28, 27, 27, 27, 27, 25, - 4, 25, 23, 21, 21, 27, 27, 27, - 27, 16, 28, 27, 27, 27, 27, 27, - 28, 27, 27, 27, 27, 28, 27, 32, - 32, 1 + 27, 27, 28, 27, 27, 27, 27, 27, + 25, 4, 25, 23, 21, 21, 27, 27, + 27, 27, 16, 28, 27, 27, 27, 27, + 27, 28, 27, 27, 27, 27, 27, 28, + 27, 32, 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { 0, 33, 62, 88, 93, 119, 143, 165, 187, 215, 243, 271, 299, 316, 344, 372, 400, 428, 456, 485, 513, 541, 569, 597, - 623, 628, 654, 678, 700, 722, 750, 778, - 806, 834, 851, 880, 908, 936, 964, 992, - 1020, 1049, 1077, 1105, 1133, 1161, 1190, 1218, - 1251, 1284 + 625, 651, 656, 682, 706, 728, 750, 778, + 806, 834, 862, 879, 908, 936, 964, 992, + 1020, 1048, 1077, 1105, 1133, 1161, 1189, 1217, + 1246, 1274, 1307, 1340 }; static const char _myanmar_syllable_machine_indicies[] = { @@ -126,116 +126,123 @@ static const char _myanmar_syllable_machine_indicies[] = { 21, 21, 21, 21, 21, 21, 32, 33, 34, 35, 36, 43, 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, - 21, 21, 21, 21, 43, 21, 21, 28, + 21, 21, 21, 21, 21, 21, 21, 28, 21, 30, 21, 32, 33, 34, 35, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 28, 21, 21, 21, 32, 33, 34, 35, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, - 21, 21, 21, 21, 43, 21, 21, 28, + 21, 21, 21, 21, 44, 21, 21, 28, 29, 30, 21, 32, 33, 34, 35, 36, - 21, 22, 23, 24, 24, 21, 25, 21, + 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, - 27, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 21, 45, 45, 44, - 5, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 46, 44, 44, 44, 44, 44, - 44, 14, 44, 44, 44, 18, 44, 45, - 45, 44, 5, 44, 45, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 44, 47, 44, - 45, 45, 44, 5, 44, 14, 44, 44, - 44, 44, 44, 44, 44, 48, 44, 44, - 44, 44, 44, 44, 14, 44, 45, 45, - 44, 5, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 48, 44, 44, 44, 44, - 44, 44, 14, 44, 45, 45, 44, 5, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 2, 44, 45, 45, 44, 5, - 44, 6, 44, 44, 44, 44, 44, 44, - 44, 49, 44, 44, 49, 44, 44, 44, - 14, 50, 44, 44, 18, 44, 2, 44, - 45, 45, 44, 5, 44, 6, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 44, 44, 44, - 18, 44, 2, 44, 45, 45, 44, 5, - 44, 6, 44, 44, 44, 44, 44, 44, - 44, 49, 44, 44, 44, 44, 44, 44, - 14, 50, 44, 44, 18, 44, 2, 44, - 45, 45, 44, 5, 44, 6, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 50, 44, 44, - 18, 44, 51, 51, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 51, 44, 2, 3, 45, 45, 44, - 5, 44, 6, 44, 44, 44, 44, 44, - 44, 44, 8, 44, 44, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 8, - 44, 44, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 52, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 17, 18, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 44, 18, 44, - 2, 44, 45, 45, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 44, - 16, 44, 18, 44, 2, 44, 45, 45, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 15, 16, 17, 18, 52, - 44, 2, 44, 45, 45, 44, 5, 44, - 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 44, 12, 44, 14, - 15, 16, 17, 18, 44, 2, 44, 45, - 45, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 52, 44, 44, 10, - 44, 44, 44, 14, 15, 16, 17, 18, - 44, 2, 44, 45, 45, 44, 5, 44, - 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 11, 12, 44, 14, - 15, 16, 17, 18, 44, 2, 3, 45, - 45, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 8, 44, 44, 10, + 21, 21, 21, 28, 29, 30, 21, 32, + 33, 34, 35, 36, 21, 22, 23, 24, + 24, 21, 25, 21, 26, 21, 21, 21, + 21, 21, 21, 21, 27, 21, 21, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 21, 46, 46, 45, 5, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 47, 45, + 45, 45, 45, 45, 45, 14, 45, 45, + 45, 18, 45, 46, 46, 45, 5, 45, + 46, 46, 45, 5, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 14, 45, 45, 45, + 18, 45, 48, 45, 46, 46, 45, 5, + 45, 14, 45, 45, 45, 45, 45, 45, + 45, 49, 45, 45, 45, 45, 45, 45, + 14, 45, 46, 46, 45, 5, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 49, + 45, 45, 45, 45, 45, 45, 14, 45, + 46, 46, 45, 5, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 14, 45, 2, 45, + 46, 46, 45, 5, 45, 6, 45, 45, + 45, 45, 45, 45, 45, 50, 45, 45, + 50, 45, 45, 45, 14, 51, 45, 45, + 18, 45, 2, 45, 46, 46, 45, 5, + 45, 6, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 14, 45, 45, 45, 18, 45, 2, 45, + 46, 46, 45, 5, 45, 6, 45, 45, + 45, 45, 45, 45, 45, 50, 45, 45, + 45, 45, 45, 45, 14, 51, 45, 45, + 18, 45, 2, 45, 46, 46, 45, 5, + 45, 6, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 14, 51, 45, 45, 18, 45, 52, 52, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 52, 45, 2, + 3, 46, 46, 45, 5, 45, 6, 45, + 45, 45, 45, 45, 45, 45, 8, 45, + 45, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 45, 2, 45, 46, 46, + 45, 5, 45, 6, 45, 45, 45, 45, + 45, 45, 45, 8, 45, 45, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 45, + 2, 45, 46, 46, 45, 5, 45, 6, + 45, 45, 45, 45, 45, 45, 45, 53, + 45, 45, 45, 45, 45, 45, 14, 15, + 16, 17, 18, 45, 2, 45, 46, 46, + 45, 5, 45, 6, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 14, 15, 16, 17, 18, 45, + 2, 45, 46, 46, 45, 5, 45, 6, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 14, 15, + 16, 45, 18, 45, 2, 45, 46, 46, + 45, 5, 45, 6, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 14, 45, 16, 45, 18, 45, + 2, 45, 46, 46, 45, 5, 45, 6, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 14, 15, + 16, 17, 18, 53, 45, 2, 45, 46, + 46, 45, 5, 45, 6, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 10, + 45, 12, 45, 14, 15, 16, 17, 18, + 45, 2, 45, 46, 46, 45, 5, 45, + 6, 45, 45, 45, 45, 45, 45, 45, + 53, 45, 45, 10, 45, 45, 45, 14, + 15, 16, 17, 18, 45, 2, 45, 46, + 46, 45, 5, 45, 6, 45, 45, 45, + 45, 45, 45, 45, 54, 45, 45, 10, + 11, 12, 45, 14, 15, 16, 17, 18, + 45, 2, 45, 46, 46, 45, 5, 45, + 6, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 10, 11, 12, 45, 14, + 15, 16, 17, 18, 45, 2, 3, 46, + 46, 45, 5, 45, 6, 45, 45, 45, + 45, 45, 45, 45, 8, 45, 45, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 44, 22, 23, 24, 24, 21, 25, 21, + 45, 22, 23, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, - 53, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 21, 22, 54, + 55, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 22, 56, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, 27, 21, 21, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 21, 1, 1, 2, 3, 45, 45, - 44, 5, 44, 6, 1, 44, 44, 44, - 44, 1, 44, 8, 44, 44, 10, 11, + 36, 21, 1, 1, 2, 3, 46, 46, + 45, 5, 45, 6, 1, 45, 45, 45, + 45, 1, 45, 8, 45, 45, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 44, 1, 44, 1, 1, 55, 55, 55, - 55, 55, 55, 55, 55, 1, 55, 55, - 55, 55, 1, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 1, 55, 56, 55, 0 + 45, 1, 45, 1, 1, 57, 57, 57, + 57, 57, 57, 57, 57, 1, 57, 57, + 57, 57, 1, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 1, 57, 58, 57, 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { - 0, 1, 23, 33, 0, 24, 30, 45, - 35, 48, 36, 41, 42, 43, 26, 38, - 39, 40, 29, 44, 49, 0, 2, 12, + 0, 1, 24, 34, 0, 25, 31, 47, + 36, 50, 37, 42, 43, 44, 27, 39, + 40, 41, 30, 46, 51, 0, 2, 12, 0, 3, 9, 13, 14, 19, 20, 21, - 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 0, 25, 27, - 28, 31, 32, 34, 37, 46, 47, 0, - 0 + 5, 16, 17, 18, 8, 23, 4, 6, + 7, 10, 11, 15, 22, 0, 0, 26, + 28, 29, 32, 33, 35, 38, 45, 48, + 49, 0, 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { @@ -244,9 +251,9 @@ static const char _myanmar_syllable_machine_trans_actions[] = { 0, 0, 0, 0, 0, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 10 + 0, 0, 0, 0, 0, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -256,7 +263,7 @@ static const char _myanmar_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 + 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -266,17 +273,17 @@ static const char _myanmar_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 + 0, 0, 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 22, 22, 45, - 56, 56 + 22, 22, 22, 22, 22, 22, 22, 22, + 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 22, + 22, 46, 58, 58 }; static const int myanmar_syllable_machine_start = 0; @@ -309,7 +316,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 313 "hb-ot-shape-complex-myanmar-machine.hh" +#line 320 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -325,7 +332,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 329 "hb-ot-shape-complex-myanmar-machine.hh" +#line 336 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -339,7 +346,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 343 "hb-ot-shape-complex-myanmar-machine.hh" +#line 350 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -389,7 +396,7 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 393 "hb-ot-shape-complex-myanmar-machine.hh" +#line 400 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -398,7 +405,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 402 "hb-ot-shape-complex-myanmar-machine.hh" +#line 409 "hb-ot-shape-complex-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shape-complex-myanmar-machine.rl b/src/hb-ot-shape-complex-myanmar-machine.rl index c4e300fda..665998938 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/src/hb-ot-shape-complex-myanmar-machine.rl @@ -69,7 +69,7 @@ k = (Ra As H); # Kinzi c = C|Ra; # is_consonant -medial_group = MY? MR? MW? MH? As?; +medial_group = MY? As? MR? ((MW MH? | MH) As?)?; main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?; post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?; pwo_tone_group = PT A* DB? As?; From 659eeddb2df5b97cc01bd39e106381f65c9f41f1 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Mon, 3 Jun 2019 22:31:50 +0700 Subject: [PATCH 442/617] Use C++11 override keyword. --- util/hb-ot-shape-closure.cc | 2 +- util/options.hh | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/util/hb-ot-shape-closure.cc b/util/hb-ot-shape-closure.cc index 77ca20135..33f531b37 100644 --- a/util/hb-ot-shape-closure.cc +++ b/util/hb-ot-shape-closure.cc @@ -39,7 +39,7 @@ struct shape_closure_consumer_t : option_group_t add_options (parser); } - void add_options (struct option_parser_t *parser) + void add_options (struct option_parser_t *parser) override { GOptionEntry entries[] = { diff --git a/util/options.hh b/util/options.hh index 83dbe3402..63360ca5f 100644 --- a/util/options.hh +++ b/util/options.hh @@ -129,13 +129,13 @@ struct view_options_t : option_group_t add_options (parser); } - virtual ~view_options_t () + ~view_options_t () override { g_free (fore); g_free (back); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; hb_bool_t annotate; char *fore; @@ -165,7 +165,7 @@ struct shape_options_t : option_group_t add_options (parser); } - virtual ~shape_options_t () + ~shape_options_t () override { g_free (direction); g_free (language); @@ -174,7 +174,7 @@ struct shape_options_t : option_group_t g_strfreev (shapers); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; void setup_buffer (hb_buffer_t *buffer) { @@ -471,7 +471,7 @@ struct font_options_t : option_group_t add_options (parser); } - virtual ~font_options_t () + ~font_options_t () override { g_free (font_file); free (variations); @@ -479,7 +479,7 @@ struct font_options_t : option_group_t hb_font_destroy (font); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; hb_font_t *get_font () const; @@ -521,7 +521,7 @@ struct text_options_t : option_group_t add_options (parser); } - virtual ~text_options_t () + ~text_options_t () override { g_free (text_before); g_free (text_after); @@ -533,9 +533,9 @@ struct text_options_t : option_group_t fclose (fp); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; - void post_parse (GError **error G_GNUC_UNUSED) { + void post_parse (GError **error G_GNUC_UNUSED) override { if (text && text_file) g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, @@ -572,7 +572,7 @@ struct output_options_t : option_group_t add_options (parser); } - virtual ~output_options_t () + ~output_options_t () override { g_free (output_file); g_free (output_format); @@ -580,9 +580,9 @@ struct output_options_t : option_group_t fclose (fp); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; - void post_parse (GError **error G_GNUC_UNUSED) + void post_parse (GError **error G_GNUC_UNUSED) override { if (output_format) explicit_output_format = true; @@ -627,7 +627,7 @@ struct format_options_t : option_group_t add_options (parser); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; void serialize_unicode (hb_buffer_t *buffer, GString *gs); @@ -678,12 +678,12 @@ struct subset_options_t : option_group_t add_options (parser); } - virtual ~subset_options_t () + ~subset_options_t () override { hb_subset_input_destroy (input); } - void add_options (option_parser_t *parser); + void add_options (option_parser_t *parser) override; hb_subset_input_t *input; }; From 815f002bb9230a52768a165383497cc98c58eadb Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Wed, 5 Jun 2019 10:38:06 +0430 Subject: [PATCH 443/617] Don't use vsnprintf when HB_NO_BUFFER_MESSAGE is defined --- src/hb-buffer.cc | 5 ++++- src/hb-config.hh | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index d95404f5c..bbbbd227c 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -2026,7 +2026,10 @@ hb_buffer_set_message_func (hb_buffer_t *buffer, bool hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) { +#ifdef HB_NO_BUFFER_MESSAGE + return false; +#endif char buf[100]; - vsnprintf (buf, sizeof (buf), fmt, ap); + vsnprintf (buf, sizeof (buf), fmt, ap); return (bool) this->message_func (this, font, buf, this->message_data); } diff --git a/src/hb-config.hh b/src/hb-config.hh index fd5a71341..8bdce3598 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -52,6 +52,7 @@ #define HB_DISABLE_DEPRECATED #define HB_NDEBUG #define HB_NO_ATEXIT +#define HB_NO_BUFFER_MESSAGE #define HB_NO_BUFFER_SERIALIZE #define HB_NO_BITMAP #define HB_NO_CFF From c7439d4e3a76d596845aad4e4bc860bd61ee47e3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 5 Jun 2019 12:13:49 -0700 Subject: [PATCH 444/617] Slightly massage buffer-messaging commit Saves a few bytes. --- src/hb-buffer.cc | 3 --- src/hb-buffer.hh | 8 +++++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index bbbbd227c..5dd83fc2c 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -2026,9 +2026,6 @@ hb_buffer_set_message_func (hb_buffer_t *buffer, bool hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) { -#ifdef HB_NO_BUFFER_MESSAGE - return false; -#endif char buf[100]; vsnprintf (buf, sizeof (buf), fmt, ap); return (bool) this->message_func (this, font, buf, this->message_data); diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index b2b190ace..9aae38dbb 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -347,7 +347,13 @@ struct hb_buffer_t HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *)); - bool messaging () { return unlikely (message_func); } + bool messaging () + { +#ifdef HB_NO_BUFFER_MESSAGE + return false; +#endif + return unlikely (message_func); + } bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { if (!messaging ()) From 8f8e8a84795db45098c95e19a7ff83d898d3bc7d Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Wed, 5 Jun 2019 12:59:09 -0700 Subject: [PATCH 445/617] fix build --- src/hb-ot-font.cc | 2 +- src/hb-ot-glyf-table.hh | 8 ++++---- src/hb-ot-hmtx-table.hh | 2 +- src/hb-ot-var-gvar-table.hh | 6 +++--- src/hb-ot-var-hvar-table.hh | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 21ca3c08d..8fa6012e7 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -186,7 +186,7 @@ hb_ot_get_glyph_extents (hb_font_t *font, #if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) if (!ret) ret = ot_face->sbix->get_extents (font, glyph, extents); #endif - if (!ret) ret = ot_face->glyf->get_extents (glyph, extents); + if (!ret) ret = ot_face->glyf->get_extents (font, glyph, extents); #ifndef HB_NO_OT_FONT_CFF if (!ret) ret = ot_face->cff1->get_extents (glyph, extents); if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents); diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 90addc46b..68ca973ee 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -691,10 +691,10 @@ struct glyf void add (const contour_point_t &p) { - min.x = MIN (min.x, p.x); - min.y = MIN (min.y, p.y); - max.x = MAX (max.x, p.x); - max.y = MAX (max.y, p.y); + min.x = hb_min (min.x, p.x); + min.y = hb_min (min.y, p.y); + max.x = hb_max (max.x, p.x); + max.y = hb_max (max.y, p.y); } bool empty () const { return (min.x >= max.x) || (min.y >= max.y); } diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index 1b09d8d9c..bae18b807 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -139,7 +139,7 @@ struct hmtxvmtx if (c->plan->old_gid_for_new_gid (_, &old_gid)) return hb_pair (_mtx.get_advance (old_gid), _mtx.get_side_bearing (old_gid)); else - return hb_pair (0u, 0u); + return hb_pair (0u, 0); }) ; diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index c34c9aed4..0c563b74b 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -164,7 +164,7 @@ struct TupleVarHeader else { if (peak != end) scalar *= (float)(end - v) / (end - peak); } } - else if (!v || v < MIN (0, peak) || v > MAX (0, peak)) return 0.f; + else if (!v || v < hb_min (0, peak) || v > hb_max (0, peak)) return 0.f; else scalar *= (float)v / peak; } @@ -567,9 +567,9 @@ struct gvar if (prev_val == next_val) return (prev_delta == next_delta)? prev_delta: 0.f; - else if (target_val <= MIN (prev_val, next_val)) + else if (target_val <= hb_min (prev_val, next_val)) return (prev_val < next_val) ? prev_delta: next_delta; - else if (target_val >= MAX (prev_val, next_val)) + else if (target_val >= hb_max (prev_val, next_val)) return (prev_val > next_val)? prev_delta: next_delta; /* linear interpolation */ diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index 49f241c3f..be00f49e2 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -159,7 +159,7 @@ struct index_map_subset_plan_t unsigned int last_val = (unsigned int)-1; hb_codepoint_t last_gid = (hb_codepoint_t)-1; - hb_codepoint_t gid = (hb_codepoint_t)MIN(index_map.get_map_count (), plan->num_output_glyphs ()); + hb_codepoint_t gid = (hb_codepoint_t) hb_min (index_map.get_map_count (), plan->num_output_glyphs ()); outer_bit_count = (index_map.get_width () * 8) - index_map.get_inner_bit_count (); max_inners.resize (inner_maps.length); From d5e5f378329b6ce21944b79b568369ea7bc36cf3 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 5 Jun 2019 22:20:03 +0300 Subject: [PATCH 446/617] This makes minor changes to allow building HarfBuzz with mingw.org's MinGW. src/hb-algs.hh: Don't compile _BitScanForward and _BitScanReverse for GCC >= 4. mingw.org's MinGW doesn't have these functions. src/hb-atomic.hh: MemoryBarrier does exist in mingw.org's MinGW, but it is not a macro, it is an inline function. __MINGW32_VERSION is a macro that exists only in mingw.org's MinGW, so conditioning on it should not affect MinGW64, where MemoryBarrier is a macro. src/hb-uniscribe.cc: Define E_NOT_SUFFICIENT_BUFFER if it is not defined (mingw.org's MinGW doesn't). src/hb.hh: Don't include intrin.h for mingw.org's MinGW, since that header is not available; instead, include windows.h. Conditioned on __MINGW32_VERSION to avoid affecting MinGW64. --- src/hb-algs.hh | 4 ++-- src/hb-atomic.hh | 2 +- src/hb-uniscribe.cc | 4 ++++ src/hb.hh | 7 +++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 0b34f7106..fe716d0c0 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -400,7 +400,7 @@ hb_bit_storage (T v) return sizeof (unsigned long long) * 8 - __builtin_clzll (v); #endif -#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4)) if (sizeof (T) <= sizeof (unsigned int)) { unsigned long where; @@ -474,7 +474,7 @@ hb_ctz (T v) return __builtin_ctzll (v); #endif -#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4)) if (sizeof (T) <= sizeof (unsigned int)) { unsigned long where; diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index 45413d5e7..09d88937c 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -107,7 +107,7 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) static inline void _hb_memory_barrier () { -#ifndef MemoryBarrier +#if !defined(MemoryBarrier) && !defined(__MINGW32_VERSION) /* MinGW has a convoluted history of supporting MemoryBarrier. */ LONG dummy = 0; InterlockedExchange (&dummy, 1); diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index f97ed91fc..69a1ae7e4 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -31,6 +31,10 @@ #include #include +#ifndef E_NOT_SUFFICIENT_BUFFER +#define E_NOT_SUFFICIENT_BUFFER HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER) +#endif + #include "hb-uniscribe.h" #include "hb-open-file.hh" diff --git a/src/hb.hh b/src/hb.hh index e6d22fe3b..afd9799ee 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -183,8 +183,15 @@ #include #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) +#ifdef __MINGW32_VERSION +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#else #include #endif +#endif #define HB_PASTE1(a,b) a##b #define HB_PASTE(a,b) HB_PASTE1(a,b) From 66361c72f655cc9170fd8c25610ed192fa0ff86d Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Wed, 5 Jun 2019 14:51:04 -0700 Subject: [PATCH 447/617] restore gvar/MVAR/HVAR tables in subset tests --- test/subset/generate-expected-outputs.py | 2 +- test/subset/run-tests.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py index 6c65627e3..c33a49f3c 100755 --- a/test/subset/generate-expected-outputs.py +++ b/test/subset/generate-expected-outputs.py @@ -23,7 +23,7 @@ def generate_expected_output(input_file, unicodes, profile_flags, output_path): "--name-languages=*", "--name-legacy", "--layout-features=*", - "--drop-tables+=DSIG,GPOS,GSUB,GDEF,gvar,avar,MVAR,HVAR", + "--drop-tables+=DSIG,GPOS,GSUB,GDEF", "--unicodes=%s" % unicodes, "--output-file=%s" % output_path]) args.extend(profile_flags) diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index 5d221e6bb..4bf57140f 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -67,7 +67,7 @@ def run_test (test, should_check_ots): "--font-file=" + test.font_path, "--output-file=" + out_file, "--unicodes=%s" % test.unicodes (), - "--drop-tables+=DSIG,GPOS,GSUB,GDEF,gvar,avar,MVAR,HVAR"] + "--drop-tables+=DSIG,GPOS,GSUB,GDEF"] cli_args.extend (test.get_profile_flags ()) print (' '.join (cli_args)) _, return_code = cmd (cli_args) From db938479d7b1e3ec35a39a9ad31c945e09e6d5e5 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 4 Jun 2019 10:30:53 -0700 Subject: [PATCH 448/617] [subset] maxp table to use _subset2 --- src/hb-ot-maxp-table.hh | 52 +++++++++++++++++++---------------------- src/hb-subset.cc | 2 +- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/hb-ot-maxp-table.hh b/src/hb-ot-maxp-table.hh index a2d9167c5..2ba2cf44d 100644 --- a/src/hb-ot-maxp-table.hh +++ b/src/hb-ot-maxp-table.hh @@ -94,39 +94,35 @@ struct maxp return_trace (likely (version.major == 0 && version.minor == 0x5000u)); } - bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_context_t *c) const { - hb_blob_t *maxp_blob = hb_sanitize_context_t().reference_table (plan->source); - hb_blob_t *maxp_prime_blob = hb_blob_copy_writable_or_fail (maxp_blob); - hb_blob_destroy (maxp_blob); + TRACE_SUBSET (this); + maxp *maxp_prime = c->serializer->embed (this); + if (unlikely (!maxp_prime)) return_trace (false); - if (unlikely (!maxp_prime_blob)) { - return false; - } - maxp *maxp_prime = (maxp *) hb_blob_get_data (maxp_prime_blob, nullptr); - - maxp_prime->set_num_glyphs (plan->num_output_glyphs ()); - if (plan->drop_hints) - drop_hint_fields (plan, maxp_prime); - - bool result = plan->add_table (HB_OT_TAG_maxp, maxp_prime_blob); - hb_blob_destroy (maxp_prime_blob); - return result; - } - - static void drop_hint_fields (hb_subset_plan_t *plan HB_UNUSED, maxp *maxp_prime) - { + maxp_prime->numGlyphs = c->plan->num_output_glyphs (); if (maxp_prime->version.major == 1) { - maxpV1Tail &v1 = StructAfter (*maxp_prime); - v1.maxZones = 1; - v1.maxTwilightPoints = 0; - v1.maxStorage = 0; - v1.maxFunctionDefs = 0; - v1.maxInstructionDefs = 0; - v1.maxStackElements = 0; - v1.maxSizeOfInstructions = 0; + const maxpV1Tail *src_v1 = &StructAfter (*this); + maxpV1Tail *dest_v1 = c->serializer->embed (src_v1); + if (unlikely (!dest_v1)) return_trace (false); + + if (c->plan->drop_hints) + drop_hint_fields (dest_v1); } + + return_trace (true); + } + + static void drop_hint_fields (maxpV1Tail* dest_v1) + { + dest_v1->maxZones = 1; + dest_v1->maxTwilightPoints = 0; + dest_v1->maxStorage = 0; + dest_v1->maxFunctionDefs = 0; + dest_v1->maxInstructionDefs = 0; + dest_v1->maxStackElements = 0; + dest_v1->maxSizeOfInstructions = 0; } protected: diff --git a/src/hb-subset.cc b/src/hb-subset.cc index ddd88f7e3..233f3dc41 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -181,7 +181,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset2 (plan); break; case HB_OT_TAG_maxp: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_loca: DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf"); From 6f35cf7a637f5efc0ef3888d929a6392cc2863c3 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Thu, 6 Jun 2019 09:15:34 -0700 Subject: [PATCH 449/617] regenerate SourceSerifVariable expected subset results --- .gitignore | 1 + ...iable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 5464 -> 4132 bytes ...ceSerifVariable-Roman.default.61,62,63.ttf | Bin 5432 -> 4100 bytes ...fVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 5924 -> 4592 bytes ...le-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 5464 -> 4132 bytes ...erifVariable-Roman.drop-hints.61,62,63.ttf | Bin 5432 -> 4100 bytes ...riable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 5924 -> 4592 bytes 7 files changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..86042ab43 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.plist diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf index 1800da8640c0f9375fb1d096e715690071edc05e..3424a3dba83e2378e8821c3bde5e423fbdad76fa 100644 GIT binary patch delta 507 zcmYk%ze_?<6bJC{x%WPOzV|GX(!!9Cpb!a>axo~Uh%hW7geI40iA*CRBWaC>9uB!A z1P#&XgZ_a)TpHRU!l|v@tsjp(P}BYJz2D0{=OunSaTyAl^8oU>&Fp&Rywn2B3wt^m zG&^qEDjpWgvE9jIz4H)Yf%468p`6DOCF@;VBhXu zmdvsV!!pMfNXsHy!jM;Ng@n9eYkwb;2TA$FxfcQXiOlcRq$8#LeBpzx7T5;jYKd*a cQ2T5P3019kJq@Soy%)~Mz%~iM$p>`p2iY<{Hvj+t delta 1691 zcmb7DOK2oj6g^d4-Sw(Ej-6%_GpL~)Tu2Pb7&4;4#l%l*Fm_@(V@7n->FHz|lkTRv zlNm**y^F!nAlWGR+4>>v!sVs1&+b0>22d^?T$*%8KRdWK>6RZm zIJ`9R{#WmO19*o(@r!P!*Z=(%=IFgTG|s&19Up!F%kV<(6(@Jjtqk7tstHDs#~~cX zm8F1p6*~y=p<);J;$y`*+8-9LN9=x}`U2*1rxp7N zZsaN|7|eSG#R1NGCy9%g^Ilc`UAf4+uJ{z@{ZAB+BJ_V$dVb!8v!ghl-OMTAoHJB ze|)2bwzaroeJ)aJ(Y{IR2sNU*mC{IUYG>&gTmL@9M{vXDZQDF8>Ux+NeCMBkpknj3 zZN6uT1W)WQzeO|C-hDrHHW zmb`*Ryl8PB3*4{ptWO#XEZ{6NHf%Y%)UjCnCDsf&3Dw&)SRvEpzfsA!|65fqGfa;m zrP7<6gp)o>HH8+}XoAFQl$KD7IOTZK%9OwoAlcx-I-Vnei`*k@@OX{iBC3>^@Qig{ zp(espw5sB1>#=091QzO%wSSrW^E?$B3EtESrA=z$8tV~L+v6t#$<`$_*`->_E`60| z)QF_O|EsGEDLz|i*gt)Hb`lzlzQw;m3u$4SHQ(dDjihOr$~eX(BIT6cNCC4aAWlM4 z`Yq2RJKv_|zV(%7Bw-^CclszJrbtQ2NT=8N$GBH%eCNE+{MW%D-E3~w7)4%sdvMF# SGq@Rs!_R{)XLx_n&;J2`5e3Tt diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf index 4b538a87d7ba6034f8a9d8ca63a562b1b3cb1297..ae4ee43e5760d5d5e001d671a09edab6498a4997 100644 GIT binary patch delta 542 zcmYk&ze_?<6bJC{x%a;3^Szgus2PGp1cf-1P)kqdM>u`cGUx@HNf02u9r8PPe=pyyJyj) zP=|%link==B>U*4R#J0&qz6%lz5pWFIAsgOan6=7aLZPR;+}25hX~t546ke-EPS#p zbm5!rhoVlljR?ij%GbdT3>x5uizp32f|Osk?r4ThNQw@&KtPPJC6>e#Tm73cP!cCx zH<6a@zt(}S%&=(>VVUKJz_84-C2V=jR!GS+w(%ECCI;jK*L?`eFSdoWYGeChsWG;V wq?%wmu+@gPUvEh+Qfjx>FzepD??QMtfmI6V)n)5zfaW98wZUN68xMY{9}sdt9smFU delta 1703 zcmb7DO=uKn7=C7UcIPKil2k*)5=QYLX-G6^p`nMypVerZ*laWkUN)OeTue60%qH4i z#zPC@K@1Be7Z2)DRB$gI+lz?kLA=zHVrfsk^z1>O_nUXwcqmqenR(v-=Y7BT`#F3x zaHF@U>j;1o-=7(qj<3}o0$n%O_xAU6J)`zvajh8bUf%N)(EVopY`@)oW&Lu$-Q%rq zob9{y^w*bwvjlWJs;$KJ_b)KQ=siu(I&M3E-zxmloXPC8GW+a&BXTAabR&xmSj;P* z9BwMM5a5nt8#{4Nafbd+6g%j}bH!P>*seH-KK!ZJg@<>FJ?yYDihVfNmq^mW0k&JA z8aj}*4l3?MuQdvWI6nD3woWOwFkts8wz1XzPH_e^_M~EGlTQ|reOvW8jAXVcb`$)T z$*bVufRj_~W4F^P+<_72yy~}PLg%{TtvKM`SKN)jeXDo}Lie8(v%5~OQ?Z3@UY}wc zUwebZ2|MFR0&h+Y4hFp?#o2aeRu22T4b{8o@}4O6Fyj58*oWr_iUSPzJ&HRJ_}?n- z#Gs!qtgJ?*a#$!wjZ?Yn%~!bx_HY3!SVe>q$_Pbuoq-_uPZK@}_Rp z)H_Bjw%3d*lE<>dHvV$IO6vF#HA*wIq@452C)tDnc@kYRyxUzZ(NnstvR2A)abDU)CNY-gTmWk^hlK^o7P@R$ZEA7Vd-%o}c^_Hp6%kk?4Cf+c?E_!Xj; zC<~GF2=W-i4+hsU%Kru0>ZCP_WSBFJ*^SJnMkS}mSCS2pNQ6b&r^tMQ@@6XSUjA!J z^UM-6qhy}rX0*;VZLcUzhJ6W{6_|J&g^+8HLq?_qnaM2mGdNBHr}-Co4AXqZFiCkF zM@{S$H6aeuYZ6CH#JItdSEz@^{~Z4(X%!#IT_&wMlGYZLahd%`RL6W|L**{z; zA-gkgCQu-f0e{vhGo!>TXx3J2j9NlNiRl;kmgpj9Smn@H`Cp_>n96!aBqHN%?MM4c zNQ}^wZsfY8`y=*6mRmEia;+q5$YoD2X~+sf>Y}-eGzh0p?f=lG#rgkxGtH86^Q(>D QgI&$5{({x~H~1p^0jIhK`2YX_ diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf index d579c1fa58e714fd604bb7563c4c970faf2c9bdb..1a5ba475b47943d82490b9ac883a17662bbd263e 100644 GIT binary patch delta 507 zcmYk%y-Pw-7zXg?J?C7#Ua$FqX(2gSP>6&Gxfp~~L>U!PPLWGnWEv4QNLxfh7l#~5 z2pXa`FZ2&2(bCWw(bODG(a_f=U#R7rAJ2K+pYqz{s-T1yo2Jk-GI=u^Z z(AQqJm0Bb@NDuWTZ8}R%5e+yOKm-F#wm=N$YzYn5Y=sDJ>n~cg_QZ)BI^Nhidhx~f zKv9%!pqpZBFEmQCO+;t}5~MuN05>$rCL~3WEzl)$Y>9a>(QysxUr9qnoN&p7jP!Tx z>}AS4n-G=-wm?>v*b;_3Vk@NNDO>ydm|RH9JI>t*$WP>crzRa4<>LnrbT!5{kW}Mr eFATNLHjz?0^`^UF=kyC7%g5dL<(_P$+*sy0nX1*(?90hP!JQHw;>1L4OI5u7$oNe~Fhah=p6v8}a} z7B0(~LsiQXgaZeDu7FfuIB?(ss*n&=T;PC^;MxPnN*v&uw-dI2kU*<_@0)q^^SzmQ zzdrC`<=RxaGzZ|^^Diu}_TTJX2TE@YA39MkeMar|#(pC{x%=SjK>6F@#tFCF8(!gh zdw8%h{oYq^eFx+>fa0gUZh!FmP0Z8#=-4>7UGLWUA6^=J-nx^UbE~6Q^0fpdskne?{G!;0!EcHUjypNU0X*kEBx&Lh zlTM@uMdY0`iYGATEPyUvKz?63=M+0QXJ5%$Oa;`Rry+0dwX+^*)Z88;T9)&G(7}m>^Uf;#5#pTtpb0 zRXl;2pjz+l#m!b!Z^fgt{?+jp{wMBi9bN1pMiVVWXrs@y!GAzq0~e{?blq( zy=@*_Z=+)^E?J)ol-jg!(K$CE@EUrQ)_9U~t}>oP69(i-blLLGZnZ;8xn+mBQm%W% zazo*hG86A5EK^>w@#UUbgCd!JsPeN_%aNXo8#4b~o z#A(T^Sj2gY2Uy^KiDv`SSYQEXnXzfh(W8#V;xDl(=q6Ne(_n>6m;Xj3vDAg2NT%&0ct5aG+J>rz(2`f_qOMqmZ2Wxni1TJuou+HOEev7D4Uc%GX zd4-w?PtvM}r>w`4#S&PkN7nvD?$7a5Y$SL~E0i{=g)6K_Ol_Z^3?y5Z&}5ftDZBJl zno%c`0{^eBGNkxyrD6Z{?b}IcGWr((CM~3e9oBr0`!RSf% diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf index 1800da8640c0f9375fb1d096e715690071edc05e..3424a3dba83e2378e8821c3bde5e423fbdad76fa 100644 GIT binary patch delta 507 zcmYk%ze_?<6bJC{x%WPOzV|GX(!!9Cpb!a>axo~Uh%hW7geI40iA*CRBWaC>9uB!A z1P#&XgZ_a)TpHRU!l|v@tsjp(P}BYJz2D0{=OunSaTyAl^8oU>&Fp&Rywn2B3wt^m zG&^qEDjpWgvE9jIz4H)Yf%468p`6DOCF@;VBhXu zmdvsV!!pMfNXsHy!jM;Ng@n9eYkwb;2TA$FxfcQXiOlcRq$8#LeBpzx7T5;jYKd*a cQ2T5P3019kJq@Soy%)~Mz%~iM$p>`p2iY<{Hvj+t delta 1691 zcmb7DOK2oj6g^d4-Sw(Ej-6%_GpL~)Tu2Pb7&4;4#l%l*Fm_@(V@7n->FHz|lkTRv zlNm**y^F!nAlWGR+4>>v!sVs1&+b0>22d^?T$*%8KRdWK>6RZm zIJ`9R{#WmO19*o(@r!P!*Z=(%=IFgTG|s&19Up!F%kV<(6(@Jjtqk7tstHDs#~~cX zm8F1p6*~y=p<);J;$y`*+8-9LN9=x}`U2*1rxp7N zZsaN|7|eSG#R1NGCy9%g^Ilc`UAf4+uJ{z@{ZAB+BJ_V$dVb!8v!ghl-OMTAoHJB ze|)2bwzaroeJ)aJ(Y{IR2sNU*mC{IUYG>&gTmL@9M{vXDZQDF8>Ux+NeCMBkpknj3 zZN6uT1W)WQzeO|C-hDrHHW zmb`*Ryl8PB3*4{ptWO#XEZ{6NHf%Y%)UjCnCDsf&3Dw&)SRvEpzfsA!|65fqGfa;m zrP7<6gp)o>HH8+}XoAFQl$KD7IOTZK%9OwoAlcx-I-Vnei`*k@@OX{iBC3>^@Qig{ zp(espw5sB1>#=091QzO%wSSrW^E?$B3EtESrA=z$8tV~L+v6t#$<`$_*`->_E`60| z)QF_O|EsGEDLz|i*gt)Hb`lzlzQw;m3u$4SHQ(dDjihOr$~eX(BIT6cNCC4aAWlM4 z`Yq2RJKv_|zV(%7Bw-^CclszJrbtQ2NT=8N$GBH%eCNE+{MW%D-E3~w7)4%sdvMF# SGq@Rs!_R{)XLx_n&;J2`5e3Tt diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf index 4b538a87d7ba6034f8a9d8ca63a562b1b3cb1297..ae4ee43e5760d5d5e001d671a09edab6498a4997 100644 GIT binary patch delta 542 zcmYk&ze_?<6bJC{x%a;3^Szgus2PGp1cf-1P)kqdM>u`cGUx@HNf02u9r8PPe=pyyJyj) zP=|%link==B>U*4R#J0&qz6%lz5pWFIAsgOan6=7aLZPR;+}25hX~t546ke-EPS#p zbm5!rhoVlljR?ij%GbdT3>x5uizp32f|Osk?r4ThNQw@&KtPPJC6>e#Tm73cP!cCx zH<6a@zt(}S%&=(>VVUKJz_84-C2V=jR!GS+w(%ECCI;jK*L?`eFSdoWYGeChsWG;V wq?%wmu+@gPUvEh+Qfjx>FzepD??QMtfmI6V)n)5zfaW98wZUN68xMY{9}sdt9smFU delta 1703 zcmb7DO=uKn7=C7UcIPKil2k*)5=QYLX-G6^p`nMypVerZ*laWkUN)OeTue60%qH4i z#zPC@K@1Be7Z2)DRB$gI+lz?kLA=zHVrfsk^z1>O_nUXwcqmqenR(v-=Y7BT`#F3x zaHF@U>j;1o-=7(qj<3}o0$n%O_xAU6J)`zvajh8bUf%N)(EVopY`@)oW&Lu$-Q%rq zob9{y^w*bwvjlWJs;$KJ_b)KQ=siu(I&M3E-zxmloXPC8GW+a&BXTAabR&xmSj;P* z9BwMM5a5nt8#{4Nafbd+6g%j}bH!P>*seH-KK!ZJg@<>FJ?yYDihVfNmq^mW0k&JA z8aj}*4l3?MuQdvWI6nD3woWOwFkts8wz1XzPH_e^_M~EGlTQ|reOvW8jAXVcb`$)T z$*bVufRj_~W4F^P+<_72yy~}PLg%{TtvKM`SKN)jeXDo}Lie8(v%5~OQ?Z3@UY}wc zUwebZ2|MFR0&h+Y4hFp?#o2aeRu22T4b{8o@}4O6Fyj58*oWr_iUSPzJ&HRJ_}?n- z#Gs!qtgJ?*a#$!wjZ?Yn%~!bx_HY3!SVe>q$_Pbuoq-_uPZK@}_Rp z)H_Bjw%3d*lE<>dHvV$IO6vF#HA*wIq@452C)tDnc@kYRyxUzZ(NnstvR2A)abDU)CNY-gTmWk^hlK^o7P@R$ZEA7Vd-%o}c^_Hp6%kk?4Cf+c?E_!Xj; zC<~GF2=W-i4+hsU%Kru0>ZCP_WSBFJ*^SJnMkS}mSCS2pNQ6b&r^tMQ@@6XSUjA!J z^UM-6qhy}rX0*;VZLcUzhJ6W{6_|J&g^+8HLq?_qnaM2mGdNBHr}-Co4AXqZFiCkF zM@{S$H6aeuYZ6CH#JItdSEz@^{~Z4(X%!#IT_&wMlGYZLahd%`RL6W|L**{z; zA-gkgCQu-f0e{vhGo!>TXx3J2j9NlNiRl;kmgpj9Smn@H`Cp_>n96!aBqHN%?MM4c zNQ}^wZsfY8`y=*6mRmEia;+q5$YoD2X~+sf>Y}-eGzh0p?f=lG#rgkxGtH86^Q(>D QgI&$5{({x~H~1p^0jIhK`2YX_ diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf index d579c1fa58e714fd604bb7563c4c970faf2c9bdb..1a5ba475b47943d82490b9ac883a17662bbd263e 100644 GIT binary patch delta 507 zcmYk%y-Pw-7zXg?J?C7#Ua$FqX(2gSP>6&Gxfp~~L>U!PPLWGnWEv4QNLxfh7l#~5 z2pXa`FZ2&2(bCWw(bODG(a_f=U#R7rAJ2K+pYqz{s-T1yo2Jk-GI=u^Z z(AQqJm0Bb@NDuWTZ8}R%5e+yOKm-F#wm=N$YzYn5Y=sDJ>n~cg_QZ)BI^Nhidhx~f zKv9%!pqpZBFEmQCO+;t}5~MuN05>$rCL~3WEzl)$Y>9a>(QysxUr9qnoN&p7jP!Tx z>}AS4n-G=-wm?>v*b;_3Vk@NNDO>ydm|RH9JI>t*$WP>crzRa4<>LnrbT!5{kW}Mr eFATNLHjz?0^`^UF=kyC7%g5dL<(_P$+*sy0nX1*(?90hP!JQHw;>1L4OI5u7$oNe~Fhah=p6v8}a} z7B0(~LsiQXgaZeDu7FfuIB?(ss*n&=T;PC^;MxPnN*v&uw-dI2kU*<_@0)q^^SzmQ zzdrC`<=RxaGzZ|^^Diu}_TTJX2TE@YA39MkeMar|#(pC{x%=SjK>6F@#tFCF8(!gh zdw8%h{oYq^eFx+>fa0gUZh!FmP0Z8#=-4>7UGLWUA6^=J-nx^UbE~6Q^0fpdskne?{G!;0!EcHUjypNU0X*kEBx&Lh zlTM@uMdY0`iYGATEPyUvKz?63=M+0QXJ5%$Oa;`Rry+0dwX+^*)Z88;T9)&G(7}m>^Uf;#5#pTtpb0 zRXl;2pjz+l#m!b!Z^fgt{?+jp{wMBi9bN1pMiVVWXrs@y!GAzq0~e{?blq( zy=@*_Z=+)^E?J)ol-jg!(K$CE@EUrQ)_9U~t}>oP69(i-blLLGZnZ;8xn+mBQm%W% zazo*hG86A5EK^>w@#UUbgCd!JsPeN_%aNXo8#4b~o z#A(T^Sj2gY2Uy^KiDv`SSYQEXnXzfh(W8#V;xDl(=q6Ne(_n>6m;Xj3vDAg2NT%&0ct5aG+J>rz(2`f_qOMqmZ2Wxni1TJuou+HOEev7D4Uc%GX zd4-w?PtvM}r>w`4#S&PkN7nvD?$7a5Y$SL~E0i{=g)6K_Ol_Z^3?y5Z&}5ftDZBJl zno%c`0{^eBGNkxyrD6Z{?b}IcGWr((CM~3e9oBr0`!RSf% From 93d592e0e181f436ea47038fef419134007208aa Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 5 Jun 2019 16:51:31 -0700 Subject: [PATCH 450/617] [subset] post table to use _subset2 --- src/hb-ot-post-table.hh | 31 +++++++++++++++---------------- src/hb-subset.cc | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 970bbe68a..9177a5393 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -73,26 +73,25 @@ struct post { static constexpr hb_tag_t tableTag = HB_OT_TAG_post; - bool subset (hb_subset_plan_t *plan) const + void serialize (hb_serialize_context_t *c) const { - unsigned int post_prime_length; - hb_blob_t *post_blob = hb_sanitize_context_t ().reference_table(plan->source); - hb_blob_t *post_prime_blob = hb_blob_create_sub_blob (post_blob, 0, post::min_size); - post *post_prime = (post *) hb_blob_get_data_writable (post_prime_blob, &post_prime_length); - hb_blob_destroy (post_blob); - - if (unlikely (!post_prime || post_prime_length != post::min_size)) - { - hb_blob_destroy (post_prime_blob); - DEBUG_MSG(SUBSET, nullptr, "Invalid source post table with length %d.", post_prime_length); - return false; - } + post *post_prime = c->allocate_min (); + if (unlikely (!post_prime)) return; + memcpy (post_prime, this, post::min_size); post_prime->version.major = 3; // Version 3 does not have any glyph names. - bool result = plan->add_table (HB_OT_TAG_post, post_prime_blob); - hb_blob_destroy (post_prime_blob); + } - return result; + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + post *post_prime = c->serializer->start_embed (); + if (unlikely (!post_prime)) return_trace (false); + + serialize (c->serializer); + if (c->serializer->in_error () || c->serializer->ran_out_of_room) return_trace (false); + + return_trace (true); } struct accelerator_t diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 233f3dc41..a6140718e 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -193,7 +193,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset (plan); break; case HB_OT_TAG_post: - result = _subset (plan); + result = _subset2 (plan); break; #ifndef HB_NO_SUBSET_CFF From f9b1ae73360054d9f121a2d36820377909888b35 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 5 Jun 2019 17:40:59 -0700 Subject: [PATCH 451/617] [subset] Move OS/2 to subset2. --- src/hb-ot-os2-table.hh | 32 ++++++++++++++++---------------- src/hb-subset.cc | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 3b6a3727a..33fbb643c 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -145,29 +145,20 @@ struct OS2 } } - bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_context_t *c) const { - hb_blob_t *os2_blob = hb_sanitize_context_t ().reference_table (plan->source); - hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1); - // TODO(grieger): move to hb_blob_copy_writable_or_fail - hb_blob_destroy (os2_blob); - - OS2 *os2_prime = (OS2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr); - if (unlikely (!os2_prime)) { - hb_blob_destroy (os2_prime_blob); - return false; - } + TRACE_SUBSET (this); + OS2 *os2_prime = c->serializer->embed (this); + if (unlikely (!os2_prime)) return_trace (false); uint16_t min_cp, max_cp; - find_min_and_max_codepoint (plan->unicodes, &min_cp, &max_cp); + find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp); os2_prime->usFirstCharIndex = min_cp; os2_prime->usLastCharIndex = max_cp; - _update_unicode_ranges (plan->unicodes, os2_prime->ulUnicodeRange); - bool result = plan->add_table (HB_OT_TAG_OS2, os2_prime_blob); + _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange); - hb_blob_destroy (os2_prime_blob); - return result; + return_trace (true); } void _update_unicode_ranges (const hb_set_t *codepoints, @@ -218,6 +209,15 @@ struct OS2 font_page_t get_font_page () const { return (font_page_t) (version == 0 ? fsSelection & 0xFF00 : 0); } + unsigned get_size () const + { + unsigned result = min_size; + if (version >= 1) result += v1X.get_size (); + if (version >= 2) result += v2X.get_size (); + if (version >= 5) result += v5X.get_size (); + return result; + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/src/hb-subset.cc b/src/hb-subset.cc index a6140718e..3f4c2e40b 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -190,7 +190,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset (plan); break; case HB_OT_TAG_OS2: - result = _subset (plan); + result = _subset2 (plan); break; case HB_OT_TAG_post: result = _subset2 (plan); From 1bada656a86e9cb27d4a6b9fcc50748f0bd9c1d9 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 7 Jun 2019 02:01:27 +0430 Subject: [PATCH 452/617] Minor, remove unnecessary semicolon Causing -Wextra-semi-stmt build error when no primitive has chosen Interesting that nobody has noticed it yet. --- src/hb-mutex.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-mutex.hh b/src/hb-mutex.hh index cbbfa2681..e13626731 100644 --- a/src/hb-mutex.hh +++ b/src/hb-mutex.hh @@ -106,7 +106,7 @@ typedef volatile int hb_mutex_impl_t; #define HB_MUTEX_IMPL_INIT 0 #define hb_mutex_impl_init(M) *(M) = 0 #define hb_mutex_impl_lock(M) HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END -#define hb_mutex_impl_unlock(M) (*(M))--; +#define hb_mutex_impl_unlock(M) (*(M))-- #define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END From 385e436692e94588fc4cb3a7afbeb862035db09b Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 7 Jun 2019 10:44:53 -0700 Subject: [PATCH 453/617] Minor, fix gcc maybe-uninitialized complain I guess all of its field will be initialized anyway here but lets make it more defensive --- src/hb-ot-glyf-table.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 1ac9f6ba2..76efdc9b8 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -180,7 +180,7 @@ struct glyf + hb_range (plan->num_output_glyphs ()) | hb_map ([&] (hb_codepoint_t new_gid) { - SubsetGlyph subset_glyph; + SubsetGlyph subset_glyph = {0}; subset_glyph.new_gid = new_gid; // should never fail: all old gids should be mapped From 3c240bd3dc0aaca38154da555d0aef350da62ee6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 7 Jun 2019 10:56:24 -0700 Subject: [PATCH 454/617] Downgrade double-promotion from error to warning https://github.com/harfbuzz/harfbuzz/issues/1740 --- src/hb.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb.hh b/src/hb.hh index afd9799ee..33ad32311 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -66,7 +66,6 @@ #pragma GCC diagnostic error "-Wcast-align" #pragma GCC diagnostic error "-Wcast-function-type" #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" -#pragma GCC diagnostic error "-Wdouble-promotion" #pragma GCC diagnostic error "-Wextra-semi-stmt" #pragma GCC diagnostic error "-Wformat-security" #pragma GCC diagnostic error "-Wimplicit-function-declaration" @@ -99,6 +98,7 @@ #pragma GCC diagnostic warning "-Wbuiltin-macro-redefined" #pragma GCC diagnostic warning "-Wdeprecated" #pragma GCC diagnostic warning "-Wdisabled-optimization" +#pragma GCC diagnostic warning "-Wdouble-promotion" #pragma GCC diagnostic warning "-Wformat=2" #pragma GCC diagnostic warning "-Wignored-pragma-optimize" #pragma GCC diagnostic warning "-Wlogical-op" From e4e518f33d933a02058bad86a6aae714e59814db Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 7 Jun 2019 12:41:09 -0700 Subject: [PATCH 455/617] Fix build on gcc 4.8 Fixes https://github.com/harfbuzz/harfbuzz/issues/1724 --- src/hb-algs.hh | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index fe716d0c0..8229c5f39 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -167,14 +167,39 @@ template auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN (( hb_partial_t (a, v) )) -/* The following hacky replacement version is to make Visual Stuiod build:. */ \ -/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ +/* The following, HB_PARTIALIZE, macro uses a particular corner-case + * of C++11 that is not particularly well-supported by all compilers. + * What's happening is that it's using "this" in a trailing return-type + * via decltype(). Broken compilers deduce the type of "this" pointer + * in that context differently from what it resolves to in the body + * of the function. + * + * One probable cause of this is that at the time of trailing return + * type declaration, "this" points to an incomplete type, whereas in + * the function body the type is complete. That doesn't justify the + * error in any way, but is probably what's happening. + * + * In the case of MSVC, we get around this by using C++14 "decltype(auto)" + * which deduces the type from the actual return statement. For gcc 4.8 + * we use "this+0" instead of "this" which produces an rvalue that seems + * to do be deduces as the same type with this particular compiler. Note + * that "this+0" is illegal in the trailing decltype position since at + * that point this points to incomplete type! But seems to do the trick. + */ #ifdef _MSC_VER +/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ #define HB_PARTIALIZE(Pos) \ template \ decltype(auto) operator () (_T&& _v) const \ { return hb_partial (this, hb_forward<_T> (_v)); } \ static_assert (true, "") +#elif defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) +/* https://github.com/harfbuzz/harfbuzz/issues/1724 */ +#define HB_PARTIALIZE(Pos) \ + template \ + auto operator () (_T&& _v) const HB_AUTO_RETURN \ + (hb_partial (this+0, hb_forward<_T> (_v))) \ + static_assert (true, "") #else #define HB_PARTIALIZE(Pos) \ template \ From 973699c49b905e142ecc5cefd1f4fa15aad8e309 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 7 Jun 2019 12:49:06 -0700 Subject: [PATCH 456/617] Disable clang gcc impersonator --- src/hb-algs.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 8229c5f39..39bb2f1ac 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -193,7 +193,7 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN decltype(auto) operator () (_T&& _v) const \ { return hb_partial (this, hb_forward<_T> (_v)); } \ static_assert (true, "") -#elif defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) +#elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) /* https://github.com/harfbuzz/harfbuzz/issues/1724 */ #define HB_PARTIALIZE(Pos) \ template \ From 6d58b45782833f8c6c8efd9426e2785c78e6462a Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 8 Jun 2019 00:40:18 +0430 Subject: [PATCH 457/617] [ci] use trusty for its gcc 4.8 again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d788263ef..703fac25c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ # Build Configuration for Travis -dist: xenial +dist: trusty language: cpp From 5074d665a8b0980f202a5986bda52808674cfb54 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 7 Jun 2019 14:20:45 -0700 Subject: [PATCH 458/617] [ucd] Save another 1.5kb https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/gen-ucd-table.py | 8 +++++--- src/hb-ucd-table.hh | 37 +++++++++++++++++++++---------------- src/hb-ucd.cc | 12 +++++++++--- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 3f821802d..967e000d4 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -31,14 +31,15 @@ ce = {i for i,u in enumerate(ucd) if u['Comp_Ex'] == 'Y'} assert not any(v for v in dm.values() if len(v) not in (1,2)) dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) -dm1_array = ['0x%04Xu' % v for v in dm1] +dm1_u16_array = ['0x%04Xu' % v for v in dm1 if v[0] <= 0xFFFF] +dm1_u32_array = ['0x%04Xu' % v for v in dm1 if v[0] > 0xFFFF] dm1_order = {v:i+1 for i,v in enumerate(dm1)} dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) dm2 = [("HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % (v+(i if i not in ce and not ccc[i] else 0,)), v) for v,i in dm2] dm2_array = [s for s,v in dm2] -l = 1 + len(dm1_array) +l = 1 + len(dm1_u16_array) + len(dm1_u32_array) dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} dm_order = {None: 0} dm_order.update(dm1_order) @@ -89,7 +90,8 @@ print() code = packTab.Code('_hb_ucd') sc_array, _ = code.addArray('hb_script_t', 'sc_map', sc_array) -dm1_array, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) +dm1_16_array, _ = code.addArray('uint16_t', 'dm1_u16_map', dm1_u16_array) +dm1_32_array, _ = code.addArray('uint32_t', 'dm1_u32_map', dm1_u32_array) dm2_array, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) code.print_c(linkage='static inline') diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index 95c4bf86e..ae339ec0c 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -86,8 +86,8 @@ _hb_ucd_sc_map[138] = HB_SCRIPT_MARCHEN, HB_SCRIPT_OSAGE, HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA, }; -static const hb_codepoint_t -_hb_ucd_dm1_map[935] = +static const uint16_t +_hb_ucd_dm1_u16_map[825] = { 0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u, 0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu, @@ -192,20 +192,25 @@ _hb_ucd_dm1_map[935] = 0x9A6Au, 0x9B12u, 0x9B6Fu, 0x9C40u, 0x9C57u, 0x9CFDu, 0x9D67u, 0x9DB4u, 0x9DFAu, 0x9E1Eu, 0x9E7Fu, 0x9E97u, 0x9E9Fu, 0x9EBBu, 0x9ECEu, 0x9EF9u, 0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu, - 0x9F9Cu,0x20122u,0x2051Cu,0x20525u,0x2054Bu,0x2063Au,0x20804u,0x208DEu, - 0x20A2Cu,0x20B63u,0x214E4u,0x216A8u,0x216EAu,0x219C8u,0x21B18u,0x21D0Bu, - 0x21DE4u,0x21DE6u,0x22183u,0x2219Fu,0x22331u,0x226D4u,0x22844u,0x2284Au, - 0x22B0Cu,0x22BF1u,0x2300Au,0x232B8u,0x2335Fu,0x23393u,0x2339Cu,0x233C3u, - 0x233D5u,0x2346Du,0x236A3u,0x238A7u,0x23A8Du,0x23AFAu,0x23CBCu,0x23D1Eu, - 0x23ED1u,0x23F5Eu,0x23F8Eu,0x24263u,0x242EEu,0x243ABu,0x24608u,0x24735u, - 0x24814u,0x24C36u,0x24C92u,0x24FA1u,0x24FB8u,0x25044u,0x250F2u,0x250F3u, - 0x25119u,0x25133u,0x25249u,0x2541Du,0x25626u,0x2569Au,0x256C5u,0x2597Cu, - 0x25AA7u,0x25BABu,0x25C80u,0x25CD0u,0x25F86u,0x261DAu,0x26228u,0x26247u, - 0x262D9u,0x2633Eu,0x264DAu,0x26523u,0x265A8u,0x267A7u,0x267B5u,0x26B3Cu, - 0x26C36u,0x26CD5u,0x26D6Bu,0x26F2Cu,0x26FB1u,0x270D2u,0x273CAu,0x27667u, - 0x278AEu,0x27966u,0x27CA8u,0x27ED3u,0x27F2Fu,0x285D2u,0x285EDu,0x2872Eu, - 0x28BFAu,0x28D77u,0x29145u,0x291DFu,0x2921Au,0x2940Au,0x29496u,0x295B6u, - 0x29B30u,0x2A0CEu,0x2A105u,0x2A20Eu,0x2A291u,0x2A392u,0x2A600u, + 0x9F9Cu, +}; +static const uint32_t +_hb_ucd_dm1_u32_map[110] = +{ + 0x20122u,0x2051Cu,0x20525u,0x2054Bu,0x2063Au,0x20804u,0x208DEu,0x20A2Cu, + 0x20B63u,0x214E4u,0x216A8u,0x216EAu,0x219C8u,0x21B18u,0x21D0Bu,0x21DE4u, + 0x21DE6u,0x22183u,0x2219Fu,0x22331u,0x226D4u,0x22844u,0x2284Au,0x22B0Cu, + 0x22BF1u,0x2300Au,0x232B8u,0x2335Fu,0x23393u,0x2339Cu,0x233C3u,0x233D5u, + 0x2346Du,0x236A3u,0x238A7u,0x23A8Du,0x23AFAu,0x23CBCu,0x23D1Eu,0x23ED1u, + 0x23F5Eu,0x23F8Eu,0x24263u,0x242EEu,0x243ABu,0x24608u,0x24735u,0x24814u, + 0x24C36u,0x24C92u,0x24FA1u,0x24FB8u,0x25044u,0x250F2u,0x250F3u,0x25119u, + 0x25133u,0x25249u,0x2541Du,0x25626u,0x2569Au,0x256C5u,0x2597Cu,0x25AA7u, + 0x25BABu,0x25C80u,0x25CD0u,0x25F86u,0x261DAu,0x26228u,0x26247u,0x262D9u, + 0x2633Eu,0x264DAu,0x26523u,0x265A8u,0x267A7u,0x267B5u,0x26B3Cu,0x26C36u, + 0x26CD5u,0x26D6Bu,0x26F2Cu,0x26FB1u,0x270D2u,0x273CAu,0x27667u,0x278AEu, + 0x27966u,0x27CA8u,0x27ED3u,0x27F2Fu,0x285D2u,0x285EDu,0x2872Eu,0x28BFAu, + 0x28D77u,0x29145u,0x291DFu,0x2921Au,0x2940Au,0x29496u,0x295B6u,0x29B30u, + 0x2A0CEu,0x2A105u,0x2A20Eu,0x2A291u,0x2A392u,0x2A600u, }; static const uint64_t _hb_ucd_dm2_map[1025] = diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc index 134e043d8..4d35017a6 100644 --- a/src/hb-ucd.cc +++ b/src/hb-ucd.cc @@ -148,13 +148,19 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (likely (!i)) return false; i--; - if (i < ARRAY_LENGTH (_hb_ucd_dm1_map)) + if (i < ARRAY_LENGTH (_hb_ucd_dm1_u16_map) + ARRAY_LENGTH (_hb_ucd_dm1_u32_map)) { - *a = _hb_ucd_dm1_map[i]; + if (i < ARRAY_LENGTH (_hb_ucd_dm1_u16_map)) + *a = _hb_ucd_dm1_u16_map[i]; + else + { + i -= ARRAY_LENGTH (_hb_ucd_dm1_u16_map); + *a = _hb_ucd_dm1_u32_map[i]; + } *b = 0; return true; } - i -= ARRAY_LENGTH (_hb_ucd_dm1_map); + i -= ARRAY_LENGTH (_hb_ucd_dm1_u16_map) + ARRAY_LENGTH (_hb_ucd_dm1_u32_map); uint64_t v = _hb_ucd_dm2_map[i]; *a = HB_CODEPOINT_DECODE3_1 (v); From eff579f743a91c0b1c543f4b69ab33580cae6392 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 7 Jun 2019 12:58:09 +0430 Subject: [PATCH 459/617] Update and use internal qsort everywhere --- src/hb-algs.hh | 210 +++++++++++++++++++++++++++++----------- src/hb-array.hh | 6 +- src/hb-ot-post-table.hh | 2 +- 3 files changed, 158 insertions(+), 60 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 39bb2f1ac..07abffbcf 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -653,115 +653,213 @@ hb_bsearch (const void *key, const void *base, /* From https://github.com/noporpoise/sort_r - * With following modifications: - * - * 10 November 2018: - * https://github.com/noporpoise/sort_r/issues/7 - */ + Feb 5, 2019 (c8c65c1e) + Modified to support optional argument using templates */ /* Isaac Turner 29 April 2014 Public Domain */ /* - -hb_sort_r function to be exported. - +hb_qsort function to be exported. Parameters: base is the array to be sorted nel is the number of elements in the array width is the size in bytes of each element of the array compar is the comparison function - arg is a pointer to be passed to the comparison function + arg (optional) is a pointer to be passed to the comparison function -void hb_sort_r(void *base, size_t nel, size_t width, - int (*compar)(const void *_a, const void *_b, void *_arg), - void *arg); +void hb_sort(void *base, size_t nel, size_t width, + int (*compar)(const void *_a, const void *_b, [void *_arg]), + [void *arg]); */ +#define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp)) -/* swap a, b iff a>b */ -/* __restrict is same as restrict but better support on old machines */ -static int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w, - int (*compar)(const void *_a, const void *_b, - void *_arg), - void *arg) +/* swap a and b */ +/* a and b must not be equal! */ +static inline void sort_r_swap(char *__restrict a, char *__restrict b, + size_t w) { char tmp, *end = a+w; - if(compar(a, b, arg) > 0) { - for(; a < end; a++, b++) { tmp = *a; *a = *b; *b = tmp; } + for(; a < end; a++, b++) { SORT_R_SWAP(*a, *b, tmp); } +} + +/* swap a, b iff a>b */ +/* a and b must not be equal! */ +/* __restrict is same as restrict but better support on old machines */ +template +static inline int sort_r_cmpswap(char *__restrict a, + char *__restrict b, size_t w, + int (*compar)(const void *_a, + const void *_b, + Ts... _ds), + Ts... ds) +{ + if(compar(a, b, ds...) > 0) { + sort_r_swap(a, b, w); return 1; } return 0; } +/* +Swap consecutive blocks of bytes of size na and nb starting at memory addr ptr, +with the smallest swap so that the blocks are in the opposite order. Blocks may +be internally re-ordered e.g. + 12345ab -> ab34512 + 123abc -> abc123 + 12abcde -> deabc12 +*/ +static inline void sort_r_swap_blocks(char *ptr, size_t na, size_t nb) +{ + if(na > 0 && nb > 0) { + if(na > nb) { sort_r_swap(ptr, ptr+na, nb); } + else { sort_r_swap(ptr, ptr+nb, na); } + } +} + +/* Implement recursive quicksort ourselves */ /* Note: quicksort is not stable, equivalent values may be swapped */ +template static inline void sort_r_simple(void *base, size_t nel, size_t w, - int (*compar)(const void *_a, const void *_b, - void *_arg), - void *arg) + int (*compar)(const void *_a, + const void *_b, + Ts... _ds), + Ts... ds) { char *b = (char *)base, *end = b + nel*w; - if(nel < 7) { + + /* for(size_t i=0; i b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {} + for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,ds...); pj -= w) {} } } else { - /* nel > 6; Quicksort */ + /* nel > 9; Quicksort */ - /* Use median of first, middle and last items as pivot */ - char *x, *y, *xend, ch; - char *pl, *pm, *pr; + int cmp; + char *pl, *ple, *pr, *pre, *pivot; char *last = b+w*(nel-1), *tmp; + + /* + Use median of second, middle and second-last items as pivot. + First and last may have been swapped with pivot and therefore be extreme + */ char *l[3]; - l[0] = b; + l[0] = b + w; l[1] = b+w*(nel/2); - l[2] = last; + l[2] = last - w; - if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; } - if(compar(l[1],l[2],arg) > 0) { - tmp=l[1]; l[1]=l[2]; l[2]=tmp; /* swap(l[1],l[2]) */ - if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; } + /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */ + + if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } + if(compar(l[1],l[2],ds...) > 0) { + SORT_R_SWAP(l[1], l[2], tmp); + if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } } - /* swap l[id], l[2] to put pivot as last element */ - for(x = l[1], y = last, xend = x+w; x>1); - for(; pl < pm; pl += w) { - if(sort_r_cmpswap(pl, pr, w, compar, arg)) { - pr -= w; /* pivot now at pl */ - break; + /* Move left hand items which are equal to the pivot to the far left. + break when we find an item that is greater than the pivot */ + for(; pl < pr; pl += w) { + cmp = compar(pl, pivot, ds...); + if(cmp > 0) { break; } + else if(cmp == 0) { + if(ple < pl) { sort_r_swap(ple, pl, w); } + ple += w; } } - pm = pl+((pr-pl)>>1); - for(; pm < pr; pr -= w) { - if(sort_r_cmpswap(pl, pr, w, compar, arg)) { - pl += w; /* pivot now at pr */ + /* break if last batch of left hand items were equal to pivot */ + if(pl >= pr) { break; } + /* Move right hand items which are equal to the pivot to the far right. + break when we find an item that is less than the pivot */ + for(; pl < pr; ) { + pr -= w; /* Move right pointer onto an unprocessed item */ + cmp = compar(pr, pivot, ds...); + if(cmp == 0) { + pre -= w; + if(pr < pre) { sort_r_swap(pr, pre, w); } + } + else if(cmp < 0) { + if(pl < pr) { sort_r_swap(pl, pr, w); } + pl += w; break; } } } - sort_r_simple(b, (pl-b)/w, w, compar, arg); - sort_r_simple(pl+w, (end-(pl+w))/w, w, compar, arg); + pl = pr; /* pr may have gone below pl */ + + /* + Now we need to go from: EEELLLGGGGEEEE + to: LLLEEEEEEEGGGG + Pivot comparison key: + E = equal, L = less than, u = unknown, G = greater than, E = equal + */ + sort_r_swap_blocks(b, ple-b, pl-ple); + sort_r_swap_blocks(pr, pre-pr, end-pre); + + /*for(size_t i=0; i, Type&> hb_sorted_array_t qsort (int (*cmp_)(const void*, const void*)) { if (likely (length)) - ::qsort (arrayZ, length, this->item_size, cmp_); + hb_qsort (arrayZ, length, this->item_size, cmp_); return hb_sorted_array_t (*this); } hb_sorted_array_t qsort () { if (likely (length)) - ::qsort (arrayZ, length, this->item_size, Type::cmp); + hb_qsort (arrayZ, length, this->item_size, Type::cmp); return hb_sorted_array_t (*this); } void qsort (unsigned int start, unsigned int end) @@ -155,7 +155,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> end = hb_min (end, length); assert (start <= end); if (likely (start < end)) - ::qsort (arrayZ + start, end - start, this->item_size, Type::cmp); + hb_qsort (arrayZ + start, end - start, this->item_size, Type::cmp); } /* diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 9177a5393..720e03bac 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -157,7 +157,7 @@ struct post for (unsigned int i = 0; i < count; i++) gids[i] = i; - hb_sort_r (gids, count, sizeof (gids[0]), cmp_gids, (void *) this); + hb_qsort (gids, count, sizeof (gids[0]), cmp_gids, (void *) this); if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids))) { From 9b853f755dd05ccef3429d3d3d0d561a99cc4c2d Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 9 Jun 2019 11:49:25 +0430 Subject: [PATCH 460/617] [cff] Use switch on multi-format structs (#1762) --- src/hb-cff-interp-cs-common.hh | 4 +- src/hb-cff-interp-dict-common.hh | 12 +- src/hb-ot-cff-common.hh | 137 ++++++++++---------- src/hb-ot-cff1-table.hh | 215 +++++++++++++++++-------------- src/hb-ot-cff2-table.hh | 70 +++++----- src/hb-subset-cff1.cc | 2 +- src/hb-subset-cff2.cc | 2 +- 7 files changed, 235 insertions(+), 207 deletions(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 61bdba5f5..1cfbba603 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -76,8 +76,8 @@ struct biased_subrs_t void fini () {} - unsigned int get_count () const { return (subrs == nullptr)? 0: subrs->count; } - unsigned int get_bias () const { return bias; } + unsigned int get_count () const { return (subrs == nullptr) ? 0 : subrs->count; } + unsigned int get_bias () const { return bias; } byte_str_t operator [] (unsigned int index) const { diff --git a/src/hb-cff-interp-dict-common.hh b/src/hb-cff-interp-dict-common.hh index 2c54909a1..ea0db13f8 100644 --- a/src/hb-cff-interp-dict-common.hh +++ b/src/hb-cff-interp-dict-common.hh @@ -134,10 +134,10 @@ struct dict_opset_t : opset_t return value; case END: - value = (double)(neg? -int_part: int_part); + value = (double) (neg ? -int_part : int_part); if (frac_count > 0) { - double frac = (frac_part / pow (10.0, (double)frac_count)); + double frac = (frac_part / pow (10.0, (double) frac_count)); if (neg) frac = -frac; value += frac; } @@ -146,16 +146,16 @@ struct dict_opset_t : opset_t if (value == 0.0) return value; if (exp_neg) - return neg? -DBL_MIN: DBL_MIN; + return neg ? -DBL_MIN : DBL_MIN; else - return neg? -DBL_MAX: DBL_MAX; + return neg ? -DBL_MAX : DBL_MAX; } if (exp_part != 0) { if (exp_neg) - value /= pow (10.0, (double)exp_part); + value /= pow (10.0, (double) exp_part); else - value *= pow (10.0, (double)exp_part); + value *= pow (10.0, (double) exp_part); } return value; diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index 55ae10efe..919cb8150 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -82,22 +82,14 @@ struct str_buff_vec_t : hb_vector_t template struct CFFIndex { - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely ((count.sanitize (c) && count == 0) || /* empty INDEX */ - (c->check_struct (this) && offSize >= 1 && offSize <= 4 && - c->check_array (offsets, offSize, count + 1) && - c->check_array ((const HBUINT8*)data_base (), 1, max_offset () - 1)))); - } - static unsigned int calculate_offset_array_size (unsigned int offSize, unsigned int count) { return offSize * (count + 1); } unsigned int offset_array_size () const { return calculate_offset_array_size (offSize, count); } - static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count, unsigned int dataSize) + static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count, + unsigned int dataSize) { if (count == 0) return COUNT::static_size; @@ -199,11 +191,11 @@ struct CFFIndex unsigned int length_at (unsigned int index) const { - if (likely ((offset_at (index + 1) >= offset_at (index)) && - (offset_at (index + 1) <= offset_at (count)))) - return offset_at (index + 1) - offset_at (index); - else - return 0; + if (likely ((offset_at (index + 1) >= offset_at (index)) && + (offset_at (index + 1) <= offset_at (count)))) + return offset_at (index + 1) - offset_at (index); + else + return 0; } const unsigned char *data_base () const @@ -216,12 +208,12 @@ struct CFFIndex if (likely (index < count)) return byte_str_t (data_base () + offset_at (index) - 1, length_at (index)); else - return Null(byte_str_t); + return Null (byte_str_t); } unsigned int get_size () const { - if (this != &Null(CFFIndex)) + if (this != &Null (CFFIndex)) { if (count > 0) return min_size + offset_array_size () + (offset_at (count) - 1); @@ -232,6 +224,15 @@ struct CFFIndex return 0; } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely ((count.sanitize (c) && count == 0) || /* empty INDEX */ + (c->check_struct (this) && offSize >= 1 && offSize <= 4 && + c->check_array (offsets, offSize, count + 1) && + c->check_array ((const HBUINT8*) data_base (), 1, max_offset () - 1)))); + } + protected: unsigned int max_offset () const { @@ -245,10 +246,10 @@ struct CFFIndex } public: - COUNT count; /* Number of object data. Note there are (count+1) offsets */ - HBUINT8 offSize; /* The byte size of each offset in the offsets array. */ - HBUINT8 offsets[VAR]; /* The array of (count + 1) offsets into objects array (1-base). */ - /* HBUINT8 data[VAR]; Object data */ + COUNT count; /* Number of object data. Note there are (count+1) offsets */ + HBUINT8 offSize; /* The byte size of each offset in the offsets array. */ + HBUINT8 offsets[VAR]; /* The array of (count + 1) offsets into objects array (1-base). */ + /* HBUINT8 data[VAR]; Object data */ public: DEFINE_SIZE_ARRAY (COUNT::static_size + HBUINT8::static_size, offsets); }; @@ -293,7 +294,7 @@ struct CFFIndexOf : CFFIndex /* serialize data */ for (unsigned int i = 0; i < dataArrayLen; i++) { - TYPE *dest = c->start_embed (); + TYPE *dest = c->start_embed (); if (unlikely (dest == nullptr || !dest->serialize (c, dataArray[i], param1, param2))) return_trace (false); @@ -310,7 +311,7 @@ struct CFFIndexOf : CFFIndex const PARAM ¶m) { /* determine offset size */ - unsigned int totalDataSize = 0; + unsigned int totalDataSize = 0; for (unsigned int i = 0; i < dataArrayLen; i++) { unsigned int dataSize = TYPE::calculate_serialized_size (dataArray[i], param); @@ -334,10 +335,9 @@ struct Dict : UnsizedByteStr { TRACE_SERIALIZE (this); for (unsigned int i = 0; i < dictval.get_count (); i++) - { if (unlikely (!opszr.serialize (c, dictval[i], param))) return_trace (false); - } + return_trace (true); } @@ -391,14 +391,10 @@ struct Dict : UnsizedByteStr { return serialize_int_op (c, op, value, OpCode_shortint); } static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value) - { - return serialize_uint4_op (c, op, value); - } + { return serialize_uint4_op (c, op, value); } static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value) - { - return serialize_uint2_op (c, op, value); - } + { return serialize_uint2_op (c, op, value); } }; struct TopDict : Dict {}; @@ -483,7 +479,7 @@ struct FDArray : CFFIndexOf return_trace (false); /* serialize font dict offsets */ - unsigned int offset = 1; + unsigned int offset = 1; unsigned int fid = 0; for (; fid < fontDicts.length; fid++) { @@ -575,9 +571,7 @@ struct FDSelect0 { } hb_codepoint_t get_fd (hb_codepoint_t glyph) const - { - return (hb_codepoint_t)fds[glyph]; - } + { return (hb_codepoint_t) fds[glyph]; } unsigned int get_size (unsigned int num_glyphs) const { return HBUINT8::static_size * num_glyphs; } @@ -588,7 +582,8 @@ struct FDSelect0 { }; template -struct FDSelect3_4_Range { +struct FDSelect3_4_Range +{ bool sanitize (hb_sanitize_context_t *c, const void * /*nullptr*/, unsigned int fdcount) const { TRACE_SANITIZE (this); @@ -597,12 +592,13 @@ struct FDSelect3_4_Range { GID_TYPE first; FD_TYPE fd; - + public: DEFINE_SIZE_STATIC (GID_TYPE::static_size + FD_TYPE::static_size); }; template -struct FDSelect3_4 { +struct FDSelect3_4 +{ unsigned int get_size () const { return GID_TYPE::static_size * 2 + ranges.get_size (); } @@ -614,10 +610,8 @@ struct FDSelect3_4 { return_trace (false); for (unsigned int i = 1; i < nRanges (); i++) - { if (unlikely (ranges[i - 1].first >= ranges[i].first)) - return_trace (false); - } + return_trace (false); if (unlikely (!sentinel().sanitize (c) || (sentinel() != c->get_num_glyphs ()))) return_trace (false); @@ -649,17 +643,8 @@ struct FDSelect3_4 { typedef FDSelect3_4 FDSelect3; typedef FDSelect3_4_Range FDSelect3_Range; -struct FDSelect { - bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const - { - TRACE_SANITIZE (this); - - return_trace (likely (c->check_struct (this) && (format == 0 || format == 3) && - ((format == 0)? - u.format0.sanitize (c, fdcount): - u.format3.sanitize (c, fdcount)))); - } - +struct FDSelect +{ bool serialize (hb_serialize_context_t *c, const FDSelect &src, unsigned int num_glyphs) { TRACE_SERIALIZE (this); @@ -675,30 +660,46 @@ struct FDSelect { unsigned int get_size (unsigned int num_glyphs) const { - unsigned int size = format.static_size; - if (format == 0) - size += u.format0.get_size (num_glyphs); - else - size += u.format3.get_size (); - return size; + switch (format) + { + case 0: return format.static_size + u.format0.get_size (num_glyphs); + case 3: return format.static_size + u.format3.get_size (); + default:return 0; + } } hb_codepoint_t get_fd (hb_codepoint_t glyph) const { - if (this == &Null(FDSelect)) + if (this == &Null (FDSelect)) return 0; - if (format == 0) - return u.format0.get_fd (glyph); - else - return u.format3.get_fd (glyph); + switch (format) + { + case 0: return u.format0.get_fd (glyph); + case 3: return u.format3.get_fd (glyph); + default:return 0; + } } - HBUINT8 format; - union { - FDSelect0 format0; - FDSelect3 format3; - } u; + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + switch (format) + { + case 0: return_trace (u.format0.sanitize (c, fdcount)); + case 3: return_trace (u.format3.sanitize (c, fdcount)); + default:return_trace (false); + } + } + + HBUINT8 format; + union { + FDSelect0 format0; + FDSelect3 format3; + } u; + public: DEFINE_SIZE_MIN (1); }; diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh index 3a887d3d0..31d9d879d 100644 --- a/src/hb-ot-cff1-table.hh +++ b/src/hb-ot-cff1-table.hh @@ -161,21 +161,8 @@ struct CFF1SuppEncData { DEFINE_SIZE_ARRAY_SIZED (1, supps); }; -struct Encoding { - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - - if (unlikely (!c->check_struct (this))) - return_trace (false); - unsigned int fmt = format & 0x7F; - if (unlikely (fmt > 1)) - return_trace (false); - if (unlikely (!((fmt == 0)? u.format0.sanitize (c): u.format1.sanitize (c)))) - return_trace (false); - return_trace (((format & 0x80) == 0) || suppEncData ().sanitize (c)); - } - +struct Encoding +{ /* serialize a fullset Encoding */ bool serialize (hb_serialize_context_t *c, const Encoding &src) { @@ -197,11 +184,12 @@ struct Encoding { TRACE_SERIALIZE (this); Encoding *dest = c->extend_min (*this); if (unlikely (dest == nullptr)) return_trace (false); - dest->format = format | ((supp_codes.length > 0)? 0x80: 0); - if (format == 0) + dest->format = format | ((supp_codes.length > 0) ? 0x80 : 0); + switch (format) { + case 0: { Encoding0 *fmt0 = c->allocate_size (Encoding0::min_size + HBUINT8::static_size * enc_count); - if (unlikely (fmt0 == nullptr)) return_trace (false); + if (unlikely (fmt0 == nullptr)) return_trace (false); fmt0->nCodes () = enc_count; unsigned int glyph = 0; for (unsigned int i = 0; i < code_ranges.length; i++) @@ -213,7 +201,9 @@ struct Encoding { return_trace (false); } } - else + break; + + case 1: { Encoding1 *fmt1 = c->allocate_size (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length); if (unlikely (fmt1 == nullptr)) return_trace (false); @@ -226,7 +216,11 @@ struct Encoding { fmt1->ranges[i].nLeft = code_ranges[i].glyph; } } - if (supp_codes.length > 0) + break; + + } + + if (supp_codes.length) { CFF1SuppEncData *suppData = c->allocate_size (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length); if (unlikely (suppData == nullptr)) return_trace (false); @@ -237,6 +231,7 @@ struct Encoding { suppData->supps[i].glyph = supp_codes[i].glyph; /* actually SID */ } } + return_trace (true); } @@ -245,11 +240,13 @@ struct Encoding { unsigned int enc_count, unsigned int supp_count) { - unsigned int size = min_size; - if (format == 0) - size += Encoding0::min_size + HBUINT8::static_size * enc_count; - else - size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; + unsigned int size = min_size; + switch (format) + { + case 0: size += Encoding0::min_size + HBUINT8::static_size * enc_count; break; + case 1: size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; break; + default:return 0; + } if (supp_count > 0) size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count; return size; @@ -258,10 +255,11 @@ struct Encoding { unsigned int get_size () const { unsigned int size = min_size; - if (table_format () == 0) - size += u.format0.get_size (); - else - size += u.format1.get_size (); + switch (table_format ()) + { + case 0: size += u.format0.get_size (); break; + case 1: size += u.format1.get_size (); break; + } if (has_supplement ()) size += suppEncData ().get_size (); return size; @@ -269,14 +267,16 @@ struct Encoding { hb_codepoint_t get_code (hb_codepoint_t glyph) const { - if (table_format () == 0) - return u.format0.get_code (glyph); - else - return u.format1.get_code (glyph); + switch (table_format ()) + { + case 0: return u.format0.get_code (glyph); + case 1: return u.format1.get_code (glyph); + default:return 0; + } } - uint8_t table_format () const { return (format & 0x7F); } - bool has_supplement () const { return (format & 0x80) != 0; } + uint8_t table_format () const { return format & 0x7F; } + bool has_supplement () const { return format & 0x80; } void get_supplement_codes (hb_codepoint_t sid, hb_vector_t &codes) const { @@ -285,21 +285,37 @@ struct Encoding { suppEncData().get_codes (sid, codes); } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + + switch (table_format ()) + { + case 0: if (unlikely (!u.format0.sanitize (c))) { return_trace (false); } break; + case 1: if (unlikely (!u.format1.sanitize (c))) { return_trace (false); } break; + default:return_trace (false); + } + return_trace (likely (!has_supplement () || suppEncData ().sanitize (c))); + } + protected: const CFF1SuppEncData &suppEncData () const { - if ((format & 0x7F) == 0) - return StructAfter (u.format0.codes[u.format0.nCodes ()-1]); - else - return StructAfter (u.format1.ranges[u.format1.nRanges ()-1]); + switch (table_format ()) + { + case 0: return StructAfter (u.format0.codes[u.format0.nCodes ()-1]); + case 1: return StructAfter (u.format1.ranges[u.format1.nRanges ()-1]); + default:return Null (CFF1SuppEncData); + } } public: - HBUINT8 format; - + HBUINT8 format; union { - Encoding0 format0; - Encoding1 format1; + Encoding0 format0; + Encoding1 format1; } u; /* CFF1SuppEncData suppEncData; */ @@ -433,23 +449,8 @@ typedef Charset1_2 Charset2; typedef Charset_Range Charset1_Range; typedef Charset_Range Charset2_Range; -struct Charset { - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - - if (unlikely (!c->check_struct (this))) - return_trace (false); - if (format == 0) - return_trace (u.format0.sanitize (c, c->get_num_glyphs ())); - else if (format == 1) - return_trace (u.format1.sanitize (c, c->get_num_glyphs ())); - else if (likely (format == 2)) - return_trace (u.format2.sanitize (c, c->get_num_glyphs ())); - else - return_trace (false); - } - +struct Charset +{ /* serialize a fullset Charset */ bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs) { @@ -471,10 +472,12 @@ struct Charset { Charset *dest = c->extend_min (*this); if (unlikely (dest == nullptr)) return_trace (false); dest->format = format; - if (format == 0) + switch (format) + { + case 0: { Charset0 *fmt0 = c->allocate_size (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1)); - if (unlikely (fmt0 == nullptr)) return_trace (false); + if (unlikely (fmt0 == nullptr)) return_trace (false); unsigned int glyph = 0; for (unsigned int i = 0; i < sid_ranges.length; i++) { @@ -483,7 +486,9 @@ struct Charset { fmt0->sids[glyph++] = sid++; } } - else if (format == 1) + break; + + case 1: { Charset1 *fmt1 = c->allocate_size (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length); if (unlikely (fmt1 == nullptr)) return_trace (false); @@ -495,7 +500,9 @@ struct Charset { fmt1->ranges[i].nLeft = sid_ranges[i].glyph; } } - else /* format 2 */ + break; + + case 2: { Charset2 *fmt2 = c->allocate_size (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length); if (unlikely (fmt2 == nullptr)) return_trace (false); @@ -506,56 +513,72 @@ struct Charset { fmt2->ranges[i].first = sid_ranges[i].code; fmt2->ranges[i].nLeft = sid_ranges[i].glyph; } + } + break; + } return_trace (true); } /* parallel to above: calculate the size of a subset Charset */ - static unsigned int calculate_serialized_size ( - uint8_t format, - unsigned int count) + static unsigned int calculate_serialized_size (uint8_t format, + unsigned int count) { - unsigned int size = min_size; - if (format == 0) - size += Charset0::min_size + HBUINT16::static_size * (count - 1); - else if (format == 1) - size += Charset1::min_size + Charset1_Range::static_size * count; - else - size += Charset2::min_size + Charset2_Range::static_size * count; - - return size; + switch (format) + { + case 0: return min_size + Charset0::min_size + HBUINT16::static_size * (count - 1); + case 1: return min_size + Charset1::min_size + Charset1_Range::static_size * count; + case 2: return min_size + Charset2::min_size + Charset2_Range::static_size * count; + default:return 0; + } } unsigned int get_size (unsigned int num_glyphs) const { - unsigned int size = min_size; - if (format == 0) - size += u.format0.get_size (num_glyphs); - else if (format == 1) - size += u.format1.get_size (num_glyphs); - else - size += u.format2.get_size (num_glyphs); - return size; + switch (format) + { + case 0: return min_size + u.format0.get_size (num_glyphs); + case 1: return min_size + u.format1.get_size (num_glyphs); + case 2: return min_size + u.format2.get_size (num_glyphs); + default:return 0; + } } hb_codepoint_t get_sid (hb_codepoint_t glyph) const { - if (format == 0) - return u.format0.get_sid (glyph); - else if (format == 1) - return u.format1.get_sid (glyph); - else - return u.format2.get_sid (glyph); + switch (format) + { + case 0: return u.format0.get_sid (glyph); + case 1: return u.format1.get_sid (glyph); + case 2: return u.format2.get_sid (glyph); + default:return 0; + } } hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const { - if (format == 0) - return u.format0.get_glyph (sid, num_glyphs); - else if (format == 1) - return u.format1.get_glyph (sid, num_glyphs); - else - return u.format2.get_glyph (sid, num_glyphs); + switch (format) + { + case 0: return u.format0.get_glyph (sid, num_glyphs); + case 1: return u.format1.get_glyph (sid, num_glyphs); + case 2: return u.format2.get_glyph (sid, num_glyphs); + default:return 0; + } + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + + switch (format) + { + case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs ())); + case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs ())); + case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs ())); + default:return_trace (false); + } } HBUINT8 format; diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh index 74acc771a..8646cde58 100644 --- a/src/hb-ot-cff2-table.hh +++ b/src/hb-ot-cff2-table.hh @@ -51,18 +51,6 @@ typedef FDSelect3_4_Range FDSelect4_Range; struct CFF2FDSelect { - bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const - { - TRACE_SANITIZE (this); - - return_trace (likely (c->check_struct (this) && (format == 0 || format == 3 || format == 4) && - ((format == 0)? - u.format0.sanitize (c, fdcount): - ((format == 3)? - u.format3.sanitize (c, fdcount): - u.format4.sanitize (c, fdcount))))); - } - bool serialize (hb_serialize_context_t *c, const CFF2FDSelect &src, unsigned int num_glyphs) { TRACE_SERIALIZE (this); @@ -78,35 +66,51 @@ struct CFF2FDSelect unsigned int get_size (unsigned int num_glyphs) const { - unsigned int size = format.static_size; - if (format == 0) - size += u.format0.get_size (num_glyphs); - else if (format == 3) - size += u.format3.get_size (); - else - size += u.format4.get_size (); - return size; + switch (format) + { + case 0: return format.static_size + u.format0.get_size (num_glyphs); + case 3: return format.static_size + u.format3.get_size (); + case 4: return format.static_size + u.format4.get_size (); + default:return 0; + } } hb_codepoint_t get_fd (hb_codepoint_t glyph) const { - if (this == &Null(CFF2FDSelect)) + if (this == &Null (CFF2FDSelect)) return 0; - if (format == 0) - return u.format0.get_fd (glyph); - else if (format == 3) - return u.format3.get_fd (glyph); - else - return u.format4.get_fd (glyph); + + switch (format) + { + case 0: return u.format0.get_fd (glyph); + case 3: return u.format3.get_fd (glyph); + case 4: return u.format4.get_fd (glyph); + default:return 0; + } } - HBUINT8 format; - union { - FDSelect0 format0; - FDSelect3 format3; - FDSelect4 format4; - } u; + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + switch (format) + { + case 0: return_trace (u.format0.sanitize (c, fdcount)); + case 3: return_trace (u.format3.sanitize (c, fdcount)); + case 4: return_trace (u.format4.sanitize (c, fdcount)); + default:return_trace (false); + } + } + + HBUINT8 format; + union { + FDSelect0 format0; + FDSelect3 format3; + FDSelect4 format4; + } u; + public: DEFINE_SIZE_MIN (2); }; diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index cfecab6ba..688f3f377 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -1040,7 +1040,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ - unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0)? priv_size: 0; + unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0; result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset); if (unlikely (!result)) { diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 5977b5669..78b8c05d4 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -547,7 +547,7 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ - unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0)? priv_size: 0; + unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0; result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset); if (unlikely (!result)) { From c4669fda7890bc741ef934ebc360e366eba94866 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 9 Jun 2019 11:50:36 +0430 Subject: [PATCH 461/617] [algs] minor --- src/hb-algs.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 07abffbcf..9a9d3f430 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -667,9 +667,9 @@ Parameters: compar is the comparison function arg (optional) is a pointer to be passed to the comparison function -void hb_sort(void *base, size_t nel, size_t width, - int (*compar)(const void *_a, const void *_b, [void *_arg]), - [void *arg]); +void hb_qsort(void *base, size_t nel, size_t width, + int (*compar)(const void *_a, const void *_b, [void *_arg]), + [void *arg]); */ #define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp)) From 2646c7149ce49d3b6cf90e354658df35254bcce0 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 9 Jun 2019 11:51:58 +0430 Subject: [PATCH 462/617] [stat] minor --- src/hb-ot-stat-table.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 03604a0ad..e9592631d 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -191,10 +191,10 @@ struct AxisValue switch (u.format) { - case 1: return_trace (likely (u.format1.sanitize (c))); - case 2: return_trace (likely (u.format2.sanitize (c))); - case 3: return_trace (likely (u.format3.sanitize (c))); - case 4: return_trace (likely (u.format4.sanitize (c))); + case 1: return_trace (u.format1.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); + case 3: return_trace (u.format3.sanitize (c)); + case 4: return_trace (u.format4.sanitize (c)); default: return_trace (true); } } From 7dcfc5357df879491f847bd7d2941645e58f268c Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sun, 9 Jun 2019 11:58:08 +0430 Subject: [PATCH 463/617] [stat] minor format --- src/hb-ot-stat-table.hh | 74 ++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index e9592631d..98bdfa324 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -59,14 +59,14 @@ enum struct AxisValueFormat1 { + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - hb_ot_name_id_t get_value_name_id () const { return valueNameID; } - protected: HBUINT16 format; /* Format identifier — set to 1. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -84,14 +84,14 @@ struct AxisValueFormat1 struct AxisValueFormat2 { + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - hb_ot_name_id_t get_value_name_id () const { return valueNameID; } - protected: HBUINT16 format; /* Format identifier — set to 2. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -113,14 +113,14 @@ struct AxisValueFormat2 struct AxisValueFormat3 { + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - hb_ot_name_id_t get_value_name_id () const { return valueNameID; } - protected: HBUINT16 format; /* Format identifier — set to 3. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -157,14 +157,14 @@ struct AxisValueRecord struct AxisValueFormat4 { + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - hb_ot_name_id_t get_value_name_id () const { return valueNameID; } - protected: HBUINT16 format; /* Format identifier — set to 4. */ HBUINT16 axisCount; /* The total number of axes contributing to @@ -183,6 +183,18 @@ struct AxisValueFormat4 struct AxisValue { + hb_ot_name_id_t get_value_name_id () const + { + switch (u.format) + { + case 1: return u.format1.get_value_name_id (); + case 2: return u.format2.get_value_name_id (); + case 3: return u.format3.get_value_name_id (); + case 4: return u.format4.get_value_name_id (); + default:return HB_OT_NAME_ID_INVALID; + } + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -191,23 +203,11 @@ struct AxisValue switch (u.format) { - case 1: return_trace (u.format1.sanitize (c)); - case 2: return_trace (u.format2.sanitize (c)); - case 3: return_trace (u.format3.sanitize (c)); - case 4: return_trace (u.format4.sanitize (c)); - default: return_trace (true); - } - } - - hb_ot_name_id_t get_value_name_id () const - { - switch (u.format) - { - case 1: return u.format1.get_value_name_id (); - case 2: return u.format2.get_value_name_id (); - case 3: return u.format3.get_value_name_id (); - case 4: return u.format4.get_value_name_id (); - default: return HB_OT_NAME_ID_INVALID; + case 1: return_trace (u.format1.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); + case 3: return_trace (u.format3.sanitize (c)); + case 4: return_trace (u.format4.sanitize (c)); + default:return_trace (true); } } @@ -226,14 +226,14 @@ struct AxisValue struct StatAxisRecord { + hb_ot_name_id_t get_name_id () const { return nameID; } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - hb_ot_name_id_t get_name_id () const { return nameID; } - protected: Tag tag; /* A tag identifying the axis of design variation. */ NameID nameID; /* The name ID for entries in the 'name' table that @@ -249,16 +249,6 @@ struct STAT { static constexpr hb_tag_t tableTag = HB_OT_TAG_STAT; - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - version.major == 1 && - version.minor > 0 && - designAxesOffset.sanitize (c, this, designAxisCount) && - offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); - } - bool has_data () const { return version.to_int (); } unsigned get_design_axis_count () const { return designAxisCount; } @@ -295,6 +285,16 @@ struct STAT ; } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + version.major == 1 && + version.minor > 0 && + designAxesOffset.sanitize (c, this, designAxisCount) && + offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); + } + protected: hb_array_t const get_design_axes () const { return (this+designAxesOffset).as_array (designAxisCount); } From 801d93fc58aa13082dea86fb2c3821bc6362f593 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 14:53:14 +0430 Subject: [PATCH 464/617] [ci] remove wine from fedora bot We are not testing Windows exes in fedora mingw bot, we don't have to as probably won't go that smoothly and we have real Windows bots anyway and as wine installation itself is time taking let's remove it --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e81f187f7..9e104dcbe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -197,7 +197,7 @@ jobs: - image: fedora steps: - checkout - - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python wine mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true + - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config python mingw32-gcc-c++ mingw64-gcc-c++ mingw32-glib2 mingw32-cairo mingw32-freetype mingw64-glib2 mingw64-cairo mingw64-freetype glibc-devel.i686 || true - run: CFLAGS="-O0" CXXFLAGS="-O0" CPPFLAGS="-DHB_DEBUG" NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 - run: mkdir build && cd build && ../configure && make -j32 && (make check || ../.ci/fail.sh) - run: pip install pefile From 9407ef8d4bb96346b1f8b07757d79d3f8cc61cf7 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 15:17:43 +0430 Subject: [PATCH 465/617] minor, add HB_USE_INTERNAL_QSORT The only thing I need for a working wasm in a minimum libc, otherwise I have to provide the very same qsort inside that libc --- src/hb-algs.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 9a9d3f430..7b727f299 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -1,6 +1,6 @@ /* * Copyright © 2017 Google, Inc. - * Copyright © 2019 Google, Inc. + * Copyright © 2019 Facebook, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -843,7 +843,7 @@ static inline void hb_qsort (void *base, size_t nel, size_t width, int (*compar)(const void *_a, const void *_b)) { -#ifdef __OPTIMIZE_SIZE__ +#if defined(__OPTIMIZE_SIZE__) && !defined(HB_USE_INTERNAL_QSORT) qsort (base, nel, width, compar); #else sort_r_simple (base, nel, width, compar); From a228bb5f1d471a334bc9727f5d4f5b59dbe829ff Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 15:56:36 +0430 Subject: [PATCH 466/617] [ci] Test -Os and optimize size in Alpine bot __OPTIMIZE_SIZE__ should be defined whenever -Os but some Internet thread indicate may not so lets do that ourselves as that is the main intention --- .circleci/config.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9e104dcbe..5a8b8d73a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ jobs: - run: rm -rf harfbuzz-* - run: make distdir && cd harfbuzz-* && cmake -DHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test && ninja -Cbuild install - alpine-O3-NOMMAP: + alpine-O3-Os-NOMMAP: docker: - image: alpine steps: @@ -55,6 +55,10 @@ jobs: - run: CFLAGS="-O3" CXXFLAGS="-O3 -DHB_NO_MMAP" ./autogen.sh - run: make -j32 - run: make check || .ci/fail.sh + - run: make clean + - run: CFLAGS="-Os -D__OPTIMIZE_SIZE__" CXXFLAGS="-Os -DHB_NO_MMAP -D__OPTIMIZE_SIZE__" ./autogen.sh + - run: make -j32 + - run: make check || .ci/fail.sh archlinux-py3-all: docker: @@ -307,7 +311,7 @@ workflows: - distcheck # autotools based builds - - alpine-O3-NOMMAP + - alpine-O3-Os-NOMMAP - archlinux-py3-all #- void-notest - gcc-valgrind From 4a2b58555f173b692b767c933d280a51142926dd Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 08:16:51 -0700 Subject: [PATCH 467/617] [ci] Use HB_OPTIMIZE_SIZE instead of __OPTIMIZE_SIZE__ --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5a8b8d73a..c1741a804 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,7 +56,7 @@ jobs: - run: make -j32 - run: make check || .ci/fail.sh - run: make clean - - run: CFLAGS="-Os -D__OPTIMIZE_SIZE__" CXXFLAGS="-Os -DHB_NO_MMAP -D__OPTIMIZE_SIZE__" ./autogen.sh + - run: CFLAGS="-Os -DHB_OPTIMIZE_SIZE" CXXFLAGS="-Os -DHB_NO_MMAP -DHB_OPTIMIZE_SIZE" ./autogen.sh - run: make -j32 - run: make check || .ci/fail.sh From a0c4900799c26e4ff34180842a5ff21048fe31a0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 10 Jun 2019 12:33:23 -0700 Subject: [PATCH 468/617] Test new solution for HB_PARTIALIZE Just testing bots. Will finish based on results. --- src/hb-algs.hh | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 7b727f299..401668a36 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -186,27 +186,11 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN * that "this+0" is illegal in the trailing decltype position since at * that point this points to incomplete type! But seems to do the trick. */ -#ifdef _MSC_VER -/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ -#define HB_PARTIALIZE(Pos) \ - template \ - decltype(auto) operator () (_T&& _v) const \ - { return hb_partial (this, hb_forward<_T> (_v)); } \ - static_assert (true, "") -#elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) -/* https://github.com/harfbuzz/harfbuzz/issues/1724 */ #define HB_PARTIALIZE(Pos) \ template \ auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial (this+0, hb_forward<_T> (_v))) \ + (hb_partial (+this, hb_forward<_T> (_v))) \ static_assert (true, "") -#else -#define HB_PARTIALIZE(Pos) \ - template \ - auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial (this, hb_forward<_T> (_v))) \ - static_assert (true, "") -#endif struct From 451edbd4d063a4b43c1ca3d2b60c7392602ae7b7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 10 Jun 2019 12:46:54 -0700 Subject: [PATCH 469/617] Revert "Test new solution for HB_PARTIALIZE" This reverts commit a0c4900799c26e4ff34180842a5ff21048fe31a0. --- src/hb-algs.hh | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 401668a36..7b727f299 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -186,11 +186,27 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN * that "this+0" is illegal in the trailing decltype position since at * that point this points to incomplete type! But seems to do the trick. */ +#ifdef _MSC_VER +/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ +#define HB_PARTIALIZE(Pos) \ + template \ + decltype(auto) operator () (_T&& _v) const \ + { return hb_partial (this, hb_forward<_T> (_v)); } \ + static_assert (true, "") +#elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) +/* https://github.com/harfbuzz/harfbuzz/issues/1724 */ #define HB_PARTIALIZE(Pos) \ template \ auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial (+this, hb_forward<_T> (_v))) \ + (hb_partial (this+0, hb_forward<_T> (_v))) \ static_assert (true, "") +#else +#define HB_PARTIALIZE(Pos) \ + template \ + auto operator () (_T&& _v) const HB_AUTO_RETURN \ + (hb_partial (this, hb_forward<_T> (_v))) \ + static_assert (true, "") +#endif struct From ff9b9b1c89d5529fafc74ce84c0acb71b5d6031b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 10 Jun 2019 12:48:25 -0700 Subject: [PATCH 470/617] Simplify HB_PARTIALIZE impl +this works on gcc 4.8 as well as default code path. --- src/hb-algs.hh | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 7b727f299..59eead4eb 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -181,10 +181,9 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN * * In the case of MSVC, we get around this by using C++14 "decltype(auto)" * which deduces the type from the actual return statement. For gcc 4.8 - * we use "this+0" instead of "this" which produces an rvalue that seems - * to do be deduces as the same type with this particular compiler. Note - * that "this+0" is illegal in the trailing decltype position since at - * that point this points to incomplete type! But seems to do the trick. + * we use "+this" instead of "this" which produces an rvalue that seems + * to be deduced as the same type with this particular compiler, and seem + * to be fine as default code path as well. */ #ifdef _MSC_VER /* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \ @@ -193,18 +192,12 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN decltype(auto) operator () (_T&& _v) const \ { return hb_partial (this, hb_forward<_T> (_v)); } \ static_assert (true, "") -#elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ <= 8) +#else /* https://github.com/harfbuzz/harfbuzz/issues/1724 */ #define HB_PARTIALIZE(Pos) \ template \ auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial (this+0, hb_forward<_T> (_v))) \ - static_assert (true, "") -#else -#define HB_PARTIALIZE(Pos) \ - template \ - auto operator () (_T&& _v) const HB_AUTO_RETURN \ - (hb_partial (this, hb_forward<_T> (_v))) \ + (hb_partial (+this, hb_forward<_T> (_v))) \ static_assert (true, "") #endif From c4cae81a26a816979f3206418c47856b5ed2d8bb Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 15:32:54 +0430 Subject: [PATCH 471/617] Remove round polyfill Added in 01dff1e and 19256bef, this was targeted at older msvc versions that don't support C99 but now as we require C++11 we don't target places those envs thus removing this. --- CMakeLists.txt | 2 +- configure.ac | 6 ------ src/hb.hh | 14 -------------- 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ffabad10..cbff81e95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ endmacro () if (UNIX) list(APPEND CMAKE_REQUIRED_LIBRARIES m) endif () -check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l round) +check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l) check_include_file(unistd.h HAVE_UNISTD_H) if (${HAVE_UNISTD_H}) add_definitions(-DHAVE_UNISTD_H) diff --git a/configure.ac b/configure.ac index 6a68df79e..d48823d25 100644 --- a/configure.ac +++ b/configure.ac @@ -78,12 +78,6 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl]) # Functions and headers AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign) - -save_libs="$LIBS" -LIBS="$LIBS -lm" -AC_CHECK_FUNCS([round], ,[AC_CHECK_DECLS([round], , ,[#include ])]) -LIBS="$save_libs" - AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h stdbool.h) # Compiler flags diff --git a/src/hb.hh b/src/hb.hh index 33ad32311..0ee8ff57d 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -515,20 +515,6 @@ typedef uint64_t hb_vector_size_impl_t; #define VAR 1 -/* fallback for round() */ -static inline double -_hb_round (double x) -{ - if (x >= 0) - return floor (x + 0.5); - else - return ceil (x - 0.5); -} -#if !defined (HAVE_ROUND) && !defined (HAVE_DECL_ROUND) -#define round(x) _hb_round(x) -#endif - - /* fallback for posix_memalign() */ static inline int _hb_memalign(void **memptr, size_t alignment, size_t size) From a36ff941710b5a5f7e464e6d72aff36cf5549a91 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 10 Jun 2019 15:48:28 +0430 Subject: [PATCH 472/617] Add HB_NO_SETLOCALE --- src/hb-config.hh | 1 + src/hb.hh | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 8bdce3598..bcce15941 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -61,6 +61,7 @@ #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH #define HB_NO_NAME +#define HB_NO_SETLOCALE #define HB_NO_SUBSET_LAYOUT #endif diff --git a/src/hb.hh b/src/hb.hh index 0ee8ff57d..bf547708f 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -359,7 +359,7 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); # define HB_NO_GETENV # endif # if _WIN32_WCE < 0x800 -# define setlocale(Category, Locale) "C" +# define HB_NO_SETLOCALE static int errno = 0; /* Use something better? */ # endif # elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) @@ -372,6 +372,10 @@ static int errno = 0; /* Use something better? */ # endif #endif +#ifdef HB_NO_SETLOCALE +#define setlocale(Category, Locale) "C" +#endif + #ifdef HB_NO_GETENV #define getenv(Name) nullptr #endif From b4a5a69ad8625e3b90eb907a1b70e3ed24d4ff97 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 11 Jun 2019 01:33:09 +0430 Subject: [PATCH 473/617] Add HB_NO_OEPN (#1767) --- src/hb-blob.cc | 3 +++ src/hb-config.hh | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 5783fb294..0c562b770 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -543,6 +543,9 @@ _hb_mapped_file_destroy (void *file_) hb_blob_t * hb_blob_create_from_file (const char *file_name) { +#ifdef HB_NO_OEPN + return hb_blob_get_empty (); +#endif /* Adopted from glib's gmappedfile.c with Matthias Clasen and Allison Lortie permission but changed a lot to suit our need. */ #if defined(HAVE_MMAP) && !defined(HB_NO_MMAP) diff --git a/src/hb-config.hh b/src/hb-config.hh index bcce15941..19ceed863 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -60,7 +60,9 @@ #define HB_NO_GETENV #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH +#define HB_NO_MMAP #define HB_NO_NAME +#define HB_NO_OEPN #define HB_NO_SETLOCALE #define HB_NO_SUBSET_LAYOUT #endif From 19b8eb08e5457cd643aee5f9b9ad1c80b2243895 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 11 Jun 2019 01:33:30 +0430 Subject: [PATCH 474/617] Move HB_NO_SETLOCALE to closer place to its to unbreak HB_TINY build (#1768) --- src/hb-common.cc | 3 +++ src/hb.hh | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index 71791dba1..fb6377e39 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -35,6 +35,9 @@ #include #endif +#ifdef HB_NO_SETLOCALE +#define setlocale(Category, Locale) "C" +#endif /** * SECTION:hb-common diff --git a/src/hb.hh b/src/hb.hh index bf547708f..a2baa31d2 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -372,10 +372,6 @@ static int errno = 0; /* Use something better? */ # endif #endif -#ifdef HB_NO_SETLOCALE -#define setlocale(Category, Locale) "C" -#endif - #ifdef HB_NO_GETENV #define getenv(Name) nullptr #endif From 0c5da57d1aab91d7677a5c6517a3da254d53267f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 10 Jun 2019 14:06:25 -0700 Subject: [PATCH 475/617] Fix typo :) --- src/hb-blob.cc | 3 ++- src/hb-config.hh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 0c562b770..497df65fd 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -543,9 +543,10 @@ _hb_mapped_file_destroy (void *file_) hb_blob_t * hb_blob_create_from_file (const char *file_name) { -#ifdef HB_NO_OEPN +#ifdef HB_NO_OPEN return hb_blob_get_empty (); #endif + /* Adopted from glib's gmappedfile.c with Matthias Clasen and Allison Lortie permission but changed a lot to suit our need. */ #if defined(HAVE_MMAP) && !defined(HB_NO_MMAP) diff --git a/src/hb-config.hh b/src/hb-config.hh index 19ceed863..56c85a042 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -62,7 +62,7 @@ #define HB_NO_MATH #define HB_NO_MMAP #define HB_NO_NAME -#define HB_NO_OEPN +#define HB_NO_OPEN #define HB_NO_SETLOCALE #define HB_NO_SUBSET_LAYOUT #endif From 90872a29ee5d0bef6df1c2900f7001c11106c4da Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Tue, 11 Jun 2019 12:28:30 -0700 Subject: [PATCH 476/617] change assert(false) to failure --- src/hb-subset-cff-common.cc | 2 +- ...se-minimized-hb-subset-fuzzer-5680398559870976 | Bin 0 -> 145 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5680398559870976 diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc index aa5d27b36..223c6a821 100644 --- a/src/hb-subset-cff-common.cc +++ b/src/hb-subset-cff-common.cc @@ -226,7 +226,7 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c, fdselect_ranges); default: - assert(false); + return_trace (false); } return_trace (true); diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5680398559870976 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5680398559870976 new file mode 100644 index 0000000000000000000000000000000000000000..5c7b6b50bd7f661b471b0d702bca7bdfdad0f1bd GIT binary patch literal 145 zcmZQzWME)mR=^6J-Q0{o5 Date: Tue, 11 Jun 2019 17:55:31 -0400 Subject: [PATCH 477/617] Remove 'mym3' --- src/hb-ot-tag.cc | 4 +++- test/api/test-ot-tag.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index ad3635bda..61b609d5e 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -145,7 +145,9 @@ hb_ot_all_tags_from_script (hb_script_t script, hb_tag_t new_tag = hb_ot_new_tag_from_script (script); if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT)) { - tags[i++] = new_tag | '3'; + /* HB_SCRIPT_MYANMAR maps to 'mym2', but there is no 'mym3'. */ + if (new_tag != HB_TAG('m','y','m','2')) + tags[i++] = new_tag | '3'; if (*count > i) tags[i++] = new_tag; } diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c index 66c69caf7..d0334cd06 100644 --- a/test/api/test-ot-tag.c +++ b/test/api/test-ot-tag.c @@ -190,7 +190,6 @@ test_ot_tag_script_indic (void) test_indic_tags ("ory3", "ory2", "orya", HB_SCRIPT_ORIYA); test_indic_tags ("tml3", "tml2", "taml", HB_SCRIPT_TAMIL); test_indic_tags ("tel3", "tel2", "telu", HB_SCRIPT_TELUGU); - test_indic_tags ("mym3", "mym2", "mymr", HB_SCRIPT_MYANMAR); } @@ -506,6 +505,7 @@ test_ot_tag_full (void) test_tags (HB_SCRIPT_INVALID, "x-hbsc5678-hbot1234", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 1, 1, "5678", "1234"); test_tags (HB_SCRIPT_MALAYALAM, "ml", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 3, 2, "mlm3", "mlm2", "mlym", "MAL", "MLR"); test_tags (HB_SCRIPT_MALAYALAM, "ml", 1, 1, 1, 1, "mlm3", "MAL"); + test_tags (HB_SCRIPT_MYANMAR, "und", HB_OT_MAX_TAGS_PER_SCRIPT, 0, 2, 0, "mym2", "mymr"); test_tags (HB_SCRIPT_INVALID, "xyz", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 1, "XYZ"); test_tags (HB_SCRIPT_INVALID, "xy", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 0); } From 6bcbe495bff221169f8c0769dde1b4b2c165a211 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 13 Jun 2019 15:04:51 +0430 Subject: [PATCH 478/617] [cff] minor format (#1774) --- src/hb-subset-cff-common.cc | 100 +++++++++++++++++------------------- 1 file changed, 46 insertions(+), 54 deletions(-) diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc index 223c6a821..2aa55b985 100644 --- a/src/hb-subset-cff-common.cc +++ b/src/hb-subset-cff-common.cc @@ -44,18 +44,18 @@ using namespace CFF; bool hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, - unsigned int fdCount, - const FDSelect &src, /* IN */ - unsigned int &subset_fd_count /* OUT */, - unsigned int &subset_fdselect_size /* OUT */, - unsigned int &subset_fdselect_format /* OUT */, - hb_vector_t &fdselect_ranges /* OUT */, - remap_t &fdmap /* OUT */) + unsigned int fdCount, + const FDSelect &src, /* IN */ + unsigned int &subset_fd_count /* OUT */, + unsigned int &subset_fdselect_size /* OUT */, + unsigned int &subset_fdselect_format /* OUT */, + hb_vector_t &fdselect_ranges /* OUT */, + remap_t &fdmap /* OUT */) { subset_fd_count = 0; subset_fdselect_size = 0; subset_fdselect_format = 0; - unsigned int num_ranges = 0; + unsigned int num_ranges = 0; unsigned int subset_num_glyphs = plan->num_output_glyphs (); if (subset_num_glyphs == 0) @@ -63,14 +63,14 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, { /* use hb_set to determine the subset of font dicts */ - hb_set_t *set = hb_set_create (); + hb_set_t *set = hb_set_create (); if (set == &Null (hb_set_t)) return false; - hb_codepoint_t prev_fd = CFF_UNDEF_CODE; + hb_codepoint_t prev_fd = CFF_UNDEF_CODE; for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++) { - hb_codepoint_t glyph; - hb_codepoint_t fd; + hb_codepoint_t glyph; + hb_codepoint_t fd; if (!plan->old_gid_for_new_gid (i, &glyph)) { /* fonttools retains FDSelect & font dicts for missing glyphs. do the same */ @@ -104,7 +104,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, return false; } - hb_codepoint_t fd = CFF_UNDEF_CODE; + hb_codepoint_t fd = CFF_UNDEF_CODE; while (set->next (&fd)) fdmap.add (fd); hb_set_destroy (set); @@ -152,10 +152,10 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, template static inline bool serialize_fdselect_3_4 (hb_serialize_context_t *c, - const unsigned int num_glyphs, - const FDSelect &src, - unsigned int size, - const hb_vector_t &fdselect_ranges) + const unsigned int num_glyphs, + const FDSelect &src, + unsigned int size, + const hb_vector_t &fdselect_ranges) { TRACE_SERIALIZE (this); FDSELECT3_4 *p = c->allocate_size (size); @@ -166,7 +166,7 @@ serialize_fdselect_3_4 (hb_serialize_context_t *c, p->ranges[i].first = fdselect_ranges[i].glyph; p->ranges[i].fd = fdselect_ranges[i].code; } - p->sentinel() = num_glyphs; + p->sentinel () = num_glyphs; return_trace (true); } @@ -176,15 +176,15 @@ serialize_fdselect_3_4 (hb_serialize_context_t *c, **/ bool hb_serialize_cff_fdselect (hb_serialize_context_t *c, - const unsigned int num_glyphs, - const FDSelect &src, - unsigned int fd_count, - unsigned int fdselect_format, - unsigned int size, - const hb_vector_t &fdselect_ranges) + const unsigned int num_glyphs, + const FDSelect &src, + unsigned int fd_count, + unsigned int fdselect_format, + unsigned int size, + const hb_vector_t &fdselect_ranges) { TRACE_SERIALIZE (this); - FDSelect *p = c->allocate_min (); + FDSelect *p = c->allocate_min (); if (unlikely (p == nullptr)) return_trace (false); p->format = fdselect_format; size -= FDSelect::min_size; @@ -192,42 +192,34 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c, switch (fdselect_format) { #if CFF_SERIALIZE_FDSELECT_0 - case 0: + case 0: + { + FDSelect0 *p = c->allocate_size (size); + if (unlikely (p == nullptr)) return_trace (false); + unsigned int range_index = 0; + unsigned int fd = fdselect_ranges[range_index++].code; + for (unsigned int i = 0; i < num_glyphs; i++) { - FDSelect0 *p = c->allocate_size (size); - if (unlikely (p == nullptr)) return_trace (false); - unsigned int range_index = 0; - unsigned int fd = fdselect_ranges[range_index++].code; - for (unsigned int i = 0; i < num_glyphs; i++) + if ((range_index < fdselect_ranges.len) && + (i >= fdselect_ranges[range_index].glyph)) { - if ((range_index < fdselect_ranges.len) && - (i >= fdselect_ranges[range_index].glyph)) - { - fd = fdselect_ranges[range_index++].code; - } - p->fds[i] = fd; + fd = fdselect_ranges[range_index++].code; } - break; + p->fds[i] = fd; } + return_trace (true); + } #endif /* CFF_SERIALIZE_FDSELECT_0 */ - case 3: - return serialize_fdselect_3_4 (c, - num_glyphs, - src, - size, - fdselect_ranges); + case 3: + return serialize_fdselect_3_4 (c, num_glyphs, src, + size, fdselect_ranges); - case 4: - return serialize_fdselect_3_4 (c, - num_glyphs, - src, - size, - fdselect_ranges); + case 4: + return serialize_fdselect_3_4 (c, num_glyphs, src, + size, fdselect_ranges); - default: - return_trace (false); + default: + return_trace (false); } - - return_trace (true); } From 82d4bfb8f3ac30fecce41f8abe59f58ad64ba98a Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Fri, 14 Jun 2019 10:49:42 -0700 Subject: [PATCH 479/617] enable cff subset tests add Unicode UCS-4 cmap fix Unicode bits in OS/2 add Unicode cmap sub-table in SourceHanSans-Regular_subset.otf regenerate cff subset test expected results --- src/hb-ot-cmap-table.hh | 75 ++++++++++++++---- src/hb-ot-os2-table.hh | 10 ++- test/subset/data/Makefile.am | 2 + test/subset/data/Makefile.sources | 2 + ...utinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 32124 -> 20000 bytes ...ar.desubroutinize-retain-gids.61,62,63.otf | Bin 29688 -> 2196 bytes ...ubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33316 -> 30412 bytes ...utinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 31960 -> 19840 bytes ...ts-desubroutinize-retain-gids.61,62,63.otf | Bin 29564 -> 2072 bytes ...ubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33168 -> 30264 bytes ...p-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 32052 -> 19932 bytes ...egular.drop-hints-retain-gids.61,62,63.otf | Bin 29632 -> 2108 bytes ....drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33180 -> 30276 bytes ...Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 32276 -> 20152 bytes ...ceSansPro-Regular.retain-gids.61,62,63.otf | Bin 29788 -> 2264 bytes ...Pro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 33332 -> 30428 bytes ....default.3042,3044,3046,3048,304A,304B.otf | Bin 3028 -> 3036 bytes ....default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3240 -> 3248 bytes ...ans-Regular_subset.default.61,63,65,6B.otf | Bin 2200 -> 2208 bytes ....default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3460 -> 3468 bytes ...rceHanSans-Regular_subset.default.660E.otf | Bin 1920 -> 1928 bytes ...ain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90956 -> 8932 bytes ...ain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125820 -> 116080 bytes ...desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88392 -> 3016 bytes ...ain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126004 -> 116264 bytes ...subset.desubroutinize-retain-gids.660E.otf | Bin 103780 -> 50224 bytes ...outinize.3042,3044,3046,3048,304A,304B.otf | Bin 2952 -> 2960 bytes ...outinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3136 -> 3144 bytes ...ular_subset.desubroutinize.61,63,65,6B.otf | Bin 2132 -> 2140 bytes ...outinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3256 -> 3264 bytes ...ans-Regular_subset.desubroutinize.660E.otf | Bin 1896 -> 1904 bytes ...ain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90656 -> 8672 bytes ...ain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125468 -> 115768 bytes ...desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88156 -> 2892 bytes ...ain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125584 -> 115884 bytes ...-hints-desubroutinize-retain-gids.660E.otf | Bin 103556 -> 50040 bytes ...outinize.3042,3044,3046,3048,304A,304B.otf | Bin 2792 -> 2800 bytes ...outinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2896 -> 2904 bytes ....drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2028 -> 2036 bytes ...outinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 2964 -> 2972 bytes ..._subset.drop-hints-desubroutinize.660E.otf | Bin 1804 -> 1812 bytes ...ain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90724 -> 8740 bytes ...ain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125560 -> 115864 bytes ...set.drop-hints-retain-gids.61,63,65,6B.otf | Bin 88196 -> 2852 bytes ...ain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125780 -> 116084 bytes ...lar_subset.drop-hints-retain-gids.660E.otf | Bin 103572 -> 50060 bytes ...op-hints.3042,3044,3046,3048,304A,304B.otf | Bin 2848 -> 2856 bytes ...op-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2988 -> 2996 bytes ...-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2060 -> 2068 bytes ...op-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3164 -> 3172 bytes ...HanSans-Regular_subset.drop-hints.660E.otf | Bin 1824 -> 1832 bytes ...ain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 91040 -> 9016 bytes ...ain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125924 -> 116184 bytes ...Regular_subset.retain-gids.61,63,65,6B.otf | Bin 88468 -> 3012 bytes ...ain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126208 -> 116468 bytes ...anSans-Regular_subset.retain-gids.660E.otf | Bin 103800 -> 50244 bytes .../fonts/SourceHanSans-Regular_subset.otf | Bin 2707728 -> 2707736 bytes 57 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 9e9679f8b..724da6e82 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -848,11 +848,16 @@ struct cmap size_t final_size () const { return 4 // header - + 8 * 3 // 3 EncodingRecord + + 8 * num_enc_records + CmapSubtableFormat4::get_sub_table_size (this->format4_segments) + CmapSubtableFormat12::get_sub_table_size (this->format12_groups); } + unsigned int num_enc_records; + bool has_unicode_bmp; + bool has_unicode_ucs4; + bool has_ms_bmp; + bool has_ms_ucs4; hb_sorted_vector_t format4_segments; hb_sorted_vector_t format12_groups; }; @@ -860,6 +865,12 @@ struct cmap bool _create_plan (const hb_subset_plan_t *plan, subset_plan *cmap_plan) const { + cmap_plan->has_unicode_bmp = find_subtable (0, 3); + cmap_plan->has_unicode_ucs4 = find_subtable (0, 4); + cmap_plan->has_ms_bmp = find_subtable (3, 1); + cmap_plan->has_ms_ucs4 = find_subtable (3, 10); + cmap_plan->num_enc_records = cmap_plan->has_unicode_bmp + cmap_plan->has_unicode_ucs4 + cmap_plan->has_ms_bmp + cmap_plan->has_ms_ucs4; + if (unlikely (!CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments))) return false; @@ -882,32 +893,60 @@ struct cmap table->version = 0; - if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ cmap_subset_plan.format12_groups ? 3 : 2))) return false; + if (unlikely (!table->encodingRecord.serialize (&c, cmap_subset_plan.num_enc_records))) return false; // TODO(grieger): Convert the below to a for loop + int enc_index = 0; + int unicode_bmp_index = 0; + int unicode_ucs4_index = 0; + int ms_bmp_index = 0; + int ms_ucs4_index = 0; // Format 4, Plat 0 Encoding Record - EncodingRecord &format4_plat0_rec = table->encodingRecord[0]; - format4_plat0_rec.platformID = 0; // Unicode - format4_plat0_rec.encodingID = 3; + if (cmap_subset_plan.has_unicode_bmp) + { + unicode_bmp_index = enc_index; + EncodingRecord &format4_plat0_rec = table->encodingRecord[enc_index++]; + format4_plat0_rec.platformID = 0; // Unicode + format4_plat0_rec.encodingID = 3; + } + + // Format 12, Plat 0 Encoding Record + if (cmap_subset_plan.has_unicode_ucs4) + { + unicode_ucs4_index = enc_index; + EncodingRecord &format12_rec = table->encodingRecord[enc_index++]; + format12_rec.platformID = 0; // Unicode + format12_rec.encodingID = 4; // Unicode UCS-4 + } // Format 4, Plat 3 Encoding Record - EncodingRecord &format4_plat3_rec = table->encodingRecord[1]; - format4_plat3_rec.platformID = 3; // Windows - format4_plat3_rec.encodingID = 1; // Unicode BMP - - // Format 12 Encoding Record - if (cmap_subset_plan.format12_groups) + if (cmap_subset_plan.has_ms_bmp) { - EncodingRecord &format12_rec = table->encodingRecord[2]; + ms_bmp_index = enc_index; + EncodingRecord &format4_plat3_rec = table->encodingRecord[enc_index++]; + format4_plat3_rec.platformID = 3; // Windows + format4_plat3_rec.encodingID = 1; // Unicode BMP + } + + // Format 12, Plat 3 Encoding Record + if (cmap_subset_plan.has_ms_ucs4) + { + ms_ucs4_index = enc_index; + EncodingRecord &format12_rec = table->encodingRecord[enc_index++]; format12_rec.platformID = 3; // Windows format12_rec.encodingID = 10; // Unicode UCS-4 } // Write out format 4 sub table { - CmapSubtable &subtable = format4_plat0_rec.subtable.serialize (&c, table); - format4_plat3_rec.subtable = (unsigned int) format4_plat0_rec.subtable; + if (unlikely (!cmap_subset_plan.has_unicode_bmp && !cmap_subset_plan.has_ms_bmp)) return false; + EncodingRecord &format4_rec = cmap_subset_plan.has_unicode_bmp? + table->encodingRecord[unicode_bmp_index]: + table->encodingRecord[ms_bmp_index]; + CmapSubtable &subtable = format4_rec.subtable.serialize (&c, table); + if (cmap_subset_plan.has_unicode_bmp && cmap_subset_plan.has_ms_bmp) + table->encodingRecord[ms_bmp_index].subtable = (unsigned int) format4_rec.subtable; subtable.u.format = 4; CmapSubtableFormat4 &format4 = subtable.u.format4; @@ -918,8 +957,14 @@ struct cmap // Write out format 12 sub table. if (cmap_subset_plan.format12_groups) { - EncodingRecord &format12_rec = table->encodingRecord[2]; + if (unlikely (!cmap_subset_plan.has_unicode_ucs4 && !cmap_subset_plan.has_ms_ucs4)) return false; + EncodingRecord &format12_rec = cmap_subset_plan.has_unicode_ucs4? + table->encodingRecord[unicode_ucs4_index]: + table->encodingRecord[ms_ucs4_index]; + CmapSubtable &subtable = format12_rec.subtable.serialize (&c, table); + if (cmap_subset_plan.has_unicode_ucs4 && cmap_subset_plan.has_ms_ucs4) + table->encodingRecord[ms_ucs4_index].subtable = (unsigned int) format12_rec.subtable; subtable.u.format = 12; CmapSubtableFormat12 &format12 = subtable.u.format12; diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 33fbb643c..16e29caf3 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -164,8 +164,9 @@ struct OS2 void _update_unicode_ranges (const hb_set_t *codepoints, HBUINT32 ulUnicodeRange[4]) const { + HBUINT32 newBits[4]; for (unsigned int i = 0; i < 4; i++) - ulUnicodeRange[i] = 0; + newBits[i] = 0; hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (codepoints->next (&cp)) { @@ -175,16 +176,19 @@ struct OS2 unsigned int block = bit / 32; unsigned int bit_in_block = bit % 32; unsigned int mask = 1 << bit_in_block; - ulUnicodeRange[block] = ulUnicodeRange[block] | mask; + newBits[block] = newBits[block] | mask; } if (cp >= 0x10000 && cp <= 0x110000) { /* the spec says that bit 57 ("Non Plane 0") implies that there's at least one codepoint beyond the BMP; so I also include all the non-BMP codepoints here */ - ulUnicodeRange[1] = ulUnicodeRange[1] | (1 << 25); + newBits[1] = newBits[1] | (1 << 25); } } + + for (unsigned int i = 0; i < 4; i++) + ulUnicodeRange[i] = ulUnicodeRange[i] & newBits[i]; // set bits only if set in the original } static void find_min_and_max_codepoint (const hb_set_t *codepoints, diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 3439588ae..618e663c0 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -9,7 +9,9 @@ EXTRA_DIST += \ $(TESTS) \ expected/basics \ expected/full-font \ + expected/cff-full-font \ expected/japanese \ + expected/cff-japanese \ expected/layout \ fonts \ profiles \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 75913fd9f..f065e8327 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -1,7 +1,9 @@ TESTS = \ tests/basics.tests \ tests/full-font.tests \ + tests/cff-full-font.tests \ tests/japanese.tests \ + tests/cff-japanese.tests \ tests/layout.tests \ $(NULL) diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf index 8ce5fdbf532694d3fd3cb55e3de34ff63c0dccc9..2811017ca78f4a1a57bf62a814f9f9391f4b2729 100644 GIT binary patch delta 320 zcmezKi*dmm#(Mvd5Pt?vh6V;^1_5U`Hw7)}+D!}$3`-ao%ticz^^KyQmM>&r@B#`k zBqZl17O+I~|72kB4FU4kWTYmhi2B6G1J&*T^35`U0$eRzwhRoOcYu7AjNFn6-o1>L zK=}_041#ZR6DtZ>ssn&h40C{(EiW-wFZCktqbQ&S2@DKO9}Dt}Oa5PEFk)cv11VBq zUI7oh$TBdn7Bhgz5=IbN$^+((fQ delta 10142 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 a<1=N4?6*-XAIH{ySd*V~%6&(BhW!svS&ec4 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf index a1487ff65c143e1363207a5d4892f3a1d799cf79..98bbf38d6f64d31d3ba0536eb84db6648c5a2ad4 100644 GIT binary patch delta 278 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 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf index 9168bc869d211df24b7599ddb46004a17d6a6452..2d88e570bbbd65529ea1498062d16b45531f64a7 100644 GIT binary patch delta 313 zcmZ3|!gS^>W4(V!h(7}-LjwadgMhP}n}StH#}x(!h9wLPVX6MX`bN=n%bFP&ijDxq z5|VQh3pi^;fbwM$K>n1B)Wj4~pZItNhHxGr-z)_^8X@(5zvA)Km`g6 z3;_&m*BKZX8CaMY7#SJGCfnDGI)PX=vJ4FDy$m3-j}b)n^ME-Mm>qbS|3v-X2^8bV z{}sauq;1adp9WH4szN~0eyboG*Jc(*0Uq{J{i_D91|gfX`3m$m?{hxK%*1wm^Eda6 lyqi_S_i{{LnBdJaM^Sp^<_`&-(vyGIDluN)EK|q90ssr;Qbzy) delta 2687 zcmY*beQ;FO6~CJVa*kajic}=1;X_5#y!-Lq+k}FUU06|pq!L8~0*}p-Y@6(^`vFmd zD~h5+?I>w+WMBjbNB(fejyqGTGl){OM%030)q<8%TWT#-TLnL%_v0lm{BigEe&^$! zbI(0*-+S|TX#3iVQgdr-GeL4MsU$VAc)V`?MVXffA=?RAHobX)#TRW^c|RfdjFY-$ ziEb~8y%!uLWKCA`Uv(zE_R({fE|sQFBzHTd;+(bNO@yreTJlMq-G!cWJ3_A#;>q}N zhr7L=Z1u(#X(F5D8lLvLCngV!INBx?^b%6>MK+T!oH;-^A@@~DhdM%9NcG0Yo|-%r z9C9%s;D*$1B&?k|VzGP=O@R58hAJ4Dmf=}ZyK9?`x zZQSFXJi}M=)qE{q&o}TV_*VW5{|(>C_wasxkRRel`KSDIeu|$K!$eq&5@W@9Fl6w>Q{Z z>}Tzr_G|V5`-uISebNazVdp|;f^(%qovBXTndh`Rw>rObC%chy?TD;ZDyCDMv&ODu zKA*g!=yi4El3pR1(>R?eXz69MxlE6Ssq~6eI#sw+hEW=IvR>M{7#jU-e6dx%G)bFi?lo z4b~Jf)=03IKBAxvfkvNJ(8fTc4=!j^pwT@LG%7VE|G2t=g2n=;SiNV`>23-dA2jL9 zqJjl2VWty|`<>DEC_TggH+3>o95WR$RYpmAncPgxhh+K=1v6Q>xfpKx%1tx5=^!^< zuAwrPSL zjDu|ob^Q@)P-A3zs-bGAKYxb%W2K0xLH?PZHI#-9ar5U*>HR^|aPX@12L9bD%aHq( z50m`!) zD{@{Uy*$A3zB$#C6`viC^LkDfWQw^&vM!ac^Xdxa&C_;OmdKNYR6io$+n2~CU%%v1 z$$v>g`ei>u;zy-Uek@c!CgtN&ZXj2XUQ$6GlK4eZMM_dHKQ`pYNQkVJ@9f#1VkcoklQKfvqI z4{yLecoW`&x8aYl9}d7f@GcyL_ux(n z!{JzsfQaYdk1&iQ@LU{;HFzGLkE8Gc9F0H53vmoygk!N5$Kl0z30{hII36e9M4W_| z;pKP*PR1*73SNa*<26{17E)x$QJ{?ux){L*Y{aSf6P$+AOL#5Lz?s;DQH{m`KE>UhWfVUCWJmH@6AEg{{eii6I}oR diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf index 7cca4891a15287f9774fb72d1b9dafb1d753006c..e5775fd8d2656d9a827af24d7d5eb6eb9e19cbd8 100644 GIT binary patch delta 302 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 Pq@g(Pl(i=`c*pz?^t6li diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf index 06f0c1f2799b86fe9b7e0e3c3888eeb5ddac109e..572ea742b737823bbd8213db7b1a290cb40d4cff 100644 GIT binary patch delta 279 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 Ly#_`9hoAok;UtZ8 diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf index 556861c9521ce08a8f40182fe13d41c34b23405a..376f658ca16a54917414e946df33e4a37a9f483d 100644 GIT binary patch delta 303 zcmbQx%(UYTW4(V!h(7}-LjwadgMhP}o5G1Fn}rz|7?vVi4_HG*8_l340C{(EiW-wIrSp%qbQ(;2@DKO9}Dt}Oa5PEFk)aRlK?7E zU|2>m!D3bc=b e5r~;sX%|Fz^nD}b!i;gpwnVU2B zUhe}&122z3d_l-4DuQD9z@jj32~vnnYLS_ss2Eg44>Xaq6if};k27)i5)G4pJMyg3EB{Fc z`~3cF%{pyLHmEfw?e{e%_tqZnP!4YpQt@s!lP{dwO9UZHv&x`>klCbW9U&1?RY4+= z$b`X7`3WtGnRy-|@Q8lKBKp}BHK4ij;%Mc^9UncZWtk7ZQLSkF)Y#RE%zJp8dVYEK zSz{hAS4HZgrG96rv&y;C+2m|?wmLhUA!oO<$9c^;NJHn2!_c`H| z*YSEjjenlU_?P&lyp4Bozr=fao-g7n`5<4Mch>Tbu7K;IKt5_@U5u3y#;xVyJ42j)hpEw{6i#NqP;)FOU zt7TN4Ehow;a=LV6Ot#2NWt;4fDf#sUa;aP+H_FYjEQjO^@}N8-kGm1K&aHPZbUpVH zx6S>gn{xZzvdtdXm$EL@c z%JsEbr&LU*gy1uJllgq|+M?gvolE+KWX|yEOuy#T~tzOp8 z6;gh0S8Bcz7n0pMzc=T1r8@myvoDKj!bL1!?CbLjsZ3gJ)K%;(7%`X0e5sI9ie#4& z%wT>lmswcMS|kkW$}CK4?6ojM;$}}TK0~7>PZV+~zuUTatB}YjF$|IaRZyU@sGt?dNbE2)7?pJ!=$jp=$P~rVxm=tSESXFxFxeJNf;7uw!~V- zTP(5;aqS?ycwE~+1ATdc8jgc;65$wqQ&vf8F_FLOl6nnQ^>tzb_dmW10%a1m6-^if&JVQll{HaTuH;yR6zva+$co)3jg z4<)xzg>8(mbrrUl!d6h&s)<;TsIcV`VR?iNE5h;!n}M(yhDA=4#G1r-FNaY*+hC+G6 z%$=1baz7z8tJJT2vRdl*OU_q#wfdjy|NljbU!$nHKh)f==v|7gC7&gWNCi>%g_<3t zij(`u*CK~J3MgU$7NQ^5;d*=ri?A3spoAq@ie*@i0j$7{Sc#i( zGj74HxDBhY8sEhl+>W&v#2vU3>u?wD#ywb%d$9oHcj ziXY&I*n%J7$JmO;@Dn_aGJcAm;R$TRc07q4_&I)oop=hn@HBpjA^Zx@;8{F}U*k8} zjo;#V{0=YR_jnO|uoo}kW$eQ%conZI7JDK&j-Exw(X;6}bUd9v&!wNFpQ00KJ)K0)qm$|Rw1G~cQ|SeC8vQhl ze5M?|Vm=0Qvv-aAU}(H*oNAT2?Nv{HH8Fi_d0_6%_2r?tOCp1{xv7!;WtKzL{{iyx BDVqQQ diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf index 5177c149e79c43b446771f526ba12488b972136b..e23e37f4b3fe3ed38f7a10d589ae282a51204b81 100644 GIT binary patch delta 302 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 Q*VK4(&RG9sjeF4l03wEir~m)} diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf index c70b82a1becab94c1f1de7e9d8f2b597205b1cd8..b5a565e3ae16fe3d262687f9b46625193480e178 100644 GIT binary patch delta 323 zcmX@`oNai%*m6&XG~rg-@*gZ#K6QVC*r2dG1(wt<>Zt3N{sTG-{fCm1^`Z) BQ^WuO literal 29632 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 delta 2686 zcmY*bZE#f889o~V_d$b16s-g`AXY@X_k7%YH=(hRU07)ghC)OQ)Ogt}$!fB@?gvC0 z+#p|Cz(#^t5h}J)QBlyH5p||@hOy2toz6(d8SUr~hCkS8>*$DJ)k4q5O>X#c@B2LO z$9doLp7(yd_wUHwjWw0F_VzY1kqnY?q&|^MHqz9c8wnvV5YqWp+j5()+_zTp^}D3* zzEq!|pEz*khlC7%Ci$+OwBI##ac8GAt&-g9k%~(;)$Nh~dC6z>^p*NA>yG?I+GYIo zPy77-ytR9&G?BgXnvnJTqUjTpPIbtDGlbN9na>qV7fujP$c6#w&`8KqV(lg*LTYPB zBoeu5xU)Dlu29Rhguo^0?nTr+R;NkRxcPPCzVG<%ZKcb7yK20Y3)&|SNzu7wioD-` z;PMG?RBI#kb(Ma5gT2Fk%HD4uv=7_w*vIVS_6PPy_DTD+{keV4K2OKfIy#k3r#H|! zl+h+Sk0$97+D=!})igu%bRB(!Zl>GmFx^9+rw8d_`X>DoeUJW?{+<4Vo}{Pg=k#kv z*hE&(8rUp$3-j1*Y!Pc?9n7z=URGoSY%3dPd)NVXh#h5rX2;nF>=Sm1{fC`l7dZH2 zK8?@dw{pQ-c!DqH%XtU)c@NL=wR}C_#JBOC{29KVzsQg9qx={@&OhXz@KgMs{0n}L zpBLjrow!0w6EnnYVGB>RibbMLbcl?&XRX*EhQvN`P*lY+@i+0QI4#aP5vSg1aOOC! zv%qO{?sYOwzq8TV>Fje3IY*uMofFPU=U>iQH{#a0SGzOan_cS8b(8KAx81$leaoBe z#i|XH@^+=1&2Y||d(*{Y`oXf_+g(WerF22#Y_6oGpU)R^{TgPnYcknP=^+_LY23~G zg;K`v?aHi?>QcJ9;P)2%u1w1B)$3AE3C6u*xv$SJWpY`$P**us(rPBs#Y!n74e2he zXr_LlkXu*I8^$&3%B{;P?zU1b5_(NH(X3d^<)uQ#?=~TBTxgfLaf!#Yt;>YR7nty1 z6{eWSDw=vs(-_n7p4Zx&dpMo#PAeZOxDnb$g)155ag|<*xDg2>78;S%BGF`o@l3QD zW&#o_fV+u=>OU1!RiQ*Q<>yCWw*jg$X=0&?MFW#6OqzITQZ-7A2sMt;IH5*wKu}j} zD%xN5ONM#T)F>FKL+VCriWzGxTuX0J(56tMcPnUfsL>l2v^CV|9tawjno6);-9SMT zp;IF2n{>LHf+j~z`mm^AVN00l1mi(x^f^ioF~Uuq%oN8=MNE}ZkzOV@Q}ZF2K10Dw zR&EZ4o4#_>Ol~^JP1m>=6v|C|c-S6p((8XC->;lWrbVrq~t(~E}E&@pboyeWM! zXc~?lm0ln?TV)w@zVgA6)tLFyI1ExWC_uxDEy08-%a|!sG^j?yFvin~%z!I+k)<+{ zNO_HU{1gomX?Ri4NFrq!^Qfu3!IPw67~@Dw(0L679bHrKQ`yxamgmi>o~-1;WRgcYU7jl!Qt8G_vC(fVRrj_`slA^( zM~JmUe#@_um;C&a>m`3ee$dqqz&weEq?A7p){{~`E#*#f6B!^iq#$o$tQRjjY9GuGGES?iqjjrCvaTkAXPd+UGJ zdFuiQBB;SQ)M7j)zydH4m*7&=VG=IGWYptwOu-en5>s&%uEq~=4W^+1({U}X!}Vyy z49vt0n1vhhL)?VfxEXVB3vR`a5QPm2h6;y(0~a1*XhJjQ;>T#gZTJc1VLn98t$l5C^!@74ipLwO$5sqRhOa5ijC@>eDWLZM DW32*G diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf index 02529e3aca16ffd12755f87e1586fbd7fc453634..e1613ac5f0082e160fb1b7d7fd48857f9f3855b3 100644 GIT binary patch delta 300 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 K)?GEuJ?MY?IErBa diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf index 76e5cc59265761ea96c72468e404581d68b148a8..479c5e0164f1d9cc094168c48a3168cfc2e8dcdc 100644 GIT binary patch delta 307 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 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,3048,304A,304B.otf index 4dadbfeeae8d2ad5cfc6ba4e36b7ade65405f5de..6065be461a6986053d875c9d1a3c1f5fc77e0ec3 100644 GIT binary patch delta 148 zcmca2en)(Qx$FW41_qAg+{A)}-KAL!3|tq0{0$kYi7C8YJr5>^1S>WG1r*AFA{^UA z?HCxicL4b+Ww|94EI$|vf&3L4PrPN5mM@wR&u{aUftmRQP@du95`jJteN)~%ZSw_o fW@beeAdeY{Re%`8P66^5!F*;0E)ak68?F}sXnQ2q delta 140 zcmca3enotOx$F!E1_qAg+{A)}-6by>7`QF~`71I~6H|CCdaEaf1S?hm1r*AFA{^UA z?HCxiHvsu6Ww|94EI$|vf&2vL^KpqIo07*tD%>|@mCV%020RUssB-Q`` diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,73E0,5EA6,8F38.otf index b2a46c66d59db79f050049e743faf8941ffbca4d..cee758499234d6bb48435298050c8d53286ea4ea 100644 GIT binary patch delta 148 zcmZ1>xj}M*xoimo0|Q5LZel@(aN$`72JQ(!{*jE-#1!7Ho(B^{f)zu60t#h75svMm zb_@(WJwU!nS#C)M%LPVWAirkgiM8y~Vrf(3`E9;3Ff+dZ$}?PCBG3n-Z_1meZJxlv f%&f=)1>#R$!~F*UZAcJ=VlBJ$uC$r){5D@1n3-Py^1S@&~1r*AFA{^UA z?SN`)fP9s*+>#2mJjUrje!<2QN0?diF6c>5p1>l)a#P+sZSx8ic4kEuph9MlVju>w TV}LwHFrS%$3&fv%g8c#jJZ&Dc delta 126 zcmZ1=I74uPxoiRh0|Q5LZejt$e^yBb2KF^T{*;W=#1vkO-s*`V!HNz*0fjQ42*-9& zJD}PUAYY{{x1@qCk8wJXpRw`85oVVB65aokC$NaH+&F8&xOoK&JF_G+P$3A*07*tD N%>|@GCSPE`008$&9kc)d diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E,6975,73E0,5EA6,8F38,6E05.otf index e9679cf9a42804331d499fad39b81c1aab6c3676..6db56f42d89970332ff16b2bf5db136f66412589 100644 GIT binary patch delta 148 zcmZpX?vb8gE*rqWz`&85n^@3wCDe(5fhPyZKa!D}n8MrD^I&2~u%ZD_K%opM!m(Y{ zj)8$U1ISk?%Ppy3$!1ssi0C_-u%*GQxnWT9NMdJBwzA`W~zW|9|Tq4j1qHoHZr)|E&{F_OU c1;}FtVih0;v0Z>XMlhe5feXZ+{DEx(07$MM=>Px# delta 140 zcmeC+Z{VL`F6+ai0C_-u$i@>tnWQ%qoQUVQ`O3h|`~oC;afv`5h`w>wf^qX5=HE<` W%s?Ip%K%A6D9r_=Z6^O`AEK>)!NAfkQ# zjMy8}XyDOSce|>^)Q(KG^4l!wZ1*&wo{zyo18Vq#U23J1bcsszggyp2s*vAnSiWbt z(TIUP+LlZ-h5TGshe3jZA6+3cSi8SP!OgqF<~dkIGM+qqyiX;h`&wU)C{1{N@a*uNoidSUb=?7BrTdc^H|6Z*`O+RQ}e{d(p-t=TGLT@zOZQ VOq)3zBbry1C6!rsdBGjgx_{iFfY$&3 literal 90956 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 z zjb{_sL^g>{W>eTyHjPbZX>105s5OhtW^>qFHjm9`3)n)oh%IJI*iyEPEoUp(O16rv zW^345wvMf58`ws+iEU^M8Y zPO?+%G&{r2vUBV_yTC58OYAbc!mhGw>^i%_Zn9hKHoL?AW_Q^=cAq_957{I3m_5PI z$DXoh>^XbEUb0v0HG9L}vUlt~`@lZ3Pb{5fuuS%uePLhOH+L3yR(Fbfko%SUwP%fI zt#=XEmTSkg=R&y-Tt}`G*O}|Wg>hZEZd^DQ!9{Z2xhSp&*OQCpdT}vaEEmVcbG^9) zE|E*(`fz=@eq4VpnH#_j)44Qm1~-$N#m(mCaC5nN+xgXq5?icqj z_nZ5}6VG@T@8&(cm*;q%7kH7Ec$rstmDhNkH+Yk`c$;_lzxXVCRz4e_ozKDNA8`=C|-$`EC4meh0sk-^K6d_wal9ef)m@0Dq7_#2@C5@JIP${BiyS zf094NpXSf-XZdsddHw=_k-x-W=CANq`D^@j{sw=Ozs29?@9=-~clmq#ef|OekblHK z=AZEY@K5jzvkcYZ~1rpd;SCek^jV}^BH_5|C#^7f91dN-}xW>PyQGG zFaMkWBapxZm*5sWf>+=KUJwLPkOWy!1Xa)kT`&YwumoFhgujF=LRKN0kX^_j

rV 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 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf index 07adc1ada898edf29cc09dce8de44a7e911670a6..f1f0cb1bebbe5dab35197f961c919b611277137b 100644 GIT binary patch delta 541 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 S+kc>hW#QcabTl}d-tm7A!yAYI diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf index 28fc250ea6464db50d7b81b47e94d9cc54c250d9..b353d43466e48e5fd93cc019d0aea85f0fdf7641 100644 GIT binary patch delta 487 zcmWkrO-NKx6#mY;Z=R#w9N*Lwkv}ujn*rTKCb=kTC>R}N7|B5lM145QK#h$kGDMIN z{a{+eh1?iuxCs;n2bx8zR=EgDsD-Uuwh>%pJ!hlmF3vsQcYeO_z}?>RZJ&RV$!0T< zn1?{(PBIxz{F4H}Pr!VW8Mxdz_~BC#u>NvwY%p`TM@%z9L!KZ1c)=~w)4C3zeuMc+ ze!|V2URc}%d^zUV@?7v=H@@-y59Ut3Fk6!MX^i_T0Cg4I(nt~Me(r&XU`@G&i7V}? zEKtW`3>6>F%pN~SCmZ&1KRl-etDyzp)H-u#js?%WG+VgOM^YEST4_cw4G_^eHE)D` z8YSQU@4n=f0^Va8t8GfhTe9Kj8CYn*t#>YdS|0z#@IBdQX@x}X)Q zPrzhTR)cNeBC%0g{l5BM*)MKazCOD}Q3#@XyV(oN_{ZA!pcj$xjoNPx)@kcxCtT(;ZdAF^5vT{&P(Q-;ql+x7)f<7A& ceTDubheP9GW?ISN+@N_iVbL#Ij@{EsC!gAF&;S4c literal 88392 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 XnWO@wxj_8wI|3P}PM9wE2BZl9k;snt delta 4052 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 ZYxb;ccGuh|F|2}VX~h4uIi1gL`#%92KUV+% diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf index 76fd881ce262138c194216802ebb468c484af20d..afd9c3363acfc6cdf7663ce0365b3cd7a53ec687 100644 GIT binary patch delta 529 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 ZotasZ8OQ@+86e3BrMZA~%;XhZF94CRB3b|d diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf index 7846eedd8c916e32afbf290a71f2611c1e6783bb..b69448b5e6822a63467077a4f93a3674a587bf0d 100644 GIT binary patch delta 134 zcmX>gaYAB(xhxL@0|Q5LZel@(aN$`725t=?|42q^VhV3p&x45}!HREy0t#h75svMm zb_@(WDnPzUS#C)M%LPVWAYWwT2^V&jdHv!yCkt?hu-ue4Pur})!OX140#wKhQVhf( Ub`Fro2<9_0aDn)fUAX@M005O8H~;_u delta 126 zcmX>haX?~%xhx9<0|Q5LZel@(aG?tW1Gff{zb7L#F@@Knw|Zhou;LS-fI=Bigk!s? z9RmZ843MuzOne-$pRcAEH})`MF8~1VV<2Pz delta 141 zcmca3a7AE(xvUHW0|Q5LZejt$e^yBb2KEdfe@aGbVhXQCZ}r5GASL!cKoNy9pb*D) zQ9Gbw10Y|eEVrbBEst?Jkgu}wL?g5Gg~|o-{5D@1n3-PypF diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf index 872859bfad812f0143f6af5d06b309b36e78f3b2..6f98c8fb5204f883de03024e0c17eaa9fc94feea 100644 GIT binary patch delta 148 zcmdlXc|dZ4xoisq0|Q5LZel^#l~5-J2JQtw{*jE-#1!7Ho(B^{f)!JM0t#h75svMm zb_@(WbAWu6vfPpimTZPKKz`506MNaE{T<%M^V@u7U}k;+lxMiOM4%5u-;_5`+q{5- fnOTtq$YTa#6(9z&bAUWXFrS%$3&fwihx-oz_N^nc delta 140 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 Lf%ZR3c=&$+wcj~v diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf index 010a824b72c0641c69845b8443db29cce772da85..9a0e72600fdc2690bda1549d74027c4d66c3fc2b 100644 GIT binary patch delta 543 zcmbPpg?&c{d%b^1h(7}lLjwadgM+i1o5KCcSC=s`FkE3^n7_h5Sl_6v+1H+d(O?Ns zEFsK4$epZCszDh=JNriL-Q!P+_3j;&{ncT#RxB}(R0YEv1GeFFimzbMssOcHPz-Y+Az`zty zkY8N#zm35NXrTg7UZD(R;C4#`2F4>IK)y;D*g(dwKzR?4feZ`*49cH@?qgtKVqj!s z6r0?@Bs%evjnR+${IU!T`T{(vKx)1-j|zyFCdj}IRK~!@z{hZt;RC~eMp;HH#wf-T z#%YZEHm5LdXPoT7%(gj^`IrtbFnFXv<}$J{2(nI2G4^0l{;d3Y^DX0-?wcJuzcX&G zY5%QS&%nmW$Rn<#YvKGufk$lu$gX~&ABs@s6rmqVJZgO)(V0R&l%dQyLO)b^)Fy&N z=L`K%g^Df}`c)(HO%z4|=^vj(e)5a{*e?Qf1<)moY!&7S-SPZ3Um2L0UjRiIE-v8` z=mRls%A2QcX4(9(fBH%vMkU72+t2tg?q*U1hA7Y%z)%BX5IYCR0~w_Pq`5%+?F;-F Mr%ssu^Cd_V0M3e$v;Y7A delta 3974 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 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf index 6ca195572a101f2b4d6494ab66b288ce74258253..513d47ee92217931165df3dfe662fc118831619a 100644 GIT binary patch delta 486 zcmcb!f%S}7y?;oEKLZa#0|PUIgR`5P!v55&Nem1OR~Q&rg#3f`jlvdfD_~$?s{o26 zg!u=#GZz9`44iL(1V?giVgX|_yB3gd0OZffNKH)P?do{|)cXR+H_HGDa9A^)0qPF{ z@>Mc&ODcG>850;7SQQu;7)^2$E8+?md;@@T3_wK;YfsfL=KK*ek~7#Nr$3i69f z{aR*3l^?x=3>-i;3~UU13^y4*F#KnfVYFjR+nmBE!Z>*v zlk8-EW}eAEnUp3wFtbU5Ol0(CW?%tY3N(#DkcmN>5onR`+|8s2as)FFs{k>G a9RuWnOi}^TTp<4T5LU*kjMFV6K$-xa#&Hh- literal 88156 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 ZcdU$m{&&{j4dRao-|^2bnE$hs{U3t+McM!W diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf index c6ba9b4947d5329eec48fd217da08ae887810234..b10526d713f8ed3db5f1bedd395c29b9966ee15a 100644 GIT binary patch delta 510 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 r7H3?JqLxF}oaT+*{GnDVkGZDLN!JWUJH diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf index 996dfc7fc4cf98f740fbc57ef671d02486cbc20e..2684381c9bc70e07c1f08c8218f3f197520c6afe 100644 GIT binary patch delta 508 zcmXX@F-#L-6#icCJR3PUI6ww%ILft&gE5u_jgqEm2_g)K(h%bSUT961(;5q56ZIg* z7-MrHP7ZGBP?HNelM)Hhk%0jQTy$`AF^1va@cp5~```Dz@4fdW@Ap4wVpVzM6pIdY zEJH!AFg9krPk2oLdqDoXGkqbm>Db-C6P39;GtSLx$^%AN8Q~{B@3~duU49?%H>F-F zyQTK$FMa`qw_Fcbn229B72q**uq$3|>EtdV)^~wyr{^xsRt;FbF z;-`@S%tJlJDL<#%oVq8v(8g`h(18Q|#Staw3f-m}y`isRi6RPeiWa)c$If;>&l$Ow zRCJvPN<-tS;TwMVW2mh^tgk&ag816XBs3zuFM0lQL0EeFm9+X~ih&mVY>K3weks`v zQw+A?7gN}Jx-QwKDN-$VJIFQq46)V2mTXJf@80lFP;K<62mP1shR+(Q?D`FhlH^A< ii<+?k`9FMT*c=j%awSJ?&ZlG@jStd7cHMm~hyDYej(Jl6 delta 21756 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 Kdc)mu_5T6sNg^1S?Jf3MiBTML4#L z+A%P2odNPy%5qC8Sbi`T0{MFuo?w$fIMa(RsmuVI|ayN1oN30xIp|#TrU8Vh9t}Y delta 140 zcmew$`a*Pqx$GJS1_qAg+{A)}-6by>7&xB*`71I~6H|CCdaEaf1S|Fc1r*AFA{^UA z?HCxijsW>8Ww|94EI$|vf&48CPq4`_R&BZx&u{aUftmRQP@du95`jJtedDYJL^KpqIo07*tD%>|@mCUbDT003>_BhCN- diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf index d2012df6bc68c17e0f7dc12fd07b533182b899d7..b900d92a84f8792705a49110108ee2b2085d91e0 100644 GIT binary patch delta 134 zcmca0c0+7}xvUHW0|Q5LZel@(aN$`71}+OA|42q^VhV3p&x45}!HR!?0t#h75svMm zb_@*MCP2PQS#C)M%LPVWAYWzUi4ZoH(1WVplNH!SSZ>Ojr){=iXJ%Gp0V-q$DF$K? TI|s;P1oN30xIp~LAzXg|6%-vt delta 126 zcmca1c0p`{xvU5S0|Q5LZel@(aG?tW1D6Gmzb7L#F@@Knw|Zhou;Le>fI=Bigk!s? z9RmZm4v?=>mRnN6a)FT-$d}o8B7}`4ELGKivI4sZ%Z;-ZjGHaknVBV-feJxb21qhO NX)Yk0GC79p4*;tF8%O{E diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf index 6a35208fad7547860fae9169989bbb60538326d6..6b7cc2efe0d29ed902e084606e3976d0f612b03b 100644 GIT binary patch delta 149 zcmaFE|Al{ox$GVW1_qAg+{6Ng|E!Z37}$YahB+Cji7C8YJr5>^1S`$~3MiBTML4#L z+5r_@0PmJ843NhN<})*Jf%ubU*e?J85hWus delta 141 zcmeyu|Av2px$G7O1_qAg+{6Ng|E!V>4D3KI!<3BF#1vkO-s*`V!HQFW0t#h75svMm zc0dIufP9s*+>#2mJjUrj{+^8|B$#EcOlo=)&u{aUftmRQ$cT$e1o}Yqjk6YvoBuGg YGfOf9c_1tUBpIPJ7myB_tipZ)0G5d&GXMYp diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf index 39b88d5df0f1ad74ccfed805c4aad6c3ae817fbe..69b6b2e7492b052af1d95543c5eb4df66bad1001 100644 GIT binary patch delta 149 zcmbOtK1Y0lxoiRh0|Q5LZel^#l~5-J2Cf<)|42q^VhV3p&x45}!HNz*0fjQ42*-9& zI|c^s3LsylEVrbBC7WRlke{*f#0)l>s4bFw@%%Pl8JL-002MG?Tq4j1qHoHZr){ob gXJ%Gp0rHrESOthd>>MDE5zJ?1-~#a{&*1t40C77Z`Tzg` delta 141 zcmbOuK1F=m<%ncz&C&49v_gfC?BcE)nPh(KpUoFmA44 ZXJ(dU2J%2y21qhOX)Yk0GI;^l9{@ubAo~CS diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf index 754e35ea2cffc8d2c03538550e8ff946618bcf9a..460baced3ba1c226da4896e9ad915ec087fe5515 100644 GIT binary patch delta 133 zcmeC-o5DB2T=oG20|Q5LZejt0jBzjn16u-+pOBH7n8MrD^I&2~u;KxrfI=Bigk!s? z9Z2+K`*^R&$w%)glwS%8wvAhkdYV!Hr& Qj9@-90~d%txrS{50MMu%XaE2J delta 125 zcmbQj*TXl#T=oV70|Q5LZejt0jL|0s2DStsKO!SFF@@Knw|Zhou;LD&fI=Bigk!s? z9Z!A}lw~S}<PY diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,3048,304A,304B.otf index 92ba11f6b6c19cc1f65b82e697c6285f161f1ad3..ecdd5d64a95004a2a762732b255a55b023a1ef47 100644 GIT binary patch delta 514 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 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf index 201557e74643d74eff42cc768992d19d57877898..77b1f95a3cdd050ce33375034b50d66cc62091f4 100644 GIT binary patch delta 526 zcmexyg?&aRd%b^1h(7}lLjwadgM+i1o5GF-C2R}~3|AN!7O?pT>l?K-``R-w8nOVz z62kn0+?fl3EJl+BK$0UlH?g28{_Q~qM&ms|{*jE-#1!7Ho(Dj^cYu7e44?pqwOSDa zqXAHiK_w%%q(VA^sg{9Zp$G#*|C!vxins#h&jCO=hBH9SmY0~DYN+WM0<42(xgfP9rQuz`$Uf$}Rr1~M=NFerZpx{rZ{iGh)k zQEYMpljy`xwuTb?vJ4FRo;<2RYF-163WzsfkbxVhih+%RkKrc62ZsNQvW!-YQH&*w z(-`+{PGQ{6IN5=jZF3^?e;r<6=tzT%Wn^IxWSus+v-0Q7!X_`>H!tk?&bWDN z`+pU01~x`U9&sgI3+EpSJZcj_cAXLWp$KJO6#AhAWnL5dp$uWp=Mws%!lO13sCNEe zp&zO|YJEWF0_M#>Hd-)h{@4!;C!n=J%*b|3PJV4Xzs*+$X66?_5r&IP1o}YqO?mUQ z%?X>MBuWRePy<^u7z|M6#>I$?U~E087t D{pN=W delta 3952 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 J2F3sG_#b;-_U-@x diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf index e6bc2aef4defbf5fc50410898edc49309604e1d9..8a1bc968a936955b32960f6d453ab0200c8addad 100644 GIT binary patch delta 560 zcmWkpQAkr^6h7zw@2+=xb#87m)8#g=OKoMY>8hzMg^Adh)mkf}yrg3gt5qUC3>uUY zQqs7fFTEst@GV1V4?WaFkG%x-AVl;OK@h%FcM{n7AI|@O-#O>|&N+`>St{-a$y6!{ zDwKdjY&;(K4t|YJ0Kg{z{xf;8Ka}2hT>y}$DL0c&UYOu_34!%JJ<83zUciTSeZ&>w z&vSG7Y~#w4ZvfIe;zKz~C{gx-^g-fUEx#UJBVFcGn^{)7Yxh*m+^~Z}Js?99?7%MUV+W36c6%0`Xsj`hVdJV%V}2vXWkct! zSp=NoAc?t%U}w;dG%A6}xMY#*6l;Bh+Sp`kwmVv!E_dsJwu9{*o4sK22`VvDwCaRkZ-!PvzhEr%10$(F0oM<@I3tlZ+@H4LK86o-)kH>s? literal 88196 zcmagFWq4Le5T;!%#}#)7?(XivErH+?NU%T>lHeBHJ-EBOySwYaU;~5O013{(KC}D% z+H3dQA2&}`bsuY~?sLN1sA|%c)Dcd;CiHzOLyo!{bre1Io68Bu~}?C`A3R z@W`;jQ858gD2WN^6xBO2E~Z;}Y@z?}{Ak~R{~8!K^FJH-e+&OF_kZhzf;GBDcIg-z z7yExMtrZ>_9@DMU|G5w?8Pz2wG`j2m<=}duk)i+RBOAv=p;_a)MMZ}8_o+9MGJ0ZcC<|KRYCE1r`){jbG?xnK6WLK^K251EDNv)N-7~V}V zlto!cin4~dvXKsGmC4h#ldBgYH}41%c_$FhJC!K!3}Sf~fF)oBSckHm&^;*IM|$2< z&~v2aeF*&<@kAW=oz#2=@q8&kW}VbwN^0h^*1Ii-c_XF{;r;^OK6C5Qi z-#L`uM*J_tpTT|y8`Co17x+Jk@-q_oZDks zH1rbb1@1u~gXgIC3X111@QFl$AEXqN#0nZj1#OZAQ@~FT8*N+=ZBQ@|@q$HBULIN< z)IkhwUND5rf<53Pp%#q8F{2Qh2&RGgIL}J3g|vbPQ0F{iNNffFB(>l(*dK@$;zWg1 z;)N{ODM=|506zyP0KX(C2fG5a3KZ8Zgtjl#2sDS^8nh!>s0)sZL0KQf2Lg<*LUW;u zp(_B!RiQ2L_oDtGaGKOYR}i~{*hA z2Os@j7=2zC?OnJF%A!aq+z0hXBQ_o}^mpM^U=94OIA#yZ4g$1);j7>l_zS#7>=W5V zutXFwi5GE+6-fq73o?;fBoFyTDv&IKYZt-u7HLLKk!aM7h1~~nEJa1eqV6QrT}`6M z2E_1uMGm3-C}J02Uj`51{{s?X|4Y0m+PkO(xNcF0MA4Mcbi|5c2`HK!nj3ZU!!8JL z?V^FG(+IH;&>DVw_+3#JNlMY)um`{%3Y`I6ggSWkqHEx90eevY1pG7LI`{*}yhNS% zus>n}!W=7>8k&xHvFxBQ{NkVjsl|{_iZwzR=2)>-B#U*1-yQyR=qxZFEJb_`VtDpq zXGtk`g|uR5+hR}2DE8m^lZY3`I$AspiQ*W?#Y@1({3%`oit`r_LU~^>72ur3H$ZXU z#W7Bc-$K1V;XeQvtHqIfO6bH&pp8o4JS8v}OH?9J0^^}X3)rnu9s?h9y~IMW3>*We z5WfPwgEE|}q(W3uCsERe;`vKrj+M*@EeMLC966?BHGuI}vH=v&U$PCfBg#ADIE;ak zgTN@*lcAVrCD9fo7lYOC*FrJwO74OlBDLfnh}{ME;Xfu;3jJQnB3>#LGz~!hEL9qm zBc)U=_zeM`sZ>|g=?(1QWzI ze}?`bR$2h$mC`ARm(EB^>739)@Jo^?T?00ru{7GRbVo8uW1CjG55P4`j|9^Z$Ms61 zJxgx_7r=G!CwPc5 zC&{uZ8D&$ED4QM>AYQfzv9cwgxPIA+u&V-$zp@QTDT`+=i*_#Ci>$IEq4U5}uofH! zXxp+E!FBLANCMx9m*XH6$OJHN$`vN1Tp55hp_Q@dflfK)Y8&n^ZE0Rq{Xz*l9_vl$Df9dEsLXsZ^G{O7)

^3D*Yl}8M(8v26ahP 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 AkpKVy delta 3959 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 delta 21755 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 M+52C;{o%;^f7$Cf;{X5v diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,3048,304A,304B.otf index 9756068614a84d0ec013f815dcaec6d76f81eae4..19c8ed86e97c6fa313d2feb5a35565915547ec4d 100644 GIT binary patch delta 148 zcmZ1=wnA)zx$GMT1_qAg+{A)}-KAL!3|ulm{)UXy#1!7Ho(B^{f)&pI1r*AFA{^UA z?HCxiS%7?%vfPpimLH6TKn-6up0H$-wmp~{&u{aUftmRQP@du95`jJteN)~%ZLwm@uxx$F}L1_qAg+{A)}-6by>7`SAB{1q9gi7C7mz10&#f)$Sd1r*AFA{^UA z?SKmY0Qo9qxg`}WKNt&v{5KmLy0N8#bUjP6A delta 141 zcmdlYzD9h4xoiOg0|Q5LZel@(aG?tW1J@KFe@{kgVhXQCZ}r5GV8sBSfI=Bigk!s? z9RmY*2avB)mRnN6a)FT-$gkLVVgs8D-<+qG@%%Pl8JL-002MG?Tq4j1qHmnFVB9=~ ZotasZ8OQ@+86e3BrMZA~%H$nfe*h+KAz=Uj diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf index d6cad34dc6c76a25871334703088e9acb0f856c1..abac3dd75a073de79bab2eec652ee00cc496f215 100644 GIT binary patch delta 149 zcmeAXm?AL2T=otF0|Q5LZejt$f7VG14D1R({+x`|#1!7Ho(B^{f))1w1r*AFA{^UA z?SKkC0Qo9qxg`~Bd5qJ6{3jbvSTM_+nX__tJipCX24?0LKm`mJmk9KM=$rE9X`5wO f*qIesfIMa(RsmuVI|j&O1oN30xIp~LHtZJw?h+#P delta 141 zcmbOt&?7LxT=ohB0|Q5LZejt$e^yBb26hD?e@aGbVhXQCZ}r5GV8ty!0fjQ42*-9& zJD`FWK)y;@Zb=1O9^-T%|IWq}7R)kd9ahed=ePOFz|0I%z;JPiKp%*{an^!yvkVJ6 Xvm`T+2f{Kyk`YRC0qKy*F6>MDE5zJ?1-~#a{Cvg7(0Br3cp#T5? delta 141 zcmaDNaYtf;xvT;M0|Q5LZel^#m5`kb4BRe2{+^7~#1vkO-s*`V!HPgWgF+clgk!s? z9RmZ81(2^&mRnN6lFhIN$k*6-B7t3Ik-YfTcz&C&49v_gKsqii5$FTaH_loxZg$~d YW|m|I@<3PyNHRicE+CyUIfMHT06*Fwq5uE@ diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf index 9a83a106dc43bfe6b5fee4e60563225f99a9d644..e586904fea43f1fce612abb9db9d33050a0b3304 100644 GIT binary patch delta 148 zcmZ3$w}Nkix$GAP1_qAg+{6L~8RK9E2DTC)KOrMEF@?9Q=fT8~V8tsy0fjQ42*-9& zI|c@J79d}xEVrbB1;_(x__OiEOeSfy)$`){ZN4%vGrs_dUR)y32cmDvo2PBAVgAje c2-3z3#411xV!Hr&j9@-90~d%tc>>!60QBP_1ONa4 delta 140 zcmZ3%w}5Ygx$GMT1_qAg+{6L~8KX}O3~VJpenduUVhXQCZ}r5GV8t^)0fjQ42*-9& zJD`F;K)y;@Zb=0TkO$;{*?3|mlk}<8LGk=HUm2L0Uw}j}E)nPh(KpUoFmA44{>>!G V4CH~Z43K1m(p*5=X7UWS2>@M#A_D*b diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,3048,304A,304B.otf index b2d477467c9185db3f6bed5e2717d57d649153fe..75f16131097863825a54b2b4d9bbc1924d3408ec 100644 GIT binary patch delta 547 zcmXX?O=uHQ5dLO&vxdz}(yplsYB5bW3xZPGLR+drr5G(eq{L8)_!pX%99&H?l;FVx zixowLvc>AHq8HIaVGAjU3VQIOhkyrrC=@N?(TjF-s`J3Zd-HuW@B7}&tbPh@WNO)b zJ_~_5RE&&fGD+*>&MyF8f!KKVd{5uvou4_ts&nq@WHxtJonwSUVZOrCZlOH;e4!6G zIK+IdG*c)>A3WR!;z{NMB~FA-Xf@VfWNw$-O4a(H>~MXG<%(OVUM?#%!8Ls5qhBw$ zGrdR0@+{Z}l&SKKo0Yvq$PZ*w$$4qmuucKp3Fh{^H2k92+)$e|1SX&mK+qHr(E+cn zbc7@tTiP8w7JQGl_K9>SU|bV+>r6W${0ur`*u-z_Q6~-41**_vdgm9ZLEea}dj+*8 zYN*&RZAn9W$aDL9RZ__R(I3+M)Ax7DzkBa3jYB6AR_gfBXpj`nEBVca8FUHfrG($i zAoU;qHG^*9JmYL6VFtEvUNek!m_b@Ns}c_Q)wP;BeEUgj?y251wj#}CA+|gb4c_zI zJRpyxFD=xUuf$LOfvU>op!uThk&K&1250@^dV<%HTS*y|CN$0&^hW8@xT^BueL>

%D}Q9!`J#O}uK?(XjH*2ng-TfnY!J?Ffi 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 GND}}dwu!0$ delta 4013 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 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf index c0a3c3427fea7d9de24c2eaab47692285d9cb913..7c5f648c399b45c0a34087320f9b0d47244f0a0a 100644 GIT binary patch delta 580 zcmWkpUuaTc6hG&F*XzH}Ii1c*-PGN=Tz{6fW^1|u-^3ZfB020he6PZ5Do4}%6h_PCem`n1k{IN$gCo!>dXbIwX#_r>)fl}@LC z!y+(W7)FF|)K39&p*Xj|Zz5^B8UPL!GYeNrkUU2kXa&;kOfeS@ zO{M|#loV!4cka&ZEJzKF%zIlEE~^_hFi;Ih&<0zu1H0(KQOwt~=s@MU;8m=QD=i_Q#F?aI zm@AKfXBmhzmi)jbfE#I45>a5HPSP8UCNsCRS=(*)4u`YTwP)`>x5wMn?ehnE(NvI7^2bU zQGGo4y7k7c`g!ne>#JQ2@ZdV#E8ep!vCXb}b#n}d@7G%87gE!-ZEmh`zO8VJ`pH4J zX`4#ra$o4GHTD-6`=c%2eA)g~`?tEI`FiZ#B(6SV7{FxX1H+GkUptUd$P^mBOiXi< S={IS-QI+r~u9h!pP5%KZHG)q7 literal 88468 zcmagFWq4Le5T;!%#}#)7?(XivErH+?NFWeMLK58FJ-9QtySuyVU;~5O013{(KC}D% z+H3dQA2&}`bsuY~?sLN1sAqMKYHVQ6WEM(cv7-C{K zVjV&n1=SKgVKFTS{?$A62#sMQ)Gfr+82AYh;h|wpnMnhPwxoq$Dgpt$JimbB6X55F z=n>!7j$|EB-k2z;Mvu_GF?p`TBsve&sL&qaMf28aN=)K--XbPCF8=puDu(Mxln3I?Iz<=i>YD{@>=ZqvL##rj$=w7j%!fS^{1&2n(6$}dR z(yM!D?0+SVzGnEEae|%sYbN$JGyj@Jd`&BVfQD$m zfZYG0@d%)pQ zVTGe(1ENt98_+4bS5$m#*YLPP|KIu1z5)L=FmC35Ht_!z{$K9@)(Hh`bdBoLF*H8z z|6E!tJSsf4Yp4HnAzCuJOKfON#Q){sdZAIF|K}qc$3~-BYxr{ zX!C+0WESiW9|^T!JdPQK*hDZ5%*T0FfX$>8+>biv5JO@s_$R3apTYh>tPm$Eq!KS= z!A?m^p#bV_zB*Olecu}->Q3-I}q7I3oDWU0z6~z)zG&?jm>g0!A5a8NH z15u|DVj-Y4{Pyr8P!>f>(O$6o!yW>i0bPVTc=n>J;co`JQU5sn)8HDog=1c#&U@G& zu>fI?6-y0GN4!{eP#Au3P=VB9$S1`bp$v1ZSSymnI>YY!v)m=BgBz8Wz+d$BX5 z6uV4XF|=*5r(_iS@BB%`i(?%vo`ytmjN{@ZU}OFiuK~sRiwB{+510yY&f@E#xbNZ^ zr^Rog-k`E2L1#OQHK0gh7pxP-;}{~l}Qdw4X~XmgJ&y~2jmB3P=-8G2K`^AHtdG5+knon zyOCN3xw}kX5@nFP%ZvaM5uc0lRV2%7B&`g_a+%|Zod=guevOPW524R+%zNk;l>a1I zRwbisDiUSWg960M79m!)1QgdVTM>3ufbmzh0V!qi%w^HeWqXoUb|iEjSPIsFLjY}C z_5!#D{su|lJMnTHqym`$=1sZ6q?9WIuqKqN4?4o`21RZvHwC&7tOV-;#zwil0MAkG zKEQd)VNRBNkGj8!m)AiWV&wx!EngTm@_l)4z;!G1 zhCdjLC01cN{7tYA5U=QfWTaHYvsY{eyA=onc>aob_KL{a6)_Jhu15JL5*2rVy|53G ztat)?9>?B*qTegxzAL_fz6WUcifEHc2C+&WNC7)7sg<&lQYkNdtRa=kl2@r7v=Nz= zx#L5UWy*L>2UNm0GazJXL~7t%BTG1-YRLo~a7vN|lAE zgYi>k1K0-kpgzu1*zHko7^&6AQ?lyFi`AErsJ2?))$gP1IrI(qPG*hd zq}0etq6YGDjnV+;tq}|#?OdY=@f!W1LrJYM4)u_GYb1bqL^YO^R$~L|Z6mA3G1Nnz zs&O0j9>IPK8~eK&U%^ijH5FntFiLqL<5GY1evoy(?m0>pk%|J`i zYKGysNR-9E?*)*TYYru|=0xH(r=k8lupD(ZBfbrKn3S4l!7Y^I9%^E~)O?Tlcanhy z>47Op1mgOESkD5n?gpYi1FL{Q*o{C}qQFS_v9OUF1N-7Qyj};6MQjp|M{W$nm<_~O z4cv$Fqllk^V$K9!gkFVWt_Hp&B@pv8@Dmxeu(z&d5!FgZtX3A{wXp8hDgwn?TB{1; zHBgQ{d@Ve4tu}~vgdKz92EiT)JAu?%Snq3Xg^he%Yd`EGBx~WiwJxB}ZN%>*{s=zu za;=Xj`$nubky0D;wRU>g*`Wo9*T(bKZV1}Jk3zf`$=ZWa597Y}1TY26L>cmb?QNvi zJ_7$Ze9WcVmq@Su1joK3R!0JjL>(83*Zn$qKz`VGt~wmBYir%X&`~(YWPtHocLDsxu-D;ujGwyO z5ZebE`MoaMweA(zw-LiWqV6mBNwAS~>k&~stVQ)KV)cA7>SchPm8^P2N!BYvqF!at z0I{a17lJyiNv+onv1r8lz(=mBHymXX0CGmXC15RLTcJCl$iek+{d)J|KZYWA)x*B7 z9SU!wXJsrAw3^)Zg?qhIUiCt1G|Y~;uK$h-9$6R(f!)^7_sfX;|@C#`;8#0QdH zAA8pNGr>ZD++Tk=bQLM}H^JTxux{1IJg$EY=Y9-*it;yzeI;sueRKoN;|A#W2DxBk z{x-lG(4Z8_2I%hwxNd_mQX2Gwjec%`b+f?~)LRI}`5PejG(hfafH~6OCE~B4|G@uA ztRco!L#$&Bk(V15fL(%Q!%9RAk>?uLfL#~b5VSz7E$T$T?g`?-K!9sC91oBW8m=d$ z;XcGLejB1c8)EO$@E*?b1pYrnjZzY86hORDArg%$fEw`YlWc^X*Qh1RasEbVw?PKL*ZjiHJJ*XH%E5`IU- z(GNkmW)Pk~s2Ax$*f#}@gFOkcd87s{1M6Vp`GfXA(eFWr!7qk{X98ay644SoW2K6EK5!D~&9AM3AS`*Yq9Ama=JJ?~wnnpn5;A5^g#W-m?3XH=! zFbA8?hK+t{dH@`Pjkam}0APMM#awKPzG?ao>SByG{Y`2!n|L#yWV5tTd=qMx4VoKT z6j~Bmfv6ewe9fxC$GmJ7gt{$BG;5DoIBcvd%`hLE%>v8eZ$#Nn)H^^%vop|}D1VH) zxPG%&@RPuIVj&9g5X_5^WB_9_q%f%=6=36;Ljqx=y+g3q3F!{I7r^=)g6o9LLY;*G zIW1%*V%tfEVElz3hll(PKEwY-tT`v%+=Qkey?JKXIf$C)C(*nFVzuB0!w&&5@G))M>Cmi1ucTrIl*%jf@Q&3A`;=A~Ypn{B(hBEqg?!Yi7HO?Iz{mSgs|0|xv(*YRTW!HHyGXV= zhVxv6-h=-L_Dk>{b+Bf(W<;%3Vy#n?Xq^d~4IsC*4gsx5whl#k9O_L0m@}@@<4{RdcyV>Xc1 zW*782eB|0TPXKaE8;t2TSlilsg^h977Gt_?N}{%D0q&=50ExD_iMK5Xs*`M659Lh( z)}OYR&uu$GF{j)10I{UB9St21kXPE`{i!Ybwe1qH7Hoizc4>=w)%G%MuHtYhXKk3u#veHgbNu#-Ic2Fw}`fJRbDN zv17nw(%Yeb+AV^OvDFUqy4_xY{%MD?)edW4yO#iYw%tcu_d8L0jd**Eul9JaX`hE= zd#p3<%K_|{+M^%Zhalb>8VbU}AjHw`?JD@E$g<*8zPSsu2stH>FTqBeW1GLp-z=v>p_5G8A(% zv^$7H9qds;@f{&_E{Ra=`$E^j-VXMl{zY&fynv6q5sLGN{vg&7bZ!ZDpLL!W@xq=cb|7c?_HLa6;n#&WC$)1JY|P!xBj96y-FXsh zmUYfo=o)P!I3MUC_T>uEBl^FkU0juMt>#A_{;) zu<<+*&>aBzC*mN$vqYRE5rG^W z@euwykVw3%B(E&dti<4fw9;F zW3k5~u$-s|+N8%?QhV%%y%&EzJdOA{a0xzgXb+6Z9zS9KB8tM^G%5v1Lo5opJ1Psv z4)TB^pbW||zoKeFF*c*>k`{$|8-;}(f5oJz&M1q7-xKyg=uj}8L=@KBs1=CeTUFFH z`1=vZ--x1aA%^Qmp}(Wv5R2AHMq^(PogQ{3*g2s2h@$ac7Tp?l1Q-N{AvP8|199Yr z=%rvaV(Xyz#u$xx5dDHg^k;x)i$<=F!G0{pASEU>QA`$)8?h3gI^xKqG0hOeJ9JDO z?B1{k0knV2cqnp3%w7^PSa)L3w=r1vVz4KOc?$at&Y1-L0>IP`VgbDSINbR52Q#xtULmt=eh7q5Gg0pm)F*;=QnL^}-&z7w)-NVSu*oh56kJYksdlP>-x$*w6Rs zh#1y`UOiy;~#$kKLOA{OzH427tEjoeShA zy*JvYcX`+~0mf)=%)#Dh@7}XeZwc(Ju(5CLeGv8qa0T2%>{kqSS)zVeKl)+)=+}T)Ka972*hlt5yY`EQJp^?z*7{8b$U*&<1LXLAJ8|p*DB88( zad4WHez&2xe!oZH70N%5)n6s0e;Shgkt6%(1_g-qFA7Dj>t6$9Sg-mwgWm?)0bq>x z9}GsIY$6o7um55kkN4pIn~C?|4K9Ow0Q=Pb_)gpZGwff)2Ph;4pg#xXAawxRdq7E0 z4t{0$`0hRcb8|ox`~lFRD8rs~z$7U4#RG7S0jpteguN5G7ocATpnnJ41dmbvk@!I5 zoq-0)fyn{#+Q6Lfajk*HNDM3syAr5Q%0R611DnCdcpr#<9ypM+f#VUI4u3s-tZM`D zECaCy47^C{z}v7fe+RyWkNh+6E6G7v^9I?(1|e?@!rpaI5~+jmt}@ssHaLLfV9bxf z`2hBJgRu?{E=GKCY4{jtgBzl}DeM-YJ$&pl24f#S7=1YyeK{EKBZHSfR{=cp;9WTW zAoL{stGEW%xWO3HgTIq91b-7Al9SjF?C*w@BRQld*+be84Z%inNH}6WP!d=Oy4Mjd0+8TAx zZbOm3hhpsNYt4GO@Lw?4#oG!p&Oz5agMX7a~bwMfblo>!%=4`bQ5CRiH7Zh9)^D&JOQu4d(`<#`tZyo zhT~krixMARnv~(l)x%prJHU?ty-+q3Iv$z;(B8vw?%}He`hNIf#7+U^q~Q<98vYiF zwi%9jIzk7@iH%4NvXVLi-}go!XOE}?ke5batsc<;b?^>6A_6|zf5cEQ0zUTGBXGSD zb5Onzx`LDuo4{^xjr0)@5POcYx3IqvA87*YVMbOVePj?6V`XF*!2BPH=NQ?S#7MkT zjT}X6x3v7(fQB|R6 z^HGfv!?+yP9z>HmY9JJOd(>2bcf(Ozp~x?zjzKQ~%#BfK|50e0(JG12si6TNC&|&6 z3J3>}8~l-wef=8~>iv@jr=8 z$O5n*oPc#^LJ3e2b_i$#yCWD5#*#T1?zZ3OV`Vp1CtlVV_x0E>Kretxu&)8^JtqB$@)uC7ag&f+CVeJ08SC5Rey4XrsyaHZgfI?DYWeGLyGM@!XS7pzIuctkILP=1hJL zUIBa`nT#<%#Ro+I#^RJ_0Q^kf_u-`#H5ud?`&2T|-kQx*K6%nsS%8Vwko0FK)7dno#8R*9u zXp0$W^BKzk#?cI{5i_uFoq=^?#u3!TT%3V9G~+(v=+7B1!5fk@uveOa^)A66mXMry z0@@`3<1_*L*#yk3gsK2zJfSwpgvLE;_GvTm>@#nn4szPe zmjK`IXA$vPSSM$tf}-zc6@*=qlv#CPH-sGo8+l z?0~-)dJK9JbuL41kerS2Ivag5doj^$^vP`0osGJ)4?~g9X5T}dk0j=xf9IqoWllLL z^2wY)vgTmi%xMiD@6mI@NY05QV-9lk9OSn-_&fI;Tz}3~*bAY55Y1TudkyRjuyKt! zd%-0f_W)qt&cXjBoP#_*=PSzbjy#u$&20*>=a}0bgoCam=0+2rI}-Ldlr4dc_M5vK z{%LRxV0_Mf0Nx<}5sG)kx#+)n=)ZZGTk}ld63xSSotF-Zd^9g7$PK?biFugc^E#p~ z=EJ;kuooe|6kwk_ZyRFgVc$gj0qh^d<{QN4CxfOZnx6@Fc4!`G5m1Wc{Awt}+A+T~ zDf44Uoj(aa&N+W2$~K|yLDQFKCRi5X8|R3&IhPgdYpPKkNj=kUtkJ#Ieg^KS1mWct>oZLi)lKBo^YG zW+B#^g;;AAmL+9j5ES!gVHg+(rjoXB9&{N%8!SX#*@JiIJ?PV?_&?51j}tvb`#(i4 zev0+r=@n9*-bNYT-JiaqG|vP%&ys^2M9(m9pW*(W6$h2cdhHW?KY{4|RImu(JL-qD zBtB#!_8|avHfSzr9*~dJ4`|a5_)hqtD*PIt7N|p6K6E4FLoc#FjG(k17E|TKVqN!5$F3DK-$N=Q2gK6kHyLPSPkVhN&VP>^pD6@AMq~o5q<&8y z_0g}1@uVhV?j{Z;D{&I)C7=%GapDr_N|a-LPFx3nBiKTA;vwiU9FH|F5q*@1cltzp zTS>&|7 z70$C3x(#v6>7>25?osFoa0YR-WzrQglJ4Q!ugOaKO4=t*_9q{Tx%?>uz;}+%DJc18 z+}kg-(XZj8{F+S7em$d(zw46s`w%(5FH#CY*nlu%l9H*EK~iUY0+xgZ?kNe~-doZv zBt=O(iFQf)O!PytGn`!@_F3@y#2X79OuVV!*avMA9Ig9^=U5|iY@{3qd5*^-$9tap zypsDN<$kHCWl<|$fsnK zoKjFqN=2zD4W*@Yl%6tBM#@B)DGLQqR?0@%DF@}GT$G#g;ED24ekwo(sSp*WB2*N= z*C|dVs3eu5(o}}ZQaLJ56{sRrqRLc-s!}zoPEDy9HK!I7M&W3ME)+psX%6!5Jep4n zXdx}4#k7Q$(lYvkmeUGaNvmizt)aEFj@Hu#+DMydGi{-*w2ijY4z$=V+D&_CFYTlK zbbt=hAv#P)=qMed<8*>f(kVJkXXq@Q!*7i)&_%jLm+1;!rEB=D(+#>wx9B$Ap+D&^ z-J|>TfF9Cc^oSnQ-}Ho@(ldHaFX$z`qSy3>-qJhzhu+f%`bdeCM4!-CU+61+qwn;C ze$v163%>#){LqLq!6Z|d$~2}kgPF`?HglNEJm#}xEICWTQnFMmHA}p{yh8#KKrO>&&{a2-cN#W09;o>%pQ}G>c(9SuBgg@0@zE z-mDMn%lfhYYyca`2C>0x2ph_VvEgh48_7no(QFJG%f_+sYyz9eCb7wE3Y*HNvFU6E zOJFncOR3px4x7v7vH5HPTgVo%#cT;%%9gP|*mAaltz@g%YPN>0W$V~_wt;PAo7iTy zg>7Zq*mkyq?PR;yZnlT*#V@Y*vjglPJH!sNBkU+U#*VWS>?AwIPO~%YEIY@}vkUAZ zyTmTDE9@$}#;&s)>?XU#ZnHb=Pj;8xWB1tu_K^L>9;wDA5?K=a#6Ghx>?`}mzOx_fC;ONEV!t_Y#yJ;Ua)qm0<2pCE$t`Yk zhr8V4K2OGz^AtQKPsLO7G(0U&$J6r+JR{G+rg~9)_A7x0CA5ns%g@TGhi z|AQ~*EBH#jim&Et_*%Y>ujd>1M!tz}=3DqyzKw6^JNQn%i|^)p_+Gw`@8<{jL4JrI z=12HZevBXIC-_Nzil63Z_*s6ApXV3&MSh82=2!StevMz}H~39{i{IvV_@DePzsK+M z2mB%b3)%HC|C>MIPx&+coWI~N`78dKzu|BBJN^%U&p+^wJdr2yPy93g!oTuw{5$`_ zfAW9%FaBGQV1f%Fq)>z^G@%Pan8FgaaD*#7;frJWic})CNF&mUbRxaTATo+f zBD2UM0z_7kO=K52L{5=QRgL4=BqqLT;{;i9wXA|gar(M?2(?xKf?644??^c1loPQ;5|qPOTH z`ig#{zZf6}ia}zq7$Sy>VPd!#Ax4T(Vzd||#)@%byqF*+ib-O!m?EZ%X=1vVAriz) zF-y!AbHrRRPs|q!#6q!1EEY?|Qn5_@A(o33Vx?FmR*N-atym}4iw$C<*d#WKEn=(K zCbo+mVyD<8c8fh?uh=K{iv!}II3x~>BjTtyCXR~};-okwPKz_*tT-pmiwokSxFjx% zE8?oSCa#Mc;-5uf%KdM!Xg8 z#6RM__#i%tM3E#uiO=GT_$t1M@8XB}DgG6|#BWKGNiKzyQjx0Eq%I9i-7LWyH zAz4@!kws-OSzMNoC1ojDT9%PzWjR@1R*)5CC0SWkkyT|iSzXqUHD#czC2Pw%vaYNr z>&phRp==}@%O)~N2Fs?hnGBK5WeeF-wvw%78`)O2lkH^(87e!Q0 zE9EM=TCS06)5TAq<-%DeKOye}Wfhw?A^ zNIsT-%O~=wd?ugE7xJZiC11-o@~wO)|B>(I2l-JZ$|U(oewJV4SNTnTmp|lB`LFyX ze=DRgg)2glilV5Brs#^Hn2M#?ilexSr}#=TCApG9NvWh#QY&ecv`RW9y^=x6sAN(y zD_N8PC99H6$*$y3aw@r$+)5rLuaXbHOfH}lR0=7Dl_E+}rI=D&DWQ~9N-3q4GD=yc zoKjw?pj1>UDV3EfN>!zrQeCN`)KmhMT1suDj#5{tr_@&(C=HcHN@Jyo5~KtxO_gR! zh|*kXp|n(5DXo<@N?WC!(q8GHgeo1CPD+>(u5?zqC=p6mrJE9|bXR&PQA)HDqx4i_ zl{h6{>812m`Y3&seoB93fHF`SqzqPuC_|ND%5Y_bGEy0(j8?`dW0i5rcx8ezQJJJn zR;DOZm1)X!WrmWV%v5G6vz0l@TxFgzUs<3mR2C_Vl_knjWtsAavRqlAtW;JhtCcm% zT4kNGUfG~*R5mG_l`YCvWt*~H*`e%Ib}74+J<48XpR!*$pd3^VDTkFK%2DN*a$Gr~ zoK#LJr>E^Ub&!LR4yr(l`G0s<(hI`xuM)tZYj5wJIbHRUFDu~UwNQBRQ^&P zDUX%El_$zm<(cwad7->iUMa7YH_BV(o$`O7_Vrp@yWskPNQYF)LST3>CTHdGs_jnyVOggnI#?Z|4poP#!_^V$NOhDtS{WD`8ES$$Q=O&GR_Ca5)p_cCb%DB2U8F8nm#9nCW$GX5a&?8eQeCC4 zR@bO&)phE6b%VN5-K1_-x2RjyZR&P)hq_bUrS4YusC(6Y>VEZrdQd&29#)U2N7ZBM zarK0HQaz=fR?nzs)pP23^@4g)y`)}Nuc%kmYwC6NhI&)IrQTNWsDG+=)qCoF^?~|O z{Y!nMK34x$pQumOXXObmx^@I9RO;nTAPwHp&i~3dlrhZp{ zs6W+z)nDpwjWnilO=wb6G*#0yT{AROvou?CG*|O9UrVMX*HUOHwNzSaEsd5|OQ)sR zGH4mKOj>3wix!||)v{^XwH#VbEti&C%cJGh@@e_C0$M?>kXBeLq7~JOX~ne?T1l;x zR$42gmDS2=<+Tc0MXi!nS*xN|)v9ULwHjJYEl{ha)z<20b+vk0eXW7kP-~<$)|zNR zTCmnsYo>*0&9xR@@|X^~oYt%nw+ zMQbryPc2r9)8e&WT5qk7)>rGN_16Yy1GPcgU~PytR2!xZ*G6a~wNct=ZHzWn8>fxe zCTJ72N!ny>iZ)f7rcKvoXbIX(ZI(7$o1@Lu=4tb_1=>Pwk+xV{qAk^yX@6+TwH4Y* zZI!lKTcfSj)@kdt4cbO+leSsgqHWc-Y1_3O+D>hkwp-hy?bY^a`?UkwLG6%sSUaK} z)sAV$wG-M&?UZ&}JENV|&S~eh3))5Pl6G0UqFvRlY1g$I+D+}2c3Zon{i)s6?rHb6 z2iimJFYS@`So>RhqCM4~Y0tG6+Dq+~_F8+Rz17}n|7h>E586j9QA^T3X`i((+E?wH z_Fem-{nY-|erdmT(wWY6p-WxSRbA6{-Ox?l(rw+*UER}tJ(-?dPobyOQ|YPoG6!H`dVro)&!%VBbLctsTzYOjkDgc0r{~uT=mqscdSShYUQ{op7uQSZ zCG}EzX}yeIRxhWQ*DL51^-6kWy^3B{uclYmYv?ugK)se;Td$+n)$8f?^#*!Fy^-En zZ=wh3!Fp4@nI57y*IVc<^;UXoy^Y>hZ>P7{JLsW$N4=9CribgD^)7mZ-c|3WN9x`6 z9(t4>t;gs+^;kVlkJo$Yz4bnNU%j8+Umu_k)CcK<^&$FDeV9I6AEA%bN9m*WG5T12 zoIYNkpik5%>67&-`c!?IK3$)oC+IWvS^8{!jy_kPr_a|H=nM5l`eJ>FzEoeP|Di9} zSLiGCRr+dujlNc2r?1yH=o|G-`euELzE$6*Z`XI|JM~@qZheowSKp`a*AM6i^+Wn$ z{fK^4Kc*koPv|H0Q~GKBjDA)>r=Qm^=oj@%`epr!epSDwU)OKwH}zZkZT*h^r+!zz zr{C8f=nwV3^hf$*{crt={#1XaKi6OAFZEaYYyFM>R)44eqrcZb=pXe&JxTwhf7ZX~ zU-fVLcm0R{Q~y{0rT;d_U4bSk6WJYo$g^|)oWu!LJ z7-@}kMtUQIk4m_6f_DMg^eOcQKOhq z+$dp`G)ftzjWR}AqnuIRs9;nyDjAiHDn?bKno-@TVbnANjao)+qmEJ6sAtqS8W;_Y zMn+?!i4kN38%>R7Mu^eeXkoN8S{bd4Hbz^cozdRtV1ybSjZQ|G5pHxgx)>2gSEHK| zX>>Pw7*R&F5o7c;VvRT>-solYHu@NSjebUdV}LQx7-S4Kh8RPQVa9M{gfY?>WsEk) z7-Nlb#&~0bG0~W0Og5$%Q;liHbYq5*V9YdT8MBQ!#$02bG2d8VEHoAwi;X45Qe&C% zhq2sPVXQP(8LN#o##&>YvEJBVY&13*n~g2TR%4s7-PmF5Gao)IKTr@5jmyIjNRpXj*-MC@gG;SHUjXTDl z#$Dr{ao>1gJT(3?9vP2~zl|rxQ{$QO+<0NUG+r66jW@CFsgMl+L{+00@Fm|4wiW_B}&nbXW=<~H+~dCh!gezSmC&@5yYHj9`= z&0=P8vxHgFEM=B9%a~=&a%Oq6f?3h5WL7q-m{rYcW_7cMS|{) zU^X-xnT^dRW{??dHZ_}>A!c*4h1t?16Mw!uOjM>wSHRH^9vzOW1>|^#d`t+kU7{KVh%NjnZwNy=16mt zIocd!jy1=bidHK&==%^7BbIn$hF&Nkd$^M-lTyk*`t z@0fp@cg=g|ee;3&(EQ7MWIi_kHlLVJ&1dFw^M(1+d}Y2i-`p8lvUa)W0keaS>>$?Rz<6lRoSXyRkf;F)vX# zR(-31)zE5WHMW{qK~}KU)M{phSk0{#R!ggu)!J%fwYAz=?X3=0sMXQxWQAGbR%fe= z6=8L?x>=D{cdLgLWkp*tR!=L|inHRaURH0bkJZ=eXZ5!RSOcv=)?jOhHPjkr4Yx*E zBdt-^Xlsl$)*5Gxw^WFv+G1_BwprV)9o9~3m$lp4W9_x} zS^KR6)ymZZx?)|mu36Wu8`e$h zmUY{@WBqB}weDH>tq0aa>o4n(_1OB`dSX4bo>|YW7uHMbmG#GufH#EOvmM)y`&Tw{zGz?Ob+lJCB{$&S&Sh3)lti zLUv)hh+Wh!W*4_h*d^^!c4@neUDhsVm$xg}741rPWxI-9)vjh&w` z*R|`}_3Z|BL%WgP*luD6*}-;GyO|wgH@92ZE$vozYrBoz)^2CFw>#LOc1OFD9cG8y zo$W4mgx%HdW=GoH?H+cN9c{Am$YBn5gd-irQ60_E9m6pl%ds8DaUIX` zon%gOCxw&JN#&$=(l}|IbWVCFgOkz8HR5ayhx3JWgIGpOfDy z;1qNUIfb1fPEn_rQ`{-xlypitrJXWPS*M&+-l^bJbSgQOohnXMr8f1UpTgW=@FH+-c#obXqyBoiEMJq9i2{2 zm=o@FcDgtbPFJU!6X|q!dN@%|v=ig>bYh)2C*JAh^mh67?mc7`}Z zong*!XM{7-8Rd+2#yDf0an5*Wf-}*XXo-^NB z;4E|&Ig6bo&QfQY^M|wCS>dd7RynJkHO^XRowMHA;B0g@Ih&m=&Q@oev)$R@>~wZH zyPZAGUT2@P-#OqMbPhR(og>as=a_TcIpLgiPC2KYGtOD(oO9l};9PVrIhUO)&Q<4{ zbKSY&+;na^x1BrApUz$9o^#)M;5>BxavnL4oxhzY&Qs@^^W1siymVeUubnr}Tj!ng zkMrL7;Cyrvoh0Xz^V#|0e09D#-<==MPv>9fm-E{tm$}>(u5=Ywbv0La4cBxn*LEG( zbv@U2lex*=6mCj4m7Cg4Y;JZphnv&Q<>q$txOv@t zZhp6bThJ}!7IurcMcrajjAtGHF&YHoG6hFjAO zbZfb_-8ybvx1L+yZQwR^8@Y|$CT@@$>^60qxgl(vCkGMzOWA1VHgnQCG<(_uWxM$sS?s@lud(pk*UUsjz zSKVvwb@zsQ)4k>1cJH`&cXJkzs0 z+jBhE^E}^6<|X%1cqzS9UTQCmm)1+?rS~#;8NEziW-p5u;AQo)dD*=jUQREUm)pzZ z<@NG;`Mm;OL9dWk*el`{^@@4Ly%JtYuasBXE8~^*%6a9z3SLF8l2_TQ;#KvkdDXod zUQI91tL4@9>Ued%dR~36f!EM$*R%b;a+F2ix=T_^}2bHUU#pD7v)8JF*w|N26zL# zLEd0*h&R+5<_-5ocq6@0-e_-(H`W{HjrS&a6TL~^WN(T$)tlx`_hxtr-b`mc+0&N-b!zkx7u6dt@YM<>%9%$MsJh1+1ui6^|pE2 zy&c|8Zy&K+5@0NGlyW{=o-SzHy_q_++L+>x|k@wj9+k4_Y^`3dpy%*j~@0Iu3 zd*i+J-g*Cc@4XM+M=#M!@;-T=y)WKZ@0<7C`{Dic{`G!&zkTwV&wb%bU-4C6^L5|w zP2ciu-|=1F^L;;=pWIL3r}R_#sr@v5T0fni-p}A?^fURH{VaZfpViOiXZLgXIsIII zZaJ-`H>B2l>H%Q@@!X;y3qO_$~cbervyt-_~#E zxA!~vp?*idlON`X` z-{x=kclbN~UH)!=kH6R7=kNCq_y_$%{$c-!f7CzbANNoAC;e0YY5$CW)<5T;_b>Pt z{Y(C3|B8Rrzvf@}Z}>O;TmJuO@2;Zj=Jf@E?<7syCTSZ>mPxiH+cKog%*@Qp%*@Qp z%*@Qp%*@QpNt?p#e&0FwoO{-NnKf(XWvsnq{e_l)*}p+E|d%75^>>N1ecgg!X@P*xhO80OU5PVQgAUG#{mv< zJcl@e6FG^KIfcWV%4wX=5sq>OXL1(DIGb}gm-Dz-E+v(sJpz^jromBbSNG z%w^%Sa@n}-Tn;WLmy65I<>B&j`MCUC0j?ldh%3w$;fiv_xZ+$1t|V8AE6tVR%5vqn z@>~V3B3Fs4%vIs4a@Dx%Tn(-!SBtC7)#2)L^|<<61Fj+0h-=I>;hJ*IxaM37t|ixs zYt6Oc+H&o<_FM<9BiD)R%yr?qa^1M@To0}%*Nf}T_2K$*{kZ%zfd$ z22b~l=e}{@xdiS9_mlg@{RROL0zyF;NCd(`1V{{$fTSQ2M1g3K3?v6BKn&mj01)s1 z0Rf0W0y0nl1}e~i4hW#Y04A^i12%Ag3p@}DQi4<9>f_xx9C;$qALZC1x0*ZoSpg1T2N`g|LG$;egf^widr~oR0N}w{R z0;+;)pgO1lYJyszHmC#Yf_k7nXaE|5MxZfh0-AzmpgCv(T7p)fHE09cf_9)i=m0u` zPM|aB0=j~3pgZURdV*e{H|PWUf_|Vs7yt%>L0~W#0)~QNU^o~7MuJgbG#CTMf^lFx zm;fe%NnkRV0;Ym#U^NPHFyKwf_LCO_y9hFPvA570=|Mc5D&hA?;rvE06)Pm@EZnT2n>Z`FcA!g5il`K z0+Yf>7zLwYGMF5ufH9DR07A$^1O+HU3Cd7`7^+Z%IwX)n1Deo+4BF6vF7#k5ObJuL z)G!T93)8{$Fayj8Gr`O-3(N|$!R#;x%n5VB+%ON!3-iJJumCIw3&Fy$2rLSV!Q!w4 zED1}&(y$CH3(LXsumY?IE5XXJ3akpN!RoLEtO;wu+OQ6+3+uu9umNlc8^Ok~32X|R z!RD|9YzbSz*02q13){i=umkJ}JHgJd3+xKJ!S1jJ>Db=3+KW4Z~3H^I$t3)~8~!R>Gd+zEHV-Ea@w3-`hO z@Blmr55dFm2s{dp!Q=1*JPA+1)9?&D3(vvx@B+LDFTu<33cL!h!Rzn_ya{i?+wcy& z3-7`E@Bw@XAHm1)3498l!RPP=dU_AT=zrzIh z1O9}+;BP*_hw!0%7@vp_=Og&Ud=fq>AIV4Y(R?yKIiG@$;W-}gkmq^C3%tlnyv!>+ z=2c$fb)N8)H+Yk`c*fhj!@Io4$MPxpRD5ba4WE`z$EW8r@EQ3`d}clipOw$XXXkV9 zIr&_CZaxp6m(R!N=L_%!`9geQz6f8GFUA+=OYkN6QhaH?3}2Qn$Cu|T@D=$=d}Y20 zUzM-MSLbW+HThb6ZN3g)m#@dy=Ns@1`9^$Wz6sxyZ^k$0TktLUR(xx|4d0e;$G7J@ z@E!S1d}qE3-<9vicjtTXJ^5aIZ@v%Tm+!~-=Lhfu`9b_(eh5F5AI1;oNAM&0QT%9r z3_q41$B*YH@Duq-{A7L#Kb4=xPv>XwGx=HkY<>Bq%A0L{TUjB}2(k3KWAl1Q0|#LP$U&l8}rPgprCg zq$7eTGLVTZ#E^{~v?v`)k20W)C=<$zvY@Oe8_JGypqwZd%8l}% zyeJ>aj|!lIs1PcQilCyX7%GlRppvK*DvipZvZx#?k1C*ws1mA-s-UW<8mf+Jpqi)_ zs*UQPx~Lwij~bwcs1a(6nxLkr8ETGNpq8i=YK_{Uwx}Iyk2;`^s1xdpx}dJ88|sdF zpq{7~>W%uKzNjDSj|QNDXb>8VhM=Kn7#fa7ppj@48jZ%Fv1l9`k0zjrXcC%?rl6^4 z8k&w~pqXeEnvLe5xo94mj~1YXXc1bBmY}6*8Cs53pp|G9T8-AAwP+n$k2au7=aUj00mw^f*^>3B*=myU_li$K^KTX1w$|eOJIU6ID#v9LadNdNF}5e(gd4+sJexZO+P$(o67K#W(g2SYBvclv2vvn@LUo~rP*bQS)E4Rpb%lCDeW8KSP-rAH7Mci6 zg=Ru?p@q;=XeG23+6Zlhc0zlhgV0gvBy<+K2wjD4LU*Bu&{OCo^cMOEeT9BPe_?=yP2dxd?%e&K*{P&gzU7LEuEfI3=7G&Io6PbHaJyf^bo|BwQA* z2v>z`!gb+>a8tM?+!pQ#cZGYxec^%dP0agAHq-Jm+)H*h#_LA7$znX!^H?Ov6w_mDn^P?Vzih{ zOfIGnV?<5_A{2QMiGnDKk|>Lch(%S@L|r5z6%El8Es=?~=!mZ9iLqizF_oBFOe3Zh z(~0TD3}QwxlbBh|B4!n{iP^;*Voouam|M&v<`wga`NaZaL9vinSS%tI6^n_*#S&sk zv6NU^EF+c`%ZcU13SvdEl2}=+B32cviPgm#VokA@SX-Vo$M`*jwx)_7(ey{lx*| zKyi>bSR5h_6^Dt##S!92ag;b(93zeu$BE;`3F1U?k~mqMB2E>jiPOay;!JUtI9r?} z&K2j0^Th??LUEC}SX?456_<(2#TDX8ah14QTqCX(*NN-J4dO;|lek&jB5oD8iQB~; z;!bgwxLe#K?iKfm`^5v|LGh4ySUe&g6_1I>#S`L5@sxO4JR_bJ&xz;73*trbl6YCX zB3>1*iPyy&;!W|Ecw4+9-WBhO_r(X|L-CRLSbQQr6`zUE#TVjB@s;>md?UUU--++V z58_AhllWQuB7PO)#CY+W_+3m8e~3TDU*c~mAcaVwQkaxT3YQ|J#8MI|sT3(iNzqa= zDY=wFijg=8NKoP>BngrzNs=rn5|&g+lXQtlR5Bz}vLq(ik|Vj2C&fxBrBqUCDUFm? zN++e4GDsPvOj2ekiXL1id0pqCRLYeNHwKeQf;Y@R9C7e)t4Gb4W&j>W2uSM zRB9$Qms&_IrB+gFsg2ZDYA3aqI!GO*PEu#7i_}%>CUuv3NIj)qQg5k`)K}^!^_K=n z1EoRIU}=anR2n7?mqthh8YhjHCP)*dNz!C#iZoT4CQX-SNHe8b(rjst zG*_A@&6gHP3#CQUVrhxAR9Yr2msUtCrB%{uX^pg2S|_cSHb@(#P10s*i?mhRCT*8? zNIRun(r#&wv{%|E?UxQn2c<*OVd;o;R5~Udmrh70rBl*r>5Oz%Iwzf%E=U)pOVVZO zigZ=FCS8|qNH?Wh(rxLEbXU43-IpFn52Z)aW9fomtIIOrB~8x>5cSOdMCY? zK1d&>Pts@Ui}Y2Blj5as(swCA`XT+4eo4ROfE*%+%3*RMIb4pA6U#~Dq;jMjB}dE2 z1Q`wMB*^-%T%Z}{Io*XNulvBy6=7nBRhh2eAWj5$+zV@@?H6!d|!SbKa?NIkL4%wQ~8d{w4ob0!oMys)Q+tlyD_NNvtGMk}8o(loG8Z zQ<5twlo*9mfC3d>L5iS=iloSjqF_Z;G(}g4LKQ~-4m2ygXrGipXsiag^swh>JYD#sbhEh|hrPNmHD0P*3N`0k)(okunG*+4@ zO_gR!bESpSQfZ~MR@x|Sm3B&drGwH@>7;a4x+qR;R>mk}m2t{=Wr8wMnWRisrYKXDY07kEhB8x`rOa05 zD07v0%6w&kvQSy1ELN5%OO<8Ha%F|GQdy;}R@NwMm37K`WrMO&*`#b%wkTVbZOV3K zhq6=IrR-MrD0`KC%6{d5a!@&>99E7fN0npBapi<^QaPoZR?aAAm2=8@<$`iixujfH zt|(WPYsz)yhH_K6rQBBTD0h{6%6;X5@=$rCJXW44PnBoNbLEBdQhBAkR^BLYm3PW} z<%9B3`J{YSz9?UnI3-^BrhHctlpo4Z<(Kjs2XF`u#bG!R4#yEVF;0S$;z%5Yqj55v z9H+oBn8N@=%wvQFEMf`ESiu;pSi?Fdm|_E)*uo6k*ugILa4b%VQ{mJ&4Ni;G;q*8I z&WJPN%s30qinHPDI0w#&bK%@L56+A8;rzG&E{F@^!ng=7ii_dmxCAbVOX1SE3@(ey z;qtfwu81q)%D4)yimT!3xCX9?YvJ0s4z7#q;rh4%ZipM<#<&S?ikso)xCL&BTjAEY z4Q`9u;r6%#?ua|#&bSNiio4wTs$S z?WT5Dd#F9tUTSZ(kJ?x5r}kF|r~}nO>R@$SA??x>Q}JE>~BmE7eu%YITje zR$ZsAS2w5|)lKSVb&I-H-KK6=cc?qnUFvRikGfagr|wq|s0YS6VWdQ?589#>DO zC)HExY4wbHRz0VlS1+g+)l2GS^@@5`y{2AQZ>TrbTk37~j(S(Ur`}f|s1Mag>SOhZ z`c!?UK389;FV$D-YxRx#R(+?wS3js9)lceY^^5vdjZ@>*Z|Zk7LH(irRDY?zwSX3) zg=%41A}w5t&=PA&w4_?37NtdN$+YBJ3N1$CG@wC^*N`S?q9$pwrf67GHBHksqEXGz zOwH1mW^0b-YMvIWrPNYsskJm(S}mQHUdy0m)G}$AwJcgzEt{5I%c14ea%s7>JX&5Y zpO#-MpcT{#X@#{ST2ZZ-R$MEgmDEaUrL{6zS*@H_UaO#0)GBF}wJKUwt(sO{tD)7@ zYH78#I$B+=o>pILpf%JQX^pieT2rl=)?90$wbWW^t+h5!J13dTG72K3ZR`pVnU+pbgXpX@j*P+E8tnHe4H_jnqbIqqQ;GSZ$m(UYnpz z)Fx?@wJF+EZJIV+o1x9rW@)pvIoe!po;F`wpe@uEX^XWb+EQ(qwp?4Gt<+X&tF<-S zT5X-SUfZB;)HZ3GwJq9KZJV}T+oA2$c4@n{J=$JvpSE8+pdHi>X@|8V+EMM8c3eB5 zozzZgr?oTMS?!#5Ub~=O)Gle4wJX|H?V5I7yP@6GZfUo*JKA0Co_1e*pgq(cX^*uh z+EeYB_FQ|Rz0_W5ueCSYTkW0pUi+YZ)IMpSwJ+LNEl!KqzG>gJ1nr0RQ~Ra;)&qKo z9;%1wiS%$iLQkwG(UaEVxr`FTxY4vn^dOd@lQO~4j*0bnY^=x`}J%^rC&!y+q^XPf? ze0qMpfL>59q!-qU=tcEndU3skUQ#cmm)6VZW%Y7;dA)*OQLm&|)~o1M^=f)`y@p;> zucg=4>*#g$dU}1mf!fId(kqz~4I=tK2k`fz=OK2jg0kJiWNWA$%=je0wdHQ^Pfxb{*q%YQ&=u7ow`f`1RzEWSMuh!S- zYxQ;ddVPbwQQxF**0<e) zeo{ZBpVrUlXZ3UXdHsTZQNN^L*01PS^=tZd{f2&1zop;S@91~+d-{F-f&Nf`q(9c5 z=uh=$`g8q-{!)LXzt-RAZ}oTjd;Np{QU9cW*1zaq^*B9V|E7P}6Z9YYPyLtvn*>M* z2_<195eX*|Br!=sl9EUgMWRVElANR?8-tNpg|gBoE0;@{#ZAs#NotYWqzXG`S z0cl7Yk;bG6X-b-r=A;E_Nm`NCqz!3H+L8981L;UQk0}0(NoJAR zWDc22=8^ei0a-{Ek;P;QSxT0X*NNxNp6wbNnVlHG?a$XL^Pa6(8M$eO-dta6pg0IXmXl@#!!v|3Mo$! z6{tuhDpQ4Gs#1;Wlu$|yYEp|bYEy^0)T6O9B~3+B(=;?KO-Iwy3^XInL^IPYG%L+U zv(p?jC(T83(>ydU%}4Xo0<<74L<`d*v?wh`i_;RcBrQct(=xOyEl11K3bZ1vL@U!O zv?{GetJ4~^Capzl(>k;+tw-zA2DBktp4v?*;yo6{DwC2d7p(>Am%ZAaVF4zwff zL_5}B>?MM650dyc8LZi5ok!=>1#}@@L>JQ~bSYg%m(vw=C0#{V(=~K0 zT}Ri`4Rj;jL^sndbSvFPx6>VTC*4JN(>-)A-ADJ+1N0z0L=V#=^e8<>kJA(MBt1n> z(=+reJx9;e3-ltrL@(1T^eVkZuhSd!CcQ;((>wGoy+`lU2lOF*L?6>9^eKHtpVJrg zC4EI-(>L@jeMjHZ5A-AbL_gCn^ec^{@$?)0P7~-4`jh^mzm0$qVuTuDMj|8Jh%gcx zNsOdMq!DFA8_A61MhYXw;0$0ugEx>N7@{E=vY{B*Pz}w{4PsEkFigWTm|+`^;ToP1 zYos(%8L5plMp`4Ck>1E)WHd4vnT;$)RwJ8{-N<3&G;$fajXXwPBcGAqC}0#c3K@ls zB1Tc8m{Hs)VU#pV8KsRfMp>hrQQoLvR5U6Xm5nM!Rim0w-Kb&IG-?^OjXFkMqn=UU zXkaun8X1j^CPq`EnbF*6VYD<_8Lf>rMq8tu(cb7_bTm2{osBL=SEHNJ-RNQTGYvEJBVY&13* zn~g2TR%4s7-PmF5G zao)IKTr@5jmyIjNRpXj*-MC@gG;SHUjXTC&l~lQV${P2NPNV2Y+>%BEssQ#CbHH;GA2!!%9HWTtI8rfYg; zteMhGWu`XMm}$*)W_mM&nbFK-W;U~!S`p8lvUa)W0keaS>>$?Rz<6lRoSXyRkf;F)vX#vq<)yUNWI$|BQj#tq0aa>yh=?dSX4bo>|YW7uHMb zmG#-Ab^2SU;^_)^8SIAuN=Iu|zDKMX5MSS3}!NmF=jJ|xy)m+EG0|D zQnNHHElbDJvkWXF%fvFXEG#R_#%=;o5UuwDQqg6#-_6wY$lt{>#?AwIPO~%YEIY@}vkUAZyTmTDE9@$}#;&s)>?XU#ZnHb= zF1yF>vj^-Ud&C~IC+sPE#-6hm>?M1}Ub8psEqlk_vk&Ye`@}x8FYGIeWAW@8`_2;B z5B8J&V!!Qx9b$*tVRj-r+>Wpl+ez%CcBCC;N88El#^!8bLz}meE!d(h*|M$J z*j8=L)@@=_+ptaBvYBn$j_ul>9c!nwQ`xEQG?vE@79nOWCFEGIm+JoL%0oU{|y&*_G`o zc2&EYUEQu>*R*Tdwe31~UAvxL-)>+xv>Vxt?Iw0pyP4hGZeh2yTiLDcHg;RPo!#E< zV0W}T*`4h!c2~Qb-QDhC_q2Q2z3o1BU%Q{(-yUEOv8yR&$MURv+X(dTzj59-(FxZv=`Zn?Ire7dzro5 zUSY4aSJ|uWHTGJ2oxR@PU~jZH*_-Vx_EvkFz1`kn@3eQ>yX`&pUVERt-#%a;v=7;b z?IZS4`(}z?I-qA`(r-|YnZ zhyBz3W&d^pPKXogggJ?va3{h^>?CoLI+0G46YV5(k~=A!7>9F!10CK$j^K!nY6{7?mc7`}Zong*!XM{7-8Rd+2 z#yDf0an5*Wf-}*X>#D);MdOb~{7zd!2pGe&>L5&^hEB zc8)klony{%=Y(_8Ipv&o&NyeCbIy6^f^*TiHI9Hu(&UNR8bJMxy+;;9bcb$9A zedmGm(0SxMcAhv-ooCK-=Y{jqdF8xz-Z*cacg}m~gY(h(PEUzZnT@sP41>}V_eP!E_8Vpxq>UYk}JE4 zi(S>#T-_xubq&{aEtk2r>$tA#xv_3aH(P2;9@)4A#03~oj@lbhMi;%0TTx!K(u zZcaCso7>If=5_PA`P~9;LAQ`w*e&7~b&I*h-4bp|x0GAjE#sDT%em#<3T{QWl3UrW z;#PI5xz*hoZcVqATidPU)^+Q-_1y+;L${IJ*lprAb(^`(-4#Br&$;K_3+_etl6%>`;$C&Hx!2tr?oIcWd)vL^-gWP} z_uU8XL-&#U*nQ$Yb)UJ<-52gl_m%tFedE4$-?{JI5AH|zll$5I;(m4G+<5n!``t}& zf4D#0U+!-&;DvahUYM823-=DtHyWN?v8J zidWUE=2iDPrYZ}bMJ-s(tG8-_TG4Jy?5Sw?}PWz`{aH0zIb1~I4|D&=6&}P zydU0A@0a&GHV_*U8yXuHneNmVnHm7_3-|)QfG^++_yWFwFW?LK0=|GR;0yQyzJM>_3-|)Q zfG^++_yWFwFW?LK0=|GR;0yfk3j~scghY#Gn(T$j)`+Lk&Z^)mxYrg3@kX?>;!oHd z#GC&Jhk|%3+L`yKbuox%(azdG;dT&jM>{Kn;ks`iKKM)d^Mm1f3BYRK%Ic^HHlNEs2g^HFZgJveD7p_ul+hlrZ*Be|XVR5t|}6MQyqj9UaX7L+_Eu zlTk+|&W(;fIc3&A`~NlfQskAWzgO%#J$}=SxWY3c62{I?d_MAi)cGlsqoeQtnH2wt z|CR!+g@LF)Z}2V==oAHDDG5Wbmhq6mAgpGW8v)^)$dgm zv%**6k_;j7p%G)IkC{79iA$H~U4otf5~3196AC93i%Vk0G2PIq>_&-+FlYN&I+W@ggLlR|i%;AySEoJy+?ezT`5h z(qQq43n#Y6m0Ca&QYWrmwSLE{I4Z79Uv&2P+O7M@*odgYeJ?le8sFtwR8BWC>T+Dg z({Xt&NA-0gqY^-D@b^()hQ%H2i%y?dyloe0d_25$i+Y`FV7D06F5Q2#ZFRS{tH{pd z;cFV#Tu~S&kc1RwLWzXpabZ>*Bgy+-i_dy33LJSHH{xm3zfj{~u0iu{67BkR@n3KRKaRk@U7~9rQoQ>e@Fj+Uqdqo-}@d+AwPp} zgAbpovl!V?17BmnMye1CR z44!Klk|=2~z8=hf$032V!P?((Xdrn=#6RM&Ktp52{1mizt zWU#CpNEEzlAQ&eJo~9Zayz?K~R=I} zve7?s;b7V1AGv6-Z1s;^`mY@YE58Q?pX`51!Ci*659Ys4fc>8a{QuP!_B^D}pC|s$ z@;?=VUX}l|&9D0czJM>_3-|)QfG^++_yWFwFW?LK0=|GR;0yQyzJM>_3-|)QfG^++ z_yWFwFW?LK0=|GR;0yQyzJM>_3-|)QfG^++_yWFwFW?LK0=|GR;0yQyzJM>_3-|)Q zfG^++_yWFwFW?LK0=|GR;0yQyzJM>_3-|)QfG^++_yWFwFW?LK0=|GR@PAz(Bqk8@ c`B(77%Eae?XZ_tE@rd9Z|D1yPuT=Jb0X6cTJpcdz diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf index 589cfdaf1d5979bd2041e45748a81406f97cc296..2dcd75b77f479c85e1b72a02328c65ce8bc3cb18 100644 GIT binary patch delta 528 zcmZp;#r~z2z1}}0#GiqOp@D&!!NJ+hP2n1|-ysGDhARvVi<13=^^LYX_qAnUG)@4D zC4~70xic36S&U|XfFwt9ZeqdSEn-K3d0|ti07C^pP22g;*TCE7E z-v-E6$;d6Kkd9!i1IiaLF!Z0vO{|D3Q2rbMlw&vp#B6zqxv7Slo*_UD2N)QbA`0@0 zOa8Yp7y&J~1C&=N0~xs8(tv^S*aaY8r3_-AJ_DmU3&=nQh5!cT&p`JvurM(&GBS!y zZeS9f_{r8#j9-?4LEoK66-X`M;86kb<_a=!1647wG4L_mWca}FpHY_4iZP0@gmD_< zzRf9&+ZiW2Ftcq=Wd5te3k)4;kg<#`41%naXB&I4D1TP|yjjrXrTgZI^S^R!-Z-IK z)|-Kik&#DSN!P;phXRk`Z9 zuvLWRro4ID<`-KZ_D}EiXH;VRynTZ|<8CHJV2}Xa4GbnA2C;L1JdjouAk78hZ*K`= MoH}9p-8Udj00Sb7>i_@% delta 3999 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 bQ?6-q(%471%f7P3t@*S5TM~aJZOQ)tCn6!2 diff --git a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf index e7be927a2bda60f7623250c76bdf18fa06901e63..a5d40d0004db94a2083960a20987b43b3e6af4a7 100644 GIT binary patch delta 543 zcmXX@OK1~O6g@W+$I!eu>D13cOOrSma3N|6Dkg-|#QIxI(O60abug7Ij3yXs1<_*1 zT0{ymja3kJA&9Y{FpDe{MW{Q$2I`_h(4|Z910yc#edyx8d(J)Yp8Gz2LtU6wu3CkH z1%U}D=*tZZ#M+HxvjCQW+>CW(Tk4f%bOF~Exps2MI=oM*GQw1dm(Z!QUC|!&e*~^i zOT9E|7b7=seF5@C<~vJV2&Hv}`{$V(rE+b2^&*ZrVd5RHHle+AC6%+&)G1Y^4#6 z@bhexz7#~~D!16XKd3pH<9+H4_juL%q~?a|_93W5VnbrM4+a+;+$y$r;IEb&*s;E*`a VOgb5yJ0x#r47!k=J6e}be*uvOgkJyv delta 21801 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 RlwBn*W@w*x_OSRA`+tXoKv)0( diff --git a/test/subset/data/fonts/SourceHanSans-Regular_subset.otf b/test/subset/data/fonts/SourceHanSans-Regular_subset.otf index 7b3cb1cea1ed302ac39e6b1aa4f9278303ddd34f..06af9b320ae4a797fbd78b755ce8f2f7c8656e9a 100644 GIT binary patch delta 368 zcmWm5J4-@g7{Kx8^_nq1_ukZ&8fyrG8tftzh)YX|76u9pB2i;eU=j)q&SIay z!L9F5wA9ql(9qygi%b7A{CM8~!}B)UPpXB6KiZM_W;=CwklB{EfFue#BK5sgCcCwN zU;2>KI64X`@ltpe1O;)c! z$XC%2L_}jWG&Hny0hhl2;d2hZ!#Sr`zf)J5CwwijnRHHAYqOZ&`?-1h6)_#6Li^iW`GPBTaab)yZ0mp3+SI}kYoRi8N7FMY ziPi==S}v9j8nM7T`9vgpCW@(2_Tt3KbIv{eEry}r%j2zesr$=AN;NFivUv@X=A-H( z-JK#k_s2=|G-)c>U_j?K*wGFLI^aYny5K@L+_2DtUi6_K0~mw{L-1l4Bk;kG0D=f1 Tj0i>%#Ta6UBhgHn Date: Sat, 15 Jun 2019 21:38:27 -0400 Subject: [PATCH 480/617] Canonically reorder U+0C55 and U+0C56 --- src/hb-unicode.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 80624c0ec..021fa461d 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -326,11 +326,11 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); * * Modify Telugu length marks (ccc=84, ccc=91). * These are the only matras in the main Indic scripts range that have - * a non-zero ccc. That makes them reorder with the Halant that is - * ccc=9. Just zero them, we don't need them in our Indic shaper. + * a non-zero ccc. That makes them reorder with the Halant (ccc=9). + * Assign 5 and 6, which are otherwise unassigned. */ -#define HB_MODIFIED_COMBINING_CLASS_CCC84 0 /* length mark */ -#define HB_MODIFIED_COMBINING_CLASS_CCC91 0 /* ai length mark */ +#define HB_MODIFIED_COMBINING_CLASS_CCC84 5 /* length mark */ +#define HB_MODIFIED_COMBINING_CLASS_CCC91 6 /* ai length mark */ /* Thai * From 2682efb02df72fb254c819cb76fc23592c30fc45 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 13:38:08 -0700 Subject: [PATCH 481/617] Revert "Deprecate font kern API" This reverts commit d219f899f4b2fb4b39ebc1dff9fb648fc5d6d112. API change: Un-deprecate font kern API. Part of https://github.com/harfbuzz/harfbuzz/issues/1682 We should document that this API is only necessary to hook up non-OpenType kerning. hb-ot-font will continue to NOT implement them. --- docs/harfbuzz-sections.txt | 16 +++++------ src/hb-deprecated.h | 54 -------------------------------------- src/hb-font.cc | 3 --- src/hb-font.h | 51 +++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 65 deletions(-) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index f97902f7f..2f34b6a85 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -195,14 +195,6 @@ HB_UNICODE_MAX_DECOMPOSITION_LEN hb_unicode_decompose_compatibility_func_t hb_unicode_decompose_compatibility hb_unicode_funcs_set_decompose_compatibility_func -hb_font_funcs_set_glyph_h_kerning_func -hb_font_funcs_set_glyph_v_kerning_func -hb_font_get_glyph_h_kerning -hb_font_get_glyph_h_kerning_func_t -hb_font_get_glyph_kerning_for_direction -hb_font_get_glyph_kerning_func_t -hb_font_get_glyph_v_kerning -hb_font_get_glyph_v_kerning_func_t

@@ -271,10 +263,12 @@ hb_font_funcs_set_glyph_extents_func hb_font_funcs_set_glyph_from_name_func hb_font_funcs_set_glyph_h_advance_func hb_font_funcs_set_glyph_h_advances_func +hb_font_funcs_set_glyph_h_kerning_func hb_font_funcs_set_glyph_h_origin_func hb_font_funcs_set_glyph_name_func hb_font_funcs_set_glyph_v_advance_func hb_font_funcs_set_glyph_v_advances_func +hb_font_funcs_set_glyph_v_kerning_func hb_font_funcs_set_glyph_v_origin_func hb_font_funcs_set_nominal_glyph_func hb_font_funcs_set_nominal_glyphs_func @@ -300,8 +294,12 @@ hb_font_get_glyph_h_advance hb_font_get_glyph_h_advance_func_t hb_font_get_glyph_h_advances hb_font_get_glyph_h_advances_func_t +hb_font_get_glyph_h_kerning +hb_font_get_glyph_h_kerning_func_t hb_font_get_glyph_h_origin hb_font_get_glyph_h_origin_func_t +hb_font_get_glyph_kerning_for_direction +hb_font_get_glyph_kerning_func_t hb_font_get_glyph_name hb_font_get_glyph_name_func_t hb_font_get_glyph_origin_for_direction @@ -310,6 +308,8 @@ hb_font_get_glyph_v_advance hb_font_get_glyph_v_advance_func_t hb_font_get_glyph_v_advances hb_font_get_glyph_v_advances_func_t +hb_font_get_glyph_v_kerning +hb_font_get_glyph_v_kerning_func_t hb_font_get_glyph_v_origin hb_font_get_glyph_v_origin_func_t hb_font_get_nominal_glyph diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index 026a62c74..47de70a2b 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -165,60 +165,6 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, hb_codepoint_t *decomposed); -typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, - void *user_data); -typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; -typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; - -/** - * hb_font_funcs_set_glyph_h_kerning_func: - * @ffuncs: font functions. - * @func: (closure user_data) (destroy destroy) (scope notified): - * @user_data: - * @destroy: - * - * - * - * Since: 0.9.2 - * Deprecated: 2.0.0 - **/ -HB_EXTERN void -hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_h_kerning_func_t func, - void *user_data, hb_destroy_func_t destroy); - -/** - * hb_font_funcs_set_glyph_v_kerning_func: - * @ffuncs: font functions. - * @func: (closure user_data) (destroy destroy) (scope notified): - * @user_data: - * @destroy: - * - * - * - * Since: 0.9.2 - * Deprecated: 2.0.0 - **/ -HB_EXTERN void -hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_v_kerning_func_t func, - void *user_data, hb_destroy_func_t destroy); - -HB_EXTERN hb_position_t -hb_font_get_glyph_h_kerning (hb_font_t *font, - hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); -HB_EXTERN hb_position_t -hb_font_get_glyph_v_kerning (hb_font_t *font, - hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); - -HB_EXTERN void -hb_font_get_glyph_kerning_for_direction (hb_font_t *font, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y); - - #endif HB_END_DECLS diff --git a/src/hb-font.cc b/src/hb-font.cc index 19ee353eb..d7b2a7ae6 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -939,7 +939,6 @@ hb_font_get_glyph_v_origin (hb_font_t *font, * Return value: * * Since: 0.9.2 - * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, @@ -959,7 +958,6 @@ hb_font_get_glyph_h_kerning (hb_font_t *font, * Return value: * * Since: 0.9.2 - * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, @@ -1190,7 +1188,6 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, * * * Since: 0.9.2 - * Deprecated: 2.0.0 **/ void hb_font_get_glyph_kerning_for_direction (hb_font_t *font, diff --git a/src/hb-font.h b/src/hb-font.h index e2086d818..40dfc41d2 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -157,6 +157,12 @@ typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *fon typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t; typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t; +typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + void *user_data); +typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; +typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; + typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t glyph, @@ -356,6 +362,38 @@ hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_v_origin_func_t func, void *user_data, hb_destroy_func_t destroy); +/** + * hb_font_funcs_set_glyph_h_kerning_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + **/ +HB_EXTERN void +hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_h_kerning_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_font_funcs_set_glyph_v_kerning_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + **/ +HB_EXTERN void +hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_v_kerning_func_t func, + void *user_data, hb_destroy_func_t destroy); + /** * hb_font_funcs_set_glyph_extents_func: * @ffuncs: font functions. @@ -469,6 +507,13 @@ hb_font_get_glyph_v_origin (hb_font_t *font, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y); +HB_EXTERN hb_position_t +hb_font_get_glyph_h_kerning (hb_font_t *font, + hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); +HB_EXTERN hb_position_t +hb_font_get_glyph_v_kerning (hb_font_t *font, + hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); + HB_EXTERN hb_bool_t hb_font_get_glyph_extents (hb_font_t *font, hb_codepoint_t glyph, @@ -531,6 +576,12 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, hb_direction_t direction, hb_position_t *x, hb_position_t *y); +HB_EXTERN void +hb_font_get_glyph_kerning_for_direction (hb_font_t *font, + hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y); + HB_EXTERN hb_bool_t hb_font_get_glyph_extents_for_origin (hb_font_t *font, hb_codepoint_t glyph, From 896416bd4c6ac486eb4e1926eaa09d5a9b693763 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 13:39:49 -0700 Subject: [PATCH 482/617] Partially revert "[ft/ot] Remove implementation of deprecated kerning funcs" This reverts commit 47030b1855f04c0d75899ffb6f5021fea3c19b90. Reverts only the hb-ft part, to reinstate non-OpenType kerning with FreeType. Fixes https://github.com/harfbuzz/harfbuzz/issues/1682 --- src/hb-ft.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index d70c38a7a..c24a0e268 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -346,6 +346,23 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, return true; } +static hb_position_t +hb_ft_get_glyph_h_kerning (hb_font_t *font, + void *font_data, + hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph, + void *user_data HB_UNUSED) +{ + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + FT_Vector kerningv; + + FT_Kerning_Mode mode = font->x_ppem ? FT_KERNING_DEFAULT : FT_KERNING_UNFITTED; + if (FT_Get_Kerning (ft_font->ft_face, left_glyph, right_glyph, mode, &kerningv)) + return 0; + + return kerningv.x; +} + static hb_bool_t hb_ft_get_glyph_extents (hb_font_t *font, void *font_data, @@ -497,6 +514,8 @@ static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t Date: Mon, 17 Jun 2019 13:42:53 -0700 Subject: [PATCH 483/617] Minor --- src/hb-ot-font.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 3344c4b6b..af9a9a2dc 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -37,7 +37,6 @@ #include "hb-ot-cff1-table.hh" #include "hb-ot-cff2-table.hh" #include "hb-ot-hmtx-table.hh" -#include "hb-ot-kern-table.hh" #include "hb-ot-os2-table.hh" #include "hb-ot-post-table.hh" #include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise. From 0819f3ca863af520fe546e6ef0596300e9e28b01 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 14:02:47 -0700 Subject: [PATCH 484/617] Deprecate v_kerning callback again Part of https://github.com/harfbuzz/harfbuzz/issues/1682 --- docs/harfbuzz-sections.txt | 6 +++--- src/hb-deprecated.h | 23 +++++++++++++++++++++++ src/hb-font.cc | 7 +++---- src/hb-font.h | 20 -------------------- src/hb-font.hh | 2 +- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index 2f34b6a85..4be248d30 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -195,6 +195,9 @@ HB_UNICODE_MAX_DECOMPOSITION_LEN hb_unicode_decompose_compatibility_func_t hb_unicode_decompose_compatibility hb_unicode_funcs_set_decompose_compatibility_func +hb_font_funcs_set_glyph_v_kerning_func +hb_font_get_glyph_v_kerning +hb_font_get_glyph_v_kerning_func_t
@@ -268,7 +271,6 @@ hb_font_funcs_set_glyph_h_origin_func hb_font_funcs_set_glyph_name_func hb_font_funcs_set_glyph_v_advance_func hb_font_funcs_set_glyph_v_advances_func -hb_font_funcs_set_glyph_v_kerning_func hb_font_funcs_set_glyph_v_origin_func hb_font_funcs_set_nominal_glyph_func hb_font_funcs_set_nominal_glyphs_func @@ -308,8 +310,6 @@ hb_font_get_glyph_v_advance hb_font_get_glyph_v_advance_func_t hb_font_get_glyph_v_advances hb_font_get_glyph_v_advances_func_t -hb_font_get_glyph_v_kerning -hb_font_get_glyph_v_kerning_func_t hb_font_get_glyph_v_origin hb_font_get_glyph_v_origin_func_t hb_font_get_nominal_glyph diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index 47de70a2b..43f89a4c4 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -165,6 +165,29 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, hb_codepoint_t *decomposed); +typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; + +/** + * hb_font_funcs_set_glyph_v_kerning_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN void +hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_v_kerning_func_t func, + void *user_data, hb_destroy_func_t destroy); + +HB_EXTERN hb_position_t +hb_font_get_glyph_v_kerning (hb_font_t *font, + hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); + #endif HB_END_DECLS diff --git a/src/hb-font.cc b/src/hb-font.cc index d7b2a7ae6..7eee284e6 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -336,7 +336,6 @@ hb_font_get_glyph_v_origin_default (hb_font_t *font, return ret; } -#ifndef HB_DISABLE_DEPRECATED static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, @@ -356,6 +355,7 @@ hb_font_get_glyph_h_kerning_default (hb_font_t *font, return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); } +#ifndef HB_DISABLE_DEPRECATED static hb_position_t hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, @@ -927,7 +927,6 @@ hb_font_get_glyph_v_origin (hb_font_t *font, return font->get_glyph_v_origin (glyph, x, y); } -#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_h_kerning: * @font: a font. @@ -947,6 +946,7 @@ hb_font_get_glyph_h_kerning (hb_font_t *font, return font->get_glyph_h_kerning (left_glyph, right_glyph); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_v_kerning: * @font: a font. @@ -958,6 +958,7 @@ hb_font_get_glyph_h_kerning (hb_font_t *font, * Return value: * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, @@ -1175,7 +1176,6 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, return font->subtract_glyph_origin_for_direction (glyph, direction, x, y); } -#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_kerning_for_direction: * @font: a font. @@ -1197,7 +1197,6 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font, { return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y); } -#endif /** * hb_font_get_glyph_extents_for_origin: diff --git a/src/hb-font.h b/src/hb-font.h index 40dfc41d2..5bd8cbbcf 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -161,7 +161,6 @@ typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, void *user_data); typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; -typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data, @@ -378,22 +377,6 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_h_kerning_func_t func, void *user_data, hb_destroy_func_t destroy); -/** - * hb_font_funcs_set_glyph_v_kerning_func: - * @ffuncs: font functions. - * @func: (closure user_data) (destroy destroy) (scope notified): - * @user_data: - * @destroy: - * - * - * - * Since: 0.9.2 - **/ -HB_EXTERN void -hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_v_kerning_func_t func, - void *user_data, hb_destroy_func_t destroy); - /** * hb_font_funcs_set_glyph_extents_func: * @ffuncs: font functions. @@ -510,9 +493,6 @@ hb_font_get_glyph_v_origin (hb_font_t *font, HB_EXTERN hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); -HB_EXTERN hb_position_t -hb_font_get_glyph_v_kerning (hb_font_t *font, - hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); HB_EXTERN hb_bool_t hb_font_get_glyph_extents (hb_font_t *font, diff --git a/src/hb-font.hh b/src/hb-font.hh index 95551bfd2..3b917d129 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -51,7 +51,7 @@ HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \ HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ - HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning)) \ + HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning)) \ HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ From bfb5569d530a2b65dafd0d9be45d594af9e742ce Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 14:06:04 -0700 Subject: [PATCH 485/617] Disable non-OpenType kerning with hb-ft in HB_TINY --- src/hb-ft.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index c24a0e268..d40e8fad7 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -346,6 +346,7 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, return true; } +#ifndef HB_NO_OT_SHAPE_FALLBACK static hb_position_t hb_ft_get_glyph_h_kerning (hb_font_t *font, void *font_data, @@ -362,6 +363,7 @@ hb_ft_get_glyph_h_kerning (hb_font_t *font, return kerningv.x; } +#endif static hb_bool_t hb_ft_get_glyph_extents (hb_font_t *font, @@ -514,7 +516,9 @@ static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t Date: Mon, 17 Jun 2019 14:12:11 -0700 Subject: [PATCH 486/617] Use injected class name --- src/hb-open-type.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index de2d25638..2991d8e75 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -59,11 +59,11 @@ struct IntType typedef Type type; typedef hb_conditional wide_type; - IntType& operator = (wide_type i) { v = i; return *this; } + IntType& operator = (wide_type i) { v = i; return *this; } operator wide_type () const { return v; } - bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; } - bool operator != (const IntType &o) const { return !(*this == o); } - HB_INTERNAL static int cmp (const IntType *a, const IntType *b) + bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; } + bool operator != (const IntType &o) const { return !(*this == o); } + HB_INTERNAL static int cmp (const IntType *a, const IntType *b) { return b->cmp (*a); } template int cmp (Type2 a) const From 6492b2345cd913223b0eb931e9e11f7e5ad33049 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 14:19:13 -0700 Subject: [PATCH 487/617] Minor --- src/hb-open-type.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 2991d8e75..e235a97c3 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -146,7 +146,7 @@ struct LONGDATETIME * system, feature, or baseline */ struct Tag : HBUINT32 { - Tag& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; } + Tag& operator = (hb_tag_t i) { HBUINT32::operator= (i); return *this; } /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ operator const char* () const { return reinterpret_cast (&this->v); } operator char* () { return reinterpret_cast (&this->v); } From 1c56b5d1d8307efd12519556e41fc50c5371f136 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 14:23:04 -0700 Subject: [PATCH 488/617] [serialize] Fix copy() calling operator= https://github.com/googlefonts/harfbuzz/commit/9f610ae239a11e86f94621e26bc15849b65ce41b#commitcomment-33944686 --- src/hb-serialize.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 76f701608..5764a90f6 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -375,7 +375,7 @@ struct hb_serialize_context_t (Type *, src.copy (this, hb_forward (ds)...)) template auto - _copy (const Type &src, hb_priority<0>) -> decltype (&(src = src)) + _copy (const Type &src, hb_priority<0>) -> decltype (&(hb_declval () = src)) { Type *ret = this->allocate_size (sizeof (Type)); if (unlikely (!ret)) return nullptr; From 3a9394635ffd663d8acd0715236dd01d9f22f3b8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 20:10:36 -0700 Subject: [PATCH 489/617] Add CONFIG.md https://github.com/harfbuzz/harfbuzz/issues/1652 --- CONFIG.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile.am | 1 + README.md | 2 ++ 3 files changed, 54 insertions(+) create mode 100644 CONFIG.md diff --git a/CONFIG.md b/CONFIG.md new file mode 100644 index 000000000..b6b54f187 --- /dev/null +++ b/CONFIG.md @@ -0,0 +1,51 @@ +# Configuring HarfBuzz + +Most of the time you will not need any custom configuration. The configuration +options provided by `configure` or `cmake` should be enough. In particular, +if you just want HarfBuzz library plus hb-shape / hb-view utilities, make sure +FreeType and Cairo are available and found during configuration. + +If you are building for distribution, you should more carefully consider whether +you need Glib, ICU, Graphite2, as well as CoreText / Uniscribe / DWrite. Make +sure the relevant ones are enabled. + +If you are building for custom environment (embedded, downloadable app, etc) +where you mostly just want to call `hb_shape()` and the binary size of the +resulting library is very important to you, the rest of this file guides you +through your options to disable features you may not need, in exchange for +binary size savings. + +## Compiler Options + +Make sure you build with your compiler's "optimize for size" option. On `gcc` +this is `-Os`, and can be enabled by passing `CXXFLAGS=-Os` either to `configure` +(sticky) or to `make` (non-sticky). On clang there is an even more extreme flag, +`-Oz`. + +HarfBuzz heavily uses inline functions and the optimize-size flag can make the +library smaller by 20% or more. Moreover, sometimes, based on the target CPU, +the optimize-size builds perform *faster* as well, thanks to lower code +footprint and caching effects. So, definitely try that even if size is not +extremely tight but you have a huge application. For example, Chrome does +that. Note that this configuration also automatically enables certain internal +optimizations. Search for `HB_OPTIMIZE_SIZE` for details, if you are using +other compilers, or continue reading. + +Another compiler option to consider is "link-time optimization", also known as +'lto'. To enable that, with `gcc` or `clang`, add `-flto` to both `CXXFLAGS` +and `LDFLAGS`, either on `configure` invocation (sticky) or on `make` (non-sticky). +This, also, can have a huge impact on the final size, 20% or more. + +Finally, if you are making a static library build or otherwise linking the +library into your app, make sure your linker removes unused functions. This +can be tricky and differ from environment to environment, but you definitely +want to make sure this happens. Otherwise, every unused public function will +be adding unneeded bytes to your binary. + +Combining the above three build options should already shrink your library a lot. +The rest of this file shows you ways to shrink the library even further at the +expense of removing functionality (that may not be needed). + +## Custom configuration + +TODO diff --git a/Makefile.am b/Makefile.am index 26ebdc6e7..2bbd3c55d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,6 +13,7 @@ EXTRA_DIST = \ README.mingw.md \ README.python.md \ BUILD.md \ + CONFIG.md \ RELEASING.md \ TESTING.md \ CMakeLists.txt \ diff --git a/README.md b/README.md index ce0a04d1f..ce3e84dde 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ For license information, see [COPYING](COPYING). For build information, see [BUILD.md](BUILD.md). +For custom configurations, see [CONFIG.md](CONFIG.md). + For test execution, see [TESTING.md](TESTING.md). Documentation: https://harfbuzz.github.io From 23768a99e08cbe691772b7514c023d3184989ff8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 20:29:29 -0700 Subject: [PATCH 490/617] [config] Replace HAVE_FALLBACK with HB_NO_FALLBACK_SHAPE This disables fallback shaper in tiny builds. Projects that don't use our build system and want to disable fallback shaper (eg. Firefox) should define HB_NO_FALLBACK_SHAPE now. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- CMakeLists.txt | 2 -- configure.ac | 8 -------- src/Makefile.am | 4 ---- src/Makefile.sources | 5 +---- src/hb-config.hh | 1 + src/hb-fallback-shape.cc | 3 +++ src/hb-shaper-list.hh | 2 +- 7 files changed, 6 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbff81e95..f2b2268a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,8 +88,6 @@ include_directories(AFTER ${PROJECT_BINARY_DIR}/src ) -add_definitions(-DHAVE_FALLBACK) - # We need PYTHON_EXECUTABLE to be set for running the tests... include (FindPythonInterp) diff --git a/configure.ac b/configure.ac index d48823d25..ade6840e8 100644 --- a/configure.ac +++ b/configure.ac @@ -136,14 +136,6 @@ AM_CONDITIONAL(HAVE_PTHREAD, $have_pthread) dnl ========================================================================== -have_fallback=true -if $have_fallback; then - AC_DEFINE(HAVE_FALLBACK, 1, [Have simple TrueType Layout backend]) -fi -AM_CONDITIONAL(HAVE_FALLBACK, $have_fallback) - -dnl =========================================================================== - AC_ARG_WITH(glib, [AS_HELP_STRING([--with-glib=@<:@yes/no/auto@:>@], [Use glib @<:@default=auto@:>@])],, diff --git a/src/Makefile.am b/src/Makefile.am index d126c4017..016229b34 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,10 +28,6 @@ HBSOURCES = $(HB_BASE_sources) HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources) HBHEADERS = $(HB_BASE_headers) -if HAVE_FALLBACK -HBSOURCES += $(HB_FALLBACK_sources) -endif - if HAVE_PTHREAD HBCFLAGS += $(PTHREAD_CFLAGS) HBNONPCLIBS += $(PTHREAD_LIBS) diff --git a/src/Makefile.sources b/src/Makefile.sources index 70983f135..af0296b67 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -36,6 +36,7 @@ HB_BASE_sources = \ hb-dispatch.hh \ hb-face.cc \ hb-face.hh \ + hb-fallback-shape.cc \ hb-font.cc \ hb-font.hh \ hb-iter.hh \ @@ -200,10 +201,6 @@ HB_BASE_headers = \ hb.h \ $(NULL) -HB_FALLBACK_sources = \ - hb-fallback-shape.cc \ - $(NULL) - # Optional Sources and Headers with external deps HB_FT_sources = hb-ft.cc diff --git a/src/hb-config.hh b/src/hb-config.hh index 56c85a042..491979653 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -99,6 +99,7 @@ #endif #ifdef HB_NO_LEGACY +#define HB_NO_FALLBACK_SHAPE #define HB_NO_OT_LAYOUT_BLACKLIST #define HB_NO_OT_SHAPE_FALLBACK #endif diff --git a/src/hb-fallback-shape.cc b/src/hb-fallback-shape.cc index 09f02900f..c5b7c2c23 100644 --- a/src/hb-fallback-shape.cc +++ b/src/hb-fallback-shape.cc @@ -26,6 +26,7 @@ #include "hb-shaper-impl.hh" +#ifndef HB_NO_FALLBACK_SHAPE /* * shaper face data @@ -120,3 +121,5 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED, return true; } + +#endif diff --git a/src/hb-shaper-list.hh b/src/hb-shaper-list.hh index 25c584bc0..4108e7aab 100644 --- a/src/hb-shaper-list.hh +++ b/src/hb-shaper-list.hh @@ -47,6 +47,6 @@ HB_SHAPER_IMPLEMENT (directwrite) HB_SHAPER_IMPLEMENT (coretext) #endif -#ifdef HAVE_FALLBACK +#ifndef HB_NO_FALLBACK_SHAPE HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */ #endif From 23ccd00a3d5033b812f2bebcc5b793a4415b252b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 20:35:04 -0700 Subject: [PATCH 491/617] Minor --- src/hb-config.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 491979653..c1a15f86e 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -72,7 +72,8 @@ #define HB_NO_LEGACY #endif -/* Closure. */ + +/* Closure of options. */ #ifdef HB_DISABLE_DEPRECATED #define HB_IF_NOT_DEPRECATED(x) From 33d8b76e74579a27b06fa788d0bf696a9dd44cc4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 21:54:20 -0700 Subject: [PATCH 492/617] [config] Flesh out CONFIG.md Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- CONFIG.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index b6b54f187..393553c0a 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -44,8 +44,89 @@ be adding unneeded bytes to your binary. Combining the above three build options should already shrink your library a lot. The rest of this file shows you ways to shrink the library even further at the -expense of removing functionality (that may not be needed). +expense of removing functionality (that may not be needed). The remaining +options are all enabled by defining pre-processor macros, which can be done +via `CXXFLAGS` or `CPPFLAGS` similarly. -## Custom configuration -TODO +## Unicode-functions + +Access to Unicode data can be configured at compile time as well as run-time. +By default, HarfBuzz ships with its own compact subset of properties from +Unicode Character Database that it needs. This is a highly-optimized +implementation that depending on compile settings (optimize-size or not) +takes around ~40kb or ~60kb. Using this implementation (default) is highly +recommended, as HarfBuzz always ships with data from latest version of Unicode. +This implementation can be disabled by defining `HB_NO_UCD`. + +For example, if you are enabling ICU as a built-in option, or GLib, those +can provide Unicode data as well, so defining `HB_NO_UCD` might save you +space without reducing functionality (to the extent that the Unicode version +of those implementations is recent.) + +If, however, you provide your own Unicode data to HarfBuzz at run-time by +calling `hb_buffer_set_unicode_funcs` on every buffer you create, and you do +not rely on `hb_unicode_funcs_get_default()` results, you can disable the +internal implementation by defining both `HB_NO_UCD` and `HB_NO_UNICODE_FUNCS`. +The latter is needed to guard against accidentally building a library without +any default Unicode implementations. + + +## Font-functions + +Access to certain font functionalities can also be configured at run-time. By +default, HarfBuzz uses an efficient internal implementation of OpenType +functionality for this. This internal implementation is called `hb-ot-font`. +All newly-created `hb_font_t` objects by default use `hb-ot-font`. Using this +is highly recommended, and is what fonts use by default when they are created. + +Most embedded uses will probably use HarfBuzz with FreeType using `hb-ft.h`. +In that case, or if you otherwise provide those functions by calling +`hb_font_set_funcs()` on every font you create, you can disable `hb-ot-font` +without loss of functionality by defining `HB_NO_OT_FONT`. + + +## Thread-safety + +By default HarfBuzz builds as a thread-safe library. The exception is that +the `HB_TINY` predefined configuring (more below) disables thread-safety. + +If you do /not/ need thread-safety in the library (eg. you always call into +HarfBuzz from the same thread), you can disable thread-safety by defining +`HB_NO_MT`. As noted already, this is enabled by `HB_TINY`. + + +## Pre-defined configurations + +The [`hb-config.hh`](src/hb-config.hh) internal header supports three +pre-defined configurations as well grouping of various configuration options. +The pre-defined configurations are: + + * `HB_MINI`: Disables shaping of AAT as well as legacy fonts. Ie. it produces + a capable OpenType shaper only. + + * `HB_LEAN`: Disables various non-shaping functionality in the library. See + the definition for details. + + * `HB_TINY`: Enables both `HB_MINI` and `HB_LEAN` configurations, as well as + disabling thread-safety and debugging, and use size-optimized data tables. + + +## Tailoring configuration + +Most of the time, one of the pre-defined configuration is exactly what one needs. +Sometimes, however, the pre-defined configuration cuts out features that might +be desired in the library. Unfortunately there is no quick way to undo those +configurations from the command-line. But one can add a header file called +`config-override.h` to undefine certain `HB_NO_*` symbols as desired. Then +define `HAVE_CONFIG_OVERRIDE_H` to make `hb-config.hh` include your configuration +overrides at the end. + + +## Notes + +Note that the config option `HB_NO_CFF`, which is enabled by `HB_LEAN` and +`HB_TINY` does /not/ mean that the resulting library won't work with CFF fonts. +The library can shape valid CFF fonts just fine, with or without this option. +This option disables (among other things) the code to calculate glyph exntents +for CFF fonts. From aa3450cac148280f747fb88864b6fcc4ec70cc51 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 22:41:49 -0700 Subject: [PATCH 493/617] [config] Don't compile disabled features This makes it possible to include all .cc files into build, even if not building CoreText, Uniscribe, etc. This was mostly to help custom builders. But also means that we can include all files in our own build system. Not sure if we should. Definitely simplifies things, but slightly only. --- src/Makefile.am | 1 + src/hb-coretext.cc | 6 ++++++ src/hb-directwrite.cc | 6 ++++++ src/hb-ft.cc | 5 +++++ src/hb-glib.cc | 5 +++++ src/hb-gobject-enums.cc.tmpl | 7 +++++++ src/hb-gobject-structs.cc | 5 +++++ src/hb-graphite2.cc | 7 +++++++ src/hb-icu.cc | 5 +++++ src/hb-uniscribe.cc | 4 ++++ 10 files changed, 51 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index 016229b34..14cafb833 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -424,6 +424,7 @@ HarfBuzz_0_0_gir_CFLAGS = \ -DHB_AAT_H_IN \ -DHB_GOBJECT_H \ -DHB_GOBJECT_H_IN \ + -DHAVE_GOBJECT \ -DHB_EXTERN= \ $(NULL) HarfBuzz_0_0_gir_LIBS = \ diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 85993d196..20cfe4a60 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -27,6 +27,9 @@ */ #include "hb.hh" + +#ifdef HAVE_CORETEXT + #include "hb-shaper-impl.hh" #include "hb-coretext.h" @@ -1148,3 +1151,6 @@ fail: return ret; } + + +#endif diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index b135c49e9..85ba8b627 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -23,6 +23,9 @@ */ #include "hb.hh" + +#ifdef HAVE_DIRECTWRITE + #include "hb-shaper-impl.hh" #include @@ -958,3 +961,6 @@ hb_directwrite_face_get_font_face (hb_face_t *face) { return face->data.directwrite->fontFace; } + + +#endif diff --git a/src/hb-ft.cc b/src/hb-ft.cc index d40e8fad7..c01f02991 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -29,6 +29,8 @@ #include "hb.hh" +#ifdef HAVE_FREETYPE + #include "hb-ft.h" #include "hb-font.hh" @@ -877,3 +879,6 @@ hb_ft_font_set_funcs (hb_font_t *font) _hb_ft_font_set_funcs (font, ft_face, true); hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING); } + + +#endif diff --git a/src/hb-glib.cc b/src/hb-glib.cc index 576375460..db02b6760 100644 --- a/src/hb-glib.cc +++ b/src/hb-glib.cc @@ -28,6 +28,8 @@ #include "hb.hh" +#ifdef HAVE_GLIB + #include "hb-glib.h" #include "hb-machinery.hh" @@ -404,3 +406,6 @@ hb_glib_blob_create (GBytes *gbytes) _hb_g_bytes_unref); } #endif + + +#endif diff --git a/src/hb-gobject-enums.cc.tmpl b/src/hb-gobject-enums.cc.tmpl index e3a9a6b3f..17f1adeb1 100644 --- a/src/hb-gobject-enums.cc.tmpl +++ b/src/hb-gobject-enums.cc.tmpl @@ -27,6 +27,8 @@ #include "hb.hh" +#ifdef HAVE_GOBJECT + /* g++ didn't like older gtype.h gcc-only code path. */ #include #if !GLIB_CHECK_VERSION(2,29,16) @@ -44,6 +46,11 @@ /* enumerations from "@filename@" */ /*** END file-production ***/ +/*** BEGIN file-tail ***/ + +#endif +/*** END file-tail ***/ + /*** BEGIN value-header ***/ GType @enum_name@_get_type () diff --git a/src/hb-gobject-structs.cc b/src/hb-gobject-structs.cc index 3cff880aa..7f4922ef1 100644 --- a/src/hb-gobject-structs.cc +++ b/src/hb-gobject-structs.cc @@ -26,6 +26,8 @@ #include "hb.hh" +#ifdef HAVE_GOBJECT + /** * SECTION:hb-gobject @@ -94,3 +96,6 @@ HB_DEFINE_VALUE_TYPE (user_data_key) HB_DEFINE_VALUE_TYPE (ot_math_glyph_variant) HB_DEFINE_VALUE_TYPE (ot_math_glyph_part) + + +#endif diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index f799f8b22..9588fa4d6 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -26,6 +26,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifdef HAVE_GRAPHITE2 + #include "hb-shaper-impl.hh" #include "hb-graphite2.h" @@ -447,3 +451,6 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, return true; } + + +#endif diff --git a/src/hb-icu.cc b/src/hb-icu.cc index 399829a81..e98908de7 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -29,6 +29,8 @@ #include "hb.hh" +#ifdef HAVE_ICU + #include "hb-icu.h" #include "hb-machinery.hh" @@ -351,3 +353,6 @@ hb_icu_get_unicode_funcs () { return static_icu_funcs.get_unconst (); } + + +#endif diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 69a1ae7e4..fceda5244 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -25,6 +25,9 @@ */ #include "hb.hh" + +#ifdef HAVE_UNISCRIBE + #include "hb-shaper-impl.hh" #include @@ -1023,3 +1026,4 @@ retry: } +#endif From efef672911dd6c3b80e53294f3fcd59dbb64597a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jun 2019 22:57:51 -0700 Subject: [PATCH 494/617] Fix cmake build Hopefullly. --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2b2268a2..c9ba0160c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,8 +161,6 @@ extract_make_variable(HB_BASE_sources ${SRCSOURCES}) add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/") extract_make_variable(HB_BASE_headers ${SRCSOURCES}) add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/") -extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES}) -add_prefix_to_list(HB_FALLBACK_sources "${PROJECT_SOURCE_DIR}/src/") extract_make_variable(HB_SUBSET_sources ${SRCSOURCES}) add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/") @@ -229,8 +227,6 @@ set (HB_VERSION_MICRO ${CMAKE_MATCH_4}) set (project_sources ${HB_BASE_sources} ${HB_BASE_RAGEL_GENERATED_sources} - - ${HB_FALLBACK_sources} ) set (subset_project_sources From eb28d6e48b02a8c49875cfcd084a16c1c66c367e Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 18 Jun 2019 12:14:10 +0430 Subject: [PATCH 495/617] [ci] Test no build system builds Introduced in aa3450c, let's preserve it --- .circleci/config.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c1741a804..2ce6a8e22 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -82,7 +82,7 @@ jobs: # - run: xbps-install -Suy freetype gettext gcc glib graphite pkg-config ragel libtool autoconf automake make # - run: ./autogen.sh && make -j32 && make check - clang-O3-O0: + clang-O3-O0-and-nobuildsystem: docker: - image: ubuntu:18.10 steps: @@ -97,6 +97,7 @@ jobs: - run: CFLAGS="-O0" CXXFLAGS="-O0" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-fontconfig --with-glib --with-cairo --with-icu --with-graphite2 - run: make -j32 - run: LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" make check || .ci/fail.sh + - run: make clean && cd src && clang++ -c hb-*.cc gcc-valgrind: docker: @@ -315,7 +316,7 @@ workflows: - archlinux-py3-all #- void-notest - gcc-valgrind - - clang-O3-O0 + - clang-O3-O0-and-nobuildsystem - clang-everything - clang-asan - clang-msan From 6172ec5d879653c536d7cb3d3b3760fbb6d0f3f3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 12:41:56 -0700 Subject: [PATCH 496/617] Remove (unused) posix_memalign fallback Was wrong. The returned pointer couldn't be passed to free(). Ouch! --- configure.ac | 2 +- src/hb.hh | 34 ---------------------------------- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index ade6840e8..958bd2dd2 100644 --- a/configure.ac +++ b/configure.ac @@ -77,7 +77,7 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl]) ]) # Functions and headers -AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign) +AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l) AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h stdbool.h) # Compiler flags diff --git a/src/hb.hh b/src/hb.hh index a2baa31d2..a63d629bd 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -211,14 +211,6 @@ extern "C" void hb_free_impl(void *ptr); #define calloc hb_calloc_impl #define realloc hb_realloc_impl #define free hb_free_impl - -#ifdef hb_memalign_impl -extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); -#define posix_memalign hb_memalign_impl -#else -#undef HAVE_POSIX_MEMALIGN -#endif - #endif @@ -515,32 +507,6 @@ typedef uint64_t hb_vector_size_impl_t; #define VAR 1 -/* fallback for posix_memalign() */ -static inline int -_hb_memalign(void **memptr, size_t alignment, size_t size) -{ - if (unlikely (0 != (alignment & (alignment - 1)) || - !alignment || - 0 != (alignment & (sizeof (void *) - 1)))) - return EINVAL; - - char *p = (char *) malloc (size + alignment - 1); - if (unlikely (!p)) - return ENOMEM; - - size_t off = (size_t) p & (alignment - 1); - if (off) - p += alignment - off; - - *memptr = (void *) p; - - return 0; -} -#if !defined(posix_memalign) && !defined(HAVE_POSIX_MEMALIGN) -#define posix_memalign _hb_memalign -#endif - - /* * Big-endian integers. Here because fundamental. */ From 7cf9169078f35299ec0633a7b212256acdd71661 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 12:44:03 -0700 Subject: [PATCH 497/617] Remove accidentally left cruft --- src/hb-algs.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 59eead4eb..9a8abe686 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -1021,7 +1021,7 @@ struct hb_vector_size_t hb_vector_size_t operator ~ () const { hb_vector_size_t r; -#if HB_VECTOR_SIZE && 0 +#if HB_VECTOR_SIZE if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) r.u.vec[i] = ~u.vec[i]; From 24060d3aa77f1e1a18960cc61c3d1ac241875507 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 12:50:42 -0700 Subject: [PATCH 498/617] Add hb_bitwise_neg --- src/hb-algs.hh | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 9a8abe686..fe78d94c9 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -940,6 +940,12 @@ struct hb_bitwise_sub operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } HB_FUNCOBJ (hb_bitwise_sub); +struct +{ + template auto + operator () (const T &a) const HB_AUTO_RETURN (~a) +} +HB_FUNCOBJ (hb_bitwise_neg); struct { HB_PARTIALIZE(2); @@ -998,6 +1004,20 @@ struct hb_vector_size_t void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } + template + hb_vector_size_t process (const Op& op) const + { + hb_vector_size_t r; +#if HB_VECTOR_SIZE + if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) + for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) + r.u.vec[i] = op (u.vec[i]); + else +#endif + for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) + r.u.v[i] = op (u.v[i]); + return r; + } template hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const { @@ -1019,18 +1039,7 @@ struct hb_vector_size_t hb_vector_size_t operator ^ (const hb_vector_size_t &o) const { return process (hb_bitwise_xor, o); } hb_vector_size_t operator ~ () const - { - hb_vector_size_t r; -#if HB_VECTOR_SIZE - if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) - for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) - r.u.vec[i] = ~u.vec[i]; - else -#endif - for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) - r.u.v[i] = ~u.v[i]; - return r; - } + { return process (hb_bitwise_neg); } private: static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, ""); From 60653a7adbbd8143d187b3edf33cb7a2dddadf74 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:01:11 -0700 Subject: [PATCH 499/617] Remove HB_VECTOR_SIZE It was cumbersome to get it to work reliably, for dubious performance gain, mostly in the subsetter maybe... Life is easier without. It was disabled forever anyway. --- src/hb-algs.hh | 36 +++++++++--------------------------- src/hb-null.hh | 4 ++-- src/hb-static.cc | 4 ++-- src/hb.hh | 32 -------------------------------- 4 files changed, 13 insertions(+), 63 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index fe78d94c9..4a537baf3 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -994,13 +994,12 @@ HB_FUNCOBJ (hb_neg); /* Compiler-assisted vectorization. */ /* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))), - * using vectorized operations if HB_VECTOR_SIZE is set to **bit** numbers (eg 128). - * Define that to 0 to disable. */ + * basically a fixed-size bitset. */ template struct hb_vector_size_t { - elt_t& operator [] (unsigned int i) { return u.v[i]; } - const elt_t& operator [] (unsigned int i) const { return u.v[i]; } + elt_t& operator [] (unsigned int i) { return v[i]; } + const elt_t& operator [] (unsigned int i) const { return v[i]; } void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } @@ -1008,28 +1007,16 @@ struct hb_vector_size_t hb_vector_size_t process (const Op& op) const { hb_vector_size_t r; -#if HB_VECTOR_SIZE - if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) - for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) - r.u.vec[i] = op (u.vec[i]); - else -#endif - for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) - r.u.v[i] = op (u.v[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) + r.v[i] = op (v[i]); return r; } template hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const { hb_vector_size_t r; -#if HB_VECTOR_SIZE - if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) - for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) - r.u.vec[i] = op (u.vec[i], o.u.vec[i]); - else -#endif - for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) - r.u.v[i] = op (u.v[i], o.u.v[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) + r.v[i] = op (v[i], o.v[i]); return r; } hb_vector_size_t operator | (const hb_vector_size_t &o) const @@ -1042,13 +1029,8 @@ struct hb_vector_size_t { return process (hb_bitwise_neg); } private: - static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, ""); - union { - elt_t v[byte_size / sizeof (elt_t)]; -#if HB_VECTOR_SIZE - hb_vector_size_impl_t vec[byte_size / sizeof (hb_vector_size_impl_t)]; -#endif - } u; + static_assert (0 == byte_size % sizeof (elt_t), ""); + elt_t v[byte_size / sizeof (elt_t)]; }; diff --git a/src/hb-null.hh b/src/hb-null.hh index 674b4dffc..d4578205e 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -74,7 +74,7 @@ using hb_static_size = _hb_static_size; */ extern HB_INTERNAL -hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; +uint64_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)]; /* Generic nul-content Null objects. */ template @@ -128,7 +128,7 @@ struct NullHelper * causing bad memory access. So, races there are not actually introducing incorrectness * in the code. Has ~12kb binary size overhead to have it, also clang build fails with it. */ extern HB_INTERNAL -/*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; +/*thread_local*/ uint64_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)]; /* CRAP pool: Common Region for Access Protection. */ template diff --git a/src/hb-static.cc b/src/hb-static.cc index 6b89183ca..08a2f2136 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -39,8 +39,8 @@ #ifndef HB_NO_VISIBILITY #include "hb-ot-name-language-static.hh" -hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {}; -/*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {}; +uint64_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)] = {}; +/*thread_local*/ uint64_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)] = {}; DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; diff --git a/src/hb.hh b/src/hb.hh index a63d629bd..3145574d9 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -435,38 +435,6 @@ static_assert ((sizeof (hb_var_int_t) == 4), ""); void operator=(const TypeName&) = delete -/* - * Compiler-assisted vectorization parameters. - */ - -/* - * Disable vectorization for now. To correctly use them, we should - * use posix_memalign() to allocate in hb_vector_t. Otherwise, can - * cause misaligned access. - * - * https://bugs.chromium.org/p/chromium/issues/detail?id=860184 - */ -#ifndef HB_VECTOR_SIZE -# define HB_VECTOR_SIZE 0 -#endif - -/* The `vector_size' attribute was introduced in gcc 3.1. */ -#ifndef HB_VECTOR_SIZE -# if defined( __GNUC__ ) && ( __GNUC__ >= 4 ) -# define HB_VECTOR_SIZE 128 -# else -# define HB_VECTOR_SIZE 0 -# endif -#endif -static_assert (0 == (HB_VECTOR_SIZE & (HB_VECTOR_SIZE - 1)), "HB_VECTOR_SIZE is not power of 2."); -static_assert (0 == (HB_VECTOR_SIZE % 64), "HB_VECTOR_SIZE is not multiple of 64."); -#if HB_VECTOR_SIZE -typedef uint64_t hb_vector_size_impl_t __attribute__((vector_size (HB_VECTOR_SIZE / 8))); -#else -typedef uint64_t hb_vector_size_impl_t; -#endif - - /* Flags */ /* Enable bitwise ops on enums marked as flags_t */ From 737436d3f8aacfd0bd586cd54d7034bae3afc4e1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:07:44 -0700 Subject: [PATCH 500/617] Streamline HB_NO_CFF --- src/hb-ot-cff1-table.cc | 7 +++++-- src/hb-ot-cff2-table.cc | 7 +++++-- src/hb-subset-cff-common.cc | 7 +++++++ src/hb-subset-cff1.cc | 7 +++++-- src/hb-subset-cff2.cc | 7 +++++-- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index e6dd6a7b8..3238ad73a 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -24,11 +24,13 @@ * Adobe Author(s): Michiharu Ariza */ -#include "hb-ot-cff1-table.hh" -#include "hb-cff1-interp-cs.hh" +#include "hb.hh" #ifndef HB_NO_CFF +#include "hb-ot-cff1-table.hh" +#include "hb-cff1-interp-cs.hh" + using namespace CFF; /* SID to code */ @@ -391,4 +393,5 @@ bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_code return false; } + #endif diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc index f1fa6ec30..9c9e37bd0 100644 --- a/src/hb-ot-cff2-table.cc +++ b/src/hb-ot-cff2-table.cc @@ -24,11 +24,13 @@ * Adobe Author(s): Michiharu Ariza */ -#include "hb-ot-cff2-table.hh" -#include "hb-cff2-interp-cs.hh" +#include "hb.hh" #ifndef HB_NO_OT_FONT_CFF +#include "hb-ot-cff2-table.hh" +#include "hb-cff2-interp-cs.hh" + using namespace CFF; struct extents_param_t @@ -142,4 +144,5 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, return true; } + #endif diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc index 2aa55b985..54f6dc2a7 100644 --- a/src/hb-subset-cff-common.cc +++ b/src/hb-subset-cff-common.cc @@ -24,6 +24,10 @@ * Adobe Author(s): Michiharu Ariza */ +#include "hb.hh" + +#ifndef HB_NO_SUBSET_CFF + #include "hb-ot-cff-common.hh" #include "hb-ot-cff2-table.hh" #include "hb-subset-cff-common.hh" @@ -223,3 +227,6 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c, return_trace (false); } } + + +#endif diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index 688f3f377..ab46808d2 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -24,6 +24,10 @@ * Adobe Author(s): Michiharu Ariza */ +#include "hb.hh" + +#ifndef HB_NO_SUBSET_CFF + #include "hb-open-type.hh" #include "hb-ot-cff1-table.hh" #include "hb-set.h" @@ -32,8 +36,6 @@ #include "hb-subset-cff-common.hh" #include "hb-cff1-interp-cs.hh" -#ifndef HB_NO_SUBSET_CFF - using namespace CFF; struct remap_sid_t : remap_t @@ -1121,4 +1123,5 @@ hb_subset_cff1 (hb_subset_plan_t *plan, return result; } + #endif diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 78b8c05d4..afb23ae3c 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -24,6 +24,10 @@ * Adobe Author(s): Michiharu Ariza */ +#include "hb.hh" + +#ifndef HB_NO_SUBSET_CFF + #include "hb-open-type.hh" #include "hb-ot-cff2-table.hh" #include "hb-set.h" @@ -32,8 +36,6 @@ #include "hb-subset-cff-common.hh" #include "hb-cff2-interp-cs.hh" -#ifndef HB_NO_SUBSET_CFF - using namespace CFF; struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t @@ -629,4 +631,5 @@ hb_subset_cff2 (hb_subset_plan_t *plan, return result; } + #endif From da51a2cb0efae664d4ee83c6036f29a21621e993 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:09:22 -0700 Subject: [PATCH 501/617] [config] Don't compile math API if HB_NO_MATH Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-math.cc | 47 +++++++---------------------------------------- 1 file changed, 7 insertions(+), 40 deletions(-) diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index 7f2792327..a0bc357e6 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -24,6 +24,10 @@ * Igalia Author(s): Frédéric Wang */ +#include "hb.hh" + +#ifndef HB_NO_MATH + #include "hb-open-type.hh" #include "hb-ot-face.hh" @@ -62,10 +66,6 @@ hb_bool_t hb_ot_math_has_data (hb_face_t *face) { -#ifdef HB_NO_MATH - return false; -#endif - return face->table.MATH->has_data (); } @@ -90,10 +90,6 @@ hb_position_t hb_ot_math_get_constant (hb_font_t *font, hb_ot_math_constant_t constant) { -#ifdef HB_NO_MATH - return 0; -#endif - return font->face->table.MATH->get_constant(constant, font); } @@ -113,10 +109,6 @@ hb_position_t hb_ot_math_get_glyph_italics_correction (hb_font_t *font, hb_codepoint_t glyph) { -#ifdef HB_NO_MATH - return 0; -#endif - return font->face->table.MATH->get_glyph_info().get_italics_correction (glyph, font); } @@ -143,10 +135,6 @@ hb_position_t hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font, hb_codepoint_t glyph) { -#ifdef HB_NO_MATH - return 0; -#endif - return font->face->table.MATH->get_glyph_info().get_top_accent_attachment (glyph, font); } @@ -165,10 +153,6 @@ hb_bool_t hb_ot_math_is_glyph_extended_shape (hb_face_t *face, hb_codepoint_t glyph) { -#ifdef HB_NO_MATH - return false; -#endif - return face->table.MATH->get_glyph_info().is_extended_shape (glyph); } @@ -197,10 +181,6 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, hb_ot_math_kern_t kern, hb_position_t correction_height) { -#ifdef HB_NO_MATH - return 0; -#endif - return font->face->table.MATH->get_glyph_info().get_kerning (glyph, kern, correction_height, @@ -238,12 +218,6 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, unsigned int *variants_count, /* IN/OUT */ hb_ot_math_glyph_variant_t *variants /* OUT */) { -#ifdef HB_NO_MATH - if (variants_count) - *variants_count = 0; - return 0; -#endif - return font->face->table.MATH->get_variants().get_glyph_variants (glyph, direction, font, start_offset, variants_count, @@ -272,10 +246,6 @@ hb_position_t hb_ot_math_get_min_connector_overlap (hb_font_t *font, hb_direction_t direction) { -#ifdef HB_NO_MATH - return 0; -#endif - return font->face->table.MATH->get_variants().get_min_connector_overlap (direction, font); } @@ -313,12 +283,6 @@ hb_ot_math_get_glyph_assembly (hb_font_t *font, hb_ot_math_glyph_part_t *parts, /* OUT */ hb_position_t *italics_correction /* OUT */) { -#ifdef HB_NO_MATH - if (parts_count) - *parts_count = 0; - return 0; -#endif - return font->face->table.MATH->get_variants().get_glyph_parts (glyph, direction, font, @@ -327,3 +291,6 @@ hb_ot_math_get_glyph_assembly (hb_font_t *font, parts, italics_correction); } + + +#endif From 350f98ea47aaf0fe008065b92c8b6fe2bc519fa7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:11:41 -0700 Subject: [PATCH 502/617] [config] Don't compile name table API if HB_NO_NAME Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-name.cc | 25 +++++-------------------- src/test-ot-name.cc | 5 ++++- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc index 5cd1cc118..2f37c6768 100644 --- a/src/hb-ot-name.cc +++ b/src/hb-ot-name.cc @@ -26,6 +26,8 @@ #include "hb.hh" +#ifndef HB_NO_NAME + #include "hb-ot-name-table.hh" #include "hb-ot-face.hh" @@ -58,11 +60,6 @@ const hb_ot_name_entry_t * hb_ot_name_list_names (hb_face_t *face, unsigned int *num_entries /* OUT */) { -#ifdef HB_NO_NAME - if (num_entries) - *num_entries = 0; - return 0; -#endif const OT::name_accelerator_t &name = *face->table.name; if (num_entries) *num_entries = name.names.length; return (const hb_ot_name_entry_t *) name.names; @@ -172,11 +169,6 @@ hb_ot_name_get_utf8 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, char *text /* OUT */) { -#ifdef HB_NO_NAME - if (text_size) - *text_size = 0; - return 0; -#endif return hb_ot_name_get_utf (face, name_id, language, text_size, (hb_utf8_t::codepoint_t *) text); } @@ -204,11 +196,6 @@ hb_ot_name_get_utf16 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint16_t *text /* OUT */) { -#ifdef HB_NO_NAME - if (text_size) - *text_size = 0; - return 0; -#endif return hb_ot_name_get_utf (face, name_id, language, text_size, text); } @@ -235,10 +222,8 @@ hb_ot_name_get_utf32 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint32_t *text /* OUT */) { -#ifdef HB_NO_NAME - if (text_size) - *text_size = 0; - return 0; -#endif return hb_ot_name_get_utf (face, name_id, language, text_size, text); } + + +#endif diff --git a/src/test-ot-name.cc b/src/test-ot-name.cc index 518e4eb6e..44c2c179c 100644 --- a/src/test-ot-name.cc +++ b/src/test-ot-name.cc @@ -43,7 +43,9 @@ main (int argc, char **argv) hb_blob_destroy (blob); blob = nullptr; - unsigned int count; + unsigned int count = 0; + +#ifndef HB_NO_NAME const hb_ot_name_entry_t *entries = hb_ot_name_list_names (face, &count); for (unsigned int i = 0; i < count; i++) @@ -62,6 +64,7 @@ main (int argc, char **argv) printf ("%s\n", buf); } +#endif hb_face_destroy (face); From 83de3a60ab7383cf3ee25c1f8c33a45a7778d003 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:18:15 -0700 Subject: [PATCH 503/617] [config] Don't compile color API if HB_NO_COLOR Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-color.cc | 55 ++++++++------------------------------------ src/test-ot-color.cc | 9 +++++++- 2 files changed, 17 insertions(+), 47 deletions(-) diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index 20c602cdc..0e7203a88 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -25,20 +25,21 @@ * Google Author(s): Sascha Brawer, Behdad Esfahbod */ -#include "hb-open-type.hh" +#include "hb.hh" + +#ifndef HB_NO_COLOR + +#include "hb-ot.h" + #include "hb-ot-color-cbdt-table.hh" #include "hb-ot-color-colr-table.hh" #include "hb-ot-color-cpal-table.hh" #include "hb-ot-color-sbix-table.hh" #include "hb-ot-color-svg-table.hh" -#include "hb-ot-face.hh" -#include "hb-ot.h" #include #include -#include "hb-ot-layout.hh" - /** * SECTION:hb-ot-color @@ -70,9 +71,6 @@ hb_bool_t hb_ot_color_has_palettes (hb_face_t *face) { -#ifdef HB_NO_COLOR - return false; -#endif return face->table.CPAL->has_data (); } @@ -89,9 +87,6 @@ hb_ot_color_has_palettes (hb_face_t *face) unsigned int hb_ot_color_palette_get_count (hb_face_t *face) { -#ifdef HB_NO_COLOR - return 0; -#endif return face->table.CPAL->get_palette_count (); } @@ -115,9 +110,6 @@ hb_ot_name_id_t hb_ot_color_palette_get_name_id (hb_face_t *face, unsigned int palette_index) { -#ifdef HB_NO_COLOR - return HB_OT_NAME_ID_INVALID; -#endif return face->table.CPAL->get_palette_name_id (palette_index); } @@ -140,9 +132,6 @@ hb_ot_name_id_t hb_ot_color_palette_color_get_name_id (hb_face_t *face, unsigned int color_index) { -#ifdef HB_NO_COLOR - return HB_OT_NAME_ID_INVALID; -#endif return face->table.CPAL->get_color_name_id (color_index); } @@ -161,9 +150,6 @@ hb_ot_color_palette_flags_t hb_ot_color_palette_get_flags (hb_face_t *face, unsigned int palette_index) { -#ifdef HB_NO_COLOR - return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; -#endif return face->table.CPAL->get_palette_flags (palette_index); } @@ -195,11 +181,6 @@ hb_ot_color_palette_get_colors (hb_face_t *face, unsigned int *colors_count /* IN/OUT. May be NULL. */, hb_color_t *colors /* OUT. May be NULL. */) { -#ifdef HB_NO_COLOR - if (colors_count) - *colors_count = 0; - return 0; -#endif return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors); } @@ -221,9 +202,6 @@ hb_ot_color_palette_get_colors (hb_face_t *face, hb_bool_t hb_ot_color_has_layers (hb_face_t *face) { -#ifdef HB_NO_COLOR - return false; -#endif return face->table.COLR->has_data (); } @@ -250,11 +228,6 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, unsigned int *layer_count, /* IN/OUT. May be NULL. */ hb_ot_color_layer_t *layers /* OUT. May be NULL. */) { -#ifdef HB_NO_COLOR - if (layer_count) - *layer_count = 0; - return 0; -#endif return face->table.COLR->get_glyph_layers (glyph, start_offset, layer_count, layers); } @@ -276,9 +249,6 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, hb_bool_t hb_ot_color_has_svg (hb_face_t *face) { -#ifdef HB_NO_COLOR - return false; -#endif return face->table.SVG->has_data (); } @@ -296,9 +266,6 @@ hb_ot_color_has_svg (hb_face_t *face) hb_blob_t * hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) { -#ifdef HB_NO_COLOR - return hb_blob_get_empty (); -#endif return face->table.SVG->reference_blob_for_glyph (glyph); } @@ -320,9 +287,6 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) hb_bool_t hb_ot_color_has_png (hb_face_t *face) { -#ifdef HB_NO_COLOR - return false; -#endif return face->table.CBDT->has_data () || face->table.sbix->has_data (); } @@ -342,10 +306,6 @@ hb_ot_color_has_png (hb_face_t *face) hb_blob_t * hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph) { -#ifdef HB_NO_COLOR - return hb_blob_get_empty (); -#endif - hb_blob_t *blob = hb_blob_get_empty (); if (font->face->table.sbix->has_data ()) @@ -356,3 +316,6 @@ hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph) return blob; } + + +#endif diff --git a/src/test-ot-color.cc b/src/test-ot-color.cc index 26931fed3..44bd2eb69 100644 --- a/src/test-ot-color.cc +++ b/src/test-ot-color.cc @@ -23,7 +23,10 @@ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */ -#include "hb.h" +#include "hb.hh" + +#ifndef HB_NO_COLOR + #include "hb-ot.h" #include "hb-ft.h" @@ -334,3 +337,7 @@ main (int argc, char **argv) return 0; } + +#else +int main (int argc, char **argv) { return 0; } +#endif From bdbabd110cfdb4c59cf24bd500ce63073a5213e4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:21:25 -0700 Subject: [PATCH 504/617] Minor header include cleanup --- src/hb-aat-layout.cc | 1 - src/hb-ot-math.cc | 3 --- src/hb-ot-name.cc | 1 - src/hb-ot-var.cc | 4 ++-- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 35ba611a9..0efc2c432 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -27,7 +27,6 @@ #include "hb-open-type.hh" -#include "hb-ot-face.hh" #include "hb-aat-layout.hh" #include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise. #include "hb-aat-layout-ankr-table.hh" diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc index a0bc357e6..9d8c6e735 100644 --- a/src/hb-ot-math.cc +++ b/src/hb-ot-math.cc @@ -28,9 +28,6 @@ #ifndef HB_NO_MATH -#include "hb-open-type.hh" - -#include "hb-ot-face.hh" #include "hb-ot-math-table.hh" diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc index 2f37c6768..0b5ce810e 100644 --- a/src/hb-ot-name.cc +++ b/src/hb-ot-name.cc @@ -30,7 +30,6 @@ #include "hb-ot-name-table.hh" -#include "hb-ot-face.hh" #include "hb-utf.hh" diff --git a/src/hb-ot-var.cc b/src/hb-ot-var.cc index 25a246a21..5eea90d25 100644 --- a/src/hb-ot-var.cc +++ b/src/hb-ot-var.cc @@ -26,11 +26,11 @@ #include "hb-open-type.hh" -#include "hb-ot-face.hh" +#include "hb-ot-var.h" + #include "hb-ot-var-avar-table.hh" #include "hb-ot-var-fvar-table.hh" #include "hb-ot-var-mvar-table.hh" -#include "hb-ot-var.h" /** From be1c0ab2186a728eabdf6666632a9f759474f901 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:26:03 -0700 Subject: [PATCH 505/617] [config] Don't compile buffer serialize API if HB_NO_BUFFER_SERIALIZE Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-buffer-serialize.cc | 19 +++++++------------ src/test-buffer-serialize.cc | 7 ++++++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc index d3732fd02..77d997c90 100644 --- a/src/hb-buffer-serialize.cc +++ b/src/hb-buffer-serialize.cc @@ -24,14 +24,16 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_BUFFER_SERIALIZE + #include "hb-buffer.hh" static const char *serialize_formats[] = { -#ifndef HB_NO_BUFFER_SERIALIZE "text", "json", -#endif nullptr }; @@ -89,10 +91,8 @@ hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) { switch ((unsigned) format) { -#ifndef HB_NO_BUFFER_SERIALIZE case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0]; case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1]; -#endif default: case HB_BUFFER_SERIALIZE_FORMAT_INVALID: return nullptr; } @@ -348,10 +348,6 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer, if (buf_size) *buf = '\0'; -#ifdef HB_NO_BUFFER_SERIALIZE - return 0; -#endif - assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); @@ -457,10 +453,6 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, end_ptr = &end; *end_ptr = buf; -#ifdef HB_NO_BUFFER_SERIALIZE - return false; -#endif - assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); @@ -496,3 +488,6 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, } } + + +#endif diff --git a/src/test-buffer-serialize.cc b/src/test-buffer-serialize.cc index a91f4f7e9..28826be8d 100644 --- a/src/test-buffer-serialize.cc +++ b/src/test-buffer-serialize.cc @@ -37,6 +37,10 @@ int main (int argc, char **argv) { + bool ret = true; + +#ifndef HB_NO_BUFFER_SERIALIZE + if (argc != 2) { fprintf (stderr, "usage: %s font-file\n", argv[0]); exit (1); @@ -59,7 +63,6 @@ main (int argc, char **argv) hb_buffer_t *buf; buf = hb_buffer_create (); - bool ret = true; char line[BUFSIZ], out[BUFSIZ]; while (fgets (line, sizeof(line), stdin) != nullptr) { @@ -85,5 +88,7 @@ main (int argc, char **argv) hb_font_destroy (font); +#endif + return !ret; } From eb9798ef733da53e69966054b67752cd8937eb7b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:29:55 -0700 Subject: [PATCH 506/617] [config] Dont' compile buffer message API if HB_NO_BUFFER_MESSAGE Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-buffer.cc | 2 ++ src/hb-buffer.hh | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 5dd83fc2c..d1dbd0788 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -1993,6 +1993,7 @@ hb_buffer_diff (hb_buffer_t *buffer, * Debugging. */ +#ifndef HB_NO_BUFFER_MESSAGE /** * hb_buffer_set_message_func: * @buffer: an #hb_buffer_t. @@ -2030,3 +2031,4 @@ hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) vsnprintf (buf, sizeof (buf), fmt, ap); return (bool) this->message_func (this, font, buf, this->message_data); } +#endif diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index 9aae38dbb..bc0c7eddc 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -124,7 +124,9 @@ struct hb_buffer_t unsigned int context_len[2]; /* Debugging API */ +#ifndef HB_NO_BUFFER_MESSAGE hb_buffer_message_func_t message_func; +#endif void *message_data; hb_destroy_func_t message_destroy; @@ -351,8 +353,9 @@ struct hb_buffer_t { #ifdef HB_NO_BUFFER_MESSAGE return false; -#endif +#else return unlikely (message_func); +#endif } bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { From bf9424a9a198b99d49c005536a10f27387630064 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 13:31:35 -0700 Subject: [PATCH 507/617] [config] Don't compile unused layout API if HB_NO_LAYOUT_UNUSED Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-layout.cc | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 1945df4fe..9f3332281 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -311,6 +311,7 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t *face, } +#ifndef HB_NO_LAYOUT_UNUSED /** * hb_ot_layout_get_attach_points: * @face: The #hb_face_t to work on @@ -333,19 +334,11 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int *point_count /* IN/OUT */, unsigned int *point_array /* OUT */) { -#ifdef HB_NO_LAYOUT_UNUSED - if (point_count) - *point_count = 0; - return 0; -#endif - return face->table.GDEF->table->get_attach_points (glyph, start_offset, point_count, point_array); } - - /** * hb_ot_layout_get_ligature_carets: * @font: The #hb_font_t to work on @@ -368,12 +361,6 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, unsigned int *caret_count /* IN/OUT */, hb_position_t *caret_array /* OUT */) { -#ifdef HB_NO_LAYOUT_UNUSED - if (caret_count) - *caret_count = 0; - return 0; -#endif - unsigned int result_caret_count = 0; unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array); if (result) @@ -384,6 +371,7 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array); return result; } +#endif /* From 231d0257883ec9e8904afae1adfd73f3c225f177 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 14:25:52 -0700 Subject: [PATCH 508/617] [config] Don't compile AAT API if HB_NO_AAT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-aat-layout.cc | 131 ++++++++++++++----------------------------- src/hb-ot-shape.cc | 19 +++++-- 2 files changed, 56 insertions(+), 94 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 0efc2c432..e106c7623 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -25,7 +25,7 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-open-type.hh" +#include "hb.hh" #include "hb-aat-layout.hh" #include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise. @@ -39,6 +39,43 @@ #include "hb-aat-ltag-table.hh" +/* + * hb_aat_apply_context_t + */ + +/* Note: This context is used for kerning, even without AAT, hence the code location + * before HB_NO_AAT conditional below. */ + +AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, + hb_font_t *font_, + hb_buffer_t *buffer_, + hb_blob_t *blob) : + plan (plan_), + font (font_), + face (font->face), + buffer (buffer_), + sanitizer (), + ankr_table (&Null(AAT::ankr)), + lookup_index (0), + debug_depth (0) +{ + sanitizer.init (blob); + sanitizer.set_num_glyphs (face->get_num_glyphs ()); + sanitizer.start_processing (); + sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX); +} + +AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t () +{ sanitizer.end_processing (); } + +void +AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) +{ ankr_table = ankr_table_; } + + +#ifndef HB_NO_AAT + + /** * SECTION:hb-aat-layout * @title: hb-aat-layout @@ -134,10 +171,6 @@ static const hb_aat_feature_mapping_t feature_mappings[] = const hb_aat_feature_mapping_t * hb_aat_layout_find_feature_mapping (hb_tag_t tag) { -#ifdef HB_NO_SHAPE_AAT - return nullptr; -#endif - return (const hb_aat_feature_mapping_t *) hb_bsearch (&tag, feature_mappings, ARRAY_LENGTH (feature_mappings), @@ -146,39 +179,6 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) } -/* - * hb_aat_apply_context_t - */ - -/* Note: This context is used for kerning, even without AAT. */ - -AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, - hb_font_t *font_, - hb_buffer_t *buffer_, - hb_blob_t *blob) : - plan (plan_), - font (font_), - face (font->face), - buffer (buffer_), - sanitizer (), - ankr_table (&Null(AAT::ankr)), - lookup_index (0), - debug_depth (0) -{ - sanitizer.init (blob); - sanitizer.set_num_glyphs (face->get_num_glyphs ()); - sanitizer.start_processing (); - sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX); -} - -AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t () -{ sanitizer.end_processing (); } - -void -AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) -{ ankr_table = ankr_table_; } - - /* * mort/morx/kerx/trak */ @@ -188,10 +188,6 @@ void hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_aat_map_t *map) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - const AAT::morx& morx = *mapper->face->table.morx; if (morx.has_data ()) { @@ -218,10 +214,6 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_bool_t hb_aat_layout_has_substitution (hb_face_t *face) { -#ifdef HB_NO_SHAPE_AAT - return false; -#endif - return face->table.morx->has_data () || face->table.mort->has_data (); } @@ -231,10 +223,6 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - hb_blob_t *morx_blob = font->face->table.morx.get_blob (); const AAT::morx& morx = *morx_blob->as (); if (morx.has_data ()) @@ -257,10 +245,6 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, void hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; hb_glyph_position_t *pos = buffer->pos; @@ -278,10 +262,6 @@ is_deleted_glyph (const hb_glyph_info_t *info) void hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); } @@ -295,10 +275,6 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) hb_bool_t hb_aat_layout_has_positioning (hb_face_t *face) { -#ifdef HB_NO_SHAPE_AAT - return false; -#endif - return face->table.kerx->has_data (); } @@ -307,10 +283,6 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - hb_blob_t *kerx_blob = font->face->table.kerx.get_blob (); const AAT::kerx& kerx = *kerx_blob->as (); @@ -330,10 +302,6 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_bool_t hb_aat_layout_has_tracking (hb_face_t *face) { -#ifdef HB_NO_SHAPE_AAT - return false; -#endif - return face->table.trak->has_data (); } @@ -342,10 +310,6 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - const AAT::trak& trak = *font->face->table.trak; AAT::hb_aat_apply_context_t c (plan, font, buffer); @@ -369,12 +333,6 @@ hb_aat_layout_get_feature_types (hb_face_t *face, unsigned int *feature_count, /* IN/OUT. May be NULL. */ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) { -#ifdef HB_NO_SHAPE_AAT - if (feature_count) - *feature_count = 0; - return 0; -#endif - return face->table.feat->get_feature_types (start_offset, feature_count, features); } @@ -391,10 +349,6 @@ hb_ot_name_id_t hb_aat_layout_feature_type_get_name_id (hb_face_t *face, hb_aat_layout_feature_type_t feature_type) { -#ifdef HB_NO_SHAPE_AAT - return HB_OT_NAME_ID_INVALID; -#endif - return face->table.feat->get_feature_name_id (feature_type); } @@ -423,11 +377,8 @@ hb_aat_layout_feature_type_get_selector_infos (hb_face_t hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ unsigned int *default_index /* OUT. May be NULL. */) { -#ifdef HB_NO_SHAPE_AAT - if (selector_count) - *selector_count = 0; - return 0; -#endif - return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index); } + + +#endif diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index c63c3adee..635fa9403 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -152,13 +152,12 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (!plan.apply_kerx && !has_gpos_kern) { /* Apparently Apple applies kerx if GPOS kern was not applied. */ - if (0) - ; #ifndef HB_NO_SHAPE_AAT - else if (hb_aat_layout_has_positioning (face)) + if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; + else #endif - else if (hb_ot_layout_has_kerning (face)) + if (hb_ot_layout_has_kerning (face)) plan.apply_kern = true; } @@ -220,9 +219,11 @@ void hb_ot_shape_plan_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const { +#ifndef HB_NO_SHAPE_AAT if (unlikely (apply_morx)) hb_aat_layout_substitute (this, font, buffer); else +#endif map.substitute (this, font, buffer); } @@ -232,15 +233,19 @@ hb_ot_shape_plan_t::position (hb_font_t *font, { if (this->apply_gpos) map.position (this, font, buffer); +#ifndef HB_NO_SHAPE_AAT else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); +#endif else if (this->apply_kern) hb_ot_layout_kern (this, font, buffer); else _hb_ot_shape_fallback_kern (this, font, buffer); +#ifndef HB_NO_SHAPE_AAT if (this->apply_trak) hb_aat_layout_track (this, font, buffer); +#endif } @@ -336,6 +341,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, feature->value); } +#ifndef HB_NO_SHAPE_AAT if (planner->apply_morx) { hb_aat_map_builder_t *aat_map = &planner->aat_map; @@ -345,6 +351,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, aat_map->add_feature (feature->tag, feature->value); } } +#endif if (planner->shaper->override_features) planner->shaper->override_features (planner); @@ -779,8 +786,10 @@ static inline void hb_ot_substitute_post (const hb_ot_shape_context_t *c) { hb_ot_hide_default_ignorables (c->buffer, c->font); +#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_remove_deleted_glyphs (c->buffer); +#endif if (c->plan->shaper->postprocess_glyphs) c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font); @@ -914,8 +923,10 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) /* Finish off. Has to follow a certain order. */ hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c->buffer); +#ifndef HB_NO_SHAPE_AAT if (c->plan->apply_morx) hb_aat_layout_zero_width_deleted_glyphs (c->buffer); +#endif hb_ot_layout_position_finish_offsets (c->font, c->buffer); /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ From f08066ce9a41469e2a7396f0accd61e1c02e5649 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 14:29:27 -0700 Subject: [PATCH 509/617] [config] One more morx disabling Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-layout.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 9f3332281..1c69e253f 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -385,6 +385,8 @@ OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED, #ifdef HB_NO_OT_LAYOUT_BLACKLIST return false; #endif + +#ifndef HB_NO_SHAPE_AAT /* Mac OS X prefers morx over GSUB. It also ships with various Indic fonts, * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken * GSUB/GPOS tables. Some have GSUB with zero scripts, those are ignored by @@ -402,6 +404,7 @@ OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED, if (unlikely (face->table.OS2->achVendID == HB_TAG ('M','U','T','F') && face->table.morx->has_data ())) return true; +#endif return false; } From 37f8ebff5f1973423c7e4ed9dea88881d0642b61 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 14:33:49 -0700 Subject: [PATCH 510/617] [config] Fixup for AAT ltag table access Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-aat-layout.hh | 8 -------- src/hb-ot-name-table.hh | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/hb-aat-layout.hh b/src/hb-aat-layout.hh index 9a0e4468f..8310bfcc2 100644 --- a/src/hb-aat-layout.hh +++ b/src/hb-aat-layout.hh @@ -78,12 +78,4 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer); -inline hb_language_t -_hb_aat_language_get (hb_face_t *face, - unsigned int i) -{ - return face->table.ltag->get_language (i); -} - - #endif /* HB_AAT_LAYOUT_HH */ diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 68d7b3a65..59bf4387f 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -63,7 +63,7 @@ struct NameRecord #ifndef HB_NO_OT_NAME_LANGUAGE_AAT if (p == 0) - return _hb_aat_language_get (face, l); + return face->table.ltag->get_language (l); #endif #endif From d7e27cd65a085a76c85cddd93cea48ce4b7be03f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 14:38:05 -0700 Subject: [PATCH 511/617] [config] Don't use VORG table if HB_NO_OT_FONT_CFF Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-font.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index af9a9a2dc..0707a2ff8 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -148,12 +148,14 @@ hb_ot_get_glyph_v_origin (hb_font_t *font, *x = font->get_glyph_h_advance (glyph) / 2; +#ifndef HB_NO_OT_FONT_CFF const OT::VORG &VORG = *ot_face->VORG; if (VORG.has_data ()) { *y = font->em_scale_y (VORG.get_y_origin (glyph)); return true; } +#endif hb_glyph_extents_t extents = {0}; if (ot_face->glyf->get_extents (glyph, &extents)) From f0b0fd4e78e94315c9d01b9232ebfb09bbfef556 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 14:40:24 -0700 Subject: [PATCH 512/617] Remove dead code --- src/hb-ot-layout.cc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 1c69e253f..16b2c28f2 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1932,11 +1932,6 @@ hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, } #if 0 -static const OT::BASE& _get_base (hb_face_t *face) -{ - return *face->table.BASE; -} - hb_bool_t hb_ot_layout_get_baseline (hb_font_t *font, hb_ot_layout_baseline_t baseline, @@ -1945,9 +1940,8 @@ hb_ot_layout_get_baseline (hb_font_t *font, hb_tag_t language_tag, hb_position_t *coord /* OUT. May be NULL. */) { - const OT::BASE &base = _get_base (font->face); - bool result = base.get_baseline (font, baseline, direction, script_tag, - language_tag, coord); + bool result = font->face->table.BASE->get_baseline (font, baseline, direction, script_tag, + language_tag, coord); /* TODO: Simulate https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags#ideographic-em-box */ if (!result && coord) *coord = 0; From 10bac21bb5b25cf20c2198934e99e444625dfd97 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jun 2019 15:15:06 -0700 Subject: [PATCH 513/617] [coretext/uniscribe/directwrite] Remove extra semicolons Fixes https://github.com/harfbuzz/harfbuzz/pull/1783 --- src/hb-coretext.cc | 2 +- src/hb-directwrite.cc | 2 +- src/hb-uniscribe.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 20cfe4a60..4a299a6ee 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -652,7 +652,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, DEBUG_MSG (CORETEXT, nullptr, __VA_ARGS__); \ ret = false; \ goto fail; \ - } HB_STMT_END; + } HB_STMT_END bool ret = true; CFStringRef string_ref = nullptr; diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 85ba8b627..9b851148b 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -176,7 +176,7 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) HB_STMT_START { \ DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \ return nullptr; \ - } HB_STMT_END; + } HB_STMT_END if (FAILED (hr)) FAIL ("Failed to load font file from data!"); diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index fceda5244..88f429401 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -724,7 +724,7 @@ _hb_uniscribe_shape (hb_shape_plan_t *shape_plan, HB_STMT_START { \ DEBUG_MSG (UNISCRIBE, nullptr, __VA_ARGS__); \ return false; \ - } HB_STMT_END; + } HB_STMT_END HRESULT hr; From e710888188ff3285a162c25c89d886d9535d9f02 Mon Sep 17 00:00:00 2001 From: Misty De Meo Date: Tue, 18 Jun 2019 15:20:38 -0700 Subject: [PATCH 514/617] coretext: remove trailing macro from SCRATCH_RESTORE --- src/hb-coretext.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 4a299a6ee..a57b97026 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -980,7 +980,7 @@ resize_and_retry: #define SCRATCH_RESTORE() \ scratch_size = scratch_size_saved; \ - scratch = scratch_saved; + scratch = scratch_saved { /* Setup glyphs */ SCRATCH_SAVE(); From 631da9d816da381c5fd4b3cc640c41fda736a96f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 15:36:14 -0700 Subject: [PATCH 515/617] [config] Remove tables from hb_face_t for disabled features Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/Makefile.sources | 1 + src/hb-ot-face-table-list.hh | 112 +++++++++++++++++++++++++++++++++++ src/hb-ot-face.cc | 8 +-- src/hb-ot-face.hh | 52 +--------------- src/hb-ot-layout.cc | 2 + 5 files changed, 120 insertions(+), 55 deletions(-) create mode 100644 src/hb-ot-face-table-list.hh diff --git a/src/Makefile.sources b/src/Makefile.sources index af0296b67..ab228ce7e 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -64,6 +64,7 @@ HB_BASE_sources = \ hb-ot-color.cc \ hb-ot-face.cc \ hb-ot-face.hh \ + hb-ot-face-table-list.hh \ hb-ot-font.cc \ hb-ot-gasp-table.hh \ hb-ot-glyf-table.hh \ diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh new file mode 100644 index 000000000..75ce59309 --- /dev/null +++ b/src/hb-ot-face-table-list.hh @@ -0,0 +1,112 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2012,2013 Google, Inc. + * Copyright © 2019, Facebook Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + * Facebook Author(s): Behdad Esfahbod + */ + +#ifndef HB_FACE_TABLE_LIST_HH +#define HB_FACE_TABLE_LIST_HH +#endif /* HB_FACE_TABLE_LIST_HH */ /* Dummy header guards */ + +#ifndef HB_OT_ACCELERATOR +#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) +#define _HB_OT_ACCELERATOR_UNDEF +#endif + + +/* This lists font tables that the hb_face_t will contain and lazily + * load. Don't add a table unless it's used though. This is not + * exactly free. */ + +/* v--- Add new tables in the right place here. */ + + +/* OpenType fundamentals. */ +HB_OT_TABLE (OT, head) +HB_OT_ACCELERATOR (OT, cmap) +HB_OT_ACCELERATOR (OT, hmtx) +HB_OT_ACCELERATOR (OT, post) +HB_OT_TABLE (OT, kern) +HB_OT_ACCELERATOR (OT, name) +HB_OT_TABLE (OT, OS2) +HB_OT_TABLE (OT, STAT) + +/* Vertical layout. */ +HB_OT_ACCELERATOR (OT, vmtx) + +/* TrueType outlines. */ +HB_OT_ACCELERATOR (OT, glyf) + +/* CFF outlines. */ +#ifndef HB_NO_CFF +HB_OT_ACCELERATOR (OT, cff1) +HB_OT_ACCELERATOR (OT, cff2) +HB_OT_TABLE (OT, VORG) +#endif + +/* OpenType variations. */ +HB_OT_TABLE (OT, fvar) +HB_OT_TABLE (OT, avar) +HB_OT_TABLE (OT, MVAR) + +/* OpenType shaping. */ +HB_OT_ACCELERATOR (OT, GDEF) +HB_OT_ACCELERATOR (OT, GSUB) +HB_OT_ACCELERATOR (OT, GPOS) +//HB_OT_TABLE (OT, BASE) +//HB_OT_TABLE (OT, JSTF) + +/* AAT shaping. */ +#ifndef HB_NO_AAT +HB_OT_TABLE (AAT, morx) +HB_OT_TABLE (AAT, mort) +HB_OT_TABLE (AAT, kerx) +HB_OT_TABLE (AAT, ankr) +HB_OT_TABLE (AAT, trak) +HB_OT_TABLE (AAT, lcar) +HB_OT_TABLE (AAT, ltag) +HB_OT_TABLE (AAT, feat) +#endif + +/* OpenType color fonts. */ +#ifndef HB_NO_COLOR +HB_OT_TABLE (OT, COLR) +HB_OT_TABLE (OT, CPAL) +HB_OT_ACCELERATOR (OT, CBDT) +HB_OT_ACCELERATOR (OT, sbix) +HB_OT_ACCELERATOR (OT, SVG) +#endif + +/* OpenType math. */ +#ifndef HB_NO_MATH +HB_OT_TABLE (OT, MATH) +#endif + + +#ifdef _HB_OT_ACCELERATOR_UNDEF +#undef HB_OT_ACCELERATOR +#endif diff --git a/src/hb-ot-face.cc b/src/hb-ot-face.cc index 9b17526b7..f54d0b639 100644 --- a/src/hb-ot-face.cc +++ b/src/hb-ot-face.cc @@ -46,16 +46,12 @@ void hb_ot_face_t::init0 (hb_face_t *face) { this->face = face; #define HB_OT_TABLE(Namespace, Type) Type.init0 (); -#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) - HB_OT_TABLES -#undef HB_OT_ACCELERATOR +#include "hb-ot-face-table-list.hh" #undef HB_OT_TABLE } void hb_ot_face_t::fini () { #define HB_OT_TABLE(Namespace, Type) Type.fini (); -#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) - HB_OT_TABLES -#undef HB_OT_ACCELERATOR +#include "hb-ot-face-table-list.hh" #undef HB_OT_TABLE } diff --git a/src/hb-ot-face.hh b/src/hb-ot-face.hh index 7f47ba6cb..e24d380bc 100644 --- a/src/hb-ot-face.hh +++ b/src/hb-ot-face.hh @@ -38,54 +38,10 @@ * hb_ot_face_t */ -#define HB_OT_TABLES \ - /* OpenType fundamentals. */ \ - HB_OT_TABLE(OT, head) \ - HB_OT_ACCELERATOR(OT, cmap) \ - HB_OT_ACCELERATOR(OT, hmtx) \ - HB_OT_ACCELERATOR(OT, vmtx) \ - HB_OT_ACCELERATOR(OT, post) \ - HB_OT_TABLE(OT, kern) \ - HB_OT_ACCELERATOR(OT, glyf) \ - HB_OT_ACCELERATOR(OT, cff1) \ - HB_OT_ACCELERATOR(OT, cff2) \ - HB_OT_TABLE(OT, VORG) \ - HB_OT_ACCELERATOR(OT, name) \ - HB_OT_TABLE(OT, OS2) \ - HB_OT_TABLE(OT, STAT) \ - /* OpenType shaping. */ \ - HB_OT_ACCELERATOR(OT, GDEF) \ - HB_OT_ACCELERATOR(OT, GSUB) \ - HB_OT_ACCELERATOR(OT, GPOS) \ - HB_OT_TABLE(OT, BASE) \ - HB_OT_TABLE(OT, JSTF) \ - /* AAT shaping. */ \ - HB_OT_TABLE(AAT, mort) \ - HB_OT_TABLE(AAT, morx) \ - HB_OT_TABLE(AAT, kerx) \ - HB_OT_TABLE(AAT, ankr) \ - HB_OT_TABLE(AAT, trak) \ - HB_OT_TABLE(AAT, lcar) \ - HB_OT_TABLE(AAT, ltag) \ - HB_OT_TABLE(AAT, feat) \ - /* OpenType variations. */ \ - HB_OT_TABLE(OT, fvar) \ - HB_OT_TABLE(OT, avar) \ - HB_OT_TABLE(OT, MVAR) \ - /* OpenType math. */ \ - HB_OT_TABLE(OT, MATH) \ - /* OpenType color fonts. */ \ - HB_OT_TABLE(OT, COLR) \ - HB_OT_TABLE(OT, CPAL) \ - HB_OT_ACCELERATOR(OT, CBDT) \ - HB_OT_ACCELERATOR(OT, sbix) \ - HB_OT_ACCELERATOR(OT, SVG) \ - /* */ - /* Declare tables. */ #define HB_OT_TABLE(Namespace, Type) namespace Namespace { struct Type; } #define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type##_accelerator_t) -HB_OT_TABLES +#include "hb-ot-face-table-list.hh" #undef HB_OT_ACCELERATOR #undef HB_OT_TABLE @@ -100,9 +56,7 @@ struct hb_ot_face_t { ORDER_ZERO, #define HB_OT_TABLE(Namespace, Type) HB_OT_TABLE_ORDER (Namespace, Type), -#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) - HB_OT_TABLES -#undef HB_OT_ACCELERATOR +#include "hb-ot-face-table-list.hh" #undef HB_OT_TABLE }; @@ -111,7 +65,7 @@ struct hb_ot_face_t hb_table_lazy_loader_t Type; #define HB_OT_ACCELERATOR(Namespace, Type) \ hb_face_lazy_loader_t Type; - HB_OT_TABLES +#include "hb-ot-face-table-list.hh" #undef HB_OT_ACCELERATOR #undef HB_OT_TABLE }; diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 16b2c28f2..0e75049c8 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -367,8 +367,10 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, { if (caret_count) *caret_count = result_caret_count; } +#ifndef HB_NO_AAT else result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array); +#endif return result; } #endif From 2e3e929d2b0fa6026c55eb92f91de0498fb22646 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 15:50:13 -0700 Subject: [PATCH 516/617] Fix build --- src/hb-ot-face-table-list.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 75ce59309..74ee1985e 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -28,9 +28,9 @@ * Facebook Author(s): Behdad Esfahbod */ -#ifndef HB_FACE_TABLE_LIST_HH -#define HB_FACE_TABLE_LIST_HH -#endif /* HB_FACE_TABLE_LIST_HH */ /* Dummy header guards */ +#ifndef HB_OT_FACE_TABLE_LIST_HH +#define HB_OT_FACE_TABLE_LIST_HH +#endif /* HB_OT_FACE_TABLE_LIST_HH */ /* Dummy header guards */ #ifndef HB_OT_ACCELERATOR #define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) From 588697afd0ddf411e8201866ade1f593ccb61aab Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:24:51 -0700 Subject: [PATCH 517/617] [config] Add HB_NO_OT_KERN, enabled by HB_MINI / HB_NO_LEGACY Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-face-table-list.hh | 6 +++++- src/hb-ot-layout.cc | 4 ++-- src/hb-ot-shape.cc | 16 ++++++++++++++-- src/hb-ot-shape.hh | 4 ++++ 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index c1a15f86e..e02694bef 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -101,6 +101,7 @@ #ifdef HB_NO_LEGACY #define HB_NO_FALLBACK_SHAPE +#define HB_NO_OT_KERN #define HB_NO_OT_LAYOUT_BLACKLIST #define HB_NO_OT_SHAPE_FALLBACK #endif diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 74ee1985e..1dcfad4c9 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -50,7 +50,6 @@ HB_OT_TABLE (OT, head) HB_OT_ACCELERATOR (OT, cmap) HB_OT_ACCELERATOR (OT, hmtx) HB_OT_ACCELERATOR (OT, post) -HB_OT_TABLE (OT, kern) HB_OT_ACCELERATOR (OT, name) HB_OT_TABLE (OT, OS2) HB_OT_TABLE (OT, STAT) @@ -73,6 +72,11 @@ HB_OT_TABLE (OT, fvar) HB_OT_TABLE (OT, avar) HB_OT_TABLE (OT, MVAR) +/* Legacy kern. */ +#ifndef HB_NO_OT_KERN +HB_OT_TABLE (OT, kern) +#endif + /* OpenType shaping. */ HB_OT_ACCELERATOR (OT, GDEF) HB_OT_ACCELERATOR (OT, GSUB) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 0e75049c8..0761b8e53 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -62,6 +62,7 @@ * kern */ +#ifndef HB_NO_OT_KERN /** * hb_ot_layout_has_kerning: * @face: The #hb_face_t to work on @@ -78,7 +79,6 @@ hb_ot_layout_has_kerning (hb_face_t *face) return face->table.kern->has_data (); } - /** * hb_ot_layout_has_machine_kerning: * @face: The #hb_face_t to work on @@ -95,7 +95,6 @@ hb_ot_layout_has_machine_kerning (hb_face_t *face) return face->table.kern->has_state_machine (); } - /** * hb_ot_layout_has_cross_kerning: * @face: The #hb_face_t to work on @@ -128,6 +127,7 @@ hb_ot_layout_kern (const hb_ot_shape_plan_t *plan, kern.apply (&c); } +#endif /* diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 635fa9403..f5f1ae6cc 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -157,18 +157,28 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.apply_kerx = true; else #endif +#ifndef HB_NO_OT_KERN if (hb_ot_layout_has_kerning (face)) plan.apply_kern = true; +#endif } plan.zero_marks = script_zero_marks && !plan.apply_kerx && - (!plan.apply_kern || !hb_ot_layout_has_machine_kerning (face)); + (!plan.apply_kern +#ifndef HB_NO_OT_KERN + || !hb_ot_layout_has_machine_kerning (face) +#endif + ); plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k')); plan.adjust_mark_positioning_when_zeroing = !plan.apply_gpos && !plan.apply_kerx && - (!plan.apply_kern || !hb_ot_layout_has_cross_kerning (face)); + (!plan.apply_kern +#ifndef HB_NO_OT_KERN + || !hb_ot_layout_has_cross_kerning (face) +#endif + ); plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing && script_fallback_mark_positioning; @@ -237,8 +247,10 @@ hb_ot_shape_plan_t::position (hb_font_t *font, else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); #endif +#ifndef HB_NO_OT_KERN else if (this->apply_kern) hb_ot_layout_kern (this, font, buffer); +#endif else _hb_ot_shape_fallback_kern (this, font, buffer); diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index b7c0f1065..09164427e 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -80,7 +80,11 @@ struct hb_ot_shape_plan_t bool adjust_mark_positioning_when_zeroing : 1; bool apply_gpos : 1; +#ifndef HB_NO_OT_KERN bool apply_kern : 1; +#else + static constexpr bool apply_kern = false; +#endif #ifndef HB_NO_SHAPE_AAT bool apply_kerx : 1; bool apply_morx : 1; From d2ff73b256599a655e4ddedbe1ca75abdf837d23 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:28:08 -0700 Subject: [PATCH 518/617] [config] Remove remaining AAT context bits if HB_NO_OT_KERN Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-aat-layout.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index e106c7623..c08bb11f4 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -43,8 +43,8 @@ * hb_aat_apply_context_t */ -/* Note: This context is used for kerning, even without AAT, hence the code location - * before HB_NO_AAT conditional below. */ +/* Note: This context is used for kerning, even without AAT, hence the condition. */ +#if !defined(HB_NO_AAT) || !defined(HB_NO_OT_KERN) AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, hb_font_t *font_, @@ -72,6 +72,8 @@ void AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) { ankr_table = ankr_table_; } +#endif + #ifndef HB_NO_AAT From f642a5fa6c42b145574593a0e18815dc74d3c617 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:36:09 -0700 Subject: [PATCH 519/617] Restructure code --- src/hb-ot-tag.cc | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index 61b609d5e..e3d1aa732 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -305,28 +305,24 @@ parse_private_use_subtag (const char *private_use_subtag, const char *prefix, unsigned char (*normalize) (unsigned char)) { - if (private_use_subtag && count && tags && *count) - { - const char *s = strstr (private_use_subtag, prefix); - if (s) - { - char tag[4]; - int i; - s += strlen (prefix); - for (i = 0; i < 4 && ISALNUM (s[i]); i++) - tag[i] = normalize (s[i]); - if (i) - { - for (; i < 4; i++) - tag[i] = ' '; - tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]); - if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT) - tags[0] ^= ~0xDFDFDFDF; - *count = 1; - return false; - } - } - } + if (!(private_use_subtag && count && tags && *count)) return false; + + const char *s = strstr (private_use_subtag, prefix); + if (!s) return false; + + char tag[4]; + int i; + s += strlen (prefix); + for (i = 0; i < 4 && ISALNUM (s[i]); i++) + tag[i] = normalize (s[i]); + if (!i) return false; + + for (; i < 4; i++) + tag[i] = ' '; + tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]); + if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT) + tags[0] ^= ~0xDFDFDFDF; + *count = 1; return true; } @@ -394,8 +390,8 @@ hb_ot_tags_from_script_and_language (hb_script_t script, limit = s; } - needs_script = parse_private_use_subtag (private_use_subtag, script_count, script_tags, "-hbsc", TOLOWER); - needs_language = parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER); + needs_script = !parse_private_use_subtag (private_use_subtag, script_count, script_tags, "-hbsc", TOLOWER); + needs_language = !parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER); if (needs_language && language_count && language_tags && *language_count) hb_ot_tags_from_language (lang_str, limit, language_count, language_tags); From 971330c0588307bcd73934e44c6343db55b1f5b6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:37:35 -0700 Subject: [PATCH 520/617] [config] Add HB_NO_LANGUAGE_PRIVATE_SUBTAG Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-tag.cc | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index e02694bef..381146c55 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -58,6 +58,7 @@ #define HB_NO_CFF #define HB_NO_COLOR #define HB_NO_GETENV +#define HB_NO_LANGUAGE_PRIVATE_SUBTAG #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH #define HB_NO_MMAP diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index e3d1aa732..e63045894 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -305,6 +305,10 @@ parse_private_use_subtag (const char *private_use_subtag, const char *prefix, unsigned char (*normalize) (unsigned char)) { +#ifdef HB_NO_LANGUAGE_PRIVATE_SUBTAG + return false; +#endif + if (!(private_use_subtag && count && tags && *count)) return false; const char *s = strstr (private_use_subtag, prefix); From eaf4a7364c28663720a9da57bf4d576b6009e17d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:51:13 -0700 Subject: [PATCH 521/617] [config] Minor trak disable Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index f5f1ae6cc..e11dc15ce 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -317,10 +317,12 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, /* Random! */ map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE); +#ifndef HB_NO_SHAPE_AAT /* Tracking. We enable dummy feature here just to allow disabling * AAT 'trak' table using features. * https://github.com/harfbuzz/harfbuzz/issues/1303 */ map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK); +#endif map->enable_feature (HB_TAG ('H','A','R','F')); From d84932ba50482b3b47e393714eb77b19173d1f14 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 16:57:48 -0700 Subject: [PATCH 522/617] [config] add HB_NO_OT_SHAPE_FRACTIONS, enabled in HB_LEAN Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-shape.cc | 9 +++++++++ src/hb-ot-shape.hh | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 381146c55..2ff92ced3 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -65,6 +65,7 @@ #define HB_NO_NAME #define HB_NO_OPEN #define HB_NO_SETLOCALE +#define HB_NO_OT_SHAPE_FRACTIONS #define HB_NO_SUBSET_LAYOUT #endif diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index e11dc15ce..4bc91c2ef 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -101,10 +101,13 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (apply_morx) aat_map.compile (plan.aat_map); +#ifndef HB_NO_OT_SHAPE_FRACTIONS plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c')); plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r')); plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m')); plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask); +#endif + plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m')); hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ? HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n'); @@ -309,10 +312,12 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, break; } +#ifndef HB_NO_OT_SHAPE_FRACTIONS /* Automatic fractions. */ map->add_feature (HB_TAG ('f','r','a','c')); map->add_feature (HB_TAG ('n','u','m','r')); map->add_feature (HB_TAG ('d','n','o','m')); +#endif /* Random! */ map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE); @@ -590,6 +595,10 @@ hb_ot_mirror_chars (const hb_ot_shape_context_t *c) static inline void hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c) { +#ifdef HB_NO_OT_SHAPE_FRACTIONS + return; +#endif + if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) || !c->plan->has_frac) return; diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index 09164427e..452da635d 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -65,14 +65,24 @@ struct hb_ot_shape_plan_t hb_ot_map_t map; hb_aat_map_t aat_map; const void *data; +#ifndef HB_NO_OT_SHAPE_FRACTIONS hb_mask_t frac_mask, numr_mask, dnom_mask; +#else + static constexpr hb_mask_t frac_mask = 0; + static constexpr hb_mask_t numr_mask = 0; + static constexpr hb_mask_t dnom_mask = 0; +#endif hb_mask_t rtlm_mask; hb_mask_t kern_mask; hb_mask_t trak_mask; bool requested_kerning : 1; bool requested_tracking : 1; +#ifndef HB_NO_OT_SHAPE_FRACTIONS bool has_frac : 1; +#else + static constexpr bool has_frac = false; +#endif bool has_gpos_mark : 1; bool zero_marks : 1; bool fallback_glyph_classes : 1; From 43d7048d59b1a0af62b80bd914805bdec74a29d2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 17:02:32 -0700 Subject: [PATCH 523/617] [config] More trak disabling Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape.cc | 4 +++- src/hb-ot-shape.hh | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 4bc91c2ef..d397dded1 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -112,10 +112,12 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ? HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n'); plan.kern_mask = plan.map.get_mask (kern_tag); +#ifndef HB_NO_SHAPE_AAT plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k')); + plan.requested_tracking = !!plan.trak_mask; +#endif plan.requested_kerning = !!plan.kern_mask; - plan.requested_tracking = !!plan.trak_mask; bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX; bool disable_gpos = plan.shaper->gpos_tag && plan.shaper->gpos_tag != plan.map.chosen_script[1]; diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index 452da635d..01f6afa3d 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -74,10 +74,18 @@ struct hb_ot_shape_plan_t #endif hb_mask_t rtlm_mask; hb_mask_t kern_mask; +#ifndef HB_NO_SHAPE_AAT hb_mask_t trak_mask; +#else + static constexpr hb_mask_t trak_mask = 0; +#endif bool requested_kerning : 1; +#ifndef HB_NO_SHAPE_AAT bool requested_tracking : 1; +#else + static constexpr bool requested_tracking = false; +#endif #ifndef HB_NO_OT_SHAPE_FRACTIONS bool has_frac : 1; #else From d8bf6723a1176ca26e97e8015044c8829ec77c36 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 17:04:16 -0700 Subject: [PATCH 524/617] [config] Disable more legacy kerning Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-shape.cc | 4 +++- src/hb-ot-shape.hh | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index d397dded1..20dbac2be 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -111,13 +111,15 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m')); hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ? HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n'); +#ifndef HB_NO_OT_KERN plan.kern_mask = plan.map.get_mask (kern_tag); + plan.requested_kerning = !!plan.kern_mask; +#endif #ifndef HB_NO_SHAPE_AAT plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k')); plan.requested_tracking = !!plan.trak_mask; #endif - plan.requested_kerning = !!plan.kern_mask; bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX; bool disable_gpos = plan.shaper->gpos_tag && plan.shaper->gpos_tag != plan.map.chosen_script[1]; diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index 01f6afa3d..fec8983c6 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -73,14 +73,22 @@ struct hb_ot_shape_plan_t static constexpr hb_mask_t dnom_mask = 0; #endif hb_mask_t rtlm_mask; +#ifndef HB_NO_OT_KERN hb_mask_t kern_mask; +#else + static constexpr hb_mask_t kern_mask = 0; +#endif #ifndef HB_NO_SHAPE_AAT hb_mask_t trak_mask; #else static constexpr hb_mask_t trak_mask = 0; #endif +#ifndef HB_NO_OT_KERN bool requested_kerning : 1; +#else + static constexpr bool requested_kerning = false; +#endif #ifndef HB_NO_SHAPE_AAT bool requested_tracking : 1; #else From f4de0c775408e34474a688361fa319251e1a9c18 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 17:08:26 -0700 Subject: [PATCH 525/617] [config] Disable AAT map Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-aat-map.cc | 15 +++++++-------- src/hb-ot-shape.cc | 6 ++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/hb-aat-map.cc b/src/hb-aat-map.cc index d57ee849d..e16ecfe04 100644 --- a/src/hb-aat-map.cc +++ b/src/hb-aat-map.cc @@ -26,6 +26,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_SHAPE_AAT + #include "hb-aat-map.hh" #include "hb-aat-layout.hh" @@ -34,10 +38,6 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, unsigned int value) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - if (tag == HB_TAG ('a','a','l','t')) { feature_info_t *info = features.push(); @@ -57,10 +57,6 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, void hb_aat_map_builder_t::compile (hb_aat_map_t &m) { -#ifdef HB_NO_SHAPE_AAT - return; -#endif - /* Sort features and merge duplicates */ if (features.length) { @@ -74,3 +70,6 @@ hb_aat_map_builder_t::compile (hb_aat_map_t &m) hb_aat_layout_compile_map (this, &m); } + + +#endif diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 20dbac2be..7690c2229 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -98,8 +98,10 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.props = props; plan.shaper = shaper; map.compile (plan.map, key); +#ifndef HB_NO_SHAPE_AAT if (apply_morx) aat_map.compile (plan.aat_map); +#endif #ifndef HB_NO_OT_SHAPE_FRACTIONS plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c')); @@ -201,7 +203,9 @@ hb_ot_shape_plan_t::init0 (hb_face_t *face, const hb_shape_plan_key_t *key) { map.init (); +#ifndef HB_NO_SHAPE_AAT aat_map.init (); +#endif hb_ot_shape_planner_t planner (face, &key->props); @@ -229,7 +233,9 @@ hb_ot_shape_plan_t::fini () shaper->data_destroy (const_cast (data)); map.fini (); +#ifndef HB_NO_SHAPE_AAT aat_map.fini (); +#endif } void From b1a2384a5244ea3ea63ca94eb095c4add2cd451d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 17:34:12 -0700 Subject: [PATCH 526/617] [ucd] Print out table sizes --- src/gen-ucd-table.py | 27 +++++++++++++++++++-------- src/hb-ucd-table.hh | 1 - 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 967e000d4..c98c715e1 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -3,19 +3,22 @@ from __future__ import print_function, division, absolute_import import io, os.path, sys, re +import logging +logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) if len (sys.argv) != 2: print("usage: ./gen-ucd-table ucd.nonunihan.grouped.xml", file=sys.stderr) sys.exit(1) - # https://github.com/harfbuzz/packtab import packTab import packTab.ucdxml +logging.info('Loading UCDXML...') ucdxml = packTab.ucdxml.load_ucdxml(sys.argv[1]) ucd = packTab.ucdxml.ucdxml_get_repertoire(ucdxml) +logging.info('Preparing data tables...') gc = [u['gc'] for u in ucd] ccc = [int(u['ccc']) for u in ucd] @@ -71,6 +74,7 @@ DEFAULT = 1 COMPACT = 3 +logging.info('Generating output...') print("/* == Start of generated table == */") print("/*") print(" * The following table is generated by running:") @@ -82,8 +86,6 @@ print(" */") print() print("#ifndef HB_UCD_TABLE_HH") print("#define HB_UCD_TABLE_HH") -print() - print() print('#include "hb.hh"') print() @@ -95,7 +97,16 @@ dm1_32_array, _ = code.addArray('uint32_t', 'dm1_u32_map', dm1_u32_array) dm2_array, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) code.print_c(linkage='static inline') +datasets = [ + ('gc', gc, 'Cn', gc_order), + ('ccc', ccc, 0, None), + ('bmg', bmg, 0, None), + ('sc', sc, 'Zzzz', sc_order), + ('dm', dm, None, dm_order), +] + for compression in (DEFAULT, COMPACT): + logging.info(' Compression=%d:' % compression) print() if compression == DEFAULT: print('#ifndef HB_OPTIMIZE_SIZE') @@ -105,11 +116,10 @@ for compression in (DEFAULT, COMPACT): code = packTab.Code('_hb_ucd') - packTab.pack_table(gc, 'Cn', mapping=gc_order, compression=compression).genCode(code, 'gc') - packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') - packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') - packTab.pack_table(sc, 'Zzzz', mapping=sc_order, compression=compression).genCode(code, 'sc') - packTab.pack_table(dm, None, mapping=dm_order, compression=compression).genCode(code, 'dm') + for name,data,default,mapping in datasets: + sol = packTab.pack_table(data, default, mapping=mapping, compression=compression) + logging.info(' Dataset=%-8s FullCost=%d' % (name, sol.fullCost)) + sol.genCode(code, name) code.print_c(linkage='static inline') @@ -123,3 +133,4 @@ print() print("#endif /* HB_UCD_TABLE_HH */") print() print("/* == End of generated table == */") +logging.info('Done.') diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index ae339ec0c..e9d097542 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -10,7 +10,6 @@ #ifndef HB_UCD_TABLE_HH #define HB_UCD_TABLE_HH - #include "hb.hh" static const hb_script_t From 1432df102ebf206592f92677f48bb950871675b3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 18:32:40 -0700 Subject: [PATCH 527/617] [config] Disable hb-ot-font code if HB_NO_OT_FONT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-font.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 0707a2ff8..5895c7b6b 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -26,6 +26,8 @@ #include "hb.hh" +#ifndef HB_NO_OT_FONT + #include "hb-ot.h" #include "hb-font.hh" @@ -317,3 +319,6 @@ hb_ot_font_set_funcs (hb_font_t *font) &font->face->table, nullptr); } + + +#endif From ffc2b8d56e5d35b4dc19499c830d8fc4b643213a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 18:33:29 -0700 Subject: [PATCH 528/617] [config] Don't include name table in face if HB_NO_NAME Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-ot-face-table-list.hh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 1dcfad4c9..6185b67cc 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -50,8 +50,10 @@ HB_OT_TABLE (OT, head) HB_OT_ACCELERATOR (OT, cmap) HB_OT_ACCELERATOR (OT, hmtx) HB_OT_ACCELERATOR (OT, post) -HB_OT_ACCELERATOR (OT, name) HB_OT_TABLE (OT, OS2) +#ifndef HB_NO_NAME +HB_OT_ACCELERATOR (OT, name) +#endif HB_OT_TABLE (OT, STAT) /* Vertical layout. */ From a5897463d4d0b83cb1bfe4ae1477dac4e3851252 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 18:36:35 -0700 Subject: [PATCH 529/617] [config] Add HB_NO_STAT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-face-table-list.hh | 2 ++ src/hb-subset-plan.cc | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 2ff92ced3..3aa48b4b0 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -66,6 +66,7 @@ #define HB_NO_OPEN #define HB_NO_SETLOCALE #define HB_NO_OT_SHAPE_FRACTIONS +#define HB_NO_STAT #define HB_NO_SUBSET_LAYOUT #endif diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 6185b67cc..4e73db566 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -54,7 +54,9 @@ HB_OT_TABLE (OT, OS2) #ifndef HB_NO_NAME HB_OT_ACCELERATOR (OT, name) #endif +#ifndef HB_NO_STAT HB_OT_TABLE (OT, STAT) +#endif /* Vertical layout. */ HB_OT_ACCELERATOR (OT, vmtx) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 7c1ed872c..baf6a19e9 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -201,9 +201,11 @@ _nameid_closure (hb_face_t *face, { hb_tag_t tag = table_tags[i]; switch (tag) { +#ifndef HB_NO_STAT case HB_OT_TAG_STAT: face->table.STAT->collect_name_ids (nameids); break; +#endif case HB_OT_TAG_fvar: face->table.fvar->collect_name_ids (nameids); break; From b0debc32f6cedfa76a4851aa391f88ed1860955d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 18:42:39 -0700 Subject: [PATCH 530/617] [subset] Simplify collect_name_ids --- src/hb-subset-plan.cc | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index baf6a19e9..f4877332b 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -194,25 +194,10 @@ static void _nameid_closure (hb_face_t *face, hb_set_t *nameids) { - hb_tag_t table_tags[32]; - unsigned count = ARRAY_LENGTH (table_tags); - hb_face_get_table_tags (face, 0, &count, table_tags); - for (unsigned int i = 0; i < count; i++) - { - hb_tag_t tag = table_tags[i]; - switch (tag) { #ifndef HB_NO_STAT - case HB_OT_TAG_STAT: - face->table.STAT->collect_name_ids (nameids); - break; + face->table.STAT->collect_name_ids (nameids); #endif - case HB_OT_TAG_fvar: - face->table.fvar->collect_name_ids (nameids); - break; - default: - break; - } - } + face->table.fvar->collect_name_ids (nameids); } /** From 230adf2c417bbb6b5f367eb857dd6f98bea3ef26 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 18:49:52 -0700 Subject: [PATCH 531/617] [config] Add HB_NO_OT_FONT_GLYPH_NAMES Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-face-table-list.hh | 4 +++- src/hb-ot-font.cc | 5 ++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 3aa48b4b0..3f9a9ca6f 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -58,6 +58,7 @@ #define HB_NO_CFF #define HB_NO_COLOR #define HB_NO_GETENV +#define HB_NO_OT_FONT_GLYPH_NAMES #define HB_NO_LANGUAGE_PRIVATE_SUBTAG #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 4e73db566..348c3b299 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -49,8 +49,10 @@ HB_OT_TABLE (OT, head) HB_OT_ACCELERATOR (OT, cmap) HB_OT_ACCELERATOR (OT, hmtx) -HB_OT_ACCELERATOR (OT, post) HB_OT_TABLE (OT, OS2) +#ifndef HB_NO_OT_FONT_GLYPH_NAMES +HB_OT_ACCELERATOR (OT, post) +#endif #ifndef HB_NO_NAME HB_OT_ACCELERATOR (OT, name) #endif diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 5895c7b6b..999bfac29 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -205,6 +205,7 @@ hb_ot_get_glyph_extents (hb_font_t *font, return ret; } +#ifndef HB_NO_OT_FONT_GLYPH_NAMES static hb_bool_t hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED, void *font_data, @@ -215,7 +216,6 @@ hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED, const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; return ot_face->post->get_glyph_name (glyph, name, size); } - static hb_bool_t hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED, void *font_data, @@ -226,6 +226,7 @@ hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED, const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; return ot_face->post->get_glyph_from_name (name, len, glyph); } +#endif static hb_bool_t hb_ot_get_font_h_extents (hb_font_t *font, @@ -278,8 +279,10 @@ static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t Date: Wed, 19 Jun 2019 19:26:22 -0700 Subject: [PATCH 532/617] [config] Add HB_NO_VAR to disable variations support, enabled by HB_TINY Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-font.cc | 3 ++- src/hb-ot-face-table-list.hh | 2 ++ src/hb-ot-layout-common.hh | 34 ++++++++++++++++++++++++++++------ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++++++--- src/hb-ot-var.cc | 7 ++++++- src/hb-subset-plan.cc | 2 ++ 7 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 3f9a9ca6f..8f78ede21 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -69,6 +69,7 @@ #define HB_NO_OT_SHAPE_FRACTIONS #define HB_NO_STAT #define HB_NO_SUBSET_LAYOUT +#define HB_NO_VAR #endif #ifdef HB_MINI diff --git a/src/hb-font.cc b/src/hb-font.cc index 7eee284e6..f450d8889 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -1824,6 +1824,7 @@ _hb_font_adopt_var_coords_normalized (hb_font_t *font, font->num_coords = coords_length; } +#ifndef HB_NO_VAR /** * hb_font_set_variations: * @@ -1854,7 +1855,6 @@ hb_font_set_variations (hb_font_t *font, normalized, coords_length); _hb_font_adopt_var_coords_normalized (font, normalized, coords_length); } - /** * hb_font_set_var_coords_design: * @@ -1875,6 +1875,7 @@ hb_font_set_var_coords_design (hb_font_t *font, hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized); _hb_font_adopt_var_coords_normalized (font, normalized, coords_length); } +#endif /** * hb_font_set_var_coords_normalized: diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index 348c3b299..e4ed6b07d 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -74,9 +74,11 @@ HB_OT_TABLE (OT, VORG) #endif /* OpenType variations. */ +#ifndef HB_NO_VAR HB_OT_TABLE (OT, fvar) HB_OT_TABLE (OT, avar) HB_OT_TABLE (OT, MVAR) +#endif /* Legacy kern. */ #ifndef HB_NO_OT_KERN diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index f801f5af8..c332e2815 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1747,11 +1747,11 @@ struct VarData float *scalars /*OUT */, unsigned int num_scalars) const { - assert (num_scalars == regionIndices.len); - for (unsigned int i = 0; i < num_scalars; i++) - { - scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count); - } + unsigned count = hb_min (num_scalars, regionIndices.len); + for (unsigned int i = 0; i < count; i++) + scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count); + for (unsigned int i = count; i < num_scalars; i++) + scalars[i] = 0.f; } bool sanitize (hb_sanitize_context_t *c) const @@ -1779,8 +1779,12 @@ struct VariationStore float get_delta (unsigned int outer, unsigned int inner, const int *coords, unsigned int coord_count) const { +#ifdef HB_NO_VAR + return 0.f; +#endif + if (unlikely (outer >= dataSets.len)) - return 0.; + return 0.f; return (this+dataSets[outer]).get_delta (inner, coords, coord_count, @@ -1797,6 +1801,10 @@ struct VariationStore bool sanitize (hb_sanitize_context_t *c) const { +#ifdef HB_NO_VAR + return true; +#endif + TRACE_SANITIZE (this); return_trace (c->check_struct (this) && format == 1 && @@ -1812,6 +1820,12 @@ struct VariationStore float *scalars /*OUT*/, unsigned int num_scalars) const { +#ifdef HB_NO_VAR + for (unsigned i = 0; i < num_scalars; i++) + scalars[i] = 0.f; + return; +#endif + (this+dataSets[ivs]).get_scalars (coords, coord_count, this+regions, &scalars[0], num_scalars); } @@ -2154,8 +2168,10 @@ struct Device { case 1: case 2: case 3: return u.hinting.get_x_delta (font); +#ifndef HB_NO_VAR case 0x8000: return u.variation.get_x_delta (font, store); +#endif default: return 0; } @@ -2166,8 +2182,10 @@ struct Device { case 1: case 2: case 3: return u.hinting.get_y_delta (font); +#ifndef HB_NO_VAR case 0x8000: return u.variation.get_y_delta (font, store); +#endif default: return 0; } @@ -2180,8 +2198,10 @@ struct Device switch (u.b.format) { case 1: case 2: case 3: return_trace (u.hinting.sanitize (c)); +#ifndef HB_NO_VAR case 0x8000: return_trace (u.variation.sanitize (c)); +#endif default: return_trace (true); } @@ -2191,7 +2211,9 @@ struct Device union { DeviceHeader b; HintingDevice hinting; +#ifndef HB_NO_VAR VariationDevice variation; +#endif } u; public: DEFINE_SIZE_UNION (6, b); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 4bc3d7e15..dd54c9b34 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2661,11 +2661,17 @@ struct GSUBGPOS bool find_variations_index (const int *coords, unsigned int num_coords, unsigned int *index) const - { return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations)) - .find_index (coords, num_coords, index); } + { +#ifdef HB_NOVAR + return false; +#endif + return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations)) + .find_index (coords, num_coords, index); + } const Feature& get_feature_variation (unsigned int feature_index, unsigned int variations_index) const { +#ifndef HB_NO_VAR if (FeatureVariations::NOT_FOUND_INDEX != variations_index && version.to_int () >= 0x00010001u) { @@ -2674,6 +2680,7 @@ struct GSUBGPOS if (feature) return *feature; } +#endif return get_feature (feature_index); } @@ -2695,8 +2702,10 @@ struct GSUBGPOS this, out); +#ifndef HB_NO_VAR if (version.to_int () >= 0x00010001u) out->featureVars.serialize_copy (c->serializer, featureVars, this, out); +#endif return_trace (true); } @@ -2717,7 +2726,10 @@ struct GSUBGPOS scriptList.sanitize (c, this) && featureList.sanitize (c, this) && CastR> (lookupList).sanitize (c, this) && - (version.to_int () < 0x00010001u || featureVars.sanitize (c, this))); +#ifndef HB_NO_VAR + (version.to_int () < 0x00010001u || featureVars.sanitize (c, this)) && +#endif + true); } template diff --git a/src/hb-ot-var.cc b/src/hb-ot-var.cc index 5eea90d25..6b8b09b6b 100644 --- a/src/hb-ot-var.cc +++ b/src/hb-ot-var.cc @@ -24,7 +24,9 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-open-type.hh" +#include "hb.hh" + +#ifndef HB_NO_VAR #include "hb-ot-var.h" @@ -213,3 +215,6 @@ hb_ot_var_normalize_coords (hb_face_t *face, face->table.avar->map_coords (normalized_coords, coords_length); } + + +#endif diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index f4877332b..6b33c17b6 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -197,7 +197,9 @@ _nameid_closure (hb_face_t *face, #ifndef HB_NO_STAT face->table.STAT->collect_name_ids (nameids); #endif +#ifndef HB_NO_VAR face->table.fvar->collect_name_ids (nameids); +#endif } /** From c8f529a07eca06acf2216935921377e7cad8436f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 19:33:15 -0700 Subject: [PATCH 533/617] [config] Add HB_NO_HINTING, enabled by HB_TINY Disables HintingDevice tables and Anchors addressing contour points. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 3 ++- src/hb-ot-layout-common.hh | 6 ++++++ src/hb-ot-layout-gpos-table.hh | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 8f78ede21..5fac4f424 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -58,7 +58,7 @@ #define HB_NO_CFF #define HB_NO_COLOR #define HB_NO_GETENV -#define HB_NO_OT_FONT_GLYPH_NAMES +#define HB_NO_HINTING #define HB_NO_LANGUAGE_PRIVATE_SUBTAG #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH @@ -66,6 +66,7 @@ #define HB_NO_NAME #define HB_NO_OPEN #define HB_NO_SETLOCALE +#define HB_NO_OT_FONT_GLYPH_NAMES #define HB_NO_OT_SHAPE_FRACTIONS #define HB_NO_STAT #define HB_NO_SUBSET_LAYOUT diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index c332e2815..a903bcd87 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2166,8 +2166,10 @@ struct Device { switch (u.b.format) { +#ifndef HB_NO_HINTING case 1: case 2: case 3: return u.hinting.get_x_delta (font); +#endif #ifndef HB_NO_VAR case 0x8000: return u.variation.get_x_delta (font, store); @@ -2181,7 +2183,9 @@ struct Device switch (u.b.format) { case 1: case 2: case 3: +#ifndef HB_NO_HINTING return u.hinting.get_y_delta (font); +#endif #ifndef HB_NO_VAR case 0x8000: return u.variation.get_y_delta (font, store); @@ -2196,8 +2200,10 @@ struct Device TRACE_SANITIZE (this); if (!u.b.format.sanitize (c)) return_trace (false); switch (u.b.format) { +#ifndef HB_NO_HINTING case 1: case 2: case 3: return_trace (u.hinting.sanitize (c)); +#endif #ifndef HB_NO_VAR case 0x8000: return_trace (u.variation.sanitize (c)); diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 86c45be29..d371c4b5f 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -267,6 +267,13 @@ struct AnchorFormat2 float *x, float *y) const { hb_font_t *font = c->font; + +#ifdef HB_NO_HINTING + *x = font->em_fscale_x (xCoordinate); + *y = font->em_fscale_y (yCoordinate); + return; +#endif + unsigned int x_ppem = font->x_ppem; unsigned int y_ppem = font->y_ppem; hb_position_t cx = 0, cy = 0; From 8e3cde67dfa4aa17c0f1156b4a4acd0c95bdbe6f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 19:58:24 -0700 Subject: [PATCH 534/617] Fix MSVC build MSVC warning: c:\projects\harfbuzz\src\hb-ot-layout-gsubgpos.hh(2732): error C2121: '#': invalid character: possibly the result of a macro expansion [C:\projects\harfbuzz\build\harfbuzz.vcxproj] Clang warning for it: ./hb-ot-layout-gsubgpos.hh:2729:2: error: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive] --- src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++------- src/hb.hh | 1 + 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index dd54c9b34..9a82a4d67 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2721,15 +2721,19 @@ struct GSUBGPOS { TRACE_SANITIZE (this); typedef OffsetListOf TLookupList; - return_trace (version.sanitize (c) && - likely (version.major == 1) && - scriptList.sanitize (c, this) && - featureList.sanitize (c, this) && - CastR> (lookupList).sanitize (c, this) && + if (unlikely (!(version.sanitize (c) && + likely (version.major == 1) && + scriptList.sanitize (c, this) && + featureList.sanitize (c, this) && + CastR> (lookupList).sanitize (c, this)))) + return_trace (false); + #ifndef HB_NO_VAR - (version.to_int () < 0x00010001u || featureVars.sanitize (c, this)) && + if (unlikely (!(version.to_int () < 0x00010001u || featureVars.sanitize (c, this)))) + return_trace (false); #endif - true); + + return_trace (true); } template diff --git a/src/hb.hh b/src/hb.hh index 3145574d9..bee39cd46 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -66,6 +66,7 @@ #pragma GCC diagnostic error "-Wcast-align" #pragma GCC diagnostic error "-Wcast-function-type" #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" +#pragma GCC diagnostic error "-Wembedded-directive" #pragma GCC diagnostic error "-Wextra-semi-stmt" #pragma GCC diagnostic error "-Wformat-security" #pragma GCC diagnostic error "-Wimplicit-function-declaration" From 3caa32d737e7c2b4fe6ccd10950760998524f573 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 19:50:54 -0700 Subject: [PATCH 535/617] [config] Add HB_NO_CMAP_LEGACY_SUBTABLES Part of https://vimeo.com/331852453/06eec89c65 --- src/hb-config.hh | 1 + src/hb-ot-cmap-table.hh | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 5fac4f424..d7ecf7d4c 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -106,6 +106,7 @@ #endif #ifdef HB_NO_LEGACY +#define HB_NO_CMAP_LEGACY_SUBTABLES #define HB_NO_FALLBACK_SHAPE #define HB_NO_OT_KERN #define HB_NO_OT_LAYOUT_BLACKLIST diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 724da6e82..ac75bd96a 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -756,10 +756,12 @@ struct CmapSubtable hb_codepoint_t *glyph) const { switch (u.format) { +#ifndef HB_NO_CMAP_LEGACY_SUBTABLES case 0: return u.format0 .get_glyph (codepoint, glyph); - case 4: return u.format4 .get_glyph (codepoint, glyph); case 6: return u.format6 .get_glyph (codepoint, glyph); case 10: return u.format10.get_glyph (codepoint, glyph); +#endif + case 4: return u.format4 .get_glyph (codepoint, glyph); case 12: return u.format12.get_glyph (codepoint, glyph); case 13: return u.format13.get_glyph (codepoint, glyph); case 14: @@ -769,10 +771,12 @@ struct CmapSubtable void collect_unicodes (hb_set_t *out) const { switch (u.format) { +#ifndef HB_NO_CMAP_LEGACY_SUBTABLES case 0: u.format0 .collect_unicodes (out); return; - case 4: u.format4 .collect_unicodes (out); return; case 6: u.format6 .collect_unicodes (out); return; case 10: u.format10.collect_unicodes (out); return; +#endif + case 4: u.format4 .collect_unicodes (out); return; case 12: u.format12.collect_unicodes (out); return; case 13: u.format13.collect_unicodes (out); return; case 14: @@ -785,10 +789,12 @@ struct CmapSubtable TRACE_SANITIZE (this); if (!u.format.sanitize (c)) return_trace (false); switch (u.format) { +#ifndef HB_NO_CMAP_LEGACY_SUBTABLES case 0: return_trace (u.format0 .sanitize (c)); - case 4: return_trace (u.format4 .sanitize (c)); case 6: return_trace (u.format6 .sanitize (c)); case 10: return_trace (u.format10.sanitize (c)); +#endif + case 4: return_trace (u.format4 .sanitize (c)); case 12: return_trace (u.format12.sanitize (c)); case 13: return_trace (u.format13.sanitize (c)); case 14: return_trace (u.format14.sanitize (c)); @@ -799,10 +805,12 @@ struct CmapSubtable public: union { HBUINT16 format; /* Format identifier */ +#ifndef HB_NO_CMAP_LEGACY_SUBTABLES CmapSubtableFormat0 format0; - CmapSubtableFormat4 format4; CmapSubtableFormat6 format6; CmapSubtableFormat10 format10; +#endif + CmapSubtableFormat4 format4; CmapSubtableFormat12 format12; CmapSubtableFormat13 format13; CmapSubtableFormat14 format14; From 27de7c44fe80e69c527578c99c26280ba9f26c15 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 20:07:02 -0700 Subject: [PATCH 536/617] [config] Add HB_NO_FACE_COLLECT_UNICODES Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-face.cc | 5 ++--- src/hb-ot-face-table-list.hh | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index d7ecf7d4c..92f0d5594 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -57,6 +57,7 @@ #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_COLOR +#define HB_NO_FACE_COLLECT_UNICODES #define HB_NO_GETENV #define HB_NO_HINTING #define HB_NO_LANGUAGE_PRIVATE_SUBTAG diff --git a/src/hb-face.cc b/src/hb-face.cc index 375ef9293..1098adb33 100644 --- a/src/hb-face.cc +++ b/src/hb-face.cc @@ -531,6 +531,7 @@ hb_face_get_table_tags (const hb_face_t *face, */ +#ifndef HB_NO_FACE_COLLECT_UNICODES /** * hb_face_collect_unicodes: * @face: font face. @@ -544,7 +545,6 @@ hb_face_collect_unicodes (hb_face_t *face, { face->table.cmap->collect_unicodes (out); } - /** * hb_face_collect_variation_selectors: * @face: font face. @@ -560,7 +560,6 @@ hb_face_collect_variation_selectors (hb_face_t *face, { face->table.cmap->collect_variation_selectors (out); } - /** * hb_face_collect_variation_unicodes: * @face: font face. @@ -577,7 +576,7 @@ hb_face_collect_variation_unicodes (hb_face_t *face, { face->table.cmap->collect_variation_unicodes (variation_selector, out); } - +#endif /* diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index e4ed6b07d..d07f53c2b 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -47,7 +47,9 @@ /* OpenType fundamentals. */ HB_OT_TABLE (OT, head) +#if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT) HB_OT_ACCELERATOR (OT, cmap) +#endif HB_OT_ACCELERATOR (OT, hmtx) HB_OT_TABLE (OT, OS2) #ifndef HB_NO_OT_FONT_GLYPH_NAMES From 6c725c7799bf4870fb8b4f896a537a2c0f7a1ccc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 20:12:25 -0700 Subject: [PATCH 537/617] [config] Add HB_NO_LAYOUT_FEATURE_PARAMS Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-layout-common.hh | 7 +++++-- src/hb-ot-layout.cc | 6 ++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 92f0d5594..74e4ef5bd 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -61,6 +61,7 @@ #define HB_NO_GETENV #define HB_NO_HINTING #define HB_NO_LANGUAGE_PRIVATE_SUBTAG +#define HB_NO_LAYOUT_FEATURE_PARAMS #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH #define HB_NO_MMAP diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index a903bcd87..0866760bd 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -499,6 +499,9 @@ struct FeatureParams { bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const { +#ifdef HB_NO_LAYOUT_FEATURE_PARAMS + return true; +#endif TRACE_SANITIZE (this); if (tag == HB_TAG ('s','i','z','e')) return_trace (u.size.sanitize (c)); @@ -509,26 +512,26 @@ struct FeatureParams return_trace (true); } +#ifndef HB_NO_LAYOUT_FEATURE_PARAMS const FeatureParamsSize& get_size_params (hb_tag_t tag) const { if (tag == HB_TAG ('s','i','z','e')) return u.size; return Null (FeatureParamsSize); } - const FeatureParamsStylisticSet& get_stylistic_set_params (hb_tag_t tag) const { if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */ return u.stylisticSet; return Null (FeatureParamsStylisticSet); } - const FeatureParamsCharacterVariants& get_character_variants_params (hb_tag_t tag) const { if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */ return u.characterVariants; return Null (FeatureParamsCharacterVariants); } +#endif private: union { diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 0761b8e53..0b897d5ac 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1557,6 +1557,7 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) } +#ifndef HB_NO_LAYOUT_FEATURE_PARAMS /** * hb_ot_layout_get_size_params: * @face: #hb_face_t to work upon @@ -1619,8 +1620,6 @@ hb_ot_layout_get_size_params (hb_face_t *face, return false; } - - /** * hb_ot_layout_feature_get_name_ids: * @face: #hb_face_t to work upon @@ -1695,8 +1694,6 @@ hb_ot_layout_feature_get_name_ids (hb_face_t *face, if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID; return false; } - - /** * hb_ot_layout_feature_get_characters: * @face: #hb_face_t to work upon @@ -1750,6 +1747,7 @@ hb_ot_layout_feature_get_characters (hb_face_t *face, if (char_count) *char_count = len; return cv_params.characters.len; } +#endif /* From fce3bf8127321bb53b14eb8a5528a2347cd9be8a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jun 2019 20:34:29 -0700 Subject: [PATCH 538/617] [config] Add HB_NO_LAYOUT_COLLECT_GLYPHS Part of --- src/hb-config.hh | 1 + src/hb-ot-layout.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 74e4ef5bd..66af29aaa 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -62,6 +62,7 @@ #define HB_NO_HINTING #define HB_NO_LANGUAGE_PRIVATE_SUBTAG #define HB_NO_LAYOUT_FEATURE_PARAMS +#define HB_NO_LAYOUT_COLLECT_GLYPHS #define HB_NO_LAYOUT_UNUSED #define HB_NO_MATH #define HB_NO_MMAP diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 0b897d5ac..10b9ba092 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1203,6 +1203,7 @@ hb_ot_layout_collect_lookups (hb_face_t *face, } +#ifndef HB_NO_LAYOUT_COLLECT_GLYPHS /** * hb_ot_layout_lookup_collect_glyphs: * @face: #hb_face_t to work upon @@ -1249,6 +1250,7 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, } } } +#endif /* Variations support */ From e9f7b338ef599b9cbffa125fe594a9939b8517cb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jun 2019 11:48:44 -0700 Subject: [PATCH 539/617] [config] Adjust description of HB_LEAN https://github.com/harfbuzz/harfbuzz/commit/d84932ba50482b3b47e393714eb77b19173d1f14 --- CONFIG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 393553c0a..98be0363e 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -105,8 +105,8 @@ The pre-defined configurations are: * `HB_MINI`: Disables shaping of AAT as well as legacy fonts. Ie. it produces a capable OpenType shaper only. - * `HB_LEAN`: Disables various non-shaping functionality in the library. See - the definition for details. + * `HB_LEAN`: Disables various non-shaping functionality in the library, as well + as esoteric or rarely-used shaping features. See the definition for details. * `HB_TINY`: Enables both `HB_MINI` and `HB_LEAN` configurations, as well as disabling thread-safety and debugging, and use size-optimized data tables. From 6b44bf85382146b355a5a3cbbfde48166721ce52 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jun 2019 11:57:19 -0700 Subject: [PATCH 540/617] 2.5.2 --- NEWS | 12 ++++++++++++ configure.ac | 2 +- src/hb-version.h | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 51929738a..0835378a1 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,15 @@ +Overview of changes leading to 2.5.2 +Thursday, June 20, 2019 +==================================== +- More hb-config.hh facilities to shrink library size, namely when built as + HB_TINY. +- New documentation of custom configurations in CONFIG.md. +- Fix build on gcc 4.8. That's supported again. +- Universal Shaping Engine improvements thanks to David Corbett. +- API Changes: Undeprecate some horizontal-kerning API and re-enable in hb-ft, + such that Type1 fonts will continue kerning. + + Overview of changes leading to 2.5.1 Friday, May 31, 2019 ==================================== diff --git a/configure.ac b/configure.ac index 958bd2dd2..426b85038 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.5.1], + [2.5.2], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-version.h b/src/hb-version.h index 1eca37a58..10b826ffb 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 #define HB_VERSION_MINOR 5 -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 2 -#define HB_VERSION_STRING "2.5.1" +#define HB_VERSION_STRING "2.5.2" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From 7f3b409e85897ff267f1b6a5ce1b5cdafbfe7afe Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jun 2019 14:24:43 -0700 Subject: [PATCH 541/617] Fix build with -O0 message_impl was not defined. That causes trouble if compiler didn't optimize the unreachable call out... --- src/hb-buffer.cc | 1 - src/hb-buffer.hh | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index d1dbd0788..db1978e6d 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -2023,7 +2023,6 @@ hb_buffer_set_message_func (hb_buffer_t *buffer, buffer->message_destroy = nullptr; } } - bool hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) { diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index bc0c7eddc..de0655de3 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -359,6 +359,9 @@ struct hb_buffer_t } bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { +#ifdef HB_NO_BUFFER_MESSAGE + return true; +#else if (!messaging ()) return true; va_list ap; @@ -366,6 +369,7 @@ struct hb_buffer_t bool ret = message_impl (font, fmt, ap); va_end (ap); return ret; +#endif } HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); From 12cec6c12ec1856e483097e702126214dd25a34a Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 21 Jun 2019 22:39:42 +0430 Subject: [PATCH 542/617] Don't define hb_blob_create_from_file if HB_NO_OPEN is defined --- src/hb-blob.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/hb-blob.cc b/src/hb-blob.cc index 497df65fd..9ed26bd2f 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -487,6 +487,7 @@ hb_blob_t::try_make_writable () * Mmap */ +#ifndef HB_NO_OPEN #ifdef HAVE_MMAP # include # include @@ -543,10 +544,6 @@ _hb_mapped_file_destroy (void *file_) hb_blob_t * hb_blob_create_from_file (const char *file_name) { -#ifdef HB_NO_OPEN - return hb_blob_get_empty (); -#endif - /* Adopted from glib's gmappedfile.c with Matthias Clasen and Allison Lortie permission but changed a lot to suit our need. */ #if defined(HAVE_MMAP) && !defined(HB_NO_MMAP) @@ -680,3 +677,4 @@ fread_fail_without_close: free (data); return hb_blob_get_empty (); } +#endif /* !HB_NO_OPEN */ From ccea7fa119d139b6a3a429b3b81fac8448f3bab1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 21 Jun 2019 00:42:06 -0700 Subject: [PATCH 543/617] [config] Make test build under HB_TINY --- src/test-gpos-size-params.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test-gpos-size-params.cc b/src/test-gpos-size-params.cc index 12eec6188..acd1c4fc5 100644 --- a/src/test-gpos-size-params.cc +++ b/src/test-gpos-size-params.cc @@ -45,10 +45,15 @@ main (int argc, char **argv) hb_blob_destroy (blob); blob = nullptr; - unsigned int p[5]; - bool ret = hb_ot_layout_get_size_params (face, p, p+1, (p+2), p+3, p+4); + bool ret = true; +#ifndef HB_NO_LAYOUT_FEATURE_PARAMS + unsigned int p[5]; + ret = hb_ot_layout_get_size_params (face, p, p+1, (p+2), p+3, p+4); printf ("%g %u %u %g %g\n", p[0]/10., p[1], p[2], p[3]/10., p[4]/10.); +#endif + + hb_face_destroy (face); return !ret; } From ad97ec95019b1e5170d00953d4dfe392cfb4abb0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 21 Jun 2019 00:44:29 -0700 Subject: [PATCH 544/617] [config/ucd] Add HB_NO_UNICODE_UNASSIGNED and activate in HB_TINY Saves another 12kb: $ python ./gen-ucd-table.py ucd.nounihan.grouped.zip > hb-ucd-table.hh && make -j5 CPPFLAGS='-Os -DHB_TINY' -C ~/hb/build/src/ && size ~/hb/build/src/.libs/libharfbuzz_la-hb-ucd.o INFO: Loading UCDXML... INFO: Preparing data tables... INFO: Generating output... INFO: Compression=1: INFO: Dataset=gc FullCost=18612 INFO: Dataset=ccc FullCost=3550 INFO: Dataset=bmg FullCost=1548 INFO: Dataset=sc FullCost=17765 INFO: Dataset=dm FullCost=13325 INFO: Compression=3: INFO: Dataset=gc FullCost=10726 INFO: Dataset=ccc FullCost=2389 INFO: Dataset=bmg FullCost=1052 INFO: Dataset=sc FullCost=13669 INFO: Dataset=dm FullCost=7780 INFO: Compression=5: INFO: Dataset=gc FullCost=8274 INFO: Dataset=ccc FullCost=2055 INFO: Dataset=bmg FullCost=908 INFO: Dataset=sc FullCost=4073 INFO: Dataset=dm FullCost=7780 INFO: Done. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- CONFIG.md | 3 +- src/gen-ucd-table.py | 27 +- src/hb-config.hh | 1 + src/hb-ucd-table.hh | 1161 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 1185 insertions(+), 7 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 98be0363e..5fb3e7cb4 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -109,7 +109,8 @@ The pre-defined configurations are: as esoteric or rarely-used shaping features. See the definition for details. * `HB_TINY`: Enables both `HB_MINI` and `HB_LEAN` configurations, as well as - disabling thread-safety and debugging, and use size-optimized data tables. + disabling thread-safety and debugging, and use even more size-optimized data + tables. ## Tailoring configuration diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index c98c715e1..dd3a54626 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -72,6 +72,7 @@ for line in open('hb-common.h'): DEFAULT = 1 COMPACT = 3 +SLOPPY = 5 logging.info('Generating output...') @@ -105,15 +106,32 @@ datasets = [ ('dm', dm, None, dm_order), ] -for compression in (DEFAULT, COMPACT): +for compression in (DEFAULT, COMPACT, SLOPPY): logging.info(' Compression=%d:' % compression) print() if compression == DEFAULT: print('#ifndef HB_OPTIMIZE_SIZE') + elif compression == COMPACT: + print('#elif !defined(HB_NO_UCD_UNASSIGNED)') else: print('#else') print() + if compression == SLOPPY: + for i in range(len(gc)): + if (i % 128) and gc[i] == 'Cn': + gc[i] = gc[i - 1] + for i in range(len(gc) - 2, -1, -1): + if ((i + 1) % 128) and gc[i] == 'Cn': + gc[i] = gc[i + 1] + for i in range(len(sc)): + if (i % 128) and sc[i] == 'Zzzz': + sc[i] = sc[i - 1] + for i in range(len(sc) - 2, -1, -1): + if ((i + 1) % 128) and sc[i] == 'Zzzz': + sc[i] = sc[i + 1] + + code = packTab.Code('_hb_ucd') for name,data,default,mapping in datasets: @@ -123,12 +141,11 @@ for compression in (DEFAULT, COMPACT): code.print_c(linkage='static inline') - - if compression != DEFAULT: - print() - print('#endif') print() +print('#endif') +print() + print() print("#endif /* HB_UCD_TABLE_HH */") print() diff --git a/src/hb-config.hh b/src/hb-config.hh index 66af29aaa..f9e4699fc 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -40,6 +40,7 @@ #define HB_LEAN #define HB_MINI #define HB_NO_MT +#define HB_NO_UCD_UNASSIGNED #ifndef NDEBUG #define NDEBUG #endif diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index e9d097542..014508003 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -3476,7 +3476,7 @@ _hb_ucd_dm (unsigned u) } -#else +#elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t _hb_ucd_u8[16998] = @@ -5156,6 +5156,1165 @@ _hb_ucd_dm (unsigned u) return u<195102u?_hb_ucd_u16[5632+(((_hb_ucd_u8[15974+(((_hb_ucd_b4(15878+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; } + +#else + +static const uint8_t +_hb_ucd_u8[12888] = +{ + 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 5, 17, 15, 15, 18, 15, 19, 20, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 34, 34, 34, 35, 36, 37, 34, 34, 34, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 67, 70, 71, + 67, 67, 62, 72, 62, 62, 73, 67, 74, 75, 76, 77, 78, 67, 67, 67, + 79, 80, 34, 81, 82, 83, 67, 67, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 84, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 85, 34, 34, 34, 34, 34, 34, 34, 34, 86, 34, 34, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, + 100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108, + 34, 34,109,110,111,112,113,114,115,116,117,111, 34, 34, 34,111, + 118,119,120,121,122,123,124,125, 34,126,127,111,128,111,129, 34, + 130,131,132,133,134,135,136,111,137,138,111,139,140,141,142,111, + 143,144,111,145,146,147,111,111,148,149,150,151,111,152,111,153, + 34, 34, 34, 34, 34, 34, 34, 34,154, 34, 34,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34, 34, 34, 34,155,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34,156,157,158, 34,111,111,111,111,159,160,161,162, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111, 34,163,111,111,111,111,111,111, + 67, 67,164,165,166,128, 65,111,167,168,169,170,171,172,173,174, + 67, 67, 67, 67,175,176,111,111,111,111,111,111,111,111,111,111, + 177,111,178,111,111,179,111,111,111,111,111,111,111,111,111,111, + 34,180,181,111,111,111,111,111,128,182,183,111, 34,184,111,111, + 67, 67,185, 67, 67,111, 67,186, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111, + 187,111,177,177,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, + 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, + 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, + 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, + 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, + 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, + 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, + 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, + 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, + 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, + 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 16, 44, 16, 10, + 41, 41, 41, 45, 11, 11, 11, 11, 34, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, + 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 46, 34, 32, 34, 11, + 32, 47, 43, 43, 48, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, + 11, 11, 11, 11, 49, 2, 2, 2, 16, 16, 16, 16, 50, 51, 52, 53, + 54, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 55, + 56, 57, 43, 56, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 58, 2, 2, 2, 2, 2, 2, 59, 59, 59, 8, 9, 60, 2, 61, + 43, 43, 43, 43, 43, 57, 59, 2, 62, 36, 36, 36, 36, 63, 43, 43, + 7, 7, 7, 7, 7, 2, 2, 36, 64, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 65, 43, 43, 43, 66, 47, 43, 43, 67, 68, 69, 43, 43, 36, + 7, 7, 7, 7, 7, 36, 70, 71, 2, 2, 2, 2, 2, 2, 2, 72, + 63, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 64, 36, + 36, 36, 36, 43, 43, 43, 43, 43, 7, 7, 7, 7, 7, 36, 36, 36, + 36, 36, 36, 36, 36, 63, 43, 43, 43, 43, 40, 21, 2, 40, 68, 20, + 36, 36, 36, 43, 43, 68, 43, 43, 43, 43, 68, 43, 68, 43, 43, 43, + 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 36, 36, 63, 43, 43, 2, + 36, 63, 43, 43, 43, 43, 43, 43, 43, 73, 43, 43, 43, 43, 43, 43, + 43, 74, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 74, 64, 75, + 76, 43, 43, 43, 74, 75, 76, 75, 63, 43, 43, 43, 36, 36, 36, 36, + 36, 43, 2, 7, 7, 7, 7, 7, 77, 36, 36, 36, 36, 36, 36, 36, + 63, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 75, + 76, 43, 43, 74, 75, 75, 76, 36, 36, 36, 36, 79, 75, 75, 36, 36, + 36, 43, 43, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 53, 58, 43, + 43, 74, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 75, + 76, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 64, 36, 36, 36, + 36, 36, 36, 7, 7, 7, 7, 7, 43, 36, 63, 2, 2, 2, 2, 2, + 76, 43, 43, 43, 74, 75, 76, 43, 60, 20, 20, 20, 80, 43, 43, 43, + 43, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 76, + 76, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 74, 75, 75, 36, 36, + 71, 27, 27, 27, 27, 27, 27, 27, 43, 64, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 75, 74, 75, 75, 75, 75, 75, 76, 43, + 36, 36, 36, 79, 75, 75, 75, 75, 75, 75, 75, 7, 7, 7, 7, 7, + 27, 81, 61, 61, 53, 61, 61, 61, 74, 75, 64, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 43, 74, 75, 75, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 36, 36, 36, 36, 7, 7, 7, 82, 27, 27, 27, 81, + 63, 75, 65, 36, 36, 36, 36, 36, 75, 75, 75, 74, 75, 75, 43, 43, + 43, 43, 74, 75, 75, 75, 75, 36, 83, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 63, 64, 75, 76, 43, 43, 75, 75, 75, 76, 70, + 61, 61, 36, 79, 27, 27, 27, 84, 27, 27, 27, 27, 81, 36, 36, 36, + 75, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 74, + 75, 43, 43, 43, 75, 75, 75, 75, 7, 75, 2, 2, 2, 2, 2, 2, + 63, 36, 43, 43, 43, 43, 43, 85, 36, 36, 36, 68, 43, 43, 43, 57, + 7, 7, 7, 7, 7, 2, 2, 2, 63, 36, 43, 43, 43, 43, 64, 36, + 36, 36, 36, 40, 43, 43, 43, 43, 7, 7, 7, 7, 7, 7, 36, 36, + 70, 61, 2, 2, 2, 2, 2, 2, 2, 86, 86, 61, 43, 61, 61, 61, + 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 47, 47, 47, 4, 4, 75, + 63, 43, 43, 43, 43, 43, 43, 74, 43, 43, 57, 43, 36, 36, 63, 43, + 43, 43, 43, 43, 43, 43, 43, 61, 61, 61, 61, 69, 61, 61, 61, 61, + 2, 2, 86, 61, 21, 2, 2, 2, 36, 36, 36, 36, 36, 79, 76, 43, + 74, 43, 43, 43, 76, 74, 76, 64, 36, 36, 36, 75, 43, 36, 36, 43, + 64, 75, 78, 79, 75, 75, 75, 36, 63, 43, 64, 36, 36, 36, 36, 36, + 36, 74, 76, 74, 75, 75, 76, 79, 7, 7, 7, 7, 7, 75, 76, 61, + 16, 16, 16, 16, 16, 50, 44, 16, 36, 36, 36, 36, 36, 36, 63, 43, + 2, 2, 2, 2, 87, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 61, 61, 61, 61, 61, 61, 61, 61, 11, 11, 11, 11, 16, 16, 16, 16, + 88, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 65, + 89, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 90, 91, 91, + 36, 36, 36, 36, 36, 58, 2, 92, 93, 36, 36, 36, 36, 36, 36, 36, + 36, 43, 43, 43, 43, 43, 43, 43, 36, 43, 57, 2, 2, 2, 2, 2, + 36, 36, 43, 76, 43, 43, 43, 75, 75, 75, 75, 74, 76, 43, 43, 43, + 43, 43, 2, 77, 2, 60, 63, 43, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 2, 2, 94, 2, 56, 43, 59, 36, 95, 36, 36, 36, 36, 36, 36, + 36, 36, 63, 64, 36, 36, 36, 36, 36, 36, 36, 36, 63, 36, 36, 36, + 43, 74, 75, 76, 74, 75, 75, 75, 75, 74, 75, 75, 76, 43, 43, 43, + 61, 61, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 27, 61, + 36, 36, 36, 63, 74, 76, 43, 2, 36, 36, 79, 74, 43, 43, 43, 43, + 74, 74, 76, 43, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 43, 43, + 2, 2, 2, 77, 2, 2, 2, 2, 43, 43, 43, 43, 43, 43, 43, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 43, 43, 78, 36, 36, 36, 36, 36, + 36, 36, 74, 43, 43, 74, 74, 75, 75, 74, 78, 36, 36, 36, 36, 36, + 86, 61, 61, 61, 61, 47, 43, 43, 43, 43, 61, 61, 61, 61, 61, 61, + 43, 78, 36, 36, 36, 36, 36, 36, 79, 43, 43, 75, 43, 76, 43, 36, + 36, 36, 36, 74, 43, 75, 76, 76, 43, 75, 75, 75, 75, 75, 2, 2, + 36, 36, 75, 75, 75, 75, 43, 43, 43, 43, 75, 43, 43, 57, 2, 2, + 7, 7, 7, 7, 7, 7, 83, 36, 36, 36, 36, 36, 40, 40, 40, 2, + 43, 57, 43, 43, 43, 43, 43, 43, 74, 43, 43, 43, 64, 36, 63, 36, + 36, 36, 64, 79, 43, 36, 36, 36, 16, 16, 16, 16, 16, 16, 40, 40, + 40, 40, 40, 40, 40, 44, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, + 16, 16, 16, 16, 16, 96, 40, 40, 32, 32, 32, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 16, 34, 11, 11, 11, + 16, 16, 16, 16, 97, 97, 97, 97, 16, 16, 16, 16, 11, 11, 98, 99, + 41, 16, 16, 16, 11, 11, 98, 41, 16, 16, 16, 16, 11, 11,100, 41, + 101,101,101,101,101,102, 59, 59, 51, 51, 51, 2,103,104,103,104, + 2, 2, 2, 2,105, 59, 59,106, 2, 2, 2, 2,107,108, 2,109, + 110, 2,111,112, 2, 2, 2, 2, 2, 9,110, 2, 2, 2, 2,113, + 59, 59, 59, 59, 59, 59, 59, 59,114, 40, 27, 27, 27, 8,111,115, + 27, 27, 27, 27, 27, 8,111, 91, 20, 20, 20, 20, 20, 20, 20, 20, + 43, 43, 43, 43, 43, 43,116, 48,117, 48,117, 43, 43, 43, 43, 43, + 61,118, 61,119, 61, 34, 11, 16, 11, 32,119, 61, 46, 11, 11, 61, + 61, 61,118,118,118, 11, 11,120, 11, 11, 35, 36, 39, 61, 16, 11, + 8, 8, 46, 16, 16, 26, 61,121, 92, 92, 92, 92, 92, 92, 92, 92, + 92,122,123, 92,124, 61, 61, 61, 8, 8,125, 61, 61, 8, 61, 61, + 125, 26, 61,125, 61, 61, 61,125, 61, 61, 61, 61, 61, 61, 61, 8, + 61,125,125, 61, 61, 61, 61, 61, 61, 61, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 61, 61, 61, 61, 4, 4, 61, 61, + 8, 61, 61, 61,126,127, 61, 61, 61, 61, 61, 61, 61, 61,125, 61, + 61, 61, 61, 61, 61, 26, 8, 8, 8, 8, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 8, 8, 8, 61, 61, 61, 61, 61, 61, 61, + 27, 27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27, + 61, 61, 61, 26, 61, 61, 61, 61, 26, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 8, 8, 8, 8, 61, 61, 61, 61, 61, 61, 61, 26, + 61, 61, 61, 61, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, + 27, 27, 61, 61, 61, 61, 61, 61, 8, 8,111,128, 8, 8, 8, 8, + 8, 8, 8, 4, 4, 4, 4, 4, 8,111,129,129,129,129,129,129, + 129,129,129,129,128, 8, 8, 8, 8, 8, 8, 8, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 4, 8, 8, 8,125, 26, 8, 8,125, 61, + 32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11, + 32, 32,121, 61, 61,119, 34,130, 43, 32, 16, 16, 50, 2, 87, 2, + 36, 36, 36, 36, 36, 36, 36, 95, 2, 2, 2, 2, 2, 2, 2, 56, + 2,103,103, 2,107,108,103, 2, 2, 2, 2, 6, 2, 94,103, 2, + 103, 4, 4, 4, 4, 2, 2, 77, 2, 2, 2, 2, 2, 51, 2, 2, + 94,131, 2, 2, 2, 2, 2, 2, 1, 2,132,133, 4, 4, 4, 4, + 4, 61, 4, 4, 4, 4,134, 91,135, 92, 92, 92, 92, 43, 43, 75, + 136, 40, 40, 61, 92,137, 58, 61, 71, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 63,138,139, 62, 36, 36, 36, 36, 36, 58, 40, 62, + 61, 27, 27, 61, 61, 61, 61, 61, 27, 27, 27, 27, 27, 61, 61, 61, + 61, 61, 61, 61, 27, 27, 27, 27,140, 27, 27, 27, 27, 27, 27, 27, + 36, 36, 95, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,141, 2, + 32, 32, 32, 32, 32, 32, 32, 63, 48,142, 43, 43, 43, 43, 43, 77, + 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 92, 92, 92, 92, 92, + 43, 2, 2, 2, 2, 2, 2, 2, 41, 41, 41,139, 40, 40, 40, 40, + 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, + 44, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,143, 34, 35, + 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32, + 11, 11, 32, 32, 32, 32, 32, 32, 16, 32, 11, 11, 11, 11, 11, 11, + 11, 11, 11,144, 40, 35, 36, 36, 36, 64, 36, 64, 36, 63, 36, 36, + 36, 79, 76, 74, 61, 61, 61, 61, 27, 27, 27, 61,145, 61, 61, 61, + 36, 36, 2, 2, 2, 2, 2, 2, 75, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 75, 75, 75, 75, 75, 75, 75, 75, 43, 43, 43, 43, 43, 2, + 43, 36, 36, 36, 2, 65, 65, 63, 36, 36, 36, 43, 43, 43, 43, 2, + 36, 36, 36, 63, 43, 43, 43, 43, 43, 75, 75, 75, 75, 75, 75,146, + 36, 63, 75, 43, 43, 75, 43, 75,146, 2, 2, 2, 2, 2, 2, 77, + 7, 7, 7, 7, 7, 7, 7, 2, 36, 36, 63, 62, 36, 36, 36, 36, + 36, 36, 36, 36, 63, 43, 43, 74, 76, 74, 76, 43, 43, 43, 43, 43, + 36, 63, 36, 36, 36, 36, 74, 75, 7, 7, 7, 7, 7, 7, 2, 2, + 62, 36, 36, 70, 61, 79, 74, 36, 64, 43, 64, 63, 64, 36, 36, 43, + 36, 36, 36, 36, 36, 36, 95, 2, 36, 36, 36, 36, 36, 79, 43, 75, + 2, 95,147, 43, 43, 43, 43, 43, 16, 16, 16, 16, 16, 99, 40, 40, + 36, 79, 76, 75, 74,146, 76, 43,148,148,148,148,148,148,148,148, + 149,149,149,149,149,149,149,149, 16, 16, 16, 16, 16, 16, 35, 64, + 36, 36, 36, 36,150, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, + 41,151, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,129, + 152,152,152,152,152,152,152,152, 36, 36, 36, 36, 36, 36,145, 61, + 2, 2, 2,153,112, 2, 2, 2, 6,154,155,129,129,129,129,129, + 129,129,112,153,112, 2,109,156, 2, 2, 2, 2,134,129,129,112, + 2,157, 8, 8, 60, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36,158, + 2, 2, 3, 2, 4, 5, 6, 2, 16, 16, 16, 16, 16, 17, 18,111, + 112, 4, 2, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 40, 20,159, 53, 20, 26, 8,125, 61, + 61, 61, 61, 61,160, 59, 61, 61, 2, 2, 2, 87, 27, 27, 27, 27, + 27, 27, 27, 81, 61, 61, 61, 61, 92, 92,124, 27, 81, 61, 61, 61, + 61, 61, 61, 61, 61, 27, 61, 61, 61, 61, 61, 61, 61, 61, 47, 43, + 161,161,161,161,161,161,161,161,162, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 84, 36,133, 36, 36, 36, 36, 92, 92, 92, + 36, 36, 36, 36, 36, 36, 36, 58,163, 92, 92, 92, 92, 92, 92, 92, + 36, 36, 36, 58, 27, 27, 27, 27, 36, 36, 36, 70,140, 27, 27, 27, + 36, 36, 36,164, 27, 27, 27, 27, 36, 36, 36, 36, 36,164, 27, 27, + 36, 36, 36, 27, 27, 27, 27, 30, 36, 36, 36, 36, 36, 36, 27, 36, + 63, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 43, 43, 43, 43, + 36, 36, 36, 36, 36, 36,164, 30, 36, 36, 36, 36, 36, 36,164, 27, + 36, 36, 36, 36, 71, 36, 36, 36, 36, 36, 63, 43, 43,162, 27, 27, + 36, 36, 36, 36, 58, 2, 2, 2, 36, 36, 36, 36, 27, 27, 27, 27, + 16, 16, 16, 16, 16, 27, 27, 27, 36, 36, 43, 43, 43, 43, 43, 43, + 27, 27, 27, 84, 36, 36, 36, 36,162, 27, 30, 2, 2, 2, 2, 2, + 76, 78, 36, 36, 36, 36, 36, 36, 43, 43, 43, 57, 2, 2, 2, 2, + 2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7,165, 75, 76, 43, 74, 76, 57, 72, 2, + 2, 2, 2, 2, 2, 2, 72, 59, 36, 36, 36, 63, 43, 43, 76, 43, + 43, 43, 43, 7, 7, 7, 7, 7, 2, 2, 79, 75, 75, 75, 75, 75, + 36, 63, 2, 36, 36, 36, 36, 36, 36, 79, 75, 43, 43, 43, 43, 74, + 78, 36, 58, 2, 56, 43, 57, 2, 7, 7, 7, 7, 7, 58, 58, 2, + 87, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 75, 76, + 43, 75, 74, 43, 2, 2, 2, 43, 36, 36, 36, 36, 36, 36, 36, 63, + 74, 75, 75, 75, 75, 75, 75, 75, 36, 36, 36, 79, 75, 75, 78, 36, + 36, 75, 75, 43, 43, 43, 43, 43, 36, 36, 79, 75, 43, 43, 43, 43, + 75, 43, 74, 64, 36, 58, 2, 2, 7, 7, 7, 7, 7, 82, 2, 64, + 75, 76, 43, 43, 74, 74, 75, 76, 74, 43, 36, 65, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 79, 75, 43, 43, 43, 75, 75, 43, 76, + 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 43, + 75, 76, 43, 43, 43, 74, 76, 76, 57, 2, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 63, 76, 75, 43, 43, 43, 76, 36, 36, 36, 36, + 75, 43, 43, 76, 43, 43, 43, 43, 7, 7, 7, 7, 7, 27, 2, 86, + 43, 43, 43, 43, 76, 57, 2, 2, 27, 27, 27, 27, 27, 27, 27, 84, + 79, 75, 43, 43, 43, 43, 75, 75, 64, 65, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 63, 43, 43, 43, 43, 64, 36, 36, + 36, 63, 43, 43, 74, 63, 43, 57, 2, 2, 2, 56, 43, 43, 43, 43, + 63, 43, 43, 74, 76, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, + 43, 43, 43, 74, 43, 2, 65, 2, 43, 43, 43, 43, 43, 43, 43, 76, + 58, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, + 43, 43, 43, 43, 74, 43, 43, 43, 74, 43, 76, 43, 43, 43, 43, 43, + 43, 43, 43, 63, 43, 43, 43, 43, 36, 36, 36, 36, 36, 75, 75, 75, + 43, 74, 76, 76, 36, 36, 36, 36, 36, 63, 74,146, 2, 2, 2, 2, + 27, 27, 81, 61, 61, 61, 53, 20,145, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 21, 43, 43, 57, 2, 2, 2, 2, 2, + 43, 43, 43, 57, 2, 2, 61, 61, 40, 40, 86, 61, 61, 61, 61, 61, + 7, 7, 7, 7, 7,166, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36, + 27, 27, 27, 30, 2, 2, 2, 2, 79, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 76, 43, 67, 40, 40, 40, 40, 40, 40, + 40, 77, 40, 40, 40, 40, 40, 40, 36, 36, 36, 36, 36, 36, 47, 57, + 61, 61,167, 76, 43, 61,167, 75, 75,168, 59, 59, 59, 73, 43, 43, + 43, 69, 47, 43, 43, 43, 61, 61, 61, 61, 61, 61, 61, 43, 43, 61, + 61, 43, 69, 61, 61, 61, 61, 61, 11, 11, 11, 11, 11, 16, 16, 16, + 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, + 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, + 11, 11, 11, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, + 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, + 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, + 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, + 16, 33, 16, 16, 16, 32, 16, 7, 43, 43, 43, 69, 61, 47, 43, 43, + 43, 43, 43, 43, 43, 43, 69, 61, 61, 61, 47, 61, 61, 61, 61, 61, + 61, 61, 69, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 56, 43, 43, + 43, 43, 43, 67, 40, 40, 40, 40, 7, 7, 7, 7, 7, 7, 7, 70, + 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 7, 7,169, + 16, 16, 43, 43, 43, 67, 40, 40, 27, 27, 27, 27, 27, 27,140, 27, + 170, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,140, + 61, 61, 61, 61, 61, 25, 41, 41, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 6, 5, 9, 21, 25, 9, 26, 12, 11, 11, 9, 6, 5, 21, 17, 17, + 17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21, 7, 21, 1, 1, + 21, 23, 26, 26, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, + 6, 12, 12, 26, 7, 26, 26, 7, 21, 1, 1, 12, 12, 10, 10, 10, + 10, 12, 21, 6, 10, 7, 7, 10, 23, 7, 15, 26, 13, 21, 13, 7, + 15, 7, 12, 23, 21, 26, 21, 15, 17, 7, 29, 7, 7, 22, 18, 18, + 14, 14, 14, 7, 17, 21, 7, 6, 5, 6, 8, 8, 8, 24, 5, 24, + 9, 24, 29, 29, 29, 1, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, + 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15, 6, 18, 6, + 12, 11, 11, 12, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, + 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 22, 21, + 26, 6, 7, 14, 17, 22, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, + 26, 15, 6, 21, 11, 21, 24, 9, 9, 7, 23, 26, 10, 21, 6, 10, + 4, 4, 3, 3, 7, 25, 24, 7, 22, 22, 21, 22, 17, 16, 16, 22, + 16, 16, 25, 17, 7, 1, 25, 24, 26, 1, 2, 2, 12, 15, 21, 14, + 7, 15, 13, 12, 13, 15, 26, 10, 10, 1, 13, 23, 23, 15, 0, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 16, 9, + 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 23, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 9, 9, + 9, 9, 25, 9, 9, 9, 26, 9, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, + 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 0, 14, 15, 16, + 15, 17, 15, 18, 15, 18, 15, 18, 0, 18, 0, 19, 15, 18, 20, 18, + 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 36, 0, + 0, 0, 37, 38, 39, 0, 40, 41, 42, 43, 44, 0, 0, 45, 0, 0, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 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, 0, 0, 48, 0, 49, + 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 54, 55, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, + 60, 61, 0, 0, 62, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 67, 0, 0, 0, 68, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 74, 75, 0, 76, 60, + 0, 77, 78, 0, 0, 79, 80, 81, 0, 0, 0, 82, 0, 83, 0, 0, + 49, 84, 49, 0, 85, 0, 86, 0, 0, 0, 75, 0, 0, 0, 0, 0, + 0, 87, 88, 89, 90, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 91, + 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 93, 94, 0, 0, 0, 0, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 94, 0, + 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0,101, 0,102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, + 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, + 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, + 0, 0, 0, 27, 28, 29, 0, 0, 0, 30, 31, 32, 0, 0, 31, 0, + 0, 33, 31, 0, 0, 0, 31, 34, 0, 0, 0, 0, 0, 35, 36, 0, + 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, + 0, 0, 0, 41, 0, 42, 0, 0, 0, 43, 44, 0, 0, 0, 45, 0, + 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 48, 0, 0, 0, 49, + 0, 49, 0, 50, 0, 0, 0, 0, 51, 0, 0, 0, 0, 52, 0, 53, + 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 57, 49, 0, + 58, 59, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 63, 0, 64, + 65, 66, 67, 68, 1, 69, 0, 70, 71, 72, 0, 0, 73, 74, 0, 0, + 0, 75, 0, 0, 1, 1, 0, 0, 76, 0, 0, 77, 0, 0, 0, 0, + 73, 78, 0, 79, 0, 0, 0, 0, 0, 74, 80, 0, 0, 0, 49, 0, + 1, 74, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 83, 54, 0, + 0, 0, 0, 0, 0, 84, 85, 0, 0, 80, 0, 0, 31, 0, 0, 86, + 0, 0, 0, 0, 87, 0, 0, 0, 0, 47, 0, 0, 88, 0, 0, 0, + 0, 89, 90, 0, 0, 91, 0, 0, 92, 0, 0, 0, 93, 0, 94, 88, + 0, 0, 80, 0, 0, 75, 0, 0, 0, 95, 96, 0, 0, 97, 98, 0, + 0, 0, 0, 0, 0, 99, 0, 0,100, 0, 0, 0, 0,101, 31, 0, + 102,103,104, 33, 0, 0,105, 0, 0, 0,106, 0, 0, 0, 0, 0, + 0,107, 0, 0,108, 0, 0, 0, 54, 0, 0, 0, 0, 49,109, 0, + 0, 0, 0,110, 0, 0,111, 0, 0, 0, 0,109, 0, 0, 0, 0, + 0,112, 0, 0, 0,113, 0,114, 0, 0, 0, 0,115,116,117, 0, + 118, 0,119, 0, 0, 0,120,121,122, 0, 0, 0,123, 0, 0,124, + 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, + 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, + 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, + 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, + 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, + 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, + 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, + 51, 0, 52, 1, 1, 1, 53, 21, 43, 54, 55, 21, 35, 1, 0, 0, + 0, 56, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 60, 0, 61, + 0, 0, 0, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, + 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 69, 0, 0, 70, + 71, 0, 72, 73, 74, 75, 76, 77, 0, 0, 0, 78, 0, 0, 0, 79, + 80, 0, 0, 0, 0, 47, 0, 0, 0, 49, 0, 63, 0, 0, 64, 0, + 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, 63, 0, + 0, 0, 0, 49, 1, 85, 1, 54, 15, 41, 0, 56, 0, 0, 0, 0, + 19, 10, 1, 0, 0, 0, 0, 0, 86, 0, 0, 87, 0, 0, 86, 0, + 0, 0, 0, 79, 0, 0, 88, 9, 12, 4, 89, 8, 90, 47, 0, 59, + 50, 0, 21, 1, 21, 91, 92, 1, 1, 1, 1, 93, 94, 95, 96, 1, + 97, 59, 81, 98, 99, 4, 59, 0, 0, 0, 0, 0, 0, 19, 50, 0, + 0, 0, 0, 0, 0, 62, 0, 0,100,101, 0, 0,102, 0, 0, 1, + 1, 50, 0, 0, 0, 38, 0, 64, 0, 0, 0, 0, 52, 69, 62, 0, + 0, 0, 79, 0, 0, 0,103,104, 59, 38, 81, 0, 0, 0, 0, 0, + 0,105, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 88, 0, 0, 0, + 0,106, 0, 0,107, 62, 0,108, 0, 0, 0, 1, 0, 0, 0,109, + 14, 54, 0, 0,110, 0, 88, 0, 0, 0, 62, 63, 0, 0, 63, 0, + 87, 0, 0,110, 0, 0, 0, 0,111, 0, 0, 0, 79, 56, 0, 38, + 1, 59, 1, 59, 0, 0, 64, 87, 0, 0,112, 0, 0, 0, 56, 0, + 0, 0, 0,112, 0, 0, 0, 0, 62, 0, 0, 62, 0, 0, 0, 0, + 57, 0, 87,113, 0, 0, 8, 90, 0, 0, 1, 88, 0, 0, 0, 0, + 0,114, 0,115,116,117,118, 0, 52, 4,119, 49, 23, 0, 0, 0, + 38, 50, 38, 59, 0, 0, 1, 88, 1, 1, 1, 1, 39, 1, 48,103, + 88, 0, 0, 0, 0, 1, 4,119, 0, 0, 0, 1,120, 0, 0, 0, + 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,220,220, + 220,220,220,202,202,220,220,220,220,202,202,220,220,220, 1, 1, + 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,220,220, + 230,230,230,220,220, 0,230,230,230,220,220,220,220,230,232,220, + 220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, 0,220, + 230,230,230,230,220,230,230,230,222,220,230,230,220,220,230,222, + 228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, + 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230, + 230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0, + 220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,220,220, + 230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,230,230, + 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, 0, 0, + 0,220,230,230, 0,220,230,220,220,220, 27, 28, 29,230, 7, 0, + 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0, + 230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122, + 122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129, + 130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0, + 230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, + 9, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0, + 0, 0,230, 0, 0,220, 0, 0, 9, 9, 0, 0, 7, 0,230,230, + 230, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230, + 230,230,230,230,232,228,228,220, 0,230,233,220,230,220,230,230, + 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0, + 218,228,232,222,224,224, 0, 8, 8, 0,230, 0,230,230,220, 0, + 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, 0,230, + 220, 0, 0, 0,220,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, + 9, 7, 9, 9, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, + 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0,230,230, + 7, 0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, 26, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17,177, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, + 3, 3, 6, 7, 8, 3, 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, + 3, 3, 3, 3, 3, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, + 16, 17, 18, 19, 20, 21, 3, 3, 3, 22, 23, 3, 3, 3, 3, 3, + 3, 3, 24, 3, 3, 3, 3, 3, 3, 3, 3, 25, 3, 3, 26, 27, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, + 0, 14, 15, 16, 6, 0, 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, + 19, 25, 0, 26, 27, 19, 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, + 0, 0, 36, 37, 38, 39, 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, + 45, 42, 0, 0, 0, 0, 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, + 0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, + 43, 21, 0, 0, 0, 0, 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, + 0, 0, 0, 19, 56, 31, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0, + 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 58, 59, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, 0, 4, + 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, 0, 8, + 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 0, 0, + 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, 0, 18, + 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, 0, 1, + 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, 1, 0, + 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, 1, 1, + 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, 0, 1, + 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, 9, 36, + 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, 21, 21, + 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, 0, 0, + 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, 8, 9, + 1, 0, 1, 0, 1, 1, 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, + 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 11, 12, 12, 12, + 12, 13, 14, 15, 16, 17, 18, 12, 19, 12, 20, 12, 12, 12, 12, 21, + 22, 22, 22, 23, 12, 12, 12, 12, 24, 25, 12, 12, 26, 27, 28, 29, + 30, 31, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 32, + 12, 33, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 34, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 35, 35, 35, 35, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 2, 2, 51, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 57, 57, 56, 56, 56, 56, 56, 56, 58, 59, 60, 61, + 56, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 56, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, + 62, 62, 62, 62, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 74, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89, + 91, 92, 93, 94, 95, 95, 96, 97, 87, 98, 99,100,101,102,103, 87, + 104,104,104, 87,105,106,107,108,109,110,111,112,113,114, 56, 87, + 89, 87,115, 89,116,117,118,119,120,121,122, 87,123,124, 87,125, + 126,127,128, 87,129,130, 87, 17,131,132, 87, 87,133,134,135, 51, + 87, 19, 87, 21,136,136,136,136,136,136,136,136,136,136,136, 87, + 87, 87, 87, 87,137,137,137,137,137,137,137,137,137, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,138,138,138,138, + 138, 87, 87, 87,139,139,139,139,140,141,142,142, 87, 87, 87, 87, + 18, 18,143,144,145,145,145,145,145,145,145,145,145,145,145,145, + 145,145,145,145,145,145,145,145,145,145, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,146,147,148, 32, 32, 32, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,149,150, 87, 87, + 87, 87, 87, 87, 56, 56,151,152, 51, 56, 56, 87, 56, 56, 56, 56, + 56, 56, 56, 56,153,153,153,153,153,153, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,154, 87, 62, 87, 87,155, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,156,156,157, 87, 87, 87, 87, 87, 56, 56, 56, 87, + 89, 89, 87, 87, 56, 56, 56, 56,158, 87, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87, + 87, 87, 87, 87, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 56, 87,159,159, 0, 1, 2, 2, 0, 1, 2, 2, + 2, 3, 4, 5, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, + 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, + 11, 11, 12, 11, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 17, 18, 19, 19, + 19, 19, 19, 19, 20, 21, 22, 22, 23, 24, 22, 25, 22, 22, 22, 22, + 22, 26, 22, 22, 27, 27, 27, 27, 27, 22, 22, 22, 28, 28, 28, 28, + 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 27, 27, 22, 22, 22, 22, + 22, 22, 32, 22, 33, 33, 33, 33, 33, 34, 35, 33, 36, 36, 36, 36, + 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, + 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, + 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, + 44, 44, 44, 44, 45, 45, 45, 46, 45, 45, 45, 45, 47, 47, 47, 47, + 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 49, 48, 48, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, + 51, 51, 51, 52, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, + 56, 56, 56, 56, 57, 57, 58, 58, 58, 58, 59, 58, 60, 60, 61, 62, + 63, 63, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 56, 56, 56, 56, 56, 68, 68, 68, 68, + 68, 69, 69, 69, 70, 70, 70, 70, 70, 70, 65, 65, 71, 71, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 8, 8, 8, 8, 8, 73, 73, 73, 73, + 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, + 76, 77, 77, 77, 13, 51, 51, 51, 74, 78, 79, 80, 4, 4, 81, 4, + 4, 82, 83, 84, 4, 4, 4, 85, 8, 8, 8, 8, 11, 11, 11, 11, + 11, 11, 11, 11, 86, 0, 0, 0, 0, 0, 0, 87, 0, 4, 0, 0, + 0, 8, 8, 8, 0, 0, 88, 89, 90, 0, 4, 4, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 91, 91, + 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 4, 4, 93, 93, 93, 93, + 93, 93, 93, 93, 51, 51, 51, 94, 94, 94, 94, 94, 54, 54, 54, 54, + 54, 54, 13, 13, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 0, 96, 0, 97, 98, 99,100,100,100,100,101,102,103, + 103,103,103,104,105,105,105,106, 53, 53, 53, 53, 53, 0,105,105, + 0, 0, 0,103, 53, 53, 0, 0, 0, 0, 53,107, 0, 0, 0, 0, + 0,103,103,108,103,103,103,103,103,109, 0, 0, 95, 95, 95, 95, + 0, 0, 0, 0,110,110,110,110,110,110,110,110,110,110,110,110, + 110,111,111,111,112,112,112,112,112,112,112,112,112,112,112,112, + 13, 13, 13, 13, 13, 13,113,113,113,113,113,113, 0, 0,114, 4, + 4, 4, 4, 4,115, 4, 4, 4, 4, 4, 4, 4,116,116,116, 0, + 117,117,117,117,118,118,118,118,118,118, 33, 33,119,119,120,121, + 121,121, 53, 53,122,122,122,122,123,122, 50, 50,124,124,124,124, + 124,124, 50, 50,125,125,125,125,125,125,126,126, 54, 54, 54, 4, + 4,127,128, 55, 55, 55, 55, 55,126,126,126,126,129,129,129,129, + 129,129,129,129, 4,130, 19, 19, 19, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22,131, 0, 22, 22, 22, 8, 0,132, 0, + 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22,133, 0, 0, 1, 2, + 1, 2,134,102,103,135, 53, 53, 53, 53, 0, 0,136,136,136,136, + 136,136,136,136, 0, 0, 0, 0, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 0,137,138,138,139,139,139,139,140, 0,141,141,141,142, + 142,143,143,143,144,144,145,145,145,145,145,145,146,146,146,146, + 146,147,147,147,148,148,148,149,149,149,149,149,150,150,150,151, + 151,151,151,151,152,152,152,152,152,152,152,152,153,153,153,153, + 154,154,155,155,156,156,156,156,156,156,157,157,158,158,159,159, + 159,159,159,159,160,160,161,161,161,161,161,161,162,162,162,162, + 162,162,163,163,164,164,164,164,165,165,165,165,166,166,166,166, + 167,167,168,168,169,169,169,169,169,169,169,169,170,170,170,170, + 170,170,170,170,171,171,171,171,171,171,171,171, 8, 8, 8,129, + 129,129,129,129,172,172,172,172,172,172,172,172,173,173,173,173, + 173,174,174,174,175,175,175,175,175,176,176,176,177,177,177,177, + 177,177,178, 44,179,179,179,179,179,179,179,179,180,180,180,181, + 181,181,181,181,182,182,182,183,182,182,182,182,184,184,184,184, + 184,184,184,184,185,185,185,185,185,185,185,185,186,186,186,186, + 186,186,186,186,187,187,187,187,187,187, 67, 67,188,188,188,188, + 188,188,188,188,189,189,189,189,189,189,189,189, 16, 16, 16, 16, + 16, 16, 16, 16,190,190,190,190,190,190,190,190, 13, 13, 13, 13, + 13, 33, 33, 33, 33, 33, 33, 33,191,191,191,191,192,192,192,192, + 192,192,192,193,193,193,193,193,193,193,193,193, 51, 51, 51, 51, + 51, 51, 11, 11,194,194,194,194,194,194,194,194,195,195,195,195, + 195,195,195,195,196,196,196,196,196,196,196,196,113,113,113,113, + 113,113,113,113,113,113,113,113,197,197,197,197,198,198,198,198, + 198,198,198,198,199,199,199,199,199,199,199,199,200,200,200,200, + 200,200,200,200,200,200,200,200,200,200,201, 0,202,202,202,202, + 202,202,202,202,203,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,204, 53,205,205,205,205, + 205,205,205,205,205,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,206,207,208, 0,209, 0, 0, 0, 0, 0,210,210,210,210, + 210,210,210,210, 92, 92, 92, 92, 92, 92, 92, 92, 19, 19, 19, 19, + 19, 19, 19, 19,211,211,211,211,211,211,211,211,212,212,212,212, + 212,212,212,212,213, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, + 8, 8, 8, 8, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, + 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, + 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, + 8, 8, 8, 8, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14, + 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 19, 20, 20, 20, + 20, 20, 20, 20, 21, 22, 21, 23, 21, 21, 24, 24, 21, 21, 21, 21, + 23, 21, 25, 7, 7, 26, 21, 21, 27, 21, 21, 21, 21, 21, 21, 22, + 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, + 32, 32, 32, 32, 33, 21, 21, 21, 34, 34, 34, 34, 35, 36, 34, 34, + 34, 37, 34, 34, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, + 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, + 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 48, + 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 52, 50, 53, 53, 53, 53, + 54, 54, 54, 54, 54, 54, 55, 54, 56, 56, 56, 56, 57, 57, 57, 57, + 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, + 61, 61, 62, 63, 64, 64, 64, 64, 65, 65, 65, 65, 65, 66, 0, 0, + 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 71, 72, 72, + 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, + 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, + 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 7, 7, 7, + 84, 7, 85, 86, 0, 85, 87, 0, 2, 88, 89, 2, 2, 2, 2, 90, + 91, 88, 92, 2, 2, 2, 93, 2, 2, 2, 2, 94, 0, 0, 0, 87, + 1, 0, 0, 95, 0, 96, 97, 0, 4, 0, 0, 0, 0, 0, 0, 4, + 98, 98, 98, 98, 99, 99, 99, 99, 13, 13, 13, 13,100,100,100,100, + 101,101,101,101, 0,102, 0, 0,103,101,104,105, 0, 0,101, 0, + 106,107,107,107,107,107,107,107,107,107,108,106,109,110,110,110, + 110,110,110,110,110,110,111,109,112,112,112,112,113, 56, 56, 56, + 56, 56, 56,114,110,110,110,111,110,110, 0, 0,115,115,115,115, + 116,116,116,116,117,117,117,117,118,118,118,118, 97, 2, 2, 2, + 2, 2, 95, 2,119,119,119,119,120,120,120,120,121,121,121,121, + 122,122,122,122,122,122,122,123,124,124,124,124,125,125,125,125, + 125,125,125,126,127,127,127,127,128,128,128,128,129,129,129,129, + 2, 2, 3, 2, 2,130, 2, 2,131,131,131,131,132, 17, 17, 19, + 21, 21, 21,133, 7, 7, 7,134, 21, 21, 21, 24, 0,135,110,110, + 110,110,110,136,137,137,137,137, 0, 0, 0,138,139,139,139,139, + 140,140,140,140, 85, 0, 0, 0,141,141,141,141,142,142,142,142, + 143,143,143,143,144,144,144,144,145,145,145,145,146,146,146,146, + 147,147,147,147,148,148,148,148,149,149,149,149,150,150,150,150, + 151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154, + 155,155,155,155,156,156,156,156,157,157,157,157,158,158,158,158, + 159,159,159,159,160,160,160,160,161,161,161,161,162,162,162,162, + 163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166, + 167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170, + 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174, + 175,175,175,175,176,176,176,176,177,177,177,177,178, 46, 46, 46, + 179,179,179,179,180,180,180,180,181,181,181,181,182,182,182,182, + 182,182,183,182,184,184,184,184,185,185,185,185,186,186,186,186, + 187,187,187,187,188,188,188,188,189,189,189,189,190,190,190,190, + 191,191,191,191,192,192,192,192,193,193,193,193,194,194,194,194, + 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, + 199,199,199,199,200,200,200,200,201, 0, 0, 0,202,202,202,202, + 203,107,107,107,107,110,110,110,204,204,204,204, 0,205, 87, 0, + 0, 0,205, 7, 83,138, 7, 0, 0, 0,206, 87,207,207,207,207, + 208,208,208,208,209,209,209,209,210, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, + 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, + 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 0, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, + 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, + 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, + 38, 38, 38, 38, 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, + 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, + 0, 0, 7, 7, 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, + 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, + 20, 20, 20, 20, 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, + 18, 18, 18, 18, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, + 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, + 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, + 44, 44, 44, 44, 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, + 31, 31, 31, 31, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, + 48, 48, 48, 48, 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, + 91, 91, 91, 91, 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, + 70, 70, 70, 70, 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, + 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, + 6, 19, 19, 19, 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, + 0, 0, 19, 19, 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, + 13, 13, 13, 13, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, + 1, 1, 12, 12, 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, + 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, + 26, 12, 12, 12, 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, + 77, 77, 77, 77, 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, + 75, 75, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, + 84, 84, 84, 84, 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, + 87, 87, 87, 87, 19, 9, 19, 19, 2, 2, 2, 2, 19, 19, 19, 4, + 3, 3, 0, 0, 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, + 49, 49, 49, 49, 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, + 42, 42, 42, 42, 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, + 59, 59, 59, 59, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, + 135,135,135,135,106,106,106,106,104,104,104,104,110,110,110,110, + 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,116,116,116,116, + 128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, + 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117, + 112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82, + 122,122,122,122, 89, 89, 89, 89,130,130,130,130, 94, 94, 94, 94, + 85, 85, 85, 85,101,101,101,101, 96, 96, 96, 96,111,111,111,111, + 100,100,100,100,100, 36, 36, 36,108,108,108,108,129,129,129,129, + 109,109,109,109,107,107,107,107,107,107,107, 1,137,137,137,137, + 124,124,124,124,123,123,123,123,114,114,114,114,102,102,102,102, + 126,126,126,126,125,125,125,125,121,121,121,121,133,133,133,133, + 134,134,134,134, 63, 63, 63, 63, 80, 80, 80, 80,127,127,127,127, + 115,115,115,115,103,103,103,103,119,119,119,119, 99, 99, 99, 99, + 136, 12, 0, 0,136,136,136,136, 17, 15, 15, 15,105,105,105,105, + 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131,113,113,113,113, + 132,132,132,132, 15, 0, 0, 0, 16, 50, 84,118, 88, 89, 90, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 91, 85, 85,220, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, + 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 41, 42, 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, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, + 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, + 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, + 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 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, 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, 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, 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, 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, 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, 67, 68, 0, 69, 70, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, + 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112, + 113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 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, 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,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, + 0,122,123,124,125,126, 0,127, 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, 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, 0, 0, 0, 0, 0, 0,128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, + 152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 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, 0, 0, 0, 0,165, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,167, 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, 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,168,169, 0, + 0, 0, 0,170,171, 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, 0, 0, 0, 0, 0, 0,172,173,174,175,176,177,178,179, + 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195, + 196,197,198,199,200,201,202,203,204,205, 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, 1, 2, 3, 4, +}; +static const uint16_t +_hb_ucd_u16[4800] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 35, 9, 42, 11, 11, 43, 44, 32, 45, 46, 47, 47, 48, + 49, 50, 47, 47, 51, 32, 52, 53, 47, 47, 47, 47, 47, 54, 55, 56, + 57, 58, 47, 32, 59, 47, 47, 47, 47, 47, 60, 53, 61, 47, 62, 63, + 47, 64, 65, 66, 47, 67, 47, 47, 47, 47, 47, 47, 47, 68, 69, 32, + 70, 47, 47, 71, 72, 73, 74, 75, 76, 47, 47, 77, 78, 79, 80, 81, + 82, 47, 47, 83, 84, 85, 86, 87, 82, 47, 47, 77, 88, 47, 80, 89, + 90, 47, 47, 91, 92, 93, 80, 94, 95, 47, 47, 96, 97, 98, 99, 100, + 101, 47, 47, 102, 103, 104, 80, 105, 106, 47, 47, 91, 107, 108, 80, 109, + 90, 47, 47, 110, 111, 112, 80, 113, 114, 47, 47, 47, 115, 116, 99, 117, + 47, 47, 47, 118, 119, 120, 66, 66, 47, 47, 47, 121, 122, 123, 47, 47, + 124, 125, 126, 127, 47, 47, 47, 128, 129, 32, 32, 130, 131, 132, 66, 66, + 47, 47, 133, 134, 120, 135, 136, 137, 138, 139, 9, 9, 9, 11, 11, 140, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141, 142, 143, + 47, 144, 9, 9, 9, 9, 9, 145, 146, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 147, 47, 148, 149, 47, 47, 47, 47, 150, 151, + 47, 152, 47, 153, 47, 152, 47, 152, 47, 47, 47, 154, 155, 156, 157, 143, + 158, 157, 47, 47, 159, 47, 47, 47, 160, 47, 161, 47, 47, 47, 47, 47, + 47, 47, 162, 163, 164, 47, 47, 47, 47, 47, 47, 47, 47, 165, 144, 144, + 47, 166, 47, 47, 47, 167, 168, 169, 157, 157, 170, 171, 172, 172, 172, 172, + 173, 47, 47, 174, 175, 120, 176, 177, 178, 47, 179, 61, 47, 47, 180, 181, + 47, 47, 182, 183, 184, 61, 47, 185, 11, 9, 9, 9, 66, 186, 187, 188, + 11, 11, 189, 27, 27, 27, 190, 191, 11, 192, 27, 27, 32, 32, 32, 32, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 193, 13, 13, 13, 13, 13, 13, + 194, 194, 194, 194, 194, 195, 194, 11, 196, 196, 196, 197, 198, 199, 199, 198, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 27, 209, 209, 209, 210, 211, 32, + 212, 213, 214, 215, 216, 143, 217, 217, 218, 219, 220, 144, 221, 222, 144, 223, + 224, 224, 224, 224, 224, 224, 224, 224, 225, 144, 226, 144, 144, 144, 144, 227, + 144, 228, 224, 229, 144, 230, 231, 144, 144, 144, 144, 144, 144, 144, 143, 143, + 143, 232, 144, 144, 144, 144, 233, 143, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 234, 235, 144, 144, 236, 144, 144, 144, 144, 144, 144, 237, 144, + 144, 144, 144, 144, 144, 144, 238, 239, 143, 240, 144, 144, 241, 224, 242, 224, + 243, 244, 224, 224, 224, 245, 224, 246, 144, 144, 144, 224, 247, 144, 144, 144, + 9, 9, 9, 11, 11, 11, 248, 249, 13, 13, 13, 13, 13, 13, 250, 251, + 11, 11, 11, 47, 47, 47, 252, 253, 47, 47, 47, 47, 47, 47, 32, 32, + 254, 255, 256, 257, 258, 66, 66, 66, 259, 260, 261, 262, 263, 47, 47, 47, + 47, 264, 146, 47, 47, 47, 47, 265, 47, 266, 47, 47, 144, 144, 144, 47, + 144, 144, 267, 144, 268, 269, 144, 144, 267, 144, 144, 269, 144, 144, 144, 144, + 47, 47, 47, 47, 144, 144, 144, 144, 47, 270, 47, 47, 47, 47, 47, 47, + 47, 144, 144, 144, 144, 47, 47, 185, 271, 47, 61, 47, 13, 13, 272, 273, + 13, 274, 47, 47, 47, 47, 275, 276, 31, 277, 278, 279, 13, 13, 13, 280, + 281, 282, 283, 284, 285, 9, 9, 286, 287, 47, 288, 289, 47, 47, 47, 290, + 291, 47, 47, 292, 293, 157, 32, 294, 61, 47, 295, 47, 296, 297, 47, 47, + 70, 47, 47, 298, 299, 300, 301, 61, 47, 47, 302, 303, 304, 305, 47, 306, + 47, 47, 47, 307, 58, 308, 309, 310, 47, 47, 47, 11, 11, 311, 11, 11, + 11, 11, 11, 11, 47, 47, 312, 157, 313, 313, 313, 313, 313, 313, 313, 313, + 314, 314, 314, 314, 314, 314, 314, 314, 11, 315, 316, 47, 47, 47, 47, 47, + 47, 47, 47, 317, 31, 318, 47, 47, 47, 47, 47, 319, 320, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 321, 32, 322, 32, 323, 324, 325, 326, 47, + 47, 47, 47, 47, 47, 47, 47, 327, 328, 2, 3, 4, 5, 329, 330, 331, + 47, 332, 47, 47, 47, 47, 333, 334, 335, 143, 143, 336, 217, 217, 217, 337, + 338, 144, 144, 144, 144, 144, 144, 339, 340, 340, 340, 340, 340, 340, 340, 340, + 47, 47, 47, 47, 47, 47, 341, 143, 47, 47, 342, 47, 343, 47, 47, 60, + 47, 344, 47, 47, 47, 345, 217, 217, 9, 9, 145, 11, 11, 47, 47, 47, + 47, 47, 157, 9, 9, 145, 11, 11, 47, 47, 47, 47, 47, 47, 344, 66, + 47, 47, 47, 47, 47, 346, 47, 347, 47, 47, 348, 143, 143, 143, 47, 349, + 47, 350, 47, 344, 66, 66, 66, 66, 47, 47, 47, 351, 143, 143, 143, 143, + 352, 47, 47, 353, 143, 66, 47, 354, 47, 355, 143, 143, 356, 47, 357, 66, + 47, 47, 47, 358, 47, 359, 47, 359, 47, 358, 142, 143, 143, 143, 143, 143, + 9, 9, 9, 9, 11, 11, 11, 360, 47, 47, 361, 157, 157, 157, 157, 157, + 143, 143, 143, 143, 143, 143, 143, 143, 47, 355, 362, 47, 60, 363, 66, 66, + 364, 47, 47, 353, 365, 366, 367, 368, 178, 47, 47, 369, 370, 47, 47, 157, + 95, 47, 371, 372, 373, 47, 47, 374, 178, 47, 47, 375, 376, 377, 378, 143, + 47, 47, 379, 380, 32, 32, 32, 32, 47, 47, 358, 47, 47, 381, 169, 157, + 90, 47, 47, 110, 382, 383, 384, 32, 47, 47, 47, 385, 386, 387, 47, 47, + 47, 47, 47, 388, 389, 157, 157, 157, 47, 47, 390, 391, 392, 393, 32, 32, + 47, 47, 47, 394, 395, 157, 66, 66, 47, 47, 396, 397, 157, 157, 157, 157, + 47, 141, 398, 399, 144, 144, 144, 144, 47, 47, 379, 400, 66, 66, 66, 66, + 9, 9, 9, 9, 11, 11, 126, 401, 47, 47, 47, 47, 47, 402, 403, 404, + 405, 47, 47, 406, 407, 408, 47, 47, 409, 410, 66, 66, 47, 47, 47, 47, + 47, 47, 390, 411, 412, 126, 143, 413, 47, 152, 414, 415, 32, 32, 32, 32, + 47, 47, 47, 352, 416, 157, 47, 47, 417, 418, 157, 157, 157, 157, 157, 157, + 47, 47, 47, 47, 47, 47, 47, 419, 143, 143, 143, 143, 143, 420, 421, 422, + 217, 217, 217, 217, 217, 217, 217, 66, 47, 47, 47, 206, 206, 206, 206, 206, + 47, 47, 47, 47, 47, 47, 300, 66, 47, 47, 47, 47, 47, 47, 47, 423, + 47, 47, 47, 424, 425, 426, 427, 47, 9, 9, 9, 9, 9, 9, 11, 11, + 143, 428, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 381, 429, 404, 404, + 430, 431, 27, 27, 27, 27, 432, 27, 47, 433, 206, 206, 206, 206, 206, 206, + 144, 144, 144, 144, 144, 144, 434, 435, 436, 144, 437, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 438, 144, 144, 144, 9, 439, 11, 440, 441, 11, 194, 9, + 442, 443, 9, 444, 11, 9, 439, 11, 440, 441, 11, 194, 9, 442, 443, 9, + 444, 11, 9, 439, 11, 440, 441, 11, 194, 9, 442, 443, 9, 444, 11, 9, + 439, 11, 194, 9, 445, 446, 447, 448, 11, 449, 9, 450, 451, 452, 453, 11, + 454, 9, 455, 11, 456, 157, 157, 157, 32, 32, 32, 457, 32, 32, 458, 459, + 460, 461, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 47, 47, 47, 462, 463, 144, 144, 144, 47, 47, 47, 47, 47, 47, 464, 465, + 47, 47, 47, 47, 348, 32, 32, 32, 9, 9, 442, 11, 466, 300, 66, 66, + 143, 143, 467, 468, 143, 143, 143, 143, 143, 143, 469, 143, 143, 143, 143, 143, + 47, 47, 47, 47, 47, 47, 47, 224, 143, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 470, 206, 206, 206, 206, 206, 206, 206, 206, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 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, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 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,1446,1458,1468,1476,1480,1486, + 1517, 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,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949, + 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958, + 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, +}; +static const int16_t +_hb_ucd_i16[92] = +{ + 0, 0, 1, -1, 2, 0, -2, 0, 0, 2, 0, -2, 0, 16, 0, -16, + 0, 1, -1, 0, 3, 3, 3, -3, -3, -3, 0, 2016, 0, 2527, 1923, 1914, + 1918, 0, 2250, 0, 0, 138, 0, 7, -7, 0, -1, 1, 1824, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, -1, -138, 8, 8, 8, 0, 7, 7, -8, -8, + -8, -7,-1316, 1, -1, 3, -3, 1, 0,-1914,-1918, 0, 0,-1923,-1824, 0, + 0,-2016,-2104, 0, 0,-2106,-2108,-2106,-2250, 0,-2527, 0, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114112u?_hb_ucd_u8[4840+(((_hb_ucd_u8[1072+(((_hb_ucd_u16[((_hb_ucd_u8[272+(((_hb_ucd_u8[u>>1>>3>>3>>5])<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[6670+(((_hb_ucd_u8[6166+(((_hb_ucd_u8[5754+(((_hb_ucd_u8[5306+(((_hb_ucd_u8[5182+(u>>2>>2>>2>>4)])<<4)+((u>>2>>2>>2)&15u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7538+(((_hb_ucd_u8[7314+(((_hb_ucd_u8[7218+(((_hb_ucd_b4(7154+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918016u?_hb_ucd_u8[10924+(((_hb_ucd_u8[10068+(((_hb_ucd_u8[8788+(((_hb_ucd_u8[8228+(((_hb_ucd_u8[7778+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[1504+(((_hb_ucd_u8[11864+(((_hb_ucd_b4(11768+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; +} + #endif From c2d7dfc68ffcb389c9f73b5ef94da7b270bdcf9e Mon Sep 17 00:00:00 2001 From: James Hilliard Date: Sat, 22 Jun 2019 19:38:48 -0600 Subject: [PATCH 545/617] Add missing cairo-svg dependency to test-ot-color --- src/test-ot-color.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test-ot-color.cc b/src/test-ot-color.cc index 44bd2eb69..e9126c064 100644 --- a/src/test-ot-color.cc +++ b/src/test-ot-color.cc @@ -25,7 +25,9 @@ #include "hb.hh" -#ifndef HB_NO_COLOR +#include + +#if !defined(HB_NO_COLOR) && defined(CAIRO_HAS_SVG_SURFACE) #include "hb-ot.h" @@ -35,7 +37,6 @@ #include FT_FREETYPE_H #include FT_GLYPH_H -#include #include #include From 9bd8d66c2ba97aec57597ff85e059a7618260a1c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 12 Jun 2019 11:02:48 -0700 Subject: [PATCH 546/617] [subset] VORG table to use _subset2 method and new iterator frameworks --- src/hb-ot-vorg-table.hh | 116 +++++++++++----------------------------- src/hb-subset.cc | 2 +- 2 files changed, 33 insertions(+), 85 deletions(-) diff --git a/src/hb-ot-vorg-table.hh b/src/hb-ot-vorg-table.hh index b2059e86e..19e08ebb5 100644 --- a/src/hb-ot-vorg-table.hh +++ b/src/hb-ot-vorg-table.hh @@ -69,102 +69,50 @@ struct VORG return vertYOrigins[i].vertOriginY; } - bool _subset (const hb_subset_plan_t *plan HB_UNUSED, - const VORG *vorg_table, - const hb_vector_t &subset_metrics, - unsigned int dest_sz, - void *dest) const + template + void serialize (hb_serialize_context_t *c, + Iterator it, + FWORD defaultVertOriginY) { - hb_serialize_context_t c (dest, dest_sz); - VORG *subset_table = c.start_serialize (); - if (unlikely (!c.extend_min (*subset_table))) - return false; + if (unlikely (!c->extend_min ((*this)))) return; - subset_table->version.major = 1; - subset_table->version.minor = 0; + this->version.major = 1; + this->version.minor = 0; - subset_table->defaultVertOriginY = vorg_table->defaultVertOriginY; - subset_table->vertYOrigins.len = subset_metrics.length; + this->defaultVertOriginY = defaultVertOriginY; + this->vertYOrigins.len = it.len (); - bool success = true; - if (subset_metrics.length > 0) - { - unsigned int size = VertOriginMetric::static_size * subset_metrics.length; - VertOriginMetric *metrics = c.allocate_size (size); - if (likely (metrics != nullptr)) - memcpy (metrics, &subset_metrics[0], size); - else - success = false; - } - c.end_serialize (); - - return success; + + it + | hb_apply ([c] (const VertOriginMetric& _) { c->copy (_);}) + ; } - bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_context_t *c) const { - hb_blob_t *vorg_blob = hb_sanitize_context_t().reference_table (plan->source); - const VORG *vorg_table = vorg_blob->as (); + TRACE_SUBSET (this); + VORG *vorg_prime = c->serializer->start_embed (); + if (unlikely (!c->serializer->check_success (vorg_prime))) return_trace (false); - /* count the number of glyphs to be included in the subset table */ - hb_vector_t subset_metrics; - subset_metrics.init (); + auto it = + + vertYOrigins.as_array () + | hb_filter (c->plan->glyphset (), &VertOriginMetric::glyph) + | hb_map ([&] (const VertOriginMetric& _) + { + hb_codepoint_t new_glyph = HB_SET_VALUE_INVALID; + c->plan->new_gid_for_old_gid (_.glyph, &new_glyph); - - hb_codepoint_t old_glyph = HB_SET_VALUE_INVALID; - unsigned int i = 0; - while (i < vertYOrigins.len - && plan->glyphset ()->next (&old_glyph)) - { - while (old_glyph > vertYOrigins[i].glyph) - { - i++; - if (i >= vertYOrigins.len) - break; - } - - if (old_glyph == vertYOrigins[i].glyph) - { - hb_codepoint_t new_glyph; - if (plan->new_gid_for_old_gid (old_glyph, &new_glyph)) - { - VertOriginMetric *metrics = subset_metrics.push (); - metrics->glyph = new_glyph; - metrics->vertOriginY = vertYOrigins[i].vertOriginY; - } - } - } - - /* alloc the new table */ - unsigned int dest_sz = VORG::min_size + VertOriginMetric::static_size * subset_metrics.length; - void *dest = (void *) malloc (dest_sz); - if (unlikely (!dest)) - { - subset_metrics.fini (); - hb_blob_destroy (vorg_blob); - return false; - } + VertOriginMetric metric; + metric.glyph = new_glyph; + metric.vertOriginY = _.vertOriginY; + return metric; + }) + ; /* serialize the new table */ - if (!_subset (plan, vorg_table, subset_metrics, dest_sz, dest)) - { - subset_metrics.fini (); - free (dest); - hb_blob_destroy (vorg_blob); - return false; - } - - hb_blob_t *result = hb_blob_create ((const char *)dest, - dest_sz, - HB_MEMORY_MODE_READONLY, - dest, - free); - bool success = plan->add_table (HB_OT_TAG_VORG, result); - hb_blob_destroy (result); - subset_metrics.fini (); - hb_blob_destroy (vorg_blob); - return success; + vorg_prime->serialize (c->serializer, it, defaultVertOriginY); + return_trace (true); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 3f4c2e40b..b117870c8 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -204,7 +204,7 @@ _subset_table (hb_subset_plan_t *plan, result = _subset (plan); break; case HB_OT_TAG_VORG: - result = _subset (plan); + result = _subset2 (plan); break; #endif From 9c933acaa443889bc2484dbe3ef3e990b299cd52 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 23 Jun 2019 17:14:27 -0700 Subject: [PATCH 547/617] [ucd] Save a few more bytes Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/gen-ucd-table.py | 11 ++++++----- src/hb-ucd-table.hh | 34 +++++++++++++++++----------------- src/hb-ucd.cc | 12 ++++++------ 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index dd3a54626..7410dd3f0 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -34,15 +34,16 @@ ce = {i for i,u in enumerate(ucd) if u['Comp_Ex'] == 'Y'} assert not any(v for v in dm.values() if len(v) not in (1,2)) dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) -dm1_u16_array = ['0x%04Xu' % v for v in dm1 if v[0] <= 0xFFFF] -dm1_u32_array = ['0x%04Xu' % v for v in dm1 if v[0] > 0xFFFF] +assert all((v[0] >> 16) in (0,2) for v in dm1) +dm1_p0_array = ['0x%04Xu' % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 0] +dm1_p2_array = ['0x%04Xu' % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 2] dm1_order = {v:i+1 for i,v in enumerate(dm1)} dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) dm2 = [("HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % (v+(i if i not in ce and not ccc[i] else 0,)), v) for v,i in dm2] dm2_array = [s for s,v in dm2] -l = 1 + len(dm1_u16_array) + len(dm1_u32_array) +l = 1 + len(dm1_p0_array) + len(dm1_p2_array) dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} dm_order = {None: 0} dm_order.update(dm1_order) @@ -93,8 +94,8 @@ print() code = packTab.Code('_hb_ucd') sc_array, _ = code.addArray('hb_script_t', 'sc_map', sc_array) -dm1_16_array, _ = code.addArray('uint16_t', 'dm1_u16_map', dm1_u16_array) -dm1_32_array, _ = code.addArray('uint32_t', 'dm1_u32_map', dm1_u32_array) +dm1_p0_array, _ = code.addArray('uint16_t', 'dm1_p0_map', dm1_p0_array) +dm1_p2_array, _ = code.addArray('uint16_t', 'dm1_p2_map', dm1_p2_array) dm2_array, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) code.print_c(linkage='static inline') diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index 014508003..5cd503bf5 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -86,7 +86,7 @@ _hb_ucd_sc_map[138] = HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA, }; static const uint16_t -_hb_ucd_dm1_u16_map[825] = +_hb_ucd_dm1_p0_map[825] = { 0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u, 0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu, @@ -193,23 +193,23 @@ _hb_ucd_dm1_u16_map[825] = 0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu, 0x9F9Cu, }; -static const uint32_t -_hb_ucd_dm1_u32_map[110] = +static const uint16_t +_hb_ucd_dm1_p2_map[110] = { - 0x20122u,0x2051Cu,0x20525u,0x2054Bu,0x2063Au,0x20804u,0x208DEu,0x20A2Cu, - 0x20B63u,0x214E4u,0x216A8u,0x216EAu,0x219C8u,0x21B18u,0x21D0Bu,0x21DE4u, - 0x21DE6u,0x22183u,0x2219Fu,0x22331u,0x226D4u,0x22844u,0x2284Au,0x22B0Cu, - 0x22BF1u,0x2300Au,0x232B8u,0x2335Fu,0x23393u,0x2339Cu,0x233C3u,0x233D5u, - 0x2346Du,0x236A3u,0x238A7u,0x23A8Du,0x23AFAu,0x23CBCu,0x23D1Eu,0x23ED1u, - 0x23F5Eu,0x23F8Eu,0x24263u,0x242EEu,0x243ABu,0x24608u,0x24735u,0x24814u, - 0x24C36u,0x24C92u,0x24FA1u,0x24FB8u,0x25044u,0x250F2u,0x250F3u,0x25119u, - 0x25133u,0x25249u,0x2541Du,0x25626u,0x2569Au,0x256C5u,0x2597Cu,0x25AA7u, - 0x25BABu,0x25C80u,0x25CD0u,0x25F86u,0x261DAu,0x26228u,0x26247u,0x262D9u, - 0x2633Eu,0x264DAu,0x26523u,0x265A8u,0x267A7u,0x267B5u,0x26B3Cu,0x26C36u, - 0x26CD5u,0x26D6Bu,0x26F2Cu,0x26FB1u,0x270D2u,0x273CAu,0x27667u,0x278AEu, - 0x27966u,0x27CA8u,0x27ED3u,0x27F2Fu,0x285D2u,0x285EDu,0x2872Eu,0x28BFAu, - 0x28D77u,0x29145u,0x291DFu,0x2921Au,0x2940Au,0x29496u,0x295B6u,0x29B30u, - 0x2A0CEu,0x2A105u,0x2A20Eu,0x2A291u,0x2A392u,0x2A600u, + 0x0122u, 0x051Cu, 0x0525u, 0x054Bu, 0x063Au, 0x0804u, 0x08DEu, 0x0A2Cu, + 0x0B63u, 0x14E4u, 0x16A8u, 0x16EAu, 0x19C8u, 0x1B18u, 0x1D0Bu, 0x1DE4u, + 0x1DE6u, 0x2183u, 0x219Fu, 0x2331u, 0x26D4u, 0x2844u, 0x284Au, 0x2B0Cu, + 0x2BF1u, 0x300Au, 0x32B8u, 0x335Fu, 0x3393u, 0x339Cu, 0x33C3u, 0x33D5u, + 0x346Du, 0x36A3u, 0x38A7u, 0x3A8Du, 0x3AFAu, 0x3CBCu, 0x3D1Eu, 0x3ED1u, + 0x3F5Eu, 0x3F8Eu, 0x4263u, 0x42EEu, 0x43ABu, 0x4608u, 0x4735u, 0x4814u, + 0x4C36u, 0x4C92u, 0x4FA1u, 0x4FB8u, 0x5044u, 0x50F2u, 0x50F3u, 0x5119u, + 0x5133u, 0x5249u, 0x541Du, 0x5626u, 0x569Au, 0x56C5u, 0x597Cu, 0x5AA7u, + 0x5BABu, 0x5C80u, 0x5CD0u, 0x5F86u, 0x61DAu, 0x6228u, 0x6247u, 0x62D9u, + 0x633Eu, 0x64DAu, 0x6523u, 0x65A8u, 0x67A7u, 0x67B5u, 0x6B3Cu, 0x6C36u, + 0x6CD5u, 0x6D6Bu, 0x6F2Cu, 0x6FB1u, 0x70D2u, 0x73CAu, 0x7667u, 0x78AEu, + 0x7966u, 0x7CA8u, 0x7ED3u, 0x7F2Fu, 0x85D2u, 0x85EDu, 0x872Eu, 0x8BFAu, + 0x8D77u, 0x9145u, 0x91DFu, 0x921Au, 0x940Au, 0x9496u, 0x95B6u, 0x9B30u, + 0xA0CEu, 0xA105u, 0xA20Eu, 0xA291u, 0xA392u, 0xA600u, }; static const uint64_t _hb_ucd_dm2_map[1025] = diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc index 4d35017a6..4bdd4f463 100644 --- a/src/hb-ucd.cc +++ b/src/hb-ucd.cc @@ -148,19 +148,19 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (likely (!i)) return false; i--; - if (i < ARRAY_LENGTH (_hb_ucd_dm1_u16_map) + ARRAY_LENGTH (_hb_ucd_dm1_u32_map)) + if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map)) { - if (i < ARRAY_LENGTH (_hb_ucd_dm1_u16_map)) - *a = _hb_ucd_dm1_u16_map[i]; + if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map)) + *a = _hb_ucd_dm1_p0_map[i]; else { - i -= ARRAY_LENGTH (_hb_ucd_dm1_u16_map); - *a = _hb_ucd_dm1_u32_map[i]; + i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map); + *a = 0x20000 | _hb_ucd_dm1_p2_map[i]; } *b = 0; return true; } - i -= ARRAY_LENGTH (_hb_ucd_dm1_u16_map) + ARRAY_LENGTH (_hb_ucd_dm1_u32_map); + i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map); uint64_t v = _hb_ucd_dm2_map[i]; *a = HB_CODEPOINT_DECODE3_1 (v); From ec8e635e0c1a8e5c631a90820be68cf07c52c1a0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 24 Jun 2019 12:37:23 -0700 Subject: [PATCH 548/617] [ucd] Use custom encoding to shrink composition data Saves another 2.5kb. Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/gen-ucd-table.py | 22 +- src/hb-algs.hh | 5 + src/hb-ucd-table.hh | 965 +++++++++++++++++++++++++++++-------------- src/hb-ucd.cc | 49 ++- 4 files changed, 705 insertions(+), 336 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 7410dd3f0..053953a97 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -38,13 +38,22 @@ assert all((v[0] >> 16) in (0,2) for v in dm1) dm1_p0_array = ['0x%04Xu' % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 0] dm1_p2_array = ['0x%04Xu' % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 2] dm1_order = {v:i+1 for i,v in enumerate(dm1)} -dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) -dm2 = [("HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % - (v+(i if i not in ce and not ccc[i] else 0,)), v) - for v,i in dm2] -dm2_array = [s for s,v in dm2] + +dm2 = sorted((v+(i if i not in ce and not ccc[i] else 0,), v) + for i,v in dm.items() if len(v) == 2) + +filt = lambda v: ((v[0] & 0xFFFFF800) == 0x0000 and + (v[1] & 0xFFFFFF80) == 0x0300 and + (v[2] & 0xFFF0C000) == 0x0000) +dm2_u32_array = [v for v in dm2 if filt(v[0])] +dm2_u64_array = [v for v in dm2 if not filt(v[0])] +assert dm2_u32_array + dm2_u64_array == dm2 +dm2_u32_array = ["HB_CODEPOINT_ENCODE3_11_7_14 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % v[0] for v in dm2_u32_array] +dm2_u64_array = ["HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % v[0] for v in dm2_u64_array] + l = 1 + len(dm1_p0_array) + len(dm1_p2_array) dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} + dm_order = {None: 0} dm_order.update(dm1_order) dm_order.update(dm2_order) @@ -96,7 +105,8 @@ code = packTab.Code('_hb_ucd') sc_array, _ = code.addArray('hb_script_t', 'sc_map', sc_array) dm1_p0_array, _ = code.addArray('uint16_t', 'dm1_p0_map', dm1_p0_array) dm1_p2_array, _ = code.addArray('uint16_t', 'dm1_p2_map', dm1_p2_array) -dm2_array, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) +dm2_u32_array, _ = code.addArray('uint32_t', 'dm2_u32_map', dm2_u32_array) +dm2_u64_array, _ = code.addArray('uint64_t', 'dm2_u64_map', dm2_u64_array) code.print_c(linkage='static inline') datasets = [ diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 4a537baf3..c8d83c828 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -41,6 +41,11 @@ #define HB_CODEPOINT_DECODE3_2(v) ((hb_codepoint_t) ((v) >> 21) & 0x1FFFFFu) #define HB_CODEPOINT_DECODE3_3(v) ((hb_codepoint_t) (v) & 0x1FFFFFu) +/* Custom encoding used by hb-ucd. */ +#define HB_CODEPOINT_ENCODE3_11_7_14(x,y,z) (((uint32_t) ((x) & 0x07FFu) << 21) | (((uint32_t) (y) & 0x007Fu) << 14) | (uint32_t) ((z) & 0x3FFFu)) +#define HB_CODEPOINT_DECODE3_11_7_14_1(v) ((hb_codepoint_t) ((v) >> 21)) +#define HB_CODEPOINT_DECODE3_11_7_14_2(v) ((hb_codepoint_t) (((v) >> 14) & 0x007Fu) | 0x0300) +#define HB_CODEPOINT_DECODE3_11_7_14_3(v) ((hb_codepoint_t) (v) & 0x3FFFu) struct { diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index 5cd503bf5..ae9ce3e2f 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -211,328 +211,651 @@ _hb_ucd_dm1_p2_map[110] = 0x8D77u, 0x9145u, 0x91DFu, 0x921Au, 0x940Au, 0x9496u, 0x95B6u, 0x9B30u, 0xA0CEu, 0xA105u, 0xA20Eu, 0xA291u, 0xA392u, 0xA600u, }; -static const uint64_t -_hb_ucd_dm2_map[1025] = +static const uint32_t +_hb_ucd_dm2_u32_map[638] = +{ + HB_CODEPOINT_ENCODE3_11_7_14 (0x003Cu, 0x0338u, 0x226Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x003Du, 0x0338u, 0x2260u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x003Eu, 0x0338u, 0x226Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0300u, 0x00C0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0301u, 0x00C1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0302u, 0x00C2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0303u, 0x00C3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0304u, 0x0100u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0306u, 0x0102u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0307u, 0x0226u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0308u, 0x00C4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0309u, 0x1EA2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Au, 0x00C5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Cu, 0x01CDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Fu, 0x0200u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0311u, 0x0202u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0323u, 0x1EA0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0325u, 0x1E00u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0328u, 0x0104u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0307u, 0x1E02u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0323u, 0x1E04u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0331u, 0x1E06u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0301u, 0x0106u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0302u, 0x0108u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0307u, 0x010Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x030Cu, 0x010Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0327u, 0x00C7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0307u, 0x1E0Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x030Cu, 0x010Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0323u, 0x1E0Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0327u, 0x1E10u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x032Du, 0x1E12u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0331u, 0x1E0Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0300u, 0x00C8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0301u, 0x00C9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0302u, 0x00CAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0303u, 0x1EBCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0304u, 0x0112u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0306u, 0x0114u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0307u, 0x0116u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0308u, 0x00CBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0309u, 0x1EBAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Cu, 0x011Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Fu, 0x0204u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0311u, 0x0206u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0323u, 0x1EB8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0327u, 0x0228u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0328u, 0x0118u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x032Du, 0x1E18u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0330u, 0x1E1Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0046u, 0x0307u, 0x1E1Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0301u, 0x01F4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0302u, 0x011Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0304u, 0x1E20u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0306u, 0x011Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0307u, 0x0120u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x030Cu, 0x01E6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0327u, 0x0122u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0302u, 0x0124u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0307u, 0x1E22u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0308u, 0x1E26u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x030Cu, 0x021Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0323u, 0x1E24u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0327u, 0x1E28u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x032Eu, 0x1E2Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0300u, 0x00CCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0301u, 0x00CDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0302u, 0x00CEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0303u, 0x0128u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0304u, 0x012Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0306u, 0x012Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0307u, 0x0130u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0308u, 0x00CFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0309u, 0x1EC8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Cu, 0x01CFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Fu, 0x0208u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0311u, 0x020Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0323u, 0x1ECAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0328u, 0x012Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0330u, 0x1E2Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Au, 0x0302u, 0x0134u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0301u, 0x1E30u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x030Cu, 0x01E8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0323u, 0x1E32u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0327u, 0x0136u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0331u, 0x1E34u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0301u, 0x0139u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x030Cu, 0x013Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0323u, 0x1E36u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0327u, 0x013Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x032Du, 0x1E3Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0331u, 0x1E3Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0301u, 0x1E3Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0307u, 0x1E40u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0323u, 0x1E42u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0300u, 0x01F8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0301u, 0x0143u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0303u, 0x00D1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0307u, 0x1E44u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x030Cu, 0x0147u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0323u, 0x1E46u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0327u, 0x0145u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x032Du, 0x1E4Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0331u, 0x1E48u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0300u, 0x00D2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0301u, 0x00D3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0302u, 0x00D4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0303u, 0x00D5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0304u, 0x014Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0306u, 0x014Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0307u, 0x022Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0308u, 0x00D6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0309u, 0x1ECEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Bu, 0x0150u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Cu, 0x01D1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Fu, 0x020Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0311u, 0x020Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x031Bu, 0x01A0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0323u, 0x1ECCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0328u, 0x01EAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0301u, 0x1E54u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0307u, 0x1E56u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0301u, 0x0154u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0307u, 0x1E58u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Cu, 0x0158u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Fu, 0x0210u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0311u, 0x0212u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0323u, 0x1E5Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0327u, 0x0156u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0331u, 0x1E5Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0301u, 0x015Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0302u, 0x015Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0307u, 0x1E60u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x030Cu, 0x0160u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0323u, 0x1E62u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0326u, 0x0218u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0327u, 0x015Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0307u, 0x1E6Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x030Cu, 0x0164u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0323u, 0x1E6Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0326u, 0x021Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0327u, 0x0162u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x032Du, 0x1E70u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0331u, 0x1E6Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0300u, 0x00D9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0301u, 0x00DAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0302u, 0x00DBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0303u, 0x0168u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0304u, 0x016Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0306u, 0x016Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0308u, 0x00DCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0309u, 0x1EE6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Au, 0x016Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Bu, 0x0170u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Cu, 0x01D3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Fu, 0x0214u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0311u, 0x0216u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x031Bu, 0x01AFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0323u, 0x1EE4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0324u, 0x1E72u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0328u, 0x0172u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x032Du, 0x1E76u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0330u, 0x1E74u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0303u, 0x1E7Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0323u, 0x1E7Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0300u, 0x1E80u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0301u, 0x1E82u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0302u, 0x0174u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0307u, 0x1E86u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0308u, 0x1E84u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0323u, 0x1E88u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0307u, 0x1E8Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0308u, 0x1E8Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0300u, 0x1EF2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0301u, 0x00DDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0302u, 0x0176u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0303u, 0x1EF8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0304u, 0x0232u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0307u, 0x1E8Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0308u, 0x0178u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0309u, 0x1EF6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0323u, 0x1EF4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0301u, 0x0179u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0302u, 0x1E90u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0307u, 0x017Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x030Cu, 0x017Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0323u, 0x1E92u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0331u, 0x1E94u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0300u, 0x00E0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0301u, 0x00E1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0302u, 0x00E2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0303u, 0x00E3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0304u, 0x0101u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0306u, 0x0103u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0307u, 0x0227u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0308u, 0x00E4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0309u, 0x1EA3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Au, 0x00E5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Cu, 0x01CEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Fu, 0x0201u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0311u, 0x0203u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0323u, 0x1EA1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0325u, 0x1E01u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0328u, 0x0105u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0307u, 0x1E03u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0323u, 0x1E05u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0331u, 0x1E07u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0301u, 0x0107u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0302u, 0x0109u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0307u, 0x010Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x030Cu, 0x010Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0327u, 0x00E7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0307u, 0x1E0Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x030Cu, 0x010Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0323u, 0x1E0Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0327u, 0x1E11u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x032Du, 0x1E13u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0331u, 0x1E0Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0300u, 0x00E8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0301u, 0x00E9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0302u, 0x00EAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0303u, 0x1EBDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0304u, 0x0113u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0306u, 0x0115u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0307u, 0x0117u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0308u, 0x00EBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0309u, 0x1EBBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Cu, 0x011Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Fu, 0x0205u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0311u, 0x0207u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0323u, 0x1EB9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0327u, 0x0229u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0328u, 0x0119u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x032Du, 0x1E19u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0330u, 0x1E1Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0066u, 0x0307u, 0x1E1Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0301u, 0x01F5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0302u, 0x011Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0304u, 0x1E21u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0306u, 0x011Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0307u, 0x0121u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x030Cu, 0x01E7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0327u, 0x0123u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0302u, 0x0125u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0307u, 0x1E23u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0308u, 0x1E27u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x030Cu, 0x021Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0323u, 0x1E25u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0327u, 0x1E29u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x032Eu, 0x1E2Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0331u, 0x1E96u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0300u, 0x00ECu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0301u, 0x00EDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0302u, 0x00EEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0303u, 0x0129u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0304u, 0x012Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0306u, 0x012Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0308u, 0x00EFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0309u, 0x1EC9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Cu, 0x01D0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Fu, 0x0209u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0311u, 0x020Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0323u, 0x1ECBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0328u, 0x012Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0330u, 0x1E2Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x0302u, 0x0135u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x030Cu, 0x01F0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0301u, 0x1E31u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x030Cu, 0x01E9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0323u, 0x1E33u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0327u, 0x0137u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0331u, 0x1E35u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0301u, 0x013Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x030Cu, 0x013Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0323u, 0x1E37u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0327u, 0x013Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x032Du, 0x1E3Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0331u, 0x1E3Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0301u, 0x1E3Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0307u, 0x1E41u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0323u, 0x1E43u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0300u, 0x01F9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0301u, 0x0144u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0303u, 0x00F1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0307u, 0x1E45u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x030Cu, 0x0148u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0323u, 0x1E47u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0327u, 0x0146u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x032Du, 0x1E4Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0331u, 0x1E49u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0300u, 0x00F2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0301u, 0x00F3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0302u, 0x00F4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0303u, 0x00F5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0304u, 0x014Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0306u, 0x014Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0307u, 0x022Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0308u, 0x00F6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0309u, 0x1ECFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Bu, 0x0151u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Cu, 0x01D2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Fu, 0x020Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0311u, 0x020Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x031Bu, 0x01A1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0323u, 0x1ECDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0328u, 0x01EBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0301u, 0x1E55u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0307u, 0x1E57u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0301u, 0x0155u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0307u, 0x1E59u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Cu, 0x0159u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Fu, 0x0211u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0311u, 0x0213u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0323u, 0x1E5Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0327u, 0x0157u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0331u, 0x1E5Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0301u, 0x015Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0302u, 0x015Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0307u, 0x1E61u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x030Cu, 0x0161u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0323u, 0x1E63u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0326u, 0x0219u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0327u, 0x015Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0307u, 0x1E6Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0308u, 0x1E97u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x030Cu, 0x0165u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0323u, 0x1E6Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0326u, 0x021Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0327u, 0x0163u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x032Du, 0x1E71u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0331u, 0x1E6Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0300u, 0x00F9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0301u, 0x00FAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0302u, 0x00FBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0303u, 0x0169u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0304u, 0x016Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0306u, 0x016Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0308u, 0x00FCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0309u, 0x1EE7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Au, 0x016Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Bu, 0x0171u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Cu, 0x01D4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Fu, 0x0215u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0311u, 0x0217u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x031Bu, 0x01B0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0323u, 0x1EE5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0324u, 0x1E73u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0328u, 0x0173u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x032Du, 0x1E77u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0330u, 0x1E75u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0303u, 0x1E7Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0323u, 0x1E7Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0300u, 0x1E81u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0301u, 0x1E83u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0302u, 0x0175u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0307u, 0x1E87u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0308u, 0x1E85u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x030Au, 0x1E98u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0323u, 0x1E89u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0307u, 0x1E8Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0308u, 0x1E8Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0300u, 0x1EF3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0301u, 0x00FDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0302u, 0x0177u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0303u, 0x1EF9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0304u, 0x0233u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0307u, 0x1E8Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0308u, 0x00FFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0309u, 0x1EF7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x030Au, 0x1E99u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0323u, 0x1EF5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0301u, 0x017Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0302u, 0x1E91u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0307u, 0x017Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x030Cu, 0x017Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0323u, 0x1E93u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0331u, 0x1E95u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0300u, 0x1FEDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0301u, 0x0385u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0342u, 0x1FC1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0300u, 0x1EA6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0301u, 0x1EA4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0303u, 0x1EAAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0309u, 0x1EA8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C4u, 0x0304u, 0x01DEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C5u, 0x0301u, 0x01FAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0301u, 0x01FCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0304u, 0x01E2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00C7u, 0x0301u, 0x1E08u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0300u, 0x1EC0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0301u, 0x1EBEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0303u, 0x1EC4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0309u, 0x1EC2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00CFu, 0x0301u, 0x1E2Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0300u, 0x1ED2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0301u, 0x1ED0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0303u, 0x1ED6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0309u, 0x1ED4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0301u, 0x1E4Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0304u, 0x022Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0308u, 0x1E4Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D6u, 0x0304u, 0x022Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00D8u, 0x0301u, 0x01FEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0300u, 0x01DBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0301u, 0x01D7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0304u, 0x01D5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x030Cu, 0x01D9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0300u, 0x1EA7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0301u, 0x1EA5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0303u, 0x1EABu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0309u, 0x1EA9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E4u, 0x0304u, 0x01DFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E5u, 0x0301u, 0x01FBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0301u, 0x01FDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0304u, 0x01E3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00E7u, 0x0301u, 0x1E09u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0300u, 0x1EC1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0301u, 0x1EBFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0303u, 0x1EC5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0309u, 0x1EC3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00EFu, 0x0301u, 0x1E2Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0300u, 0x1ED3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0301u, 0x1ED1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0303u, 0x1ED7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0309u, 0x1ED5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0301u, 0x1E4Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0304u, 0x022Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0308u, 0x1E4Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F6u, 0x0304u, 0x022Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00F8u, 0x0301u, 0x01FFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0300u, 0x01DCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0301u, 0x01D8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0304u, 0x01D6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x030Cu, 0x01DAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0300u, 0x1EB0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0301u, 0x1EAEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0303u, 0x1EB4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0309u, 0x1EB2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0300u, 0x1EB1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0301u, 0x1EAFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0303u, 0x1EB5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0309u, 0x1EB3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0300u, 0x1E14u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0301u, 0x1E16u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0300u, 0x1E15u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0301u, 0x1E17u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0300u, 0x1E50u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0301u, 0x1E52u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0300u, 0x1E51u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0301u, 0x1E53u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x015Au, 0x0307u, 0x1E64u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x015Bu, 0x0307u, 0x1E65u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0160u, 0x0307u, 0x1E66u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0161u, 0x0307u, 0x1E67u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0168u, 0x0301u, 0x1E78u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0169u, 0x0301u, 0x1E79u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x016Au, 0x0308u, 0x1E7Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x016Bu, 0x0308u, 0x1E7Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x017Fu, 0x0307u, 0x1E9Bu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0300u, 0x1EDCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0301u, 0x1EDAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0303u, 0x1EE0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0309u, 0x1EDEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0323u, 0x1EE2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0300u, 0x1EDDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0301u, 0x1EDBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0303u, 0x1EE1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0309u, 0x1EDFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0323u, 0x1EE3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0300u, 0x1EEAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0301u, 0x1EE8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0303u, 0x1EEEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0309u, 0x1EECu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0323u, 0x1EF0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0300u, 0x1EEBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0301u, 0x1EE9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0303u, 0x1EEFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0309u, 0x1EEDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0323u, 0x1EF1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01B7u, 0x030Cu, 0x01EEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01EAu, 0x0304u, 0x01ECu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x01EBu, 0x0304u, 0x01EDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0226u, 0x0304u, 0x01E0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0227u, 0x0304u, 0x01E1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0228u, 0x0306u, 0x1E1Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0229u, 0x0306u, 0x1E1Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x022Eu, 0x0304u, 0x0230u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x022Fu, 0x0304u, 0x0231u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0292u, 0x030Cu, 0x01EFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0308u, 0x0301u, 0x0000u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0300u, 0x1FBAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0301u, 0x0386u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0304u, 0x1FB9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0306u, 0x1FB8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0313u, 0x1F08u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0314u, 0x1F09u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0345u, 0x1FBCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0300u, 0x1FC8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0301u, 0x0388u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0313u, 0x1F18u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0314u, 0x1F19u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0300u, 0x1FCAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0301u, 0x0389u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0313u, 0x1F28u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0314u, 0x1F29u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0345u, 0x1FCCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0300u, 0x1FDAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0301u, 0x038Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0304u, 0x1FD9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0306u, 0x1FD8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0308u, 0x03AAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0313u, 0x1F38u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0314u, 0x1F39u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0300u, 0x1FF8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0301u, 0x038Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0313u, 0x1F48u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0314u, 0x1F49u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A1u, 0x0314u, 0x1FECu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0300u, 0x1FEAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0301u, 0x038Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0304u, 0x1FE9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0306u, 0x1FE8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0308u, 0x03ABu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0314u, 0x1F59u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0300u, 0x1FFAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0301u, 0x038Fu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0313u, 0x1F68u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0314u, 0x1F69u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0345u, 0x1FFCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03ACu, 0x0345u, 0x1FB4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03AEu, 0x0345u, 0x1FC4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0300u, 0x1F70u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0301u, 0x03ACu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0304u, 0x1FB1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0306u, 0x1FB0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0313u, 0x1F00u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0314u, 0x1F01u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0342u, 0x1FB6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0345u, 0x1FB3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0300u, 0x1F72u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0301u, 0x03ADu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0313u, 0x1F10u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0314u, 0x1F11u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0300u, 0x1F74u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0301u, 0x03AEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0313u, 0x1F20u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0314u, 0x1F21u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0342u, 0x1FC6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0345u, 0x1FC3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0300u, 0x1F76u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0301u, 0x03AFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0304u, 0x1FD1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0306u, 0x1FD0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0308u, 0x03CAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0313u, 0x1F30u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0314u, 0x1F31u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0342u, 0x1FD6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0300u, 0x1F78u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0301u, 0x03CCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0313u, 0x1F40u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0314u, 0x1F41u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0313u, 0x1FE4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0314u, 0x1FE5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0300u, 0x1F7Au), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0301u, 0x03CDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0304u, 0x1FE1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0306u, 0x1FE0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0308u, 0x03CBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0313u, 0x1F50u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0314u, 0x1F51u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0342u, 0x1FE6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0300u, 0x1F7Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0301u, 0x03CEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0313u, 0x1F60u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0314u, 0x1F61u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0342u, 0x1FF6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0345u, 0x1FF3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0300u, 0x1FD2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0301u, 0x0390u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0342u, 0x1FD7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0300u, 0x1FE2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0301u, 0x03B0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0342u, 0x1FE7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03CEu, 0x0345u, 0x1FF4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0301u, 0x03D3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0308u, 0x03D4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0406u, 0x0308u, 0x0407u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0306u, 0x04D0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0308u, 0x04D2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0413u, 0x0301u, 0x0403u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0300u, 0x0400u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0306u, 0x04D6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0308u, 0x0401u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0306u, 0x04C1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0308u, 0x04DCu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0417u, 0x0308u, 0x04DEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0300u, 0x040Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0304u, 0x04E2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0306u, 0x0419u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0308u, 0x04E4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x041Au, 0x0301u, 0x040Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x041Eu, 0x0308u, 0x04E6u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0304u, 0x04EEu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0306u, 0x040Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0308u, 0x04F0u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x030Bu, 0x04F2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0427u, 0x0308u, 0x04F4u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x042Bu, 0x0308u, 0x04F8u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x042Du, 0x0308u, 0x04ECu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0306u, 0x04D1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0308u, 0x04D3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0433u, 0x0301u, 0x0453u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0300u, 0x0450u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0306u, 0x04D7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0308u, 0x0451u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0306u, 0x04C2u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0308u, 0x04DDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0437u, 0x0308u, 0x04DFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0300u, 0x045Du), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0304u, 0x04E3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0306u, 0x0439u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0308u, 0x04E5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x043Au, 0x0301u, 0x045Cu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x043Eu, 0x0308u, 0x04E7u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0304u, 0x04EFu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0306u, 0x045Eu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0308u, 0x04F1u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x030Bu, 0x04F3u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0447u, 0x0308u, 0x04F5u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x044Bu, 0x0308u, 0x04F9u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x044Du, 0x0308u, 0x04EDu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0456u, 0x0308u, 0x0457u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0474u, 0x030Fu, 0x0476u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x0475u, 0x030Fu, 0x0477u), + HB_CODEPOINT_ENCODE3_11_7_14 (0x04D8u, 0x0308u, 0x04DAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x04D9u, 0x0308u, 0x04DBu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x04E8u, 0x0308u, 0x04EAu), + HB_CODEPOINT_ENCODE3_11_7_14 (0x04E9u, 0x0308u, 0x04EBu), +}; +static const uint64_t +_hb_ucd_dm2_u64_map[387] = { - HB_CODEPOINT_ENCODE3 (0x003Cu, 0x0338u, 0x226Eu), HB_CODEPOINT_ENCODE3 (0x003Du, 0x0338u, 0x2260u), - HB_CODEPOINT_ENCODE3 (0x003Eu, 0x0338u, 0x226Fu), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0300u, 0x00C0u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0301u, 0x00C1u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0302u, 0x00C2u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0303u, 0x00C3u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0304u, 0x0100u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0306u, 0x0102u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0307u, 0x0226u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0308u, 0x00C4u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0309u, 0x1EA2u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Au, 0x00C5u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Cu, 0x01CDu), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Fu, 0x0200u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0311u, 0x0202u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0323u, 0x1EA0u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0325u, 0x1E00u), - HB_CODEPOINT_ENCODE3 (0x0041u, 0x0328u, 0x0104u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0307u, 0x1E02u), - HB_CODEPOINT_ENCODE3 (0x0042u, 0x0323u, 0x1E04u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0331u, 0x1E06u), - HB_CODEPOINT_ENCODE3 (0x0043u, 0x0301u, 0x0106u), HB_CODEPOINT_ENCODE3 (0x0043u, 0x0302u, 0x0108u), - HB_CODEPOINT_ENCODE3 (0x0043u, 0x0307u, 0x010Au), HB_CODEPOINT_ENCODE3 (0x0043u, 0x030Cu, 0x010Cu), - HB_CODEPOINT_ENCODE3 (0x0043u, 0x0327u, 0x00C7u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0307u, 0x1E0Au), - HB_CODEPOINT_ENCODE3 (0x0044u, 0x030Cu, 0x010Eu), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0323u, 0x1E0Cu), - HB_CODEPOINT_ENCODE3 (0x0044u, 0x0327u, 0x1E10u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x032Du, 0x1E12u), - HB_CODEPOINT_ENCODE3 (0x0044u, 0x0331u, 0x1E0Eu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0300u, 0x00C8u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0301u, 0x00C9u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0302u, 0x00CAu), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0303u, 0x1EBCu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0304u, 0x0112u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0306u, 0x0114u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0307u, 0x0116u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0308u, 0x00CBu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0309u, 0x1EBAu), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Cu, 0x011Au), HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Fu, 0x0204u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0311u, 0x0206u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0323u, 0x1EB8u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x0327u, 0x0228u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0328u, 0x0118u), - HB_CODEPOINT_ENCODE3 (0x0045u, 0x032Du, 0x1E18u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0330u, 0x1E1Au), - HB_CODEPOINT_ENCODE3 (0x0046u, 0x0307u, 0x1E1Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0301u, 0x01F4u), - HB_CODEPOINT_ENCODE3 (0x0047u, 0x0302u, 0x011Cu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0304u, 0x1E20u), - HB_CODEPOINT_ENCODE3 (0x0047u, 0x0306u, 0x011Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0307u, 0x0120u), - HB_CODEPOINT_ENCODE3 (0x0047u, 0x030Cu, 0x01E6u), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0327u, 0x0122u), - HB_CODEPOINT_ENCODE3 (0x0048u, 0x0302u, 0x0124u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0307u, 0x1E22u), - HB_CODEPOINT_ENCODE3 (0x0048u, 0x0308u, 0x1E26u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x030Cu, 0x021Eu), - HB_CODEPOINT_ENCODE3 (0x0048u, 0x0323u, 0x1E24u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0327u, 0x1E28u), - HB_CODEPOINT_ENCODE3 (0x0048u, 0x032Eu, 0x1E2Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0300u, 0x00CCu), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0301u, 0x00CDu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0302u, 0x00CEu), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0303u, 0x0128u), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0304u, 0x012Au), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0306u, 0x012Cu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0307u, 0x0130u), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0308u, 0x00CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0309u, 0x1EC8u), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Cu, 0x01CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Fu, 0x0208u), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0311u, 0x020Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0323u, 0x1ECAu), - HB_CODEPOINT_ENCODE3 (0x0049u, 0x0328u, 0x012Eu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0330u, 0x1E2Cu), - HB_CODEPOINT_ENCODE3 (0x004Au, 0x0302u, 0x0134u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0301u, 0x1E30u), - HB_CODEPOINT_ENCODE3 (0x004Bu, 0x030Cu, 0x01E8u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0323u, 0x1E32u), - HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0327u, 0x0136u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0331u, 0x1E34u), - HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0301u, 0x0139u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x030Cu, 0x013Du), - HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0323u, 0x1E36u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0327u, 0x013Bu), - HB_CODEPOINT_ENCODE3 (0x004Cu, 0x032Du, 0x1E3Cu), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0331u, 0x1E3Au), - HB_CODEPOINT_ENCODE3 (0x004Du, 0x0301u, 0x1E3Eu), HB_CODEPOINT_ENCODE3 (0x004Du, 0x0307u, 0x1E40u), - HB_CODEPOINT_ENCODE3 (0x004Du, 0x0323u, 0x1E42u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0300u, 0x01F8u), - HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0301u, 0x0143u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0303u, 0x00D1u), - HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0307u, 0x1E44u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x030Cu, 0x0147u), - HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0323u, 0x1E46u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0327u, 0x0145u), - HB_CODEPOINT_ENCODE3 (0x004Eu, 0x032Du, 0x1E4Au), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0331u, 0x1E48u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0300u, 0x00D2u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0301u, 0x00D3u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0302u, 0x00D4u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0303u, 0x00D5u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0304u, 0x014Cu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0306u, 0x014Eu), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0307u, 0x022Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0308u, 0x00D6u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0309u, 0x1ECEu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Bu, 0x0150u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Cu, 0x01D1u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Fu, 0x020Cu), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0311u, 0x020Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x031Bu, 0x01A0u), - HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0323u, 0x1ECCu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0328u, 0x01EAu), - HB_CODEPOINT_ENCODE3 (0x0050u, 0x0301u, 0x1E54u), HB_CODEPOINT_ENCODE3 (0x0050u, 0x0307u, 0x1E56u), - HB_CODEPOINT_ENCODE3 (0x0052u, 0x0301u, 0x0154u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0307u, 0x1E58u), - HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Cu, 0x0158u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Fu, 0x0210u), - HB_CODEPOINT_ENCODE3 (0x0052u, 0x0311u, 0x0212u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0323u, 0x1E5Au), - HB_CODEPOINT_ENCODE3 (0x0052u, 0x0327u, 0x0156u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0331u, 0x1E5Eu), - HB_CODEPOINT_ENCODE3 (0x0053u, 0x0301u, 0x015Au), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0302u, 0x015Cu), - HB_CODEPOINT_ENCODE3 (0x0053u, 0x0307u, 0x1E60u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x030Cu, 0x0160u), - HB_CODEPOINT_ENCODE3 (0x0053u, 0x0323u, 0x1E62u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0326u, 0x0218u), - HB_CODEPOINT_ENCODE3 (0x0053u, 0x0327u, 0x015Eu), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0307u, 0x1E6Au), - HB_CODEPOINT_ENCODE3 (0x0054u, 0x030Cu, 0x0164u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0323u, 0x1E6Cu), - HB_CODEPOINT_ENCODE3 (0x0054u, 0x0326u, 0x021Au), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0327u, 0x0162u), - HB_CODEPOINT_ENCODE3 (0x0054u, 0x032Du, 0x1E70u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0331u, 0x1E6Eu), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0300u, 0x00D9u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0301u, 0x00DAu), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0302u, 0x00DBu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0303u, 0x0168u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0304u, 0x016Au), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0306u, 0x016Cu), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0308u, 0x00DCu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0309u, 0x1EE6u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Au, 0x016Eu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Bu, 0x0170u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Cu, 0x01D3u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Fu, 0x0214u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0311u, 0x0216u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x031Bu, 0x01AFu), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0323u, 0x1EE4u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0324u, 0x1E72u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0328u, 0x0172u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x032Du, 0x1E76u), - HB_CODEPOINT_ENCODE3 (0x0055u, 0x0330u, 0x1E74u), HB_CODEPOINT_ENCODE3 (0x0056u, 0x0303u, 0x1E7Cu), - HB_CODEPOINT_ENCODE3 (0x0056u, 0x0323u, 0x1E7Eu), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0300u, 0x1E80u), - HB_CODEPOINT_ENCODE3 (0x0057u, 0x0301u, 0x1E82u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0302u, 0x0174u), - HB_CODEPOINT_ENCODE3 (0x0057u, 0x0307u, 0x1E86u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0308u, 0x1E84u), - HB_CODEPOINT_ENCODE3 (0x0057u, 0x0323u, 0x1E88u), HB_CODEPOINT_ENCODE3 (0x0058u, 0x0307u, 0x1E8Au), - HB_CODEPOINT_ENCODE3 (0x0058u, 0x0308u, 0x1E8Cu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0300u, 0x1EF2u), - HB_CODEPOINT_ENCODE3 (0x0059u, 0x0301u, 0x00DDu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0302u, 0x0176u), - HB_CODEPOINT_ENCODE3 (0x0059u, 0x0303u, 0x1EF8u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0304u, 0x0232u), - HB_CODEPOINT_ENCODE3 (0x0059u, 0x0307u, 0x1E8Eu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0308u, 0x0178u), - HB_CODEPOINT_ENCODE3 (0x0059u, 0x0309u, 0x1EF6u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0323u, 0x1EF4u), - HB_CODEPOINT_ENCODE3 (0x005Au, 0x0301u, 0x0179u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0302u, 0x1E90u), - HB_CODEPOINT_ENCODE3 (0x005Au, 0x0307u, 0x017Bu), HB_CODEPOINT_ENCODE3 (0x005Au, 0x030Cu, 0x017Du), - HB_CODEPOINT_ENCODE3 (0x005Au, 0x0323u, 0x1E92u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0331u, 0x1E94u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0300u, 0x00E0u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0301u, 0x00E1u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0302u, 0x00E2u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0303u, 0x00E3u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0304u, 0x0101u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0306u, 0x0103u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0307u, 0x0227u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0308u, 0x00E4u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0309u, 0x1EA3u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Au, 0x00E5u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Cu, 0x01CEu), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Fu, 0x0201u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0311u, 0x0203u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0323u, 0x1EA1u), - HB_CODEPOINT_ENCODE3 (0x0061u, 0x0325u, 0x1E01u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0328u, 0x0105u), - HB_CODEPOINT_ENCODE3 (0x0062u, 0x0307u, 0x1E03u), HB_CODEPOINT_ENCODE3 (0x0062u, 0x0323u, 0x1E05u), - HB_CODEPOINT_ENCODE3 (0x0062u, 0x0331u, 0x1E07u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0301u, 0x0107u), - HB_CODEPOINT_ENCODE3 (0x0063u, 0x0302u, 0x0109u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0307u, 0x010Bu), - HB_CODEPOINT_ENCODE3 (0x0063u, 0x030Cu, 0x010Du), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0327u, 0x00E7u), - HB_CODEPOINT_ENCODE3 (0x0064u, 0x0307u, 0x1E0Bu), HB_CODEPOINT_ENCODE3 (0x0064u, 0x030Cu, 0x010Fu), - HB_CODEPOINT_ENCODE3 (0x0064u, 0x0323u, 0x1E0Du), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0327u, 0x1E11u), - HB_CODEPOINT_ENCODE3 (0x0064u, 0x032Du, 0x1E13u), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0331u, 0x1E0Fu), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0300u, 0x00E8u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0301u, 0x00E9u), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0302u, 0x00EAu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0303u, 0x1EBDu), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0304u, 0x0113u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0306u, 0x0115u), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0307u, 0x0117u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0308u, 0x00EBu), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0309u, 0x1EBBu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Cu, 0x011Bu), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Fu, 0x0205u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0311u, 0x0207u), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0323u, 0x1EB9u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0327u, 0x0229u), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0328u, 0x0119u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x032Du, 0x1E19u), - HB_CODEPOINT_ENCODE3 (0x0065u, 0x0330u, 0x1E1Bu), HB_CODEPOINT_ENCODE3 (0x0066u, 0x0307u, 0x1E1Fu), - HB_CODEPOINT_ENCODE3 (0x0067u, 0x0301u, 0x01F5u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0302u, 0x011Du), - HB_CODEPOINT_ENCODE3 (0x0067u, 0x0304u, 0x1E21u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0306u, 0x011Fu), - HB_CODEPOINT_ENCODE3 (0x0067u, 0x0307u, 0x0121u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x030Cu, 0x01E7u), - HB_CODEPOINT_ENCODE3 (0x0067u, 0x0327u, 0x0123u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0302u, 0x0125u), - HB_CODEPOINT_ENCODE3 (0x0068u, 0x0307u, 0x1E23u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0308u, 0x1E27u), - HB_CODEPOINT_ENCODE3 (0x0068u, 0x030Cu, 0x021Fu), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0323u, 0x1E25u), - HB_CODEPOINT_ENCODE3 (0x0068u, 0x0327u, 0x1E29u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x032Eu, 0x1E2Bu), - HB_CODEPOINT_ENCODE3 (0x0068u, 0x0331u, 0x1E96u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0300u, 0x00ECu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0301u, 0x00EDu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0302u, 0x00EEu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0303u, 0x0129u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0304u, 0x012Bu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0306u, 0x012Du), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0308u, 0x00EFu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0309u, 0x1EC9u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Cu, 0x01D0u), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Fu, 0x0209u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0311u, 0x020Bu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0323u, 0x1ECBu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0328u, 0x012Fu), - HB_CODEPOINT_ENCODE3 (0x0069u, 0x0330u, 0x1E2Du), HB_CODEPOINT_ENCODE3 (0x006Au, 0x0302u, 0x0135u), - HB_CODEPOINT_ENCODE3 (0x006Au, 0x030Cu, 0x01F0u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0301u, 0x1E31u), - HB_CODEPOINT_ENCODE3 (0x006Bu, 0x030Cu, 0x01E9u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0323u, 0x1E33u), - HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0327u, 0x0137u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0331u, 0x1E35u), - HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0301u, 0x013Au), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x030Cu, 0x013Eu), - HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0323u, 0x1E37u), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0327u, 0x013Cu), - HB_CODEPOINT_ENCODE3 (0x006Cu, 0x032Du, 0x1E3Du), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0331u, 0x1E3Bu), - HB_CODEPOINT_ENCODE3 (0x006Du, 0x0301u, 0x1E3Fu), HB_CODEPOINT_ENCODE3 (0x006Du, 0x0307u, 0x1E41u), - HB_CODEPOINT_ENCODE3 (0x006Du, 0x0323u, 0x1E43u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0300u, 0x01F9u), - HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0301u, 0x0144u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0303u, 0x00F1u), - HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0307u, 0x1E45u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x030Cu, 0x0148u), - HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0323u, 0x1E47u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0327u, 0x0146u), - HB_CODEPOINT_ENCODE3 (0x006Eu, 0x032Du, 0x1E4Bu), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0331u, 0x1E49u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0300u, 0x00F2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0301u, 0x00F3u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0302u, 0x00F4u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0303u, 0x00F5u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0304u, 0x014Du), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0306u, 0x014Fu), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0307u, 0x022Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0308u, 0x00F6u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0309u, 0x1ECFu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Bu, 0x0151u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Cu, 0x01D2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Fu, 0x020Du), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0311u, 0x020Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x031Bu, 0x01A1u), - HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0323u, 0x1ECDu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0328u, 0x01EBu), - HB_CODEPOINT_ENCODE3 (0x0070u, 0x0301u, 0x1E55u), HB_CODEPOINT_ENCODE3 (0x0070u, 0x0307u, 0x1E57u), - HB_CODEPOINT_ENCODE3 (0x0072u, 0x0301u, 0x0155u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0307u, 0x1E59u), - HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Cu, 0x0159u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Fu, 0x0211u), - HB_CODEPOINT_ENCODE3 (0x0072u, 0x0311u, 0x0213u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0323u, 0x1E5Bu), - HB_CODEPOINT_ENCODE3 (0x0072u, 0x0327u, 0x0157u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0331u, 0x1E5Fu), - HB_CODEPOINT_ENCODE3 (0x0073u, 0x0301u, 0x015Bu), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0302u, 0x015Du), - HB_CODEPOINT_ENCODE3 (0x0073u, 0x0307u, 0x1E61u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x030Cu, 0x0161u), - HB_CODEPOINT_ENCODE3 (0x0073u, 0x0323u, 0x1E63u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0326u, 0x0219u), - HB_CODEPOINT_ENCODE3 (0x0073u, 0x0327u, 0x015Fu), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0307u, 0x1E6Bu), - HB_CODEPOINT_ENCODE3 (0x0074u, 0x0308u, 0x1E97u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x030Cu, 0x0165u), - HB_CODEPOINT_ENCODE3 (0x0074u, 0x0323u, 0x1E6Du), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0326u, 0x021Bu), - HB_CODEPOINT_ENCODE3 (0x0074u, 0x0327u, 0x0163u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x032Du, 0x1E71u), - HB_CODEPOINT_ENCODE3 (0x0074u, 0x0331u, 0x1E6Fu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0300u, 0x00F9u), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x0301u, 0x00FAu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0302u, 0x00FBu), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x0303u, 0x0169u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0304u, 0x016Bu), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x0306u, 0x016Du), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0308u, 0x00FCu), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x0309u, 0x1EE7u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Au, 0x016Fu), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Bu, 0x0171u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Cu, 0x01D4u), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Fu, 0x0215u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0311u, 0x0217u), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x031Bu, 0x01B0u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0323u, 0x1EE5u), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x0324u, 0x1E73u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0328u, 0x0173u), - HB_CODEPOINT_ENCODE3 (0x0075u, 0x032Du, 0x1E77u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0330u, 0x1E75u), - HB_CODEPOINT_ENCODE3 (0x0076u, 0x0303u, 0x1E7Du), HB_CODEPOINT_ENCODE3 (0x0076u, 0x0323u, 0x1E7Fu), - HB_CODEPOINT_ENCODE3 (0x0077u, 0x0300u, 0x1E81u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0301u, 0x1E83u), - HB_CODEPOINT_ENCODE3 (0x0077u, 0x0302u, 0x0175u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0307u, 0x1E87u), - HB_CODEPOINT_ENCODE3 (0x0077u, 0x0308u, 0x1E85u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x030Au, 0x1E98u), - HB_CODEPOINT_ENCODE3 (0x0077u, 0x0323u, 0x1E89u), HB_CODEPOINT_ENCODE3 (0x0078u, 0x0307u, 0x1E8Bu), - HB_CODEPOINT_ENCODE3 (0x0078u, 0x0308u, 0x1E8Du), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0300u, 0x1EF3u), - HB_CODEPOINT_ENCODE3 (0x0079u, 0x0301u, 0x00FDu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0302u, 0x0177u), - HB_CODEPOINT_ENCODE3 (0x0079u, 0x0303u, 0x1EF9u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0304u, 0x0233u), - HB_CODEPOINT_ENCODE3 (0x0079u, 0x0307u, 0x1E8Fu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0308u, 0x00FFu), - HB_CODEPOINT_ENCODE3 (0x0079u, 0x0309u, 0x1EF7u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x030Au, 0x1E99u), - HB_CODEPOINT_ENCODE3 (0x0079u, 0x0323u, 0x1EF5u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0301u, 0x017Au), - HB_CODEPOINT_ENCODE3 (0x007Au, 0x0302u, 0x1E91u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0307u, 0x017Cu), - HB_CODEPOINT_ENCODE3 (0x007Au, 0x030Cu, 0x017Eu), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0323u, 0x1E93u), - HB_CODEPOINT_ENCODE3 (0x007Au, 0x0331u, 0x1E95u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0300u, 0x1FEDu), - HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0301u, 0x0385u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0342u, 0x1FC1u), - HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0300u, 0x1EA6u), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0301u, 0x1EA4u), - HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0303u, 0x1EAAu), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0309u, 0x1EA8u), - HB_CODEPOINT_ENCODE3 (0x00C4u, 0x0304u, 0x01DEu), HB_CODEPOINT_ENCODE3 (0x00C5u, 0x0301u, 0x01FAu), - HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0301u, 0x01FCu), HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0304u, 0x01E2u), - HB_CODEPOINT_ENCODE3 (0x00C7u, 0x0301u, 0x1E08u), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0300u, 0x1EC0u), - HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0301u, 0x1EBEu), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0303u, 0x1EC4u), - HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0309u, 0x1EC2u), HB_CODEPOINT_ENCODE3 (0x00CFu, 0x0301u, 0x1E2Eu), - HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0300u, 0x1ED2u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0301u, 0x1ED0u), - HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0303u, 0x1ED6u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0309u, 0x1ED4u), - HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0301u, 0x1E4Cu), HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0304u, 0x022Cu), - HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0308u, 0x1E4Eu), HB_CODEPOINT_ENCODE3 (0x00D6u, 0x0304u, 0x022Au), - HB_CODEPOINT_ENCODE3 (0x00D8u, 0x0301u, 0x01FEu), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0300u, 0x01DBu), - HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0301u, 0x01D7u), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0304u, 0x01D5u), - HB_CODEPOINT_ENCODE3 (0x00DCu, 0x030Cu, 0x01D9u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0300u, 0x1EA7u), - HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0301u, 0x1EA5u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0303u, 0x1EABu), - HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0309u, 0x1EA9u), HB_CODEPOINT_ENCODE3 (0x00E4u, 0x0304u, 0x01DFu), - HB_CODEPOINT_ENCODE3 (0x00E5u, 0x0301u, 0x01FBu), HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0301u, 0x01FDu), - HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0304u, 0x01E3u), HB_CODEPOINT_ENCODE3 (0x00E7u, 0x0301u, 0x1E09u), - HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0300u, 0x1EC1u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0301u, 0x1EBFu), - HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0303u, 0x1EC5u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0309u, 0x1EC3u), - HB_CODEPOINT_ENCODE3 (0x00EFu, 0x0301u, 0x1E2Fu), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0300u, 0x1ED3u), - HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0301u, 0x1ED1u), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0303u, 0x1ED7u), - HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0309u, 0x1ED5u), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0301u, 0x1E4Du), - HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0304u, 0x022Du), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0308u, 0x1E4Fu), - HB_CODEPOINT_ENCODE3 (0x00F6u, 0x0304u, 0x022Bu), HB_CODEPOINT_ENCODE3 (0x00F8u, 0x0301u, 0x01FFu), - HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0300u, 0x01DCu), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0301u, 0x01D8u), - HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0304u, 0x01D6u), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x030Cu, 0x01DAu), - HB_CODEPOINT_ENCODE3 (0x0102u, 0x0300u, 0x1EB0u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0301u, 0x1EAEu), - HB_CODEPOINT_ENCODE3 (0x0102u, 0x0303u, 0x1EB4u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0309u, 0x1EB2u), - HB_CODEPOINT_ENCODE3 (0x0103u, 0x0300u, 0x1EB1u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0301u, 0x1EAFu), - HB_CODEPOINT_ENCODE3 (0x0103u, 0x0303u, 0x1EB5u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0309u, 0x1EB3u), - HB_CODEPOINT_ENCODE3 (0x0112u, 0x0300u, 0x1E14u), HB_CODEPOINT_ENCODE3 (0x0112u, 0x0301u, 0x1E16u), - HB_CODEPOINT_ENCODE3 (0x0113u, 0x0300u, 0x1E15u), HB_CODEPOINT_ENCODE3 (0x0113u, 0x0301u, 0x1E17u), - HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0300u, 0x1E50u), HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0301u, 0x1E52u), - HB_CODEPOINT_ENCODE3 (0x014Du, 0x0300u, 0x1E51u), HB_CODEPOINT_ENCODE3 (0x014Du, 0x0301u, 0x1E53u), - HB_CODEPOINT_ENCODE3 (0x015Au, 0x0307u, 0x1E64u), HB_CODEPOINT_ENCODE3 (0x015Bu, 0x0307u, 0x1E65u), - HB_CODEPOINT_ENCODE3 (0x0160u, 0x0307u, 0x1E66u), HB_CODEPOINT_ENCODE3 (0x0161u, 0x0307u, 0x1E67u), - HB_CODEPOINT_ENCODE3 (0x0168u, 0x0301u, 0x1E78u), HB_CODEPOINT_ENCODE3 (0x0169u, 0x0301u, 0x1E79u), - HB_CODEPOINT_ENCODE3 (0x016Au, 0x0308u, 0x1E7Au), HB_CODEPOINT_ENCODE3 (0x016Bu, 0x0308u, 0x1E7Bu), - HB_CODEPOINT_ENCODE3 (0x017Fu, 0x0307u, 0x1E9Bu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0300u, 0x1EDCu), - HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0301u, 0x1EDAu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0303u, 0x1EE0u), - HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0309u, 0x1EDEu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0323u, 0x1EE2u), - HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0300u, 0x1EDDu), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0301u, 0x1EDBu), - HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0303u, 0x1EE1u), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0309u, 0x1EDFu), - HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0323u, 0x1EE3u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0300u, 0x1EEAu), - HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0301u, 0x1EE8u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0303u, 0x1EEEu), - HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0309u, 0x1EECu), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0323u, 0x1EF0u), - HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0300u, 0x1EEBu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0301u, 0x1EE9u), - HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0303u, 0x1EEFu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0309u, 0x1EEDu), - HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0323u, 0x1EF1u), HB_CODEPOINT_ENCODE3 (0x01B7u, 0x030Cu, 0x01EEu), - HB_CODEPOINT_ENCODE3 (0x01EAu, 0x0304u, 0x01ECu), HB_CODEPOINT_ENCODE3 (0x01EBu, 0x0304u, 0x01EDu), - HB_CODEPOINT_ENCODE3 (0x0226u, 0x0304u, 0x01E0u), HB_CODEPOINT_ENCODE3 (0x0227u, 0x0304u, 0x01E1u), - HB_CODEPOINT_ENCODE3 (0x0228u, 0x0306u, 0x1E1Cu), HB_CODEPOINT_ENCODE3 (0x0229u, 0x0306u, 0x1E1Du), - HB_CODEPOINT_ENCODE3 (0x022Eu, 0x0304u, 0x0230u), HB_CODEPOINT_ENCODE3 (0x022Fu, 0x0304u, 0x0231u), - HB_CODEPOINT_ENCODE3 (0x0292u, 0x030Cu, 0x01EFu), HB_CODEPOINT_ENCODE3 (0x0308u, 0x0301u, 0x0000u), - HB_CODEPOINT_ENCODE3 (0x0391u, 0x0300u, 0x1FBAu), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0301u, 0x0386u), - HB_CODEPOINT_ENCODE3 (0x0391u, 0x0304u, 0x1FB9u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0306u, 0x1FB8u), - HB_CODEPOINT_ENCODE3 (0x0391u, 0x0313u, 0x1F08u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0314u, 0x1F09u), - HB_CODEPOINT_ENCODE3 (0x0391u, 0x0345u, 0x1FBCu), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0300u, 0x1FC8u), - HB_CODEPOINT_ENCODE3 (0x0395u, 0x0301u, 0x0388u), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0313u, 0x1F18u), - HB_CODEPOINT_ENCODE3 (0x0395u, 0x0314u, 0x1F19u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0300u, 0x1FCAu), - HB_CODEPOINT_ENCODE3 (0x0397u, 0x0301u, 0x0389u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0313u, 0x1F28u), - HB_CODEPOINT_ENCODE3 (0x0397u, 0x0314u, 0x1F29u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0345u, 0x1FCCu), - HB_CODEPOINT_ENCODE3 (0x0399u, 0x0300u, 0x1FDAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0301u, 0x038Au), - HB_CODEPOINT_ENCODE3 (0x0399u, 0x0304u, 0x1FD9u), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0306u, 0x1FD8u), - HB_CODEPOINT_ENCODE3 (0x0399u, 0x0308u, 0x03AAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0313u, 0x1F38u), - HB_CODEPOINT_ENCODE3 (0x0399u, 0x0314u, 0x1F39u), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0300u, 0x1FF8u), - HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0301u, 0x038Cu), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0313u, 0x1F48u), - HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0314u, 0x1F49u), HB_CODEPOINT_ENCODE3 (0x03A1u, 0x0314u, 0x1FECu), - HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0300u, 0x1FEAu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0301u, 0x038Eu), - HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0304u, 0x1FE9u), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0306u, 0x1FE8u), - HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0308u, 0x03ABu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0314u, 0x1F59u), - HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0300u, 0x1FFAu), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0301u, 0x038Fu), - HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0313u, 0x1F68u), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0314u, 0x1F69u), - HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0345u, 0x1FFCu), HB_CODEPOINT_ENCODE3 (0x03ACu, 0x0345u, 0x1FB4u), - HB_CODEPOINT_ENCODE3 (0x03AEu, 0x0345u, 0x1FC4u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0300u, 0x1F70u), - HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0301u, 0x03ACu), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0304u, 0x1FB1u), - HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0306u, 0x1FB0u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0313u, 0x1F00u), - HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0314u, 0x1F01u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0342u, 0x1FB6u), - HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0345u, 0x1FB3u), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0300u, 0x1F72u), - HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0301u, 0x03ADu), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0313u, 0x1F10u), - HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0314u, 0x1F11u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0300u, 0x1F74u), - HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0301u, 0x03AEu), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0313u, 0x1F20u), - HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0314u, 0x1F21u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0342u, 0x1FC6u), - HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0345u, 0x1FC3u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0300u, 0x1F76u), - HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0301u, 0x03AFu), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0304u, 0x1FD1u), - HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0306u, 0x1FD0u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0308u, 0x03CAu), - HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0313u, 0x1F30u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0314u, 0x1F31u), - HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0342u, 0x1FD6u), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0300u, 0x1F78u), - HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0301u, 0x03CCu), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0313u, 0x1F40u), - HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0314u, 0x1F41u), HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0313u, 0x1FE4u), - HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0314u, 0x1FE5u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0300u, 0x1F7Au), - HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0301u, 0x03CDu), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0304u, 0x1FE1u), - HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0306u, 0x1FE0u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0308u, 0x03CBu), - HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0313u, 0x1F50u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0314u, 0x1F51u), - HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0342u, 0x1FE6u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0300u, 0x1F7Cu), - HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0301u, 0x03CEu), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0313u, 0x1F60u), - HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0314u, 0x1F61u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0342u, 0x1FF6u), - HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0345u, 0x1FF3u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0300u, 0x1FD2u), - HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0301u, 0x0390u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0342u, 0x1FD7u), - HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0300u, 0x1FE2u), HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0301u, 0x03B0u), - HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0342u, 0x1FE7u), HB_CODEPOINT_ENCODE3 (0x03CEu, 0x0345u, 0x1FF4u), - HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0301u, 0x03D3u), HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0308u, 0x03D4u), - HB_CODEPOINT_ENCODE3 (0x0406u, 0x0308u, 0x0407u), HB_CODEPOINT_ENCODE3 (0x0410u, 0x0306u, 0x04D0u), - HB_CODEPOINT_ENCODE3 (0x0410u, 0x0308u, 0x04D2u), HB_CODEPOINT_ENCODE3 (0x0413u, 0x0301u, 0x0403u), - HB_CODEPOINT_ENCODE3 (0x0415u, 0x0300u, 0x0400u), HB_CODEPOINT_ENCODE3 (0x0415u, 0x0306u, 0x04D6u), - HB_CODEPOINT_ENCODE3 (0x0415u, 0x0308u, 0x0401u), HB_CODEPOINT_ENCODE3 (0x0416u, 0x0306u, 0x04C1u), - HB_CODEPOINT_ENCODE3 (0x0416u, 0x0308u, 0x04DCu), HB_CODEPOINT_ENCODE3 (0x0417u, 0x0308u, 0x04DEu), - HB_CODEPOINT_ENCODE3 (0x0418u, 0x0300u, 0x040Du), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0304u, 0x04E2u), - HB_CODEPOINT_ENCODE3 (0x0418u, 0x0306u, 0x0419u), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0308u, 0x04E4u), - HB_CODEPOINT_ENCODE3 (0x041Au, 0x0301u, 0x040Cu), HB_CODEPOINT_ENCODE3 (0x041Eu, 0x0308u, 0x04E6u), - HB_CODEPOINT_ENCODE3 (0x0423u, 0x0304u, 0x04EEu), HB_CODEPOINT_ENCODE3 (0x0423u, 0x0306u, 0x040Eu), - HB_CODEPOINT_ENCODE3 (0x0423u, 0x0308u, 0x04F0u), HB_CODEPOINT_ENCODE3 (0x0423u, 0x030Bu, 0x04F2u), - HB_CODEPOINT_ENCODE3 (0x0427u, 0x0308u, 0x04F4u), HB_CODEPOINT_ENCODE3 (0x042Bu, 0x0308u, 0x04F8u), - HB_CODEPOINT_ENCODE3 (0x042Du, 0x0308u, 0x04ECu), HB_CODEPOINT_ENCODE3 (0x0430u, 0x0306u, 0x04D1u), - HB_CODEPOINT_ENCODE3 (0x0430u, 0x0308u, 0x04D3u), HB_CODEPOINT_ENCODE3 (0x0433u, 0x0301u, 0x0453u), - HB_CODEPOINT_ENCODE3 (0x0435u, 0x0300u, 0x0450u), HB_CODEPOINT_ENCODE3 (0x0435u, 0x0306u, 0x04D7u), - HB_CODEPOINT_ENCODE3 (0x0435u, 0x0308u, 0x0451u), HB_CODEPOINT_ENCODE3 (0x0436u, 0x0306u, 0x04C2u), - HB_CODEPOINT_ENCODE3 (0x0436u, 0x0308u, 0x04DDu), HB_CODEPOINT_ENCODE3 (0x0437u, 0x0308u, 0x04DFu), - HB_CODEPOINT_ENCODE3 (0x0438u, 0x0300u, 0x045Du), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0304u, 0x04E3u), - HB_CODEPOINT_ENCODE3 (0x0438u, 0x0306u, 0x0439u), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0308u, 0x04E5u), - HB_CODEPOINT_ENCODE3 (0x043Au, 0x0301u, 0x045Cu), HB_CODEPOINT_ENCODE3 (0x043Eu, 0x0308u, 0x04E7u), - HB_CODEPOINT_ENCODE3 (0x0443u, 0x0304u, 0x04EFu), HB_CODEPOINT_ENCODE3 (0x0443u, 0x0306u, 0x045Eu), - HB_CODEPOINT_ENCODE3 (0x0443u, 0x0308u, 0x04F1u), HB_CODEPOINT_ENCODE3 (0x0443u, 0x030Bu, 0x04F3u), - HB_CODEPOINT_ENCODE3 (0x0447u, 0x0308u, 0x04F5u), HB_CODEPOINT_ENCODE3 (0x044Bu, 0x0308u, 0x04F9u), - HB_CODEPOINT_ENCODE3 (0x044Du, 0x0308u, 0x04EDu), HB_CODEPOINT_ENCODE3 (0x0456u, 0x0308u, 0x0457u), - HB_CODEPOINT_ENCODE3 (0x0474u, 0x030Fu, 0x0476u), HB_CODEPOINT_ENCODE3 (0x0475u, 0x030Fu, 0x0477u), - HB_CODEPOINT_ENCODE3 (0x04D8u, 0x0308u, 0x04DAu), HB_CODEPOINT_ENCODE3 (0x04D9u, 0x0308u, 0x04DBu), - HB_CODEPOINT_ENCODE3 (0x04E8u, 0x0308u, 0x04EAu), HB_CODEPOINT_ENCODE3 (0x04E9u, 0x0308u, 0x04EBu), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D2u, 0x05BCu, 0x0000u), diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc index 4bdd4f463..69949a288 100644 --- a/src/hb-ucd.cc +++ b/src/hb-ucd.cc @@ -114,6 +114,14 @@ _cmp_pair (const void *_key, const void *_item) return a < b ? -1 : a > b ? +1 : 0; } +static int +_cmp_pair_11_7_14 (const void *_key, const void *_item) +{ + uint32_t& a = * (uint32_t*) _key; + uint32_t b = (* (uint32_t*) _item) & HB_CODEPOINT_ENCODE3_11_7_14(0x1FFFFFu, 0x1FFFFFu, 0); + + return a < b ? -1 : a > b ? +1 : 0; +} static hb_bool_t hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, @@ -122,16 +130,30 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, { if (_hb_ucd_compose_hangul (a, b, ab)) return true; - uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0); - uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_map, - ARRAY_LENGTH (_hb_ucd_dm2_map), - sizeof (*_hb_ucd_dm2_map), - _cmp_pair); - if (likely (!v)) return false; + hb_codepoint_t u = 0; + + if ((a & 0xFFFFF800u) == 0x0000u && (b & 0xFFFFFF80) == 0x0300u) + { + uint32_t k = HB_CODEPOINT_ENCODE3_11_7_14 (a, b, 0); + uint32_t *v = (uint32_t*) hb_bsearch (&k, _hb_ucd_dm2_u32_map, + ARRAY_LENGTH (_hb_ucd_dm2_u32_map), + sizeof (*_hb_ucd_dm2_u32_map), + _cmp_pair_11_7_14); + if (likely (!v)) return false; + u = HB_CODEPOINT_DECODE3_11_7_14_3 (*v); + } + else + { + uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0); + uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_u64_map, + ARRAY_LENGTH (_hb_ucd_dm2_u64_map), + sizeof (*_hb_ucd_dm2_u64_map), + _cmp_pair); + if (likely (!v)) return false; + u = HB_CODEPOINT_DECODE3_3 (*v); + } - hb_codepoint_t u = HB_CODEPOINT_DECODE3_3 (*v); if (unlikely (!u)) return false; - *ab = u; return true; } @@ -162,7 +184,16 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map); - uint64_t v = _hb_ucd_dm2_map[i]; + if (i < ARRAY_LENGTH (_hb_ucd_dm2_u32_map)) + { + uint32_t v = _hb_ucd_dm2_u32_map[i]; + *a = HB_CODEPOINT_DECODE3_11_7_14_1 (v); + *b = HB_CODEPOINT_DECODE3_11_7_14_2 (v); + return true; + } + i -= ARRAY_LENGTH (_hb_ucd_dm2_u32_map); + + uint64_t v = _hb_ucd_dm2_u64_map[i]; *a = HB_CODEPOINT_DECODE3_1 (v); *b = HB_CODEPOINT_DECODE3_2 (v); return true; From ccf1448238c91da3cba8370ee527229013f6d362 Mon Sep 17 00:00:00 2001 From: GaryQian Date: Mon, 24 Jun 2019 12:57:13 -0700 Subject: [PATCH 549/617] Cast long->size_t to ensure comparison of similar types --- src/hb-common.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index fb6377e39..9035755a4 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -70,7 +70,7 @@ _hb_options_init () p = c + strlen (c); #define OPTION(name, symbol) \ - if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) do { u.opts.symbol = true; } while (0) + if (0 == strncmp (c, name, p - c) && strlen (name) == static_cast(p - c)) do { u.opts.symbol = true; } while (0) OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible); OPTION ("aat", aat); From bb4cdf8e0bcc98a036c22cfd44242502b107fb32 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 25 Jun 2019 01:42:42 +0430 Subject: [PATCH 550/617] Replace create_from_file with empty blob if HB_NO_OPEN is defined --- src/main.cc | 4 ++++ src/test-buffer-serialize.cc | 4 ++++ src/test-gpos-size-params.cc | 4 ++++ src/test-gsub-would-substitute.cc | 4 ++++ src/test-ot-color.cc | 4 ++++ src/test-ot-name.cc | 4 ++++ src/test.cc | 4 ++++ 7 files changed, 28 insertions(+) diff --git a/src/main.cc b/src/main.cc index 490b76e5b..0aa4a5b20 100644 --- a/src/main.cc +++ b/src/main.cc @@ -38,6 +38,10 @@ using namespace OT; +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { diff --git a/src/test-buffer-serialize.cc b/src/test-buffer-serialize.cc index 28826be8d..6393f0b7f 100644 --- a/src/test-buffer-serialize.cc +++ b/src/test-buffer-serialize.cc @@ -34,6 +34,10 @@ #include +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { diff --git a/src/test-gpos-size-params.cc b/src/test-gpos-size-params.cc index acd1c4fc5..ad10ed40d 100644 --- a/src/test-gpos-size-params.cc +++ b/src/test-gpos-size-params.cc @@ -31,6 +31,10 @@ #include +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { diff --git a/src/test-gsub-would-substitute.cc b/src/test-gsub-would-substitute.cc index 268f7db98..7ad9e084c 100644 --- a/src/test-gsub-would-substitute.cc +++ b/src/test-gsub-would-substitute.cc @@ -35,6 +35,10 @@ #include "hb-ft.h" #endif +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { diff --git a/src/test-ot-color.cc b/src/test-ot-color.cc index e9126c064..3b4c8b6c2 100644 --- a/src/test-ot-color.cc +++ b/src/test-ot-color.cc @@ -27,6 +27,10 @@ #include +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + #if !defined(HB_NO_COLOR) && defined(CAIRO_HAS_SVG_SURFACE) #include "hb-ot.h" diff --git a/src/test-ot-name.cc b/src/test-ot-name.cc index 44c2c179c..4a484c6d6 100644 --- a/src/test-ot-name.cc +++ b/src/test-ot-name.cc @@ -30,6 +30,10 @@ #include #include +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { diff --git a/src/test.cc b/src/test.cc index f0eace8c4..65b469feb 100644 --- a/src/test.cc +++ b/src/test.cc @@ -34,6 +34,10 @@ #include "hb-ft.h" #endif +#ifdef HB_NO_OPEN +#define hb_blob_create_from_file(x) hb_blob_get_empty () +#endif + int main (int argc, char **argv) { From fb0df17b2701c1c5623198440aa88a676985bd4f Mon Sep 17 00:00:00 2001 From: David Corbett Date: Mon, 24 Jun 2019 21:54:26 -0400 Subject: [PATCH 551/617] Correct "nonunihan" to "nounihan" --- src/gen-ucd-table.py | 4 ++-- src/hb-ucd-table.hh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 053953a97..f443ac1cf 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -7,7 +7,7 @@ import logging logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) if len (sys.argv) != 2: - print("usage: ./gen-ucd-table ucd.nonunihan.grouped.xml", file=sys.stderr) + print("usage: ./gen-ucd-table ucd.nounihan.grouped.xml", file=sys.stderr) sys.exit(1) # https://github.com/harfbuzz/packtab @@ -90,7 +90,7 @@ print("/* == Start of generated table == */") print("/*") print(" * The following table is generated by running:") print(" *") -print(" * ./gen-ucd-table.py ucd.nonunihan.grouped.xml") +print(" * ./gen-ucd-table.py ucd.nounihan.grouped.xml") print(" *") print(" * on file with this description:", ucdxml.description) print(" */") diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index ae9ce3e2f..4a5e30c64 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -2,7 +2,7 @@ /* * The following table is generated by running: * - * ./gen-ucd-table.py ucd.nonunihan.grouped.xml + * ./gen-ucd-table.py ucd.nounihan.grouped.xml * * on file with this description: Unicode 12.1.0 */ From 0660175dc82d82bbb38c45b9cb53190e06f55750 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Tue, 25 Jun 2019 10:14:03 -0400 Subject: [PATCH 552/617] Categorize U+1133B for use in Tamil --- src/hb-ot-shape-complex-indic.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-indic.hh b/src/hb-ot-shape-complex-indic.hh index dc8f8c7ce..d207728c4 100644 --- a/src/hb-ot-shape-complex-indic.hh +++ b/src/hb-ot-shape-complex-indic.hh @@ -359,7 +359,7 @@ set_indic_properties (hb_glyph_info_t &info) /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil, * so the Indic shaper needs to know their categories. */ else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM; - else if (unlikely (u == 0x1133cu)) cat = OT_N; + else if (unlikely (u == 0x1133Bu || u == 0x1133Cu)) cat = OT_N; else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */ From 094966959f96d9a41fb612fd0b870f5ae8f5a954 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Mon, 17 Jun 2019 22:12:40 -0700 Subject: [PATCH 553/617] add hb_bimap_t, subclass hb_inc_bimap_t replacing CFF::remap_t --- src/Makefile.sources | 1 + src/hb-bimap.hh | 129 ++++++++++++++++++++++++++++++++++++ src/hb-ot-cff-common.hh | 64 ++---------------- src/hb-ot-cff1-table.hh | 16 ++--- src/hb-subset-cff-common.cc | 12 ++-- src/hb-subset-cff-common.hh | 40 +++++------ src/hb-subset-cff1.cc | 26 ++++---- src/hb-subset-cff2.cc | 29 ++++---- 8 files changed, 190 insertions(+), 127 deletions(-) create mode 100644 src/hb-bimap.hh diff --git a/src/Makefile.sources b/src/Makefile.sources index ab228ce7e..6f42ba3dc 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -44,6 +44,7 @@ HB_BASE_sources = \ hb-machinery.hh \ hb-map.cc \ hb-map.hh \ + hb-bimap.hh \ hb-meta.hh \ hb-mutex.hh \ hb-null.hh \ diff --git a/src/hb-bimap.hh b/src/hb-bimap.hh new file mode 100644 index 000000000..9dbe0dfb5 --- /dev/null +++ b/src/hb-bimap.hh @@ -0,0 +1,129 @@ +/* + * Copyright © 2019 Adobe Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Adobe Author(s): Michiharu Ariza + */ + +#ifndef HB_BIMAP_HH +#define HB_BIMAP_HH + +#include "hb.hh" + +/* Bi-directional map */ +struct hb_bimap_t +{ + hb_bimap_t () { init (); } + ~hb_bimap_t () { fini (); } + + void init () + { + forw_map.init (); + back_map.init (); + } + + void fini () + { + forw_map.fini (); + back_map.fini (); + } + + /* returns HB_MAP_VALUE_INVALID if unmapped */ + hb_codepoint_t forward (hb_codepoint_t lhs) const { return forw_map[lhs]; } + hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; } + + void set (hb_codepoint_t lhs, hb_codepoint_t rhs) + { + forw_map.set (lhs, rhs); + back_map.set (rhs, lhs); + } + + /* Create an identity map. */ + bool identity (unsigned int size) + { + clear (); + for (hb_codepoint_t i = 0; i < size; i++) set (i, i); + return forw_map.successful && back_map.successful; + } + + void clear () + { + forw_map.clear (); + back_map.clear (); + } + + void reset () + { + forw_map.reset (); + back_map.reset (); + } + + unsigned int get_population () const { return forw_map.get_population (); } + + protected: + hb_map_t forw_map; + hb_map_t back_map; +}; + +/* Inremental bimap: only lhs is given, rhs is incrementally assigned */ +struct hb_inc_bimap_t : hb_bimap_t +{ + /* Add a mapping from lhs to rhs with a unique value if lhs is unknown. + * Return the rhs value as the result. + */ + hb_codepoint_t add (hb_codepoint_t lhs) + { + hb_codepoint_t rhs = forw_map[lhs]; + if (rhs == HB_MAP_VALUE_INVALID) + { + rhs = get_population (); + set (lhs, rhs); + } + return rhs; + } + + bool has (hb_codepoint_t lhs) const { return forw_map.has (lhs); } + + protected: + static int cmp_id (const void* a, const void* b) + { return (int)*(const hb_codepoint_t *)a - (int)*(const hb_codepoint_t *)b; } + + public: + /* Optional: after finished adding all mappings in a random order, + * reassign rhs to lhs so that they are in the same order. */ + void sort () + { + hb_codepoint_t count = get_population (); + hb_vector_t work; + work.resize (count); + + for (hb_codepoint_t rhs = 0; rhs < count; rhs++) + work[rhs] = back_map[rhs]; + + work.qsort (cmp_id); + + for (hb_codepoint_t rhs = 0; rhs < count; rhs++) + set (work[rhs], rhs); + } +}; + +#endif /* HB_BIMAP_HH */ diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index 919cb8150..2de5a2995 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -27,6 +27,7 @@ #define HB_OT_CFF_COMMON_HH #include "hb-open-type.hh" +#include "hb-bimap.hh" #include "hb-ot-layout-common.hh" #include "hb-cff-interp-dict-common.hh" #include "hb-subset-plan.hh" @@ -410,57 +411,6 @@ struct table_info_t unsigned int offSize; }; -/* used to remap font index or SID from fullset to subset. - * set to CFF_UNDEF_CODE if excluded from subset */ -struct remap_t : hb_vector_t -{ - void init () { SUPER::init (); } - - void fini () { SUPER::fini (); } - - bool reset (unsigned int size) - { - if (unlikely (!SUPER::resize (size))) - return false; - for (unsigned int i = 0; i < length; i++) - (*this)[i] = CFF_UNDEF_CODE; - count = 0; - return true; - } - - bool identity (unsigned int size) - { - if (unlikely (!SUPER::resize (size))) - return false; - unsigned int i; - for (i = 0; i < length; i++) - (*this)[i] = i; - count = i; - return true; - } - - bool excludes (hb_codepoint_t id) const - { return (id < length) && ((*this)[id] == CFF_UNDEF_CODE); } - - bool includes (hb_codepoint_t id) const - { return !excludes (id); } - - unsigned int add (unsigned int i) - { - if ((*this)[i] == CFF_UNDEF_CODE) - (*this)[i] = count++; - return (*this)[i]; - } - - hb_codepoint_t get_count () const { return count; } - - protected: - hb_codepoint_t count; - - private: - typedef hb_vector_t SUPER; -}; - template struct FDArray : CFFIndexOf { @@ -504,7 +454,7 @@ struct FDArray : CFFIndexOf unsigned int offSize_, const hb_vector_t &fontDicts, unsigned int fdCount, - const remap_t &fdmap, + const hb_inc_bimap_t &fdmap, OP_SERIALIZER& opszr, const hb_vector_t &privateInfos) { @@ -519,7 +469,7 @@ struct FDArray : CFFIndexOf unsigned int offset = 1; unsigned int fid = 0; for (unsigned i = 0; i < fontDicts.length; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) { if (unlikely (fid >= fdCount)) return_trace (false); CFFIndexOf::set_offset_at (fid++, offset); @@ -529,10 +479,10 @@ struct FDArray : CFFIndexOf /* serialize font dicts */ for (unsigned int i = 0; i < fontDicts.length; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) { FontDict *dict = c->start_embed (); - if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]]))) + if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap.forward (i)]))) return_trace (false); } return_trace (true); @@ -543,12 +493,12 @@ struct FDArray : CFFIndexOf static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */, const hb_vector_t &fontDicts, unsigned int fdCount, - const remap_t &fdmap, + const hb_inc_bimap_t &fdmap, OP_SERIALIZER& opszr) { unsigned int dictsSize = 0; for (unsigned int i = 0; i < fontDicts.len; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr); offSize_ = calcOffSize (dictsSize); diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh index 31d9d879d..0dbd0bae2 100644 --- a/src/hb-ot-cff1-table.hh +++ b/src/hb-ot-cff1-table.hh @@ -594,10 +594,10 @@ struct Charset struct CFF1StringIndex : CFF1Index { bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings, - unsigned int offSize_, const remap_t &sidmap) + unsigned int offSize_, const hb_inc_bimap_t &sidmap) { TRACE_SERIALIZE (this); - if (unlikely ((strings.count == 0) || (sidmap.get_count () == 0))) + if (unlikely ((strings.count == 0) || (sidmap.get_population () == 0))) { if (unlikely (!c->extend_min (this->count))) return_trace (false); @@ -607,11 +607,11 @@ struct CFF1StringIndex : CFF1Index byte_str_array_t bytesArray; bytesArray.init (); - if (!bytesArray.resize (sidmap.get_count ())) + if (!bytesArray.resize (sidmap.get_population ())) return_trace (false); for (unsigned int i = 0; i < strings.count; i++) { - hb_codepoint_t j = sidmap[i]; + hb_codepoint_t j = sidmap.forward (i); if (j != CFF_UNDEF_CODE) bytesArray[j] = strings[i]; } @@ -622,19 +622,19 @@ struct CFF1StringIndex : CFF1Index } /* in parallel to above */ - unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const remap_t &sidmap) const + unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const hb_inc_bimap_t &sidmap) const { offSize_ = 0; - if ((count == 0) || (sidmap.get_count () == 0)) + if ((count == 0) || (sidmap.get_population () == 0)) return count.static_size; unsigned int dataSize = 0; for (unsigned int i = 0; i < count; i++) - if (sidmap[i] != CFF_UNDEF_CODE) + if (sidmap.forward (i) != CFF_UNDEF_CODE) dataSize += length_at (i); offSize_ = calcOffSize(dataSize); - return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_count (), dataSize); + return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_population (), dataSize); } }; diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc index 54f6dc2a7..1da5c4a14 100644 --- a/src/hb-subset-cff-common.cc +++ b/src/hb-subset-cff-common.cc @@ -54,7 +54,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, unsigned int &subset_fdselect_size /* OUT */, unsigned int &subset_fdselect_format /* OUT */, hb_vector_t &fdselect_ranges /* OUT */, - remap_t &fdmap /* OUT */) + hb_inc_bimap_t &fdmap /* OUT */) { subset_fd_count = 0; subset_fdselect_size = 0; @@ -102,23 +102,19 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, else { /* create a fdmap */ - if (!fdmap.reset (fdCount)) - { - hb_set_destroy (set); - return false; - } + fdmap.reset (); hb_codepoint_t fd = CFF_UNDEF_CODE; while (set->next (&fd)) fdmap.add (fd); hb_set_destroy (set); - if (unlikely (fdmap.get_count () != subset_fd_count)) + if (unlikely (fdmap.get_population () != subset_fd_count)) return false; } /* update each font dict index stored as "code" in fdselect_ranges */ for (unsigned int i = 0; i < fdselect_ranges.length; i++) - fdselect_ranges[i].code = fdmap[fdselect_ranges[i].code]; + fdselect_ranges[i].code = fdmap.forward (fdselect_ranges[i].code); } /* determine which FDSelect format is most compact */ diff --git a/src/hb-subset-cff-common.hh b/src/hb-subset-cff-common.hh index 921b0253d..5c9584107 100644 --- a/src/hb-subset-cff-common.hh +++ b/src/hb-subset-cff-common.hh @@ -541,39 +541,29 @@ struct subr_subset_param_t bool drop_hints; }; -struct subr_remap_t : remap_t +struct subr_remap_t : hb_inc_bimap_t { void create (hb_set_t *closure) { /* create a remapping of subroutine numbers from old to new. * no optimization based on usage counts. fonttools doesn't appear doing that either. */ - reset (closure->get_max () + 1); - for (hb_codepoint_t old_num = 0; old_num < length; old_num++) - { - if (hb_set_has (closure, old_num)) - add (old_num); - } + + hb_codepoint_t old_num = HB_SET_VALUE_INVALID; + while (hb_set_next (closure, &old_num)) + add (old_num); - if (get_count () < 1240) + if (get_population () < 1240) bias = 107; - else if (get_count () < 33900) + else if (get_population () < 33900) bias = 1131; else bias = 32768; } - hb_codepoint_t operator[] (unsigned int old_num) const - { - if (old_num >= length) - return CFF_UNDEF_CODE; - else - return remap_t::operator[] (old_num); - } - int biased_num (unsigned int old_num) const { - hb_codepoint_t new_num = (*this)[old_num]; + hb_codepoint_t new_num = forward (old_num); return (int)new_num - bias; } @@ -581,15 +571,15 @@ struct subr_remap_t : remap_t int bias; }; -struct subr_remap_ts +struct subr_remaps_t { - subr_remap_ts () + subr_remaps_t () { global_remap.init (); local_remaps.init (); } - ~subr_remap_ts () { fini (); } + ~subr_remaps_t () { fini (); } void init (unsigned int fdCount) { @@ -765,13 +755,13 @@ struct subr_subsetter_t bool encode_subrs (const parsed_cs_str_vec_t &subrs, const subr_remap_t& remap, unsigned int fd, str_buff_vec_t &buffArray) const { - unsigned int count = remap.get_count (); + unsigned int count = remap.get_population (); if (unlikely (!buffArray.resize (count))) return false; for (unsigned int old_num = 0; old_num < subrs.length; old_num++) { - hb_codepoint_t new_num = remap[old_num]; + hb_codepoint_t new_num = remap.forward (old_num); if (new_num != CFF_UNDEF_CODE) { if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num]))) @@ -1005,7 +995,7 @@ struct subr_subsetter_t parsed_cs_str_vec_t parsed_global_subrs; hb_vector_t parsed_local_subrs; - subr_remap_ts remaps; + subr_remaps_t remaps; private: typedef typename SUBRS::count_type subr_count_type; @@ -1021,7 +1011,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, unsigned int &subset_fdselect_size /* OUT */, unsigned int &subset_fdselect_format /* OUT */, hb_vector_t &fdselect_ranges /* OUT */, - CFF::remap_t &fdmap /* OUT */); + hb_inc_bimap_t &fdmap /* OUT */); HB_INTERNAL bool hb_serialize_cff_fdselect (hb_serialize_context_t *c, diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index ab46808d2..8c0447d2b 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -31,6 +31,7 @@ #include "hb-open-type.hh" #include "hb-ot-cff1-table.hh" #include "hb-set.h" +#include "hb-bimap.hh" #include "hb-subset-cff1.hh" #include "hb-subset-plan.hh" #include "hb-subset-cff-common.hh" @@ -38,12 +39,12 @@ using namespace CFF; -struct remap_sid_t : remap_t +struct remap_sid_t : hb_inc_bimap_t { unsigned int add (unsigned int sid) { if ((sid != CFF_UNDEF_SID) && !is_std_std (sid)) - return offset_sid (remap_t::add (unoffset_sid (sid))); + return offset_sid (hb_inc_bimap_t::add (unoffset_sid (sid))); else return sid; } @@ -53,7 +54,7 @@ struct remap_sid_t : remap_t if (is_std_std (sid) || (sid == CFF_UNDEF_SID)) return sid; else - return offset_sid (remap_t::operator [] (unoffset_sid (sid))); + return offset_sid (forward (unoffset_sid (sid))); } static const unsigned int num_std_strings = 391; @@ -581,8 +582,7 @@ struct cff_subset_plan { bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc) { - if (unlikely (!sidmap.reset (acc.stringIndex->count))) - return false; + sidmap.reset (); for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++) { @@ -596,7 +596,7 @@ struct cff_subset_plan { if (acc.fdArray != &Null(CFF1FDArray)) for (unsigned int i = 0; i < orig_fdcount; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) (void)sidmap.add (acc.fontDicts[i].fontName); return true; @@ -682,7 +682,7 @@ struct cff_subset_plan { /* SIDs for name strings in dicts are added before glyph names so they fit in 16-bit int range */ if (unlikely (!collect_sids_in_dicts (acc))) return false; - if (unlikely (sidmap.get_count () > 0x8000)) /* assumption: a dict won't reference that many strings */ + if (unlikely (sidmap.get_population () > 0x8000)) /* assumption: a dict won't reference that many strings */ return false; if (subset_charset) offsets.charsetInfo.size = plan_subset_charset (acc, plan); @@ -739,7 +739,7 @@ struct cff_subset_plan { { subset_localsubrs[fd].init (); offsets.localSubrsInfos[fd].init (); - if (fdmap.includes (fd)) + if (fdmap.has (fd)) { if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd])) return false; @@ -790,7 +790,7 @@ struct cff_subset_plan { cff1_font_dict_op_serializer_t fontSzr; unsigned int dictsSize = 0; for (unsigned int i = 0; i < acc.fontDicts.length; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr); offsets.FDArrayInfo.offSize = calcOffSize (dictsSize); @@ -813,7 +813,7 @@ struct cff_subset_plan { offsets.privateDictInfo.offset = final_size; for (unsigned int i = 0; i < orig_fdcount; i++) { - if (fdmap.includes (i)) + if (fdmap.has (i)) { bool has_localsubrs = offsets.localSubrsInfos[i].size > 0; cff_private_dict_op_serializer_t privSzr (desubroutinize, plan->drop_hints); @@ -857,7 +857,7 @@ struct cff_subset_plan { /* font dict index remap table from fullset FDArray to subset FDArray. * set to CFF_UNDEF_CODE if excluded from subset */ - remap_t fdmap; + hb_inc_bimap_t fdmap; str_buff_vec_t subset_charstrings; str_buff_vec_t subset_globalsubrs; @@ -1034,11 +1034,11 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, assert (plan.offsets.privateDictInfo.offset == (unsigned) (c.head - c.start)); for (unsigned int i = 0; i < acc.privateDicts.length; i++) { - if (plan.fdmap.includes (i)) + if (plan.fdmap.has (i)) { PrivateDict *pd = c.start_embed (); if (unlikely (pd == nullptr)) return false; - unsigned int priv_size = plan.fontdicts_mod[plan.fdmap[i]].privateDictInfo.size; + unsigned int priv_size = plan.fontdicts_mod[plan.fdmap.forward (i)].privateDictInfo.size; bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index afb23ae3c..5e36c7fd3 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -330,18 +330,15 @@ struct cff2_subset_plan { { subset_localsubrs[fd].init (); offsets.localSubrsInfos[fd].init (); - if (fdmap.includes (fd)) - { - if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd])) - return false; + if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd])) + return false; - unsigned int dataSize = subset_localsubrs[fd].total_size (); - if (dataSize > 0) - { - offsets.localSubrsInfos[fd].offset = final_size; - offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize); - offsets.localSubrsInfos[fd].size = CFF2Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize); - } + unsigned int dataSize = subset_localsubrs[fd].total_size (); + if (dataSize > 0) + { + offsets.localSubrsInfos[fd].offset = final_size; + offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize); + offsets.localSubrsInfos[fd].size = CFF2Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize); } } } @@ -382,7 +379,7 @@ struct cff2_subset_plan { cff_font_dict_op_serializer_t fontSzr; unsigned int dictsSize = 0; for (unsigned int i = 0; i < acc.fontDicts.length; i++) - if (fdmap.includes (i)) + if (fdmap.has (i)) dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr); offsets.FDArrayInfo.offSize = calcOffSize (dictsSize); @@ -401,7 +398,7 @@ struct cff2_subset_plan { offsets.privateDictsOffset = final_size; for (unsigned int i = 0; i < orig_fdcount; i++) { - if (fdmap.includes (i)) + if (fdmap.has (i)) { bool has_localsubrs = offsets.localSubrsInfos[i].size > 0; cff_private_dict_op_serializer_t privSzr (desubroutinize, drop_hints); @@ -431,7 +428,7 @@ struct cff2_subset_plan { unsigned int subset_fdselect_format; hb_vector_t subset_fdselect_ranges; - remap_t fdmap; + hb_inc_bimap_t fdmap; str_buff_vec_t subset_charstrings; str_buff_vec_t subset_globalsubrs; @@ -541,11 +538,11 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, assert (plan.offsets.privateDictsOffset == (unsigned) (c.head - c.start)); for (unsigned int i = 0; i < acc.privateDicts.length; i++) { - if (plan.fdmap.includes (i)) + if (plan.fdmap.has (i)) { PrivateDict *pd = c.start_embed (); if (unlikely (pd == nullptr)) return false; - unsigned int priv_size = plan.privateDictInfos[plan.fdmap[i]].size; + unsigned int priv_size = plan.privateDictInfos[plan.fdmap.forward (i)].size; bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ From f3ee2bd020f8ca313fae783cc49a374f1377e877 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Thu, 20 Jun 2019 14:33:09 -0700 Subject: [PATCH 554/617] add ops & methods to hb_bimap_t making it more like hb_map_t moved has () to hb_bimap_t from hb_inc_bimap_t moved identity () to hb_inc_bimap_t removed forward() --- src/hb-bimap.hh | 38 +++++++++++++++++++++++-------------- src/hb-ot-cff-common.hh | 2 +- src/hb-ot-cff1-table.hh | 4 ++-- src/hb-subset-cff-common.cc | 2 +- src/hb-subset-cff-common.hh | 4 ++-- src/hb-subset-cff1.cc | 4 ++-- src/hb-subset-cff2.cc | 2 +- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/hb-bimap.hh b/src/hb-bimap.hh index 9dbe0dfb5..cd7729c2a 100644 --- a/src/hb-bimap.hh +++ b/src/hb-bimap.hh @@ -47,9 +47,13 @@ struct hb_bimap_t back_map.fini (); } - /* returns HB_MAP_VALUE_INVALID if unmapped */ - hb_codepoint_t forward (hb_codepoint_t lhs) const { return forw_map[lhs]; } - hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; } + void reset () + { + forw_map.reset (); + back_map.reset (); + } + + bool in_error () const { return forw_map.in_error () || back_map.in_error (); } void set (hb_codepoint_t lhs, hb_codepoint_t rhs) { @@ -57,12 +61,16 @@ struct hb_bimap_t back_map.set (rhs, lhs); } - /* Create an identity map. */ - bool identity (unsigned int size) + hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); } + hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; } + + hb_codepoint_t operator [] (hb_codepoint_t lhs) const { return get (lhs); } + bool has (hb_codepoint_t lhs, hb_codepoint_t *vp = nullptr) const { return forw_map.has (lhs, vp); } + + void del (hb_codepoint_t lhs) { - clear (); - for (hb_codepoint_t i = 0; i < size; i++) set (i, i); - return forw_map.successful && back_map.successful; + back_map.del (get (lhs)); + forw_map.del (lhs); } void clear () @@ -71,11 +79,7 @@ struct hb_bimap_t back_map.clear (); } - void reset () - { - forw_map.reset (); - back_map.reset (); - } + bool is_empty () const { return get_population () == 0; } unsigned int get_population () const { return forw_map.get_population (); } @@ -101,7 +105,13 @@ struct hb_inc_bimap_t : hb_bimap_t return rhs; } - bool has (hb_codepoint_t lhs) const { return forw_map.has (lhs); } + /* Create an identity map. */ + bool identity (unsigned int size) + { + clear (); + for (hb_codepoint_t i = 0; i < size; i++) set (i, i); + return !in_error (); + } protected: static int cmp_id (const void* a, const void* b) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index 2de5a2995..8b8e59201 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -482,7 +482,7 @@ struct FDArray : CFFIndexOf if (fdmap.has (i)) { FontDict *dict = c->start_embed (); - if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap.forward (i)]))) + if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]]))) return_trace (false); } return_trace (true); diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh index 0dbd0bae2..4050b7d6f 100644 --- a/src/hb-ot-cff1-table.hh +++ b/src/hb-ot-cff1-table.hh @@ -611,7 +611,7 @@ struct CFF1StringIndex : CFF1Index return_trace (false); for (unsigned int i = 0; i < strings.count; i++) { - hb_codepoint_t j = sidmap.forward (i); + hb_codepoint_t j = sidmap[i]; if (j != CFF_UNDEF_CODE) bytesArray[j] = strings[i]; } @@ -630,7 +630,7 @@ struct CFF1StringIndex : CFF1Index unsigned int dataSize = 0; for (unsigned int i = 0; i < count; i++) - if (sidmap.forward (i) != CFF_UNDEF_CODE) + if (sidmap[i] != CFF_UNDEF_CODE) dataSize += length_at (i); offSize_ = calcOffSize(dataSize); diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc index 1da5c4a14..b71ac57cc 100644 --- a/src/hb-subset-cff-common.cc +++ b/src/hb-subset-cff-common.cc @@ -114,7 +114,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, /* update each font dict index stored as "code" in fdselect_ranges */ for (unsigned int i = 0; i < fdselect_ranges.length; i++) - fdselect_ranges[i].code = fdmap.forward (fdselect_ranges[i].code); + fdselect_ranges[i].code = fdmap[fdselect_ranges[i].code]; } /* determine which FDSelect format is most compact */ diff --git a/src/hb-subset-cff-common.hh b/src/hb-subset-cff-common.hh index 5c9584107..6c36e458f 100644 --- a/src/hb-subset-cff-common.hh +++ b/src/hb-subset-cff-common.hh @@ -563,7 +563,7 @@ struct subr_remap_t : hb_inc_bimap_t int biased_num (unsigned int old_num) const { - hb_codepoint_t new_num = forward (old_num); + hb_codepoint_t new_num = get (old_num); return (int)new_num - bias; } @@ -761,7 +761,7 @@ struct subr_subsetter_t return false; for (unsigned int old_num = 0; old_num < subrs.length; old_num++) { - hb_codepoint_t new_num = remap.forward (old_num); + hb_codepoint_t new_num = remap[old_num]; if (new_num != CFF_UNDEF_CODE) { if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num]))) diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index 8c0447d2b..21bd97fbb 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -54,7 +54,7 @@ struct remap_sid_t : hb_inc_bimap_t if (is_std_std (sid) || (sid == CFF_UNDEF_SID)) return sid; else - return offset_sid (forward (unoffset_sid (sid))); + return offset_sid (get (unoffset_sid (sid))); } static const unsigned int num_std_strings = 391; @@ -1038,7 +1038,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, { PrivateDict *pd = c.start_embed (); if (unlikely (pd == nullptr)) return false; - unsigned int priv_size = plan.fontdicts_mod[plan.fdmap.forward (i)].privateDictInfo.size; + unsigned int priv_size = plan.fontdicts_mod[plan.fdmap[i]].privateDictInfo.size; bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 5e36c7fd3..e89ca6951 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -542,7 +542,7 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, { PrivateDict *pd = c.start_embed (); if (unlikely (pd == nullptr)) return false; - unsigned int priv_size = plan.privateDictInfos[plan.fdmap.forward (i)].size; + unsigned int priv_size = plan.privateDictInfos[plan.fdmap[i]].size; bool result; cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ From 10bd6b8d913a57260b35c1ef830db37c06eebd18 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Thu, 20 Jun 2019 16:22:08 -0700 Subject: [PATCH 555/617] minor --- src/hb-bimap.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-bimap.hh b/src/hb-bimap.hh index cd7729c2a..29291506a 100644 --- a/src/hb-bimap.hh +++ b/src/hb-bimap.hh @@ -62,7 +62,7 @@ struct hb_bimap_t } hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); } - hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; } + hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map.get (rhs); } hb_codepoint_t operator [] (hb_codepoint_t lhs) const { return get (lhs); } bool has (hb_codepoint_t lhs, hb_codepoint_t *vp = nullptr) const { return forw_map.has (lhs, vp); } From f4ea1a9afb4849e7cfb7a5eb9e81e4f656c3f89e Mon Sep 17 00:00:00 2001 From: David Corbett Date: Tue, 25 Jun 2019 21:08:14 -0400 Subject: [PATCH 556/617] [ucd] Include scripts added in Unicode 10 or later --- src/gen-ucd-table.py | 2 +- src/hb-ucd-table.hh | 988 +++++++++++++++++++++++-------------------- 2 files changed, 520 insertions(+), 470 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index f443ac1cf..1afde3bdf 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -66,7 +66,7 @@ for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', sc_order = packTab.AutoMapping() sc_array = [] -sc_re = re.compile(" (HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") +sc_re = re.compile(r"\b(HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") for line in open('hb-common.h'): m = sc_re.search (line) if not m: continue diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index 4a5e30c64..8b7d648a9 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -13,7 +13,7 @@ #include "hb.hh" static const hb_script_t -_hb_ucd_sc_map[138] = +_hb_ucd_sc_map[153] = { HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED, HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC, @@ -84,6 +84,14 @@ _hb_ucd_sc_map[138] = HB_SCRIPT_ADLAM, HB_SCRIPT_BHAIKSUKI, HB_SCRIPT_MARCHEN, HB_SCRIPT_OSAGE, HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA, + HB_SCRIPT_MASARAM_GONDI, HB_SCRIPT_NUSHU, + HB_SCRIPT_SOYOMBO, HB_SCRIPT_ZANABAZAR_SQUARE, + HB_SCRIPT_DOGRA, HB_SCRIPT_GUNJALA_GONDI, + HB_SCRIPT_HANIFI_ROHINGYA, HB_SCRIPT_MAKASAR, + HB_SCRIPT_MEDEFAIDRIN, HB_SCRIPT_OLD_SOGDIAN, + HB_SCRIPT_SOGDIAN, HB_SCRIPT_ELYMAIC, + HB_SCRIPT_NANDINAGARI, HB_SCRIPT_NYIAKENG_PUACHUE_HMONG, + HB_SCRIPT_WANCHO, }; static const uint16_t _hb_ucd_dm1_p0_map[825] = @@ -1055,7 +1063,7 @@ _hb_ucd_dm2_u64_map[387] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[31814] = +_hb_ucd_u8[32102] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, @@ -2666,11 +2674,17 @@ _hb_ucd_u8[31814] = 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130, 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,130,130,130, 2, - 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 94, 94, 94, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144,144,144, + 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, + 144,144,144,144, 2, 2, 2, 2, 2, 2, 2, 2,144,144,144,144, + 144,144,144,144,144,144, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,147,147,147,147, + 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147, + 147,147,147,147, 2, 2, 2, 2, 2, 2, 2, 2,148,148,148,148, + 148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148, + 148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,149,149,149,149, + 149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149, + 149,149,149, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, @@ -2723,14 +2737,17 @@ _hb_ucd_u8[31814] = 102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126, 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, 126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,126,126, - 126,126,126,126,126,126,126,126, 2, 2, 2, 2, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2,125,125,125,125, + 126,126,126,126,126,126,126,126, 2, 2, 2, 2,142,142,142,142, + 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, + 142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125,125,125, 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125, 5, 5, 5, 5, - 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, - 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,150,150,150,150, + 150,150,150,150, 2, 2,150,150,150,150,150,150,150,150,150,150, + 150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150, + 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,141,141,141,141, + 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, + 141,141,141,141, 2, 2, 2, 2, 2, 2, 2, 2,140,140,140,140, + 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,121,121,121,121, 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, 121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133, @@ -2742,16 +2759,19 @@ _hb_ucd_u8[31814] = 134,134,134,134,134,134,134,134,134,134,134,134, 2, 2,134,134, 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, 134,134,134,134, 2,134,134,134,134,134,134,134,134,134,134,134, - 134,134,134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, - 8, 8, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 2, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, - 9, 9, 2, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, - 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 134,134,134, 2, 2, 2, 2, 2, 2, 2, 2, 2,138,138,138,138, + 138,138,138, 2,138,138, 2,138,138,138,138,138,138,138,138,138, + 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138, + 138,138,138, 2, 2, 2,138, 2,138,138, 2,138,138,138,138,138, + 138,138,138,138, 2, 2, 2, 2, 2, 2, 2, 2,138,138,138,138, + 138,138,138,138,138,138, 2, 2, 2, 2, 2, 2,143,143,143,143, + 143,143, 2,143,143, 2,143,143,143,143,143,143,143,143,143,143, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, + 143,143,143,143,143,143,143,143,143,143,143, 2,143,143, 2,143, + 143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143,143,143, + 143,143,143,143,143,143, 2, 2, 2, 2, 2, 2,145,145,145,145, + 145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145, + 145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, @@ -2775,12 +2795,12 @@ _hb_ucd_u8[31814] = 119,119, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119, 119,119,119,119,119,119, 2,119,119,119,119,119,119,119, 2,119, 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, - 119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, + 119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146,146,146, + 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, + 146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, 0, 0, + 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136,136, 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, 136,136,136,136, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136, 2, @@ -2788,7 +2808,9 @@ _hb_ucd_u8[31814] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2,105,105,105,105, + 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2,139,139,139,139, + 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, + 139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105,105,105, 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,105,105, 105,105,105,105,105,105,105,105,105, 2, 2, 2,105,105,105,105, @@ -2818,10 +2840,13 @@ _hb_ucd_u8[31814] = 131,131,131,131,131,131,131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, - 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 14,113,113,113,113, + 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151,151,151, + 151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151, + 151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151,151,151, + 151,151,151,151,151,151,151,151,151,151, 2, 2,151,151,151,151, + 151,151,151,151,151,151, 2, 2, 2, 2,151,151,152,152,152,152, + 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, + 152,152,152,152,152,152, 2, 2, 2, 2, 2,152,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113, 2, 2,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113, 2, 2, 2, 2, 2, 2, 2, 2, 2,132,132,132,132, @@ -2844,6 +2869,7 @@ _hb_ucd_u8[31814] = 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, @@ -3331,102 +3357,102 @@ _hb_ucd_u16[11168] = 403, 404, 405, 406, 407, 407, 408, 408, 409, 409, 45, 45, 410, 410, 411, 412, 413, 413, 413, 414, 415, 416, 417, 418, 419, 420, 421, 45, 45, 45, 45, 45, 422, 422, 422, 422, 423, 45, 45, 45, 424, 424, 424, 425, 424, 424, 424, 426, - 0, 0, 427, 285, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 27, 428, 45, 45, 45, 45, 45, 45, 45, 45, - 8, 8, 429, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 27, 430, - 431, 431, 431, 431, 432, 433, 431, 434, 435, 435, 435, 435, 436, 437, 438, 439, - 440, 440, 440, 441, 442, 443, 443, 444, 445, 445, 445, 445, 446, 445, 447, 448, - 449, 450, 449, 451, 45, 45, 45, 45, 452, 453, 454, 455, 455, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 45, 45, 45, 45, 45, 45, 45, 45, - 466, 466, 466, 466, 466, 467, 45, 45, 468, 468, 468, 468, 469, 470, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 471, 471, 471, 472, 471, 473, 45, 45, - 474, 474, 474, 474, 475, 476, 477, 45, 478, 478, 478, 479, 480, 45, 45, 45, - 481, 482, 483, 481, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 17, 17, 17, 484, 45, 45, 45, 45, 45, 45, 485, 485, 485, 485, 485, 486, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 487, 488, 488, 487, 489, 45, - 14, 14, 14, 14, 490, 49, 49, 49, 49, 49, 491, 45, 492, 492, 492, 493, + 427, 427, 428, 429, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 27, 430, 45, 45, 45, 45, 45, 45, 45, 45, + 431, 431, 432, 433, 433, 434, 45, 45, 45, 45, 45, 45, 45, 45, 435, 436, + 437, 437, 437, 437, 438, 439, 437, 440, 441, 441, 441, 441, 442, 443, 444, 445, + 446, 446, 446, 447, 448, 449, 449, 450, 451, 451, 451, 451, 452, 451, 453, 454, + 455, 456, 455, 457, 45, 45, 45, 45, 458, 459, 460, 461, 461, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 45, 45, 45, 45, 45, 45, 45, 45, + 472, 472, 472, 472, 472, 473, 45, 45, 474, 474, 474, 474, 475, 476, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 477, 477, 477, 478, 477, 479, 45, 45, + 480, 480, 480, 480, 481, 482, 483, 45, 484, 484, 484, 485, 486, 45, 45, 45, + 487, 488, 489, 487, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 490, 490, 490, 491, 45, 45, 45, 45, 45, 45, 492, 492, 492, 492, 492, 493, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 494, 495, 495, 494, 496, 45, + 497, 497, 497, 497, 498, 499, 499, 499, 499, 499, 500, 45, 501, 501, 501, 502, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 494, 495, 495, 496, 497, 495, 498, 499, 499, 500, 501, 502, 45, 45, 45, 45, - 503, 139, 139, 504, 505, 506, 507, 11, 349, 508, 509, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 510, 511, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 512, 512, 512, 513, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 515, 45, 45, 45, 45, 45, 45, - 514, 514, 514, 514, 514, 514, 516, 517, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 518, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 520, 521, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 503, 504, 504, 505, 506, 504, 507, 508, 508, 509, 510, 511, 45, 45, 45, 45, + 512, 513, 513, 514, 515, 516, 517, 518, 519, 520, 521, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 522, 523, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 524, 524, 524, 525, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 527, 45, 45, 45, 45, 45, 45, + 526, 526, 526, 526, 526, 526, 528, 529, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 532, 533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, - 522, 522, 522, 522, 523, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 535, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 524, 525, 526, 527, 45, 45, 45, 45, 45, 45, 528, 529, 530, - 531, 531, 531, 531, 532, 533, 534, 535, 531, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 536, 536, 536, 536, 536, 537, 45, 45, 45, 45, 45, 45, - 538, 538, 538, 538, 539, 538, 538, 538, 540, 538, 45, 45, 45, 45, 541, 45, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 543, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 544, + 277, 277, 277, 536, 537, 538, 539, 45, 45, 45, 45, 45, 45, 540, 541, 542, + 543, 543, 543, 543, 544, 545, 546, 547, 543, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 548, 548, 548, 548, 548, 549, 45, 45, 45, 45, 45, 45, + 550, 550, 550, 550, 551, 550, 550, 550, 552, 550, 45, 45, 45, 45, 553, 45, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 555, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 545, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 546, 45, 45, 45, 547, 548, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 317, + 557, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 558, 45, 45, 45, 559, 560, 561, 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 549, 549, 549, 549, 549, 549, 550, 551, 552, 553, 267, 45, 45, 45, 45, 45, + 563, 563, 563, 563, 563, 563, 564, 565, 566, 567, 267, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 555, 0, 0, 0, 556, 557, 558, 0, 559, 0, 0, 0, 560, 45, - 11, 11, 11, 11, 561, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 267, - 0, 0, 0, 0, 0, 234, 0, 560, 45, 45, 45, 45, 45, 45, 45, 45, - 0, 0, 0, 0, 0, 225, 0, 0, 0, 562, 563, 564, 565, 0, 0, 0, - 566, 567, 0, 568, 569, 570, 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, 568, + 0, 0, 569, 0, 0, 0, 570, 571, 572, 0, 573, 0, 0, 0, 574, 45, + 11, 11, 11, 11, 575, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 267, + 0, 0, 0, 0, 0, 234, 0, 574, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 225, 0, 0, 0, 576, 577, 578, 579, 0, 0, 0, + 580, 581, 0, 582, 583, 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 573, 574, 575, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, + 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, 587, 588, 589, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 576, 577, 578, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 248, 248, 579, 318, 580, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 21, 21, 21, 581, + 590, 591, 592, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 593, 593, 594, 595, 596, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 597, 597, 597, 598, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 584, 45, 45, - 585, 585, 585, 585, 586, 587, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 334, 0, 0, 0, 588, 45, 45, 45, 45, - 334, 0, 0, 589, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 590, 27, 591, 592, 593, 594, 595, 596, 597, 598, 599, 598, 45, 45, 45, 324, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 600, 601, 45, 45, + 602, 602, 602, 602, 603, 604, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 334, 0, 0, 0, 605, 45, 45, 45, 45, + 334, 0, 0, 606, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 607, 27, 608, 609, 610, 611, 612, 613, 614, 615, 616, 615, 45, 45, 45, 324, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 0, 0, 252, 0, 0, 0, 0, 0, 0, 267, 227, 334, 334, 334, 0, 554, - 600, 0, 0, 0, 0, 0, 600, 0, 0, 0, 600, 45, 45, 45, 601, 0, - 602, 0, 0, 252, 560, 603, 554, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 267, 227, 334, 334, 334, 0, 568, + 617, 0, 0, 0, 0, 0, 617, 0, 0, 0, 617, 45, 45, 45, 618, 0, + 619, 0, 0, 252, 574, 620, 568, 45, 45, 45, 45, 45, 45, 45, 45, 45, 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, 554, 600, 235, - 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 560, 252, 45, - 252, 0, 0, 0, 427, 285, 0, 0, 427, 0, 589, 45, 45, 45, 45, 45, - 604, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 607, 0, 0, 0, - 0, 0, 0, 0, 0, 267, 589, 608, 609, 554, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 617, 235, + 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 574, 252, 45, + 252, 0, 0, 0, 621, 285, 0, 0, 621, 0, 606, 45, 45, 45, 45, 45, + 622, 0, 0, 0, 0, 0, 0, 623, 0, 0, 624, 0, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 267, 606, 626, 627, 568, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 610, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 628, 45, 45, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 611, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 629, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 612, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 630, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 613, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 631, 45, 248, 318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 614, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 632, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 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, 0, 0, 0, 0, @@ -3795,14 +3821,14 @@ _hb_ucd_sc (unsigned u) static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[28764+(u>>6)])<<6)+((u)&63u))]:0; + return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[29052+(u>>6)])<<6)+((u)&63u))]:0; } #elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t -_hb_ucd_u8[16998] = +_hb_ucd_u8[17198] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15, @@ -4465,21 +4491,21 @@ _hb_ucd_u8[16998] = 97, 97,172,173,174,175,176,176,176,176,176,176,176,176,176,176, 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, 176,176,176,176,176,177,176,176,176,176,176,178, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97,179,180,181, 32, 32,182, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,183,184, - 97, 97, 97, 97, 97, 97, 59,185,186,187,188,189,190, 97,191,192, - 193, 59, 59,194, 59,195,196,196,196,196,196,197, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97,198, 97,199, 97, 97,200, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97,201,202,203, 97, 97, 97, 97, 97,204,205, - 206, 97,207,208, 97, 97,209,210,211,212,213, 97, 59, 59, 59, 59, - 59, 59, 59,214,215,216,217,218,219,220,221,222, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,179,180,181,182,182,183, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,184,185, + 97, 97, 97, 97, 97, 97, 59,186,187,188,189,190,191, 97,192,193, + 194, 59, 59,195, 59,196,197,197,197,197,197,198, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,199, 97,200, 97, 97,201, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,202,203,204, 97, 97, 97, 97, 97,205,206, + 207, 97,208,209, 97, 97,210,211,212,213,214, 97, 59, 59, 59, 59, + 59, 59, 59,215,216,217,218,219,220,221,222,223, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,223, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70,224, 70,225, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,224, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,225, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70,227, 97, 97, - 97, 97, 97, 97, 97, 97, 70, 70, 70, 70,228, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97,229, 97,230,231, 0, 1, 2, 2, 0, 1, + 70, 70, 70,227, 70, 70, 70, 70, 70, 70, 70, 70, 70,228, 97, 97, + 97, 97, 97, 97, 97, 97, 70, 70, 70, 70,229, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,230, 97,231,232, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, @@ -4709,49 +4735,58 @@ _hb_ucd_u8[16998] = 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, - 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 3, 3, - 3, 3, 3, 3, 3, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, - 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, - 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, - 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, - 100,100,100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, - 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, - 108,108,108,108,108, 2,129,129,129,129,129,129,129, 2,129, 2, - 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, - 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, - 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, - 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, - 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, - 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, - 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, - 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, - 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, - 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, - 2,137, 2,137,137,137,124,124,124,124,124,124,124,124,124,124, - 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, - 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102, 2, - 2, 2, 2, 2, 2, 2,102,102, 2, 2, 2, 2, 2, 2,126,126, - 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, - 126,126, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,125,125, + 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, + 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 2,147,147,147,147,147,147,147,147,148,148, + 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,149,149, + 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, + 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 2,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111, 2,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, + 2,108,108,108,108,108,108,108,108,108,108,108,108, 2,129,129, + 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, + 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, + 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, + 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, + 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, + 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, + 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, + 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, + 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, + 137,137,137,137,137,137,137,137, 2,137, 2,137,137,137,124,124, + 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114, + 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102, + 102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2, 2,102,102, + 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, + 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,142,142, + 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125, 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2,125, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 2, 7, 7, 7, 2, 2, 2, 2, 2,121,121, - 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133, - 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, - 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, - 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, - 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, - 134,134,134,134,134, 2, 8, 8, 8, 8, 8, 8, 8, 2, 8, 8, - 2, 8, 8, 8, 8, 8, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, - 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 2, 2, 2, 2,125,150,150,150,150,150,150,150,150, 2, 2, + 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, + 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, + 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, + 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, + 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, + 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134, + 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138, + 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138, + 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138, + 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, + 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, + 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, + 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, @@ -4762,28 +4797,31 @@ _hb_ucd_u8[16998] = 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,103,103, 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, - 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, - 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, - 0, 0, 2, 2, 2, 2,136,136,136,136,136,136,136,136,136,136, - 136, 2, 2, 2, 2, 2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,105,105, - 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, - 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, - 2, 2,105,105,105,105, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, - 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, - 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 56, 2, - 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, - 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, - 2, 2, 2, 2, 13, 13, 14, 14, 2, 2, 2, 2, 2, 14,113,113, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, + 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, + 2, 2, 2, 2, 2, 99,136,139, 0, 0, 2, 2, 2, 2,136,136, + 136,136,136,136,136,136,136,136,136, 2, 2, 2, 2, 2, 17, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139, + 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, + 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, + 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, + 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, + 131,131,131,131,131,131, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, + 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151, + 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151, + 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,152,152, + 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,113,113, 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 0, 0, @@ -4795,30 +4833,31 @@ _hb_ucd_u8[16998] = 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 13, 13, - 13, 13, 13, 13, 13, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 16, 50, 84,118, 88, 89, 90, 85, 85, 85, + 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 2, 2, 2, 13, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 16, 50, + 84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91, 85, 85, + 220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 91, 85, 85,220, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, - 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, + 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 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, 43, 44, 0, 45, 0, 0, 0, 0, - 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, - 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, - 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 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, 0, 0, 0, 0, 0, 0, 0, + 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, + 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, + 66, 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, 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, 0, 0, 0, 0, 0, @@ -4828,48 +4867,47 @@ _hb_ucd_u8[16998] = 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, 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, 0, 0, 0, 0, 67, 68, + 0, 69, 70, 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, - 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0, + 109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0, + 116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105, - 106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0, - 114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122, - 123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129, + 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145, + 146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158, + 159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0, + 164, 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, 0, 0, + 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 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, 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, 0, 0,128,129,130,131,132,133,134,135,136,137, - 138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153, - 154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162, - 163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,168,169, 0, 0, 0, 0,170,171, 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, 0, 0,165, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172,173, + 174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189, + 190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,167, 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, 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,168,169, 0, 0, 0, - 0,170,171, 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, - 0, 0, 0, 0, 0, 0,172,173,174,175,176,177,178,179,180,181, - 182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, - 198,199,200,201,202,203,204,205, 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, 1, 2, 3, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[8928] = +_hb_ucd_u16[8944] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -5122,105 +5160,106 @@ _hb_ucd_u16[8928] = 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26, 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458, - 0, 0, 0, 0, 0, 26, 0, 316, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 459, - 9, 9, 9, 9, 9, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 459, 26, - 460, 460, 460, 460, 460, 460, 460, 460, 460, 461, 462, 460, 460, 460, 26, 463, - 464, 464, 464, 464, 464, 464, 464, 464, 465, 466, 467, 467, 467, 468, 467, 469, - 470, 470, 470, 470, 470, 470, 471, 470, 472, 26, 473, 473, 473, 473, 474, 26, - 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 475, 475, 477, 140, 478, 26, - 479, 479, 480, 479, 479, 479, 479, 481, 26, 26, 26, 26, 26, 26, 26, 26, - 482, 483, 484, 485, 484, 486, 487, 487, 487, 487, 487, 487, 487, 488, 487, 489, - 490, 491, 492, 493, 493, 494, 495, 496, 491, 497, 498, 499, 500, 501, 501, 26, - 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 503, 26, 26, 26, 26, - 504, 504, 504, 504, 504, 504, 504, 504, 504, 26, 504, 505, 26, 26, 26, 26, - 506, 506, 506, 506, 506, 506, 507, 506, 506, 506, 506, 507, 26, 26, 26, 26, - 508, 508, 508, 508, 508, 508, 508, 508, 509, 26, 508, 510, 201, 511, 26, 26, - 512, 512, 512, 512, 512, 512, 512, 513, 512, 514, 26, 26, 26, 26, 26, 26, - 515, 515, 515, 516, 515, 517, 515, 515, 26, 26, 26, 26, 26, 26, 26, 26, - 21, 21, 21, 21, 21, 21, 21, 518, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 520, 521, - 26, 26, 26, 26, 60, 522, 60, 60, 60, 60, 60, 522, 523, 26, 26, 26, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 26, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 524, 26, 26, 26, 525, 525, 525, 525, 525, 525, 525, 526, - 527, 528, 527, 527, 527, 527, 529, 527, 530, 26, 527, 527, 527, 531, 532, 532, - 532, 532, 533, 532, 532, 534, 535, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 536, 537, 167, 167, 167, 167, 536, 538, 167, 26, 167, 539, 540, 541, 14, 14, - 14, 257, 15, 375, 14, 542, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 84, 84, 84, 89, - 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 543, 544, - 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, - 545, 545, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 547, 548, 26, - 545, 545, 545, 545, 545, 545, 545, 545, 549, 26, 26, 26, 26, 26, 26, 26, - 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 550, 551, 550, 552, 26, 26, 26, 26, 26, 26, 26, 26, - 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 553, 553, 553, 553, 553, 553, 553, 554, 26, 26, 26, 26, 26, 26, 26, + 459, 459, 459, 459, 459, 26, 459, 460, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 461, + 462, 462, 462, 462, 462, 26, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 465, 465, 466, 26, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467, 26, 470, + 471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476, + 477, 477, 477, 477, 477, 477, 478, 477, 479, 26, 480, 480, 480, 480, 481, 26, + 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485, 26, + 486, 486, 487, 486, 486, 486, 486, 488, 26, 26, 26, 26, 26, 26, 26, 26, + 489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496, + 497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508, 26, + 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 26, 26, 26, 26, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 26, 511, 512, 26, 26, 26, 26, + 513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514, 26, 26, 26, 26, + 515, 515, 515, 515, 515, 515, 515, 515, 516, 26, 515, 517, 201, 518, 26, 26, + 519, 519, 519, 519, 519, 519, 519, 520, 519, 521, 26, 26, 26, 26, 26, 26, + 522, 522, 522, 523, 522, 524, 522, 522, 26, 26, 26, 26, 26, 26, 26, 26, + 525, 525, 525, 525, 525, 525, 525, 526, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529, + 26, 26, 26, 26, 530, 531, 530, 530, 530, 530, 530, 531, 532, 26, 26, 26, + 533, 533, 533, 533, 533, 533, 533, 533, 533, 26, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 535, 26, 26, 26, 536, 536, 536, 536, 536, 536, 536, 537, + 538, 539, 538, 538, 538, 538, 540, 538, 541, 26, 538, 538, 538, 542, 543, 543, + 543, 543, 544, 543, 543, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 547, 548, 549, 549, 549, 549, 547, 550, 549, 26, 549, 551, 552, 553, 554, 554, + 554, 555, 556, 557, 554, 558, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, + 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 561, 562, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 564, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566, 26, + 563, 563, 563, 563, 563, 563, 563, 563, 567, 26, 26, 26, 26, 26, 26, 26, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 569, 568, 570, 26, 26, 26, 26, 26, 26, 26, 26, + 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 572, 26, 26, 26, 26, 26, 26, 26, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 555, 556, 556, 556, 557, 556, 558, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, 560, 26, - 561, 561, 561, 561, 561, 561, 561, 561, 562, 26, 561, 563, 563, 561, 561, 564, - 561, 561, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 565, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 566, 566, 566, 566, 566, 566, 566, 566, 566, 567, 566, 566, 566, 566, 566, 566, - 566, 568, 566, 566, 26, 26, 26, 26, 26, 26, 26, 26, 569, 26, 26, 26, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 26, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 571, 26, - 572, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 577, 577, 577, 578, 578, 26, + 579, 579, 579, 579, 579, 579, 579, 579, 580, 26, 579, 581, 581, 579, 579, 582, + 579, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 584, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585, + 585, 587, 585, 585, 26, 26, 26, 26, 26, 26, 26, 26, 588, 26, 26, 26, + 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, + 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 26, + 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 26, + 591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 573, 26, 574, 26, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 346, - 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 576, 575, 577, - 575, 578, 575, 579, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 592, 26, 593, 26, 594, 594, + 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, + 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, + 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598, + 596, 599, 596, 600, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, - 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 580, 581, 0, 582, - 583, 584, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 586, 26, 26, + 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 601, 602, 0, 603, + 604, 605, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, 607, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, - 0, 0, 0, 259, 587, 588, 0, 589, 590, 0, 0, 0, 0, 0, 0, 0, - 591, 592, 259, 259, 0, 0, 0, 593, 594, 595, 596, 0, 0, 0, 0, 0, + 0, 0, 0, 259, 608, 609, 0, 610, 611, 0, 0, 0, 0, 0, 0, 0, + 612, 613, 259, 259, 0, 0, 0, 614, 615, 616, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, - 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, - 597, 598, 26, 599, 600, 597, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 274, 273, 273, 601, 602, 603, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 604, 280, 283, 280, 605, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 606, - 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, - 607, 607, 607, 607, 607, 607, 607, 607, 608, 607, 609, 26, 26, 26, 26, 26, - 610, 610, 610, 610, 610, 610, 610, 610, 610, 611, 610, 612, 26, 26, 26, 26, + 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, + 618, 619, 26, 620, 621, 618, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 274, 273, 273, 622, 623, 624, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 625, 625, 625, 625, 625, 626, 625, 627, 625, 628, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 629, 629, 629, 629, 629, 629, 629, 630, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633, 26, 26, 26, 26, 26, + 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, - 0, 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, - 614, 31, 31, 31, 615, 616, 617, 618, 619, 620, 615, 621, 615, 617, 617, 622, - 31, 623, 31, 624, 625, 623, 31, 624, 26, 26, 26, 26, 26, 26, 355, 26, + 638, 31, 31, 31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646, + 31, 647, 31, 648, 649, 647, 31, 648, 26, 26, 26, 26, 26, 26, 355, 26, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26, - 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, - 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 626, 0, 0, 0, - 627, 26, 0, 0, 0, 0, 0, 284, 0, 586, 316, 26, 272, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 613, 0, 269, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, + 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 650, 0, 0, 0, + 651, 26, 0, 0, 0, 0, 0, 284, 0, 607, 316, 26, 272, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 637, 0, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 284, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 284, 26, 26, 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0, 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 595, - 0, 0, 0, 0, 592, 628, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, + 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 616, + 0, 0, 0, 0, 613, 652, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269, 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 629, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 604, 26, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 654, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 630, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655, 26, 26, 26, 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 631, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 656, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5476,14 +5515,14 @@ _hb_ucd_sc (unsigned u) static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[5632+(((_hb_ucd_u8[15974+(((_hb_ucd_b4(15878+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[5648+(((_hb_ucd_u8[16174+(((_hb_ucd_b4(16078+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; } #else static const uint8_t -_hb_ucd_u8[12888] = +_hb_ucd_u8[13072] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 17, 15, 15, 18, 15, 19, 20, 21, @@ -6014,26 +6053,26 @@ _hb_ucd_u8[12888] = 32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89, 91, 92, 93, 94, 95, 95, 96, 97, 87, 98, 99,100,101,102,103, 87, - 104,104,104, 87,105,106,107,108,109,110,111,112,113,114, 56, 87, - 89, 87,115, 89,116,117,118,119,120,121,122, 87,123,124, 87,125, - 126,127,128, 87,129,130, 87, 17,131,132, 87, 87,133,134,135, 51, - 87, 19, 87, 21,136,136,136,136,136,136,136,136,136,136,136, 87, - 87, 87, 87, 87,137,137,137,137,137,137,137,137,137, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,138,138,138,138, - 138, 87, 87, 87,139,139,139,139,140,141,142,142, 87, 87, 87, 87, - 18, 18,143,144,145,145,145,145,145,145,145,145,145,145,145,145, - 145,145,145,145,145,145,145,145,145,145, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87,146,147,148, 32, 32, 32, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,149,150, 87, 87, - 87, 87, 87, 87, 56, 56,151,152, 51, 56, 56, 87, 56, 56, 56, 56, - 56, 56, 56, 56,153,153,153,153,153,153, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87,154, 87, 62, 87, 87,155, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87,156,156,157, 87, 87, 87, 87, 87, 56, 56, 56, 87, - 89, 89, 87, 87, 56, 56, 56, 56,158, 87, 56, 56, 56, 56, 56, 56, + 104,104,104, 87,105,106,107,108,109,110,111,112,113,114,115, 87, + 89, 87,116,117,118,119,120,121,122,123,124, 87,125,126, 87,127, + 128,129,130, 87,131,132, 87,133,134,135, 87, 87,136,137,138,139, + 87,140, 87, 21,141,141,141,141,141,141,141,141,141,141,141, 87, + 87, 87, 87, 87,142,142,142,142,142,142,142,142,142, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,143,143,143,143, + 143, 87, 87, 87,144,144,144,144,145,146,147,147, 87, 87, 87, 87, + 148,148,149,150,151,151,151,151,151,151,151,151,151,151,151,151, + 151,151,151,151,151,151,151,151,151,151, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,152,153,154,155,155,155, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,156,157, 87, 87, + 87, 87, 87, 87, 56, 56,158,159, 51, 56, 56, 87, 56, 56, 56, 56, + 56, 56, 56, 56,160,160,160,160,160,160, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,161, 87,162, 87, 87,163, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87,164,164,165, 87, 87, 87, 87, 87, 56, 56, 56, 87, + 89, 89, 87, 87, 56, 56, 56, 56,166, 87, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 56, 87,159,159, 0, 1, 2, 2, 0, 1, 2, 2, + 87, 87, 87, 87, 56, 87,167,167, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, @@ -6091,29 +6130,33 @@ _hb_ucd_u8[12888] = 159,159,159,159,160,160,161,161,161,161,161,161,162,162,162,162, 162,162,163,163,164,164,164,164,165,165,165,165,166,166,166,166, 167,167,168,168,169,169,169,169,169,169,169,169,170,170,170,170, - 170,170,170,170,171,171,171,171,171,171,171,171, 8, 8, 8,129, - 129,129,129,129,172,172,172,172,172,172,172,172,173,173,173,173, - 173,174,174,174,175,175,175,175,175,176,176,176,177,177,177,177, - 177,177,178, 44,179,179,179,179,179,179,179,179,180,180,180,181, - 181,181,181,181,182,182,182,183,182,182,182,182,184,184,184,184, - 184,184,184,184,185,185,185,185,185,185,185,185,186,186,186,186, - 186,186,186,186,187,187,187,187,187,187, 67, 67,188,188,188,188, - 188,188,188,188,189,189,189,189,189,189,189,189, 16, 16, 16, 16, - 16, 16, 16, 16,190,190,190,190,190,190,190,190, 13, 13, 13, 13, - 13, 33, 33, 33, 33, 33, 33, 33,191,191,191,191,192,192,192,192, - 192,192,192,193,193,193,193,193,193,193,193,193, 51, 51, 51, 51, - 51, 51, 11, 11,194,194,194,194,194,194,194,194,195,195,195,195, - 195,195,195,195,196,196,196,196,196,196,196,196,113,113,113,113, - 113,113,113,113,113,113,113,113,197,197,197,197,198,198,198,198, - 198,198,198,198,199,199,199,199,199,199,199,199,200,200,200,200, - 200,200,200,200,200,200,200,200,200,200,201, 0,202,202,202,202, - 202,202,202,202,203,100,100,100,100,100,100,100,100,100,100,100, - 100,100,100,100,100,100,100,100,100,100,204, 53,205,205,205,205, - 205,205,205,205,205,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,206,207,208, 0,209, 0, 0, 0, 0, 0,210,210,210,210, - 210,210,210,210, 92, 92, 92, 92, 92, 92, 92, 92, 19, 19, 19, 19, - 19, 19, 19, 19,211,211,211,211,211,211,211,211,212,212,212,212, - 212,212,212,212,213, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, + 170,170,170,170,171,171,171,171,171,171,171,171,172,172,172,172, + 172,172,172,172,173,173,173,174,174,174,174,174,175,175,175,175, + 175,175,175,175,176,176,176,176,176,176,176,176,177,177,177,177, + 177,178,178,178,179,179,179,179,179,180,180,180,181,181,181,181, + 181,181,182, 44,183,183,183,183,183,183,183,183,184,184,184,185, + 185,185,185,185,186,186,186,187,186,186,186,186,188,188,188,188, + 188,188,188,188,189,189,189,189,189,189,189,189,190,190,190,190, + 190,190,190,190,191,191,191,191,191,191, 67, 67,192,192,192,192, + 192,192,192,192,193,193,193,193,193,193,193,193,194,194,194,194, + 194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196, + 196,196,196,196,197,197,197,197,197,198,198,198,198,198,198,198, + 199,199,199,199,200,200,200,200,200,200,200,201,201,201,201,201, + 201,201,201,201,202,202,202,202,202,202,203,203,203,203,203,203, + 203,203,203,203,204,204,204,204,204,204,204,204,205,205,205,205, + 205,205,205,205,206,206,206,206,206,206,206,206,207,207,207,207, + 207,207,207,207,113,113,113,113,113,113,113,113,113,113,113,113, + 208,208,208,208,209,209,209,209,209,209,209,209,210,210,210,210, + 210,210,210,210,211,211,211,211,211,211,211,211,212,212,212,212, + 212,212,212,212,212,212,212,212,212,212,213, 0,214,214,214,214, + 214,214,214,214,215,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,216,217,217,217,217,217, + 217,217,217,217,218,218,218,218,218,218,218,218,218,218, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,220,221, 0,222, 0, + 0, 0, 0, 0,223,223,223,223,223,223,223,223, 92, 92, 92, 92, + 92, 92, 92, 92,224,224,224,224,224,224,224,224,225,225,225,225, + 225,225,225,225,226,226,226,226,226,226,226,226,227,227,227,227, + 227,227,227,227,228, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, @@ -6158,91 +6201,99 @@ _hb_ucd_u8[12888] = 163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166, 167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170, 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174, - 175,175,175,175,176,176,176,176,177,177,177,177,178, 46, 46, 46, - 179,179,179,179,180,180,180,180,181,181,181,181,182,182,182,182, - 182,182,183,182,184,184,184,184,185,185,185,185,186,186,186,186, - 187,187,187,187,188,188,188,188,189,189,189,189,190,190,190,190, + 175,175,175,175,176,176,176,176,177,177,177,177,178,178,178,178, + 179,179,179,179,180,180,180,180,181,181,181,181,182, 46, 46, 46, + 183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186, + 186,186,187,186,188,188,188,188,189,189,189,189,190,190,190,190, 191,191,191,191,192,192,192,192,193,193,193,193,194,194,194,194, 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, - 199,199,199,199,200,200,200,200,201, 0, 0, 0,202,202,202,202, - 203,107,107,107,107,110,110,110,204,204,204,204, 0,205, 87, 0, - 0, 0,205, 7, 83,138, 7, 0, 0, 0,206, 87,207,207,207,207, - 208,208,208,208,209,209,209,209,210, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, - 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, - 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, - 4, 4, 4, 4, 4, 0, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, - 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, - 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, - 38, 38, 38, 38, 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, - 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, - 0, 0, 7, 7, 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, - 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, - 20, 20, 20, 20, 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, - 18, 18, 18, 18, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, - 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, - 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, - 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, - 44, 44, 44, 44, 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, - 31, 31, 31, 31, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, - 48, 48, 48, 48, 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, - 91, 91, 91, 91, 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, - 70, 70, 70, 70, 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, - 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, - 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, - 6, 19, 19, 19, 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, - 0, 0, 19, 19, 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, - 13, 13, 13, 13, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, - 1, 1, 12, 12, 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, - 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, - 26, 12, 12, 12, 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, - 77, 77, 77, 77, 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, - 75, 75, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, - 84, 84, 84, 84, 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, - 87, 87, 87, 87, 19, 9, 19, 19, 2, 2, 2, 2, 19, 19, 19, 4, - 3, 3, 0, 0, 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, - 49, 49, 49, 49, 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, - 42, 42, 42, 42, 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, - 59, 59, 59, 59, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, - 135,135,135,135,106,106,106,106,104,104,104,104,110,110,110,110, - 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,116,116,116,116, - 128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, - 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117, - 112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82, - 122,122,122,122, 89, 89, 89, 89,130,130,130,130, 94, 94, 94, 94, - 85, 85, 85, 85,101,101,101,101, 96, 96, 96, 96,111,111,111,111, - 100,100,100,100,100, 36, 36, 36,108,108,108,108,129,129,129,129, - 109,109,109,109,107,107,107,107,107,107,107, 1,137,137,137,137, - 124,124,124,124,123,123,123,123,114,114,114,114,102,102,102,102, - 126,126,126,126,125,125,125,125,121,121,121,121,133,133,133,133, - 134,134,134,134, 63, 63, 63, 63, 80, 80, 80, 80,127,127,127,127, - 115,115,115,115,103,103,103,103,119,119,119,119, 99, 99, 99, 99, - 136, 12, 0, 0,136,136,136,136, 17, 15, 15, 15,105,105,105,105, - 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131,113,113,113,113, - 132,132,132,132, 15, 0, 0, 0, 16, 50, 84,118, 88, 89, 90, 85, + 199,199,199,199,200,200,200,200,201,201,201,201,202,202,202,202, + 203,203,203,203,204,204,204,204,205,205,205,205,206,206,206,206, + 207,207,207,207,208,208,208,208,209,209,209,209,210,210,210,210, + 211,211,211,211,212,212,212,212,213, 0, 0, 0,214,214,214,214, + 215,107,107,107,107,110,110,110,216,216,216,216,217,217,217,217, + 0,218, 87, 0, 0, 0,218, 7, 83,138, 7, 0, 0, 0,219, 87, + 220,220,220,220,221,221,221,221,222,222,222,222,223,223,223,223, + 224,224,224,224,225, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, + 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55, + 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3, + 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1, + 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, 38, 38, 38, 38, + 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, 3, 3, 0, 3, + 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, 7, 7, + 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, + 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, + 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, 18, 18, 18, 18, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, 33, 33, 33, 33, + 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, + 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, + 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, + 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, + 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, + 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, + 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, 9, 9, 9, 6, + 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, + 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, 0, 0, 19, 19, + 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13, + 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, 26, 12, 12, 12, + 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, + 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, + 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 84, 84, 84, 84, + 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, + 19, 9, 19, 19, 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0, + 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49, + 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, + 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, + 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135, + 106,106,106,106,104,104,104,104,110,110,110,110, 47, 47, 47, 47, + 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,128,128, + 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97, 97, 97, + 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,112,112, + 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,122,122, + 89, 89, 89, 89,130,130,130,130,144,144,144,144,147,147,147,147, + 148,148,148,148,149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85, + 101,101,101,101, 96, 96, 96, 96,111,111,111,111,100,100,100,100, + 100, 36, 36, 36,108,108,108,108,129,129,129,129,109,109,109,109, + 107,107,107,107,107,107,107, 1,137,137,137,137,124,124,124,124, + 123,123,123,123,114,114,114,114,102,102,102,102,126,126,126,126, + 142,142,142,142,125,125,125,125,150,150,150,150,141,141,141,141, + 140,140,140,140,121,121,121,121,133,133,133,133,134,134,134,134, + 138,138,138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63, + 80, 80, 80, 80,127,127,127,127,115,115,115,115,103,103,103,103, + 119,119,119,119,146,146,146,146, 99, 99, 99, 99,136,139, 0, 0, + 136,136,136,136, 17, 15, 15, 15,139,139,139,139,105,105,105,105, + 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131,151,151,151,151, + 152,152,152,152,113,113,113,113,132,132,132,132, 15, 0, 0, 0, + 16, 50, 84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91, + 85, 85,220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 91, 85, 85,220, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, - 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, + 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 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, 43, 44, 0, 45, 0, 0, - 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, - 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, - 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 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, 0, 0, 0, 0, 0, + 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, + 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, + 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, + 0, 0, 66, 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, 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, 0, 0, 0, @@ -6253,44 +6304,43 @@ _hb_ucd_u8[12888] = 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, 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, 67, 68, 0, 69, 70, 0, 0, 0, + 67, 68, 0, 69, 70, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, - 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112, - 113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102, + 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0, + 108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, + 0, 0,116, 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, + 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,117, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, - 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, + 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, + 0, 0,164, 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, + 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 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, 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, 0, 0,128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, - 152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 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, 0, 0, 0, 0,165, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,168,169, 0, 0, 0, 0,170,171, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,169, 0, - 0, 0, 0,170,171, 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, 0, 0, 0, 0, 0, 0,172,173,174,175,176,177,178,179, - 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195, - 196,197,198,199,200,201,202,203,204,205, 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, 1, 2, 3, 4, + 172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187, + 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203, + 204,205, 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, 1, 2, 3, 4, }; static const uint16_t _hb_ucd_u16[4800] = @@ -6630,12 +6680,12 @@ _hb_ucd_bmg (unsigned u) static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918016u?_hb_ucd_u8[10924+(((_hb_ucd_u8[10068+(((_hb_ucd_u8[8788+(((_hb_ucd_u8[8228+(((_hb_ucd_u8[7778+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918016u?_hb_ucd_u8[11048+(((_hb_ucd_u8[10132+(((_hb_ucd_u8[8788+(((_hb_ucd_u8[8228+(((_hb_ucd_u8[7778+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[1504+(((_hb_ucd_u8[11864+(((_hb_ucd_b4(11768+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[1504+(((_hb_ucd_u8[12048+(((_hb_ucd_b4(11952+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; } #endif From 3bfa878c98cceeaae074d81c14329e358bea8912 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 25 Jun 2019 19:07:07 -0700 Subject: [PATCH 557/617] [gen-ucd] Protect against accidents like previous commit https://github.com/harfbuzz/harfbuzz/pull/1796 --- src/gen-ucd-table.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index 1afde3bdf..a152375dd 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -58,13 +58,14 @@ dm_order = {None: 0} dm_order.update(dm1_order) dm_order.update(dm2_order) -gc_order = packTab.AutoMapping() -for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', - 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', - 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',): - gc_order[_] +gc_order = dict() +for i,v in enumerate(('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', + 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', + 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',)): + gc_order[i] = v + gc_order[v] = i -sc_order = packTab.AutoMapping() +sc_order = dict() sc_array = [] sc_re = re.compile(r"\b(HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") for line in open('hb-common.h'): @@ -72,14 +73,11 @@ for line in open('hb-common.h'): if not m: continue name = m.group(1) tag = ''.join(m.group(i) for i in range(2, 6)) - i = sc_order[tag] - assert i == len(sc_array) + i = len(sc_array) + sc_order[tag] = i + sc_order[i] = tag sc_array.append(name) -# TODO Currently if gc_order or sc_order do not capture all values, we get in -# trouble because they silently add new values. We should be able to "freeze" -# them, or just do the mapping ourselves. - DEFAULT = 1 COMPACT = 3 SLOPPY = 5 From b14e413fae8f14b75c5956e9b38e413c878ded0c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 10:44:10 -0700 Subject: [PATCH 558/617] 2.5.3 --- NEWS | 7 +++++++ configure.ac | 2 +- src/hb-version.h | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 0835378a1..20bb21ba2 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +Overview of changes leading to 2.5.3 +Wednesday, June 26, 2019 +==================================== +- Fix UCD script data for Unicode 10+ scripts. This was broken since 2.5.0. +- More optimizations for HB_TINY. + + Overview of changes leading to 2.5.2 Thursday, June 20, 2019 ==================================== diff --git a/configure.ac b/configure.ac index 426b85038..0dc672a81 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.5.2], + [2.5.3], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-version.h b/src/hb-version.h index 10b826ffb..251cc6399 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -38,9 +38,9 @@ HB_BEGIN_DECLS #define HB_VERSION_MAJOR 2 #define HB_VERSION_MINOR 5 -#define HB_VERSION_MICRO 2 +#define HB_VERSION_MICRO 3 -#define HB_VERSION_STRING "2.5.2" +#define HB_VERSION_STRING "2.5.3" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ From 8786820a5a7406be95bc4a6b6e2aca736126420c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 12:53:57 -0700 Subject: [PATCH 559/617] [src] Add make targets "tiny" and "tinyz" --- src/Makefile.am | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index 14cafb833..51f9aac88 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,6 +15,10 @@ check_PROGRAMS = # Convenience targets: lib: $(BUILT_SOURCES) libharfbuzz.la libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES) +tiny: + $(MAKE) $(AM_MAKEFLAGS) CPPFLAGS="-Os -DHB_TINY $(CPPFLAGS)" libs +tinyz: + $(MAKE) $(AM_MAKEFLAGS) CPPFLAGS="-Oz -DHB_TINY $(CPPFLAGS)" libs lib_LTLIBRARIES = libharfbuzz.la From cee9f6e044278b590694f4dff6f22eaad9371385 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:01:58 -0700 Subject: [PATCH 560/617] Fail compile if no shapers enabled --- src/hb-shaper.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc index 575ab1f7d..4858a6a9c 100644 --- a/src/hb-shaper.cc +++ b/src/hb-shaper.cc @@ -34,6 +34,7 @@ static const hb_shaper_entry_t all_shapers[] = { #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT }; +static_assert (0 != ARRAY_LENGTH_CONST (all_shapers), "No shaper enabled."); #if HB_USE_ATEXIT static void free_static_shapers (); From 7aad53657eb23264f658711a71da3e50f2264455 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:21:03 -0700 Subject: [PATCH 561/617] [config] Add HB_NO_OT_SHAPE / HB_NO_OT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- CONFIG.md | 14 ++++++++++++++ src/gen-indic-table.py | 6 ++++++ src/gen-use-table.py | 6 ++++++ src/gen-vowel-constraints.py | 7 +++++++ src/hb-config.hh | 4 ++++ src/hb-ot-shape-complex-arabic.cc | 6 ++++++ src/hb-ot-shape-complex-default.cc | 7 +++++++ src/hb-ot-shape-complex-hangul.cc | 7 +++++++ src/hb-ot-shape-complex-hebrew.cc | 7 +++++++ src/hb-ot-shape-complex-indic-table.cc | 6 ++++++ src/hb-ot-shape-complex-indic.cc | 7 +++++++ src/hb-ot-shape-complex-khmer.cc | 7 +++++++ src/hb-ot-shape-complex-myanmar.cc | 7 +++++++ src/hb-ot-shape-complex-thai.cc | 7 +++++++ src/hb-ot-shape-complex-use-table.cc | 6 ++++++ src/hb-ot-shape-complex-use.cc | 7 +++++++ src/hb-ot-shape-complex-vowel-constraints.cc | 6 ++++++ src/hb-ot-shape-fallback.cc | 7 +++++++ src/hb-ot-shape-normalize.cc | 7 +++++++ src/hb-ot-shape.cc | 7 +++++++ src/hb-shape-plan.cc | 10 ++++++++++ src/hb-shape-plan.hh | 4 ++++ src/hb-shaper-list.hh | 2 ++ 23 files changed, 154 insertions(+) diff --git a/CONFIG.md b/CONFIG.md index 5fb3e7cb4..ff55154ad 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -86,6 +86,20 @@ In that case, or if you otherwise provide those functions by calling without loss of functionality by defining `HB_NO_OT_FONT`. +## Shapers + +Most HarfBuzz clients use it for the main shaper, called "ot". However, it +is legitimate to want to compile HarfBuzz with only another backend, eg. +CoreText, for example for an iOS app. For that, you want `HB_NO_OT_SHAPE`, +or more generally `HB_NO_OT`. + +This is very rarely what you need. Make sure you understand exactly what you +are doing. + +Defining `HB_NO_FALLBACK_SHAPE` however is pretty harmless. That removes the +(unused) "fallback" shaper. + + ## Thread-safety By default HarfBuzz builds as a thread-safe library. The exception is that diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py index eedf420b7..cdf81fe75 100755 --- a/src/gen-indic-table.py +++ b/src/gen-indic-table.py @@ -98,6 +98,10 @@ for h in headers: print (" * %s" % (l.strip())) print (" */") print () +print ('#include "hb.hh"') +print () +print ('#ifndef HB_NO_OT_SHAPE') +print () print ('#include "hb-ot-shape-complex-indic.hh"') print () @@ -251,6 +255,8 @@ for i in range (2): print ("#undef %s_%s" % (what_short[i], short[i][v])) print () +print () +print ('#endif') print ("/* == End of generated table == */") # Maintain at least 30% occupancy in the table */ diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 820838cf8..a8a03a77b 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -419,6 +419,10 @@ for h in headers: print (" * %s" % (l.strip())) print (" */") print () +print ('#include "hb.hh"') +print () +print ('#ifndef HB_NO_OT_SHAPE') +print () print ('#include "hb-ot-shape-complex-use.hh"') print () @@ -533,6 +537,8 @@ for k,v in sorted(use_positions.items()): tag = k + suf print ("#undef %s" % tag) print () +print () +print ('#endif') print ("/* == End of generated table == */") # Maintain at least 50% occupancy in the table */ diff --git a/src/gen-vowel-constraints.py b/src/gen-vowel-constraints.py index 1340d97dc..8ca90c819 100755 --- a/src/gen-vowel-constraints.py +++ b/src/gen-vowel-constraints.py @@ -157,6 +157,11 @@ print (' *') for line in scripts_header: print (' * %s' % line.strip ()) print (' */') + +print () +print ('#include "hb.hh"') +print () +print ('#ifndef HB_NO_OT_SHAPE') print () print ('#include "hb-ot-shape-complex-vowel-constraints.hh"') print () @@ -223,4 +228,6 @@ print (' }') print ('}') print () +print () +print ('#endif') print ('/* == End of generated functions == */') diff --git a/src/hb-config.hh b/src/hb-config.hh index f9e4699fc..c6a408053 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -121,6 +121,10 @@ #define HB_NO_OT_NAME_LANGUAGE #endif +#ifdef HB_NO_OT +#define HB_NO_OT_SHAPE +#endif + #ifdef HB_NO_OT_SHAPE_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc index 3212e0c96..b24833b71 100644 --- a/src/hb-ot-shape-complex-arabic.cc +++ b/src/hb-ot-shape-complex-arabic.cc @@ -25,6 +25,9 @@ */ #include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-arabic.hh" #include "hb-ot-shape.hh" @@ -710,3 +713,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-default.cc b/src/hb-ot-shape-complex-default.cc index 97923ecf6..a921f16fa 100644 --- a/src/hb-ot-shape-complex-default.cc +++ b/src/hb-ot-shape-complex-default.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex.hh" @@ -44,3 +48,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-hangul.cc b/src/hb-ot-shape-complex-hangul.cc index f084f6ad6..32e0e6612 100644 --- a/src/hb-ot-shape-complex-hangul.cc +++ b/src/hb-ot-shape-complex-hangul.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex.hh" @@ -430,3 +434,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-hebrew.cc b/src/hb-ot-shape-complex-hebrew.cc index 14989730f..334d3ded8 100644 --- a/src/hb-ot-shape-complex-hebrew.cc +++ b/src/hb-ot-shape-complex-hebrew.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex.hh" @@ -176,3 +180,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc index d26bbb8f3..419aae11e 100644 --- a/src/hb-ot-shape-complex-indic-table.cc +++ b/src/hb-ot-shape-complex-indic-table.cc @@ -14,6 +14,10 @@ * # Date: 2018-07-30, 19:40:00 GMT [KW] */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-indic.hh" #pragma GCC diagnostic push @@ -487,4 +491,6 @@ hb_indic_get_categories (hb_codepoint_t u) #undef IMC_TR #undef IMC_VOL + +#endif /* == End of generated table == */ diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index f8cb5741b..6405d9c2d 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-indic.hh" #include "hb-ot-shape-complex-vowel-constraints.hh" #include "hb-ot-layout.hh" @@ -1648,3 +1652,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc index 4c8847762..eba7d86ea 100644 --- a/src/hb-ot-shape-complex-khmer.cc +++ b/src/hb-ot-shape-complex-khmer.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-khmer.hh" #include "hb-ot-layout.hh" @@ -502,3 +506,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index b1f6b65ef..5b819cf47 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-myanmar.hh" @@ -415,3 +419,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_zawgyi = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index 22d4aa3ab..347ea2e7a 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex.hh" @@ -385,3 +389,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, false,/* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc index 024746989..4c5d687c7 100644 --- a/src/hb-ot-shape-complex-use-table.cc +++ b/src/hb-ot-shape-complex-use-table.cc @@ -15,6 +15,10 @@ * UnicodeData.txt does not have a header. */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-use.hh" #pragma GCC diagnostic push @@ -851,4 +855,6 @@ hb_use_get_category (hb_codepoint_t u) #undef VMPst #undef VMAbv + +#endif /* == End of generated table == */ diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 2cc5ea278..91c0b8c04 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -26,6 +26,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-use.hh" #include "hb-ot-shape-complex-arabic.hh" #include "hb-ot-shape-complex-vowel-constraints.hh" @@ -643,3 +647,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, false, /* fallback_position */ }; + + +#endif diff --git a/src/hb-ot-shape-complex-vowel-constraints.cc b/src/hb-ot-shape-complex-vowel-constraints.cc index 912ee35b4..2f8041323 100644 --- a/src/hb-ot-shape-complex-vowel-constraints.cc +++ b/src/hb-ot-shape-complex-vowel-constraints.cc @@ -13,6 +13,10 @@ * # Date: 2019-01-28, 22:16:47 GMT */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-complex-vowel-constraints.hh" static void @@ -440,4 +444,6 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED, } } + +#endif /* == End of generated functions == */ diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index 573af8ec6..03a42df6f 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-fallback.hh" #include "hb-kern.hh" @@ -587,3 +591,6 @@ _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan HB_UNUSED, } } } + + +#endif diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc index 82bb24b7d..14c5bd4ac 100644 --- a/src/hb-ot-shape-normalize.cc +++ b/src/hb-ot-shape-normalize.cc @@ -24,6 +24,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-shape-normalize.hh" #include "hb-ot-shape-complex.hh" #include "hb-ot-shape.hh" @@ -469,3 +473,6 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, buffer->swap_buffers (); } } + + +#endif diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 7690c2229..499b1be4b 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -26,6 +26,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-shaper-impl.hh" #include "hb-ot-shape.hh" @@ -1146,3 +1150,6 @@ hb_ot_shape_glyphs_closure (hb_font_t *font, hb_shape_plan_destroy (shape_plan); } + + +#endif diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index 61ea8d0e5..2b23dee62 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -79,7 +79,9 @@ hb_shape_plan_key_t::init (bool copy, } this->shaper_func = nullptr; this->shaper_name = nullptr; +#ifndef HB_NO_OT_SHAPE this->ot.init (face, coords, num_coords); +#endif /* * Choose shaper. @@ -148,7 +150,9 @@ hb_shape_plan_key_t::equal (const hb_shape_plan_key_t *other) { return hb_segment_properties_equal (&this->props, &other->props) && this->user_features_match (other) && +#ifndef HB_NO_OT_SHAPE this->ot.equal (&other->ot) && +#endif this->shaper_func == other->shaper_func; } @@ -224,12 +228,16 @@ hb_shape_plan_create2 (hb_face_t *face, num_coords, shaper_list))) goto bail2; +#ifndef HB_NO_OT_SHAPE if (unlikely (!shape_plan->ot.init0 (face, &shape_plan->key))) goto bail3; +#endif return shape_plan; +#ifndef HB_NO_OT_SHAPE bail3: +#endif shape_plan->key.free (); bail2: free (shape_plan); @@ -281,7 +289,9 @@ hb_shape_plan_destroy (hb_shape_plan_t *shape_plan) { if (!hb_object_destroy (shape_plan)) return; +#ifndef HB_NO_OT_SHAPE shape_plan->ot.fini (); +#endif shape_plan->key.free (); free (shape_plan); } diff --git a/src/hb-shape-plan.hh b/src/hb-shape-plan.hh index 3a057fd22..8e8d7632b 100644 --- a/src/hb-shape-plan.hh +++ b/src/hb-shape-plan.hh @@ -39,7 +39,9 @@ struct hb_shape_plan_key_t const hb_feature_t *user_features; unsigned int num_user_features; +#ifndef HB_NO_OT_SHAPE hb_ot_shape_plan_key_t ot; +#endif hb_shape_func_t *shaper_func; const char *shaper_name; @@ -65,7 +67,9 @@ struct hb_shape_plan_t hb_object_header_t header; hb_face_t *face_unsafe; /* We don't carry a reference to face. */ hb_shape_plan_key_t key; +#ifndef HB_NO_OT_SHAPE hb_ot_shape_plan_t ot; +#endif }; diff --git a/src/hb-shaper-list.hh b/src/hb-shaper-list.hh index 4108e7aab..c864af6ec 100644 --- a/src/hb-shaper-list.hh +++ b/src/hb-shaper-list.hh @@ -35,7 +35,9 @@ HB_SHAPER_IMPLEMENT (graphite2) #endif +#ifndef HB_NO_OT_SHAPE HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */ +#endif #ifdef HAVE_UNISCRIBE HB_SHAPER_IMPLEMENT (uniscribe) From ab40a2feecf53d2ef787b7785132bf57e5bdcff9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:25:02 -0700 Subject: [PATCH 562/617] [config] Enable HB_NO_OT_FONT in HB_NO_OT --- CONFIG.md | 4 ++-- src/hb-config.hh | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index ff55154ad..bf14a6df4 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -90,8 +90,8 @@ without loss of functionality by defining `HB_NO_OT_FONT`. Most HarfBuzz clients use it for the main shaper, called "ot". However, it is legitimate to want to compile HarfBuzz with only another backend, eg. -CoreText, for example for an iOS app. For that, you want `HB_NO_OT_SHAPE`, -or more generally `HB_NO_OT`. +CoreText, for example for an iOS app. For that, you want `HB_NO_OT_SHAPE`. +If you are going down that route, check if you want `HB_NO_OT`. This is very rarely what you need. Make sure you understand exactly what you are doing. diff --git a/src/hb-config.hh b/src/hb-config.hh index c6a408053..e364a6a90 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -122,6 +122,7 @@ #endif #ifdef HB_NO_OT +#define HB_NO_OT_FONT #define HB_NO_OT_SHAPE #endif From bb4bbe617d3878ca7e5e359ada493c68ec7f0a90 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:29:58 -0700 Subject: [PATCH 563/617] [config] Add HB_NO_OT_LAYOUT Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-layout.cc | 7 +++++++ src/hb-ot-map.cc | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index e364a6a90..1faeca240 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -123,6 +123,7 @@ #ifdef HB_NO_OT #define HB_NO_OT_FONT +#define HB_NO_OT_LAYOUT #define HB_NO_OT_SHAPE #endif diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 10b9ba092..846c2b00a 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -28,6 +28,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_LAYOUT + #include "hb-open-type.hh" #include "hb-ot-layout.hh" #include "hb-ot-face.hh" @@ -2000,3 +2004,6 @@ hb_ot_layout_get_baseline (hb_font_t *font, hb_position_t *coord /* OUT. May be NULL. */); #endif + + +#endif diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 92d70bb41..b0bc4726b 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -26,6 +26,10 @@ * Google Author(s): Behdad Esfahbod */ +#include "hb.hh" + +#ifndef HB_NO_OT_SHAPE + #include "hb-ot-map.hh" #include "hb-ot-shape.hh" #include "hb-ot-layout.hh" @@ -332,3 +336,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, } } } + + +#endif From 12092a46d8826eec5dcf69e7817921380e4bc507 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:31:01 -0700 Subject: [PATCH 564/617] [config] Rename HB_NO_SHAPE_AAT to HB_NO_AAT_SHAPE --- src/hb-aat-map.cc | 2 +- src/hb-config.hh | 2 +- src/hb-ot-kern-table.hh | 14 +++++++------- src/hb-ot-layout.cc | 2 +- src/hb-ot-shape.cc | 36 ++++++++++++++++++------------------ src/hb-ot-shape.hh | 8 ++++---- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/hb-aat-map.cc b/src/hb-aat-map.cc index e16ecfe04..bc879359a 100644 --- a/src/hb-aat-map.cc +++ b/src/hb-aat-map.cc @@ -28,7 +28,7 @@ #include "hb.hh" -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE #include "hb-aat-map.hh" diff --git a/src/hb-config.hh b/src/hb-config.hh index 1faeca240..fc663d878 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -93,7 +93,7 @@ #ifdef HB_NO_AAT #define HB_NO_OT_NAME_LANGUAGE_AAT -#define HB_NO_SHAPE_AAT +#define HB_NO_AAT_SHAPE #endif #ifdef HB_NO_BITMAP diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index ae2bcc92d..7dfb207b2 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -128,11 +128,11 @@ struct KernSubTable TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.format0)); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward (ds)...) : c->default_return_value ()); #endif case 2: return_trace (c->dispatch (u.format2)); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward (ds)...) : c->default_return_value ()); #endif default: return_trace (c->default_return_value ()); @@ -282,7 +282,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_state_machine (); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 1: return u.aat.has_state_machine (); #endif default:return false; @@ -293,7 +293,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_cross_stream (); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 1: return u.aat.has_cross_stream (); #endif default:return false; @@ -304,7 +304,7 @@ struct kern { switch (get_type ()) { case 0: return u.ot.get_h_kerning (left, right); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 1: return u.aat.get_h_kerning (left, right); #endif default:return 0; @@ -321,7 +321,7 @@ struct kern TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.ot, hb_forward (ds)...)); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE case 1: return_trace (c->dispatch (u.aat, hb_forward (ds)...)); #endif default: return_trace (c->default_return_value ()); @@ -340,7 +340,7 @@ struct kern HBUINT32 version32; HBUINT16 major; KernOT ot; -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE KernAAT aat; #endif } u; diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 846c2b00a..63ccab885 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -392,7 +392,7 @@ OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED, return false; #endif -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE /* Mac OS X prefers morx over GSUB. It also ships with various Indic fonts, * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken * GSUB/GPOS tables. Some have GSUB with zero scripts, those are ignored by diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 499b1be4b..007fae8fa 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -59,7 +59,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, const hb_feature_t *user_features, unsigned int num_user_features); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE static inline bool _hb_apply_morx (hb_face_t *face) { @@ -82,7 +82,7 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac props (*props), map (face, props), aat_map (face, props) -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE , apply_morx (_hb_apply_morx (face)) #endif { @@ -102,7 +102,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.props = props; plan.shaper = shaper; map.compile (plan.map, key); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (apply_morx) aat_map.compile (plan.aat_map); #endif @@ -121,7 +121,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.kern_mask = plan.map.get_mask (kern_tag); plan.requested_kerning = !!plan.kern_mask; #endif -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k')); plan.requested_tracking = !!plan.trak_mask; #endif @@ -141,7 +141,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, * Decide who does substitutions. GSUB, morx, or fallback. */ -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE plan.apply_morx = apply_morx; #endif @@ -151,13 +151,13 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (0) ; -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE else if (hb_options ().aat && hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; #endif else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face)) plan.apply_gpos = true; -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; #endif @@ -165,7 +165,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, if (!plan.apply_kerx && !has_gpos_kern) { /* Apparently Apple applies kerx if GPOS kern was not applied. */ -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; else @@ -196,7 +196,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing && script_fallback_mark_positioning; -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE /* Currently we always apply trak. */ plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face); #endif @@ -207,7 +207,7 @@ hb_ot_shape_plan_t::init0 (hb_face_t *face, const hb_shape_plan_key_t *key) { map.init (); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE aat_map.init (); #endif @@ -237,7 +237,7 @@ hb_ot_shape_plan_t::fini () shaper->data_destroy (const_cast (data)); map.fini (); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE aat_map.fini (); #endif } @@ -246,7 +246,7 @@ void hb_ot_shape_plan_t::substitute (hb_font_t *font, hb_buffer_t *buffer) const { -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (unlikely (apply_morx)) hb_aat_layout_substitute (this, font, buffer); else @@ -260,7 +260,7 @@ hb_ot_shape_plan_t::position (hb_font_t *font, { if (this->apply_gpos) map.position (this, font, buffer); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE else if (this->apply_kerx) hb_aat_layout_position (this, font, buffer); #endif @@ -271,7 +271,7 @@ hb_ot_shape_plan_t::position (hb_font_t *font, else _hb_ot_shape_fallback_kern (this, font, buffer); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (this->apply_trak) hb_aat_layout_track (this, font, buffer); #endif @@ -336,7 +336,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, /* Random! */ map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE /* Tracking. We enable dummy feature here just to allow disabling * AAT 'trak' table using features. * https://github.com/harfbuzz/harfbuzz/issues/1303 */ @@ -374,7 +374,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, feature->value); } -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (planner->apply_morx) { hb_aat_map_builder_t *aat_map = &planner->aat_map; @@ -823,7 +823,7 @@ static inline void hb_ot_substitute_post (const hb_ot_shape_context_t *c) { hb_ot_hide_default_ignorables (c->buffer, c->font); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (c->plan->apply_morx) hb_aat_layout_remove_deleted_glyphs (c->buffer); #endif @@ -960,7 +960,7 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c) /* Finish off. Has to follow a certain order. */ hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c->buffer); -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE if (c->plan->apply_morx) hb_aat_layout_zero_width_deleted_glyphs (c->buffer); #endif diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index fec8983c6..2cde73d85 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -78,7 +78,7 @@ struct hb_ot_shape_plan_t #else static constexpr hb_mask_t kern_mask = 0; #endif -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE hb_mask_t trak_mask; #else static constexpr hb_mask_t trak_mask = 0; @@ -89,7 +89,7 @@ struct hb_ot_shape_plan_t #else static constexpr bool requested_kerning = false; #endif -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE bool requested_tracking : 1; #else static constexpr bool requested_tracking = false; @@ -111,7 +111,7 @@ struct hb_ot_shape_plan_t #else static constexpr bool apply_kern = false; #endif -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE bool apply_kerx : 1; bool apply_morx : 1; bool apply_trak : 1; @@ -149,7 +149,7 @@ struct hb_ot_shape_planner_t hb_segment_properties_t props; hb_ot_map_builder_t map; hb_aat_map_builder_t aat_map; -#ifndef HB_NO_SHAPE_AAT +#ifndef HB_NO_AAT_SHAPE bool apply_morx : 1; #else static constexpr bool apply_morx = false; From b0fd16eec62dea29d984bab879064ae9d91afdfc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:31:51 -0700 Subject: [PATCH 565/617] [config] Add dependency --- src/hb-config.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index fc663d878..38a685e43 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -127,6 +127,10 @@ #define HB_NO_OT_SHAPE #endif +#ifdef HB_NO_OT_SHAPE +#define HB_NO_AAT_SHAPE +#endif + #ifdef HB_NO_OT_SHAPE_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK #define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK From 2804790bceb9398cc9b668ca63f5aa9ffe29beeb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:38:14 -0700 Subject: [PATCH 566/617] [config] Add dependency --- src/hb-ot-shape.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 007fae8fa..c659f28ca 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -30,6 +30,10 @@ #ifndef HB_NO_OT_SHAPE +#ifdef HB_NO_OT_LAYOUT +#error "Cannot compile 'ot' shaper with HB_NO_OT_LAYOUT." +#endif + #include "hb-shaper-impl.hh" #include "hb-ot-shape.hh" From 7dcf8e126ecf52c67f59745e04d21df68b1a6992 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:44:10 -0700 Subject: [PATCH 567/617] [config] Fix build with HB_NO_OT_LAYOUT --- src/hb-ot-face-table-list.hh | 2 ++ src/hb-ot-layout-gpos-table.hh | 3 ++- src/hb-ot-layout-gsub-table.hh | 5 +++-- src/hb-ot-layout-gsubgpos.hh | 8 +++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index d07f53c2b..ac7052751 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -88,11 +88,13 @@ HB_OT_TABLE (OT, kern) #endif /* OpenType shaping. */ +#ifndef HB_NO_OT_LAYOUT HB_OT_ACCELERATOR (OT, GDEF) HB_OT_ACCELERATOR (OT, GSUB) HB_OT_ACCELERATOR (OT, GPOS) //HB_OT_TABLE (OT, BASE) //HB_OT_TABLE (OT, JSTF) +#endif /* AAT shaping. */ #ifndef HB_NO_AAT diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index d371c4b5f..f4be42c1d 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1737,13 +1737,13 @@ struct GPOS_accelerator_t : GPOS::accelerator_t {}; /* Out-of-class implementation for methods recursing */ +#ifndef HB_NO_OT_LAYOUT template /*static*/ inline typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) { const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); return l.dispatch (c); } - /*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); @@ -1756,6 +1756,7 @@ template c->set_lookup_props (saved_lookup_props); return ret; } +#endif } /* namespace OT */ diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index f532f9dff..a6cc1a230 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1409,6 +1409,7 @@ struct GSUB_accelerator_t : GSUB::accelerator_t {}; /* Out-of-class implementation for methods recursing */ +#ifndef HB_NO_OT_LAYOUT /*static*/ inline bool ExtensionSubst::is_reverse () const { unsigned int type = get_type (); @@ -1416,14 +1417,12 @@ struct GSUB_accelerator_t : GSUB::accelerator_t {}; return CastR (get_subtable()).is_reverse (); return SubstLookup::lookup_type_is_reverse (type); } - template /*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); return l.dispatch (c); } - /*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); @@ -1436,6 +1435,8 @@ template c->set_lookup_props (saved_lookup_props); return ret; } +#endif + } /* namespace OT */ diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9a82a4d67..c6e6ac9cb 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -483,7 +483,13 @@ struct hb_ot_apply_context_t : iter_input (), iter_context (), font (font_), face (font->face), buffer (buffer_), recurse_func (nullptr), - gdef (*face->table.GDEF->table), + gdef ( +#ifndef HB_NO_OT_LAYOUT + *face->table.GDEF->table +#else + Null(GDEF) +#endif + ), var_store (gdef.get_var_store ()), direction (buffer_->props.direction), lookup_mask (1), From 8fe15485cbc2f56adb29d4d5f0c3957869bd0e1a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:49:42 -0700 Subject: [PATCH 568/617] [config] Add HB_NO_OT_TAG Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-layout.cc | 4 ++++ src/hb-ot-tag.cc | 5 +++++ src/hb-uniscribe.cc | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index 38a685e43..adf2b3348 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -124,6 +124,7 @@ #ifdef HB_NO_OT #define HB_NO_OT_FONT #define HB_NO_OT_LAYOUT +#define HB_NO_OT_TAG #define HB_NO_OT_SHAPE #endif diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 63ccab885..98cd10923 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -32,6 +32,10 @@ #ifndef HB_NO_OT_LAYOUT +#ifdef HB_NO_OT_TAG +#error "Cannot compile hb-ot-layout.cc with HB_NO_OT_TAG." +#endif + #include "hb-open-type.hh" #include "hb-ot-layout.hh" #include "hb-ot-face.hh" diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index e63045894..8ad917ae7 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -28,6 +28,8 @@ #include "hb.hh" +#ifndef HB_NO_OT_TAG + /* hb_script_t */ @@ -548,3 +550,6 @@ main () } #endif + + +#endif diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 88f429401..5c7ff8744 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -28,6 +28,10 @@ #ifdef HAVE_UNISCRIBE +#ifdef HB_NO_OT_TAG +#error "Cannot compile 'uniscribe' shaper with HB_NO_OT_TAG." +#endif + #include "hb-shaper-impl.hh" #include From 9d5b5348c7ca1e39faa9e197fdebfb8f5d3aeece Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 13:58:40 -0700 Subject: [PATCH 569/617] [config] Add HB_NO_SHAPER Don't know who would want when why. But makes sense to have. --- src/hb-shaper-list.hh | 6 ++++++ src/hb-shaper.cc | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/hb-shaper-list.hh b/src/hb-shaper-list.hh index c864af6ec..0d63933a7 100644 --- a/src/hb-shaper-list.hh +++ b/src/hb-shaper-list.hh @@ -28,6 +28,9 @@ #define HB_SHAPER_LIST_HH #endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */ +#ifndef HB_NO_SHAPER + + /* v--- Add new shapers in the right place here. */ #ifdef HAVE_GRAPHITE2 @@ -52,3 +55,6 @@ HB_SHAPER_IMPLEMENT (coretext) #ifndef HB_NO_FALLBACK_SHAPE HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */ #endif + + +#endif diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc index 4858a6a9c..0ea68ad1f 100644 --- a/src/hb-shaper.cc +++ b/src/hb-shaper.cc @@ -34,7 +34,9 @@ static const hb_shaper_entry_t all_shapers[] = { #include "hb-shaper-list.hh" #undef HB_SHAPER_IMPLEMENT }; +#ifndef HB_NO_SHAPER static_assert (0 != ARRAY_LENGTH_CONST (all_shapers), "No shaper enabled."); +#endif #if HB_USE_ATEXIT static void free_static_shapers (); From 5130c90ac0173c542b550049c93738ab5de84bb9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 14:29:39 -0700 Subject: [PATCH 570/617] [config] Add HB_NO_EMOJI Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-config.hh | 1 + src/hb-ot-shape.cc | 2 ++ src/hb-unicode.cc | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/hb-config.hh b/src/hb-config.hh index adf2b3348..6a95501d7 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -58,6 +58,7 @@ #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_COLOR +#define HB_NO_EMOJI #define HB_NO_FACE_COLLECT_UNICODES #define HB_NO_GETENV #define HB_NO_HINTING diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index c659f28ca..7ae0925a0 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -479,6 +479,7 @@ hb_set_unicode_props (hb_buffer_t *buffer) { _hb_glyph_info_set_continuation (&info[i]); } +#ifndef HB_NO_EMOJI else if (unlikely (_hb_glyph_info_is_zwj (&info[i]))) { _hb_glyph_info_set_continuation (&info[i]); @@ -490,6 +491,7 @@ hb_set_unicode_props (hb_buffer_t *buffer) _hb_glyph_info_set_continuation (&info[i]); } } +#endif /* Or part of the Other_Grapheme_Extend that is not marks. * As of Unicode 11 that is just: * diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 9ec2d8563..eb9451c60 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -570,6 +570,7 @@ _hb_modified_combining_class[256] = /* * Emoji */ +#ifndef HB_NO_EMOJI #include "hb-unicode-emoji-table.hh" @@ -581,3 +582,4 @@ _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp) sizeof (hb_unicode_range_t), hb_unicode_range_t::cmp); } +#endif From 1cdd0fa60d9a6aaddc20e646d294d642e2db9be4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 14:49:15 -0700 Subject: [PATCH 571/617] [emoji] Port generator to packtab --- src/gen-emoji-table.py | 18 +++-- src/hb-unicode-emoji-table.hh | 126 +++++++++++++--------------------- src/hb-unicode.cc | 5 +- 3 files changed, 60 insertions(+), 89 deletions(-) diff --git a/src/gen-emoji-table.py b/src/gen-emoji-table.py index 9afe747dd..22da22811 100755 --- a/src/gen-emoji-table.py +++ b/src/gen-emoji-table.py @@ -4,6 +4,7 @@ from __future__ import print_function, division, absolute_import import sys import os.path from collections import OrderedDict +import packTab if len (sys.argv) != 2: print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr) @@ -54,12 +55,17 @@ print () for typ,s in ranges.items(): if typ != "Extended_Pictographic": continue - print() - print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ) - print("{") - for pair in sorted(s): - print(" {0x%04X, 0x%04X}," % pair) - print("};") + + arr = dict() + for start,end in s: + for i in range(start,end): + arr[i] = 1 + + sol = packTab.pack_table(arr, 0, compression=3) + code = packTab.Code('_hb_emoji') + sol.genCode(code, 'is_'+typ) + code.print_c(linkage='static inline') + print() print () print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */") diff --git a/src/hb-unicode-emoji-table.hh b/src/hb-unicode-emoji-table.hh index aa297fcf9..1ff79c977 100644 --- a/src/hb-unicode-emoji-table.hh +++ b/src/hb-unicode-emoji-table.hh @@ -23,88 +23,56 @@ #include "hb-unicode.hh" - -static const struct hb_unicode_range_t _hb_unicode_emoji_Extended_Pictographic_table[] = +static const uint8_t +_hb_emoji_u8[448] = { - {0x00A9, 0x00A9}, - {0x00AE, 0x00AE}, - {0x203C, 0x203C}, - {0x2049, 0x2049}, - {0x2122, 0x2122}, - {0x2139, 0x2139}, - {0x2194, 0x2199}, - {0x21A9, 0x21AA}, - {0x231A, 0x231B}, - {0x2328, 0x2328}, - {0x2388, 0x2388}, - {0x23CF, 0x23CF}, - {0x23E9, 0x23F3}, - {0x23F8, 0x23FA}, - {0x24C2, 0x24C2}, - {0x25AA, 0x25AB}, - {0x25B6, 0x25B6}, - {0x25C0, 0x25C0}, - {0x25FB, 0x25FE}, - {0x2600, 0x2605}, - {0x2607, 0x2612}, - {0x2614, 0x2685}, - {0x2690, 0x2705}, - {0x2708, 0x2712}, - {0x2714, 0x2714}, - {0x2716, 0x2716}, - {0x271D, 0x271D}, - {0x2721, 0x2721}, - {0x2728, 0x2728}, - {0x2733, 0x2734}, - {0x2744, 0x2744}, - {0x2747, 0x2747}, - {0x274C, 0x274C}, - {0x274E, 0x274E}, - {0x2753, 0x2755}, - {0x2757, 0x2757}, - {0x2763, 0x2767}, - {0x2795, 0x2797}, - {0x27A1, 0x27A1}, - {0x27B0, 0x27B0}, - {0x27BF, 0x27BF}, - {0x2934, 0x2935}, - {0x2B05, 0x2B07}, - {0x2B1B, 0x2B1C}, - {0x2B50, 0x2B50}, - {0x2B55, 0x2B55}, - {0x3030, 0x3030}, - {0x303D, 0x303D}, - {0x3297, 0x3297}, - {0x3299, 0x3299}, - {0x1F000, 0x1F0FF}, - {0x1F10D, 0x1F10F}, - {0x1F12F, 0x1F12F}, - {0x1F16C, 0x1F171}, - {0x1F17E, 0x1F17F}, - {0x1F18E, 0x1F18E}, - {0x1F191, 0x1F19A}, - {0x1F1AD, 0x1F1E5}, - {0x1F201, 0x1F20F}, - {0x1F21A, 0x1F21A}, - {0x1F22F, 0x1F22F}, - {0x1F232, 0x1F23A}, - {0x1F23C, 0x1F23F}, - {0x1F249, 0x1F3FA}, - {0x1F400, 0x1F53D}, - {0x1F546, 0x1F64F}, - {0x1F680, 0x1F6FF}, - {0x1F774, 0x1F77F}, - {0x1F7D5, 0x1F7FF}, - {0x1F80C, 0x1F80F}, - {0x1F848, 0x1F84F}, - {0x1F85A, 0x1F85F}, - {0x1F888, 0x1F88F}, - {0x1F8AE, 0x1F8FF}, - {0x1F90C, 0x1F93A}, - {0x1F93C, 0x1F945}, - {0x1F947, 0x1FFFD}, + 0, 0, 0, 0, 33, 3, 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, 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, 84,118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 7, 9, 10, 11, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 7, 7, 7, 14, 15, 16, 17, 18, 19, 20, 7, 7, 7, 7, 7, 21, + 7, 7, 7, 7, 22, 23, 7, 7, 7, 24, 7, 14, 0, 25, 0, 26, + 27, 28, 29, 14, 30, 31, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 1, 0, 2, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 7, 3, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, + 159,255,243,255,255,255,255,255,255,255,255,255,255,255,255,255, + 31, 0,255,255,255,255,255,255, 31,255, 3, 0, 0, 0, 8, 0, + 0, 0, 24, 0,120, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 96, 0, 0, 8, 0, 0, 0, 0, + 255,255,255,255,255,255,255,127, 0, 96, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,240, 1, 64, 0, 0,254, 3, 0,224,255,255, + 255,255,255,255, 31, 0, 0, 0,254,127, 0, 0, 0, 0,252,115, + 0,254,255,255,255,255,255,255,255,255,255,255,255,255,255, 3, + 255,255,255,255,255,255,255, 31,192,255,255,255,255,255,255,255, + 255,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,127, + 0, 0,224,255,255,255,255,127, 0,112, 0, 0, 0, 0, 0, 0, + 0,127, 0,124, 0, 0, 0, 0, 0,127, 0, 0, 0,192,255,255, + 0,240,255,255,255,255,255,243,159,255,255,255,255,255,255,255, }; +static inline unsigned +_hb_emoji_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline unsigned +_hb_emoji_b1 (const uint8_t* a, unsigned i) +{ + return (a[i>>3]>>((i&7u)<<0))&1u; +} +static inline uint_fast8_t +_hb_emoji_is_Extended_Pictographic (unsigned u) +{ + return u<131069u?_hb_emoji_b1(192+_hb_emoji_u8,((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>6>>4))<<4)+((u>>6)&15u))])<<6)+((u)&63u)):0; +} + + #endif /* HB_UNICODE_EMOJI_TABLE_HH */ /* == End of generated table == */ diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index eb9451c60..56f1c62c8 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -577,9 +577,6 @@ _hb_modified_combining_class[256] = bool _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp) { - return hb_bsearch (&cp, _hb_unicode_emoji_Extended_Pictographic_table, - ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table), - sizeof (hb_unicode_range_t), - hb_unicode_range_t::cmp); + return _hb_emoji_is_Extended_Pictographic (cp); } #endif From 7298716a3cfbdabedd15960404623317a64db3ae Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 14:51:17 -0700 Subject: [PATCH 572/617] [config] Compile out modified combining-class if HB_NO_OT_SHAPE Part of https://github.com/harfbuzz/harfbuzz/issues/1652 --- src/hb-unicode.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 56f1c62c8..be87759a9 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -453,6 +453,7 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, #endif +#ifndef HB_NO_OT_SHAPE /* See hb-unicode.hh for details. */ const uint8_t _hb_modified_combining_class[256] = @@ -565,6 +566,7 @@ _hb_modified_combining_class[256] = 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ }; +#endif /* From cd65305b059e7495f4f993d25cfda4d88781589b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jun 2019 14:57:48 -0700 Subject: [PATCH 573/617] [config] Don't disable emoji sequences in HB_TINY It makes sense to disable this code these if editing is not needed. However, this is also necessary to correctly display emoji sequences in right-to-left direction. For that reason, don't auto-disable it. --- src/hb-config.hh | 1 - src/hb-ot-shape.cc | 2 +- src/hb-unicode.cc | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hb-config.hh b/src/hb-config.hh index 6a95501d7..adf2b3348 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -58,7 +58,6 @@ #define HB_NO_BITMAP #define HB_NO_CFF #define HB_NO_COLOR -#define HB_NO_EMOJI #define HB_NO_FACE_COLLECT_UNICODES #define HB_NO_GETENV #define HB_NO_HINTING diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 7ae0925a0..c8bda2aad 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -479,7 +479,7 @@ hb_set_unicode_props (hb_buffer_t *buffer) { _hb_glyph_info_set_continuation (&info[i]); } -#ifndef HB_NO_EMOJI +#ifndef HB_NO_EMOJI_SEQUENCES else if (unlikely (_hb_glyph_info_is_zwj (&info[i]))) { _hb_glyph_info_set_continuation (&info[i]); diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index be87759a9..ed4fb7782 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -572,7 +572,7 @@ _hb_modified_combining_class[256] = /* * Emoji */ -#ifndef HB_NO_EMOJI +#ifndef HB_NO_EMOJI_SEQUENCES #include "hb-unicode-emoji-table.hh" From 01832fd16b605971466fc3b174cb932787ef4bfb Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Wed, 26 Jun 2019 15:58:38 -0700 Subject: [PATCH 574/617] alternate fix for https://crbug.com/971933 --- src/hb-cff-interp-cs-common.hh | 6 +++--- src/hb-cff1-interp-cs.hh | 2 +- src/hb-cff2-interp-cs.hh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 1cfbba603..cf9ce4dc3 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -62,9 +62,9 @@ struct call_stack_t : stack_t {}; template struct biased_subrs_t { - void init (const SUBRS &subrs_) + void init (const SUBRS *subrs_) { - subrs = &subrs_; + subrs = subrs_; unsigned int nSubrs = get_count (); if (nSubrs < 1240) bias = 107; @@ -118,7 +118,7 @@ struct point_t template struct cs_interp_env_t : interp_env_t { - void init (const byte_str_t &str, const SUBRS &globalSubrs_, const SUBRS &localSubrs_) + void init (const byte_str_t &str, const SUBRS *globalSubrs_, const SUBRS *localSubrs_) { interp_env_t::init (str); diff --git a/src/hb-cff1-interp-cs.hh b/src/hb-cff1-interp-cs.hh index cc528564c..1c8762c17 100644 --- a/src/hb-cff1-interp-cs.hh +++ b/src/hb-cff1-interp-cs.hh @@ -40,7 +40,7 @@ struct cff1_cs_interp_env_t : cs_interp_env_t template void init (const byte_str_t &str, ACC &acc, unsigned int fd) { - SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs); + SUPER::init (str, acc.globalSubrs, acc.privateDicts[fd].localSubrs); processed_width = false; has_width = false; arg_start = 0; diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh index 1faf20831..a72100e1a 100644 --- a/src/hb-cff2-interp-cs.hh +++ b/src/hb-cff2-interp-cs.hh @@ -82,7 +82,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t void init (const byte_str_t &str, ACC &acc, unsigned int fd, const int *coords_=nullptr, unsigned int num_coords_=0) { - SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs); + SUPER::init (str, acc.globalSubrs, acc.privateDicts[fd].localSubrs); coords = coords_; num_coords = num_coords_; From 8341c0b304ee3bb0b7d150bcfb42a8b9e6448687 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Thu, 27 Jun 2019 08:43:31 -0700 Subject: [PATCH 575/617] add test case file --- ...se-minimized-harfbuzz_fuzzer-5093685255077888 | Bin 0 -> 1160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5093685255077888 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5093685255077888 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5093685255077888 new file mode 100644 index 0000000000000000000000000000000000000000..e65025e1655b04232a11c80171bf9ed351030984 GIT binary patch literal 1160 zcmZuxU1%It6h3!mchY31n{JZ^rTMv)6(lw>hN7Yco5ptAre@1-EqyY3yK}QU>F&&Q zX0kLdA{0bxgbE@)i3F?=Ldi?PN2w)N5C!qk(o$dYVEdra9Zbyn-P!g*?S(VveCM3| zoipd&nf&R~c}mmUq*H0~=u!U5wfBaJv{gtWcPd|`J=8^%e1?e3T=9*=-+Esgzz2xf zr}^S@;~!1;bi%d}FP+I3a{2{WWc-B3j&faiyN$CRxcY&^suY&-%J5m(8;}>OaG3Xv zFR=d*aJE_xFQ!+w{{-F-+*=nHJxZQ}Nxwo2N7QBV*v=~AH-XQ1ZVgnE0p<IddlnA z1+0^%yfD^jWY%>Y;fa3z6Xp54p}2If^)A~;eTh9H<;CnO_-G|5p?|}!pz;pwvZmgC zs;$|ZG{%mg`;=-*tuc^2d*`64+NbcuYln}puM)7@H4-ngvC=5(P%&*tyA8z&=Yb9f z(I-oEqB_p+p{?O$hiRHz3L%_|B*>uv)+C*vDd+-8s?a>u5b^(mKtpk9=CqF3&0$mDertPW zfGFkR(XlJJ`0)UJaOqZh(Hw%K)iR%os5|O3pN{6tY}A{f4#te-&#vFN-JG!8bMm+) zozM;!CS7mAw=30cnfX6XjTnIv05BPDX?E0STi%?ple4-E(y@@CW$^XigO) literal 0 HcmV?d00001 From d42264f151a61a4a77e5d5712e535fc6e2daf338 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Wed, 26 Jun 2019 21:10:11 -0400 Subject: [PATCH 576/617] Test at least one character per Unicode version --- test/api/test-unicode.c | 142 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 4 deletions(-) diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c index 0587c6e7f..ac34fcbb5 100644 --- a/test/api/test-unicode.c +++ b/test/api/test-unicode.c @@ -157,6 +157,27 @@ static const test_pair_t combining_class_tests_more[] = /* Unicode-6.0 character additions */ { 0x135D, 230 }, + /* Unicode-6.1 character additions */ + { 0xA674, 230 }, + + /* Unicode-7.0 character additions */ + { 0x1AB0, 230 }, + + /* Unicode-8.0 character additions */ + { 0xA69E, 230 }, + + /* Unicode-9.0 character additions */ + { 0x1E000, 230 }, + + /* Unicode-10.0 character additions */ + { 0x1DF6, 232 }, + + /* Unicode-11.0 character additions */ + { 0x07FD, 220 }, + + /* Unicode-12.0 character additions */ + { 0x0EBA, 9 }, + { 0x111111, 0 } }; @@ -204,6 +225,36 @@ static const test_pair_t general_category_tests_more[] = /* Unicode-6.0 character additions */ { 0x0620, HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER }, + /* Unicode-6.1 character additions */ + { 0x058F, HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL }, + + /* Unicode-6.2 character additions */ + { 0x20BA, HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL }, + + /* Unicode-6.3 character additions */ + { 0x061C, HB_UNICODE_GENERAL_CATEGORY_FORMAT }, + + /* Unicode-7.0 character additions */ + { 0x058D, HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL }, + + /* Unicode-8.0 character additions */ + { 0x08E3, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK }, + + /* Unicode-9.0 character additions */ + { 0x08D4, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK }, + + /* Unicode-10.0 character additions */ + { 0x09FD, HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION }, + + /* Unicode-11.0 character additions */ + { 0x0560, HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER }, + + /* Unicode-12.0 character additions */ + { 0x0C77, HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION }, + + /* Unicode-12.1 character additions */ + { 0x32FF, HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL }, + { 0x111111, HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED } }; @@ -242,7 +293,12 @@ static const test_pair_t mirroring_tests[] = }; static const test_pair_t mirroring_tests_more[] = { - /* No new mirroring characters have been encoded in recent Unicode versions. */ + /* Unicode-6.1 character additions */ + { 0x27CB, 0x27CD }, + + /* Unicode-11.0 character additions */ + { 0x2BFE, 0x221F }, + { 0x111111, 0x111111 } }; @@ -342,8 +398,10 @@ static const test_pair_t script_tests_more[] = /* Unicode-5.2 additions */ { 0x10B00, HB_SCRIPT_AVESTAN }, { 0xA6A0, HB_SCRIPT_BAMUM }, + { 0x1400, HB_SCRIPT_CANADIAN_ABORIGINAL }, { 0x13000, HB_SCRIPT_EGYPTIAN_HIEROGLYPHS }, { 0x10840, HB_SCRIPT_IMPERIAL_ARAMAIC }, + { 0x1CED, HB_SCRIPT_INHERITED }, { 0x10B60, HB_SCRIPT_INSCRIPTIONAL_PAHLAVI }, { 0x10B40, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN }, { 0xA980, HB_SCRIPT_JAVANESE }, @@ -361,9 +419,85 @@ static const test_pair_t script_tests_more[] = { 0x11000, HB_SCRIPT_BRAHMI }, { 0x0840, HB_SCRIPT_MANDAIC }, - /* Unicode-5.2 character additions */ - { 0x1CED, HB_SCRIPT_INHERITED }, - { 0x1400, HB_SCRIPT_CANADIAN_ABORIGINAL }, + /* Unicode-6.1 additions */ + { 0x10980, HB_SCRIPT_MEROITIC_HIEROGLYPHS }, + { 0x109A0, HB_SCRIPT_MEROITIC_CURSIVE }, + { 0x110D0, HB_SCRIPT_SORA_SOMPENG }, + { 0x11100, HB_SCRIPT_CHAKMA }, + { 0x11180, HB_SCRIPT_SHARADA }, + { 0x11680, HB_SCRIPT_TAKRI }, + { 0x16F00, HB_SCRIPT_MIAO }, + + /* Unicode-6.2 additions */ + { 0x20BA, HB_SCRIPT_COMMON }, + + /* Unicode-6.3 additions */ + { 0x2066, HB_SCRIPT_COMMON }, + + /* Unicode-7.0 additions */ + { 0x10350, HB_SCRIPT_OLD_PERMIC }, + { 0x10500, HB_SCRIPT_ELBASAN }, + { 0x10530, HB_SCRIPT_CAUCASIAN_ALBANIAN }, + { 0x10600, HB_SCRIPT_LINEAR_A }, + { 0x10860, HB_SCRIPT_PALMYRENE }, + { 0x10880, HB_SCRIPT_NABATAEAN }, + { 0x10A80, HB_SCRIPT_OLD_NORTH_ARABIAN }, + { 0x10AC0, HB_SCRIPT_MANICHAEAN }, + { 0x10B80, HB_SCRIPT_PSALTER_PAHLAVI }, + { 0x11150, HB_SCRIPT_MAHAJANI }, + { 0x11200, HB_SCRIPT_KHOJKI }, + { 0x112B0, HB_SCRIPT_KHUDAWADI }, + { 0x11300, HB_SCRIPT_GRANTHA }, + { 0x11480, HB_SCRIPT_TIRHUTA }, + { 0x11580, HB_SCRIPT_SIDDHAM }, + { 0x11600, HB_SCRIPT_MODI }, + { 0x118A0, HB_SCRIPT_WARANG_CITI }, + { 0x11AC0, HB_SCRIPT_PAU_CIN_HAU }, + { 0x16A40, HB_SCRIPT_MRO }, + { 0x16AD0, HB_SCRIPT_BASSA_VAH }, + { 0x16B00, HB_SCRIPT_PAHAWH_HMONG }, + { 0x1BC00, HB_SCRIPT_DUPLOYAN }, + { 0x1E800, HB_SCRIPT_MENDE_KIKAKUI }, + + /* Unicode-8.0 additions */ + { 0x108E0, HB_SCRIPT_HATRAN }, + { 0x10C80, HB_SCRIPT_OLD_HUNGARIAN }, + { 0x11280, HB_SCRIPT_MULTANI }, + { 0x11700, HB_SCRIPT_AHOM }, + { 0x14400, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS }, + { 0x1D800, HB_SCRIPT_SIGNWRITING }, + + /* Unicode-9.0 additions */ + { 0x104B0, HB_SCRIPT_OSAGE }, + { 0x11400, HB_SCRIPT_NEWA }, + { 0x11C00, HB_SCRIPT_BHAIKSUKI }, + { 0x11C70, HB_SCRIPT_MARCHEN }, + { 0x17000, HB_SCRIPT_TANGUT }, + { 0x1E900, HB_SCRIPT_ADLAM }, + + /* Unicode-10.0 additions */ + { 0x11A00, HB_SCRIPT_ZANABAZAR_SQUARE }, + { 0x11A50, HB_SCRIPT_SOYOMBO }, + { 0x11D00, HB_SCRIPT_MASARAM_GONDI }, + { 0x1B170, HB_SCRIPT_NUSHU }, + + /* Unicode-11.0 additions */ + { 0x10D00, HB_SCRIPT_HANIFI_ROHINGYA }, + { 0x10F00, HB_SCRIPT_OLD_SOGDIAN }, + { 0x10F30, HB_SCRIPT_SOGDIAN }, + { 0x11800, HB_SCRIPT_DOGRA }, + { 0x11D60, HB_SCRIPT_GUNJALA_GONDI }, + { 0x11EE0, HB_SCRIPT_MAKASAR }, + { 0x16E40, HB_SCRIPT_MEDEFAIDRIN }, + + /* Unicode-12.0 additions */ + { 0x10FE0, HB_SCRIPT_ELYMAIC }, + { 0x119A0, HB_SCRIPT_NANDINAGARI }, + { 0x1E100, HB_SCRIPT_NYIAKENG_PUACHUE_HMONG }, + { 0x1E2C0, HB_SCRIPT_WANCHO }, + + /* Unicode-12.1 additions */ + { 0x32FF, HB_SCRIPT_COMMON }, { 0x111111, HB_SCRIPT_UNKNOWN } }; From f53590971c5326dd15f4296764bfd1255ec0506a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jun 2019 13:42:51 -0700 Subject: [PATCH 577/617] [test] Make Unicode tests strict against internal UCD https://github.com/harfbuzz/harfbuzz/pull/1799 --- test/api/test-unicode.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c index ac34fcbb5..4376fd05f 100644 --- a/test/api/test-unicode.c +++ b/test/api/test-unicode.c @@ -547,7 +547,7 @@ static const property_t properties[] = #undef PROPERTY static void -test_unicode_properties (gconstpointer user_data) +test_unicode_properties (gconstpointer user_data, hb_bool_t lenient) { hb_unicode_funcs_t *uf = (hb_unicode_funcs_t *) user_data; unsigned int i, j; @@ -571,16 +571,30 @@ test_unicode_properties (gconstpointer user_data) tests = p->tests_more; for (j = 0; j < p->num_tests_more; j++) { g_test_message ("Test %s more #%d: U+%04X", p->name, j, tests[j].unicode); - if (p->getter (uf, tests[j].unicode) != tests[j].value) { - g_test_message ("Soft fail: Received %x, expected %x", p->getter (uf, tests[j].unicode), tests[j].value); - failed = TRUE; + if (lenient) { + if (p->getter (uf, tests[j].unicode) != tests[j].value) { + g_test_message ("Soft fail: Received %x, expected %x", p->getter (uf, tests[j].unicode), tests[j].value); + failed = TRUE; + } } + else + g_assert_cmphex (p->getter (uf, tests[j].unicode), ==, tests[j].value); } } if (failed) g_test_message ("Some property tests failed. You probably have an old version of one of the libraries used."); } +static void +test_unicode_properties_lenient (gconstpointer user_data) +{ + test_unicode_properties (user_data, TRUE); +} +static void +test_unicode_properties_strict (gconstpointer user_data) +{ + test_unicode_properties (user_data, FALSE); +} static hb_codepoint_t default_value (hb_codepoint_t _default_value, hb_codepoint_t unicode) @@ -663,7 +677,7 @@ test_unicode_chainup (void) g_assert (!hb_unicode_funcs_is_immutable (uf2)); hb_unicode_funcs_make_immutable (uf2); - test_unicode_properties (uf2); + test_unicode_properties_strict (uf2); hb_unicode_funcs_destroy (uf2); @@ -934,16 +948,16 @@ main (int argc, char **argv) hb_test_add (test_unicode_properties_nil); hb_test_add (test_unicode_properties_empty); - hb_test_add_data_flavor (hb_unicode_funcs_get_default (), "default", test_unicode_properties); + hb_test_add_data_flavor (hb_unicode_funcs_get_default (), "default", test_unicode_properties_strict); hb_test_add_data_flavor (hb_unicode_funcs_get_default (), "default", test_unicode_normalization); hb_test_add_data_flavor ((gconstpointer) script_roundtrip_default, "default", test_unicode_script_roundtrip); #ifdef HAVE_GLIB - hb_test_add_data_flavor (hb_glib_get_unicode_funcs (), "glib", test_unicode_properties); + hb_test_add_data_flavor (hb_glib_get_unicode_funcs (), "glib", test_unicode_properties_lenient); hb_test_add_data_flavor (hb_glib_get_unicode_funcs (), "glib", test_unicode_normalization); hb_test_add_data_flavor ((gconstpointer) script_roundtrip_glib, "glib", test_unicode_script_roundtrip); #endif #ifdef HAVE_ICU - hb_test_add_data_flavor (hb_icu_get_unicode_funcs (), "icu", test_unicode_properties); + hb_test_add_data_flavor (hb_icu_get_unicode_funcs (), "icu", test_unicode_properties_lenient); hb_test_add_data_flavor (hb_icu_get_unicode_funcs (), "icu", test_unicode_normalization); hb_test_add_data_flavor ((gconstpointer) script_roundtrip_icu, "icu", test_unicode_script_roundtrip); #endif From 8d36ef50c8712be476572514d73b7bddf43e5951 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jun 2019 14:48:10 -0700 Subject: [PATCH 578/617] [config] Add links --- CONFIG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONFIG.md b/CONFIG.md index bf14a6df4..46971b0f2 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -40,7 +40,11 @@ Finally, if you are making a static library build or otherwise linking the library into your app, make sure your linker removes unused functions. This can be tricky and differ from environment to environment, but you definitely want to make sure this happens. Otherwise, every unused public function will -be adding unneeded bytes to your binary. +be adding unneeded bytes to your binary. The following pointers might come +handy: + + * https://lwn.net/Articles/741494/ (all of the four-part series) + * https://elinux.org/images/2/2d/ELC2010-gc-sections_Denys_Vlasenko.pdf Combining the above three build options should already shrink your library a lot. The rest of this file shows you ways to shrink the library even further at the From 9a7b7bd9fc5bde7796ffdd997ee65cb33cbf6b29 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 28 Jun 2019 22:53:51 +0430 Subject: [PATCH 579/617] style fix for pylint complain --- src/gen-emoji-table.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gen-emoji-table.py b/src/gen-emoji-table.py index 22da22811..49770d4fd 100755 --- a/src/gen-emoji-table.py +++ b/src/gen-emoji-table.py @@ -53,19 +53,19 @@ print () print ('#include "hb-unicode.hh"') print () -for typ,s in ranges.items(): +for typ, s in ranges.items(): if typ != "Extended_Pictographic": continue - arr = dict() - for start,end in s: - for i in range(start,end): - arr[i] = 1 + arr = dict() + for start,end in s: + for i in range(start,end): + arr[i] = 1 - sol = packTab.pack_table(arr, 0, compression=3) - code = packTab.Code('_hb_emoji') - sol.genCode(code, 'is_'+typ) - code.print_c(linkage='static inline') - print() + sol = packTab.pack_table(arr, 0, compression=3) + code = packTab.Code('_hb_emoji') + sol.genCode(code, 'is_'+typ) + code.print_c(linkage='static inline') + print() print () print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */") From 9db7ce73d7ac6566837cdd70d38c45f3aefd7769 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 28 Jun 2019 23:11:52 +0430 Subject: [PATCH 580/617] minor style improve in hb-cff-interp-common.hh --- src/hb-cff-interp-common.hh | 91 ++++++++++++------------------------- 1 file changed, 30 insertions(+), 61 deletions(-) diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh index c5157c783..948772b0e 100644 --- a/src/hb-cff-interp-common.hh +++ b/src/hb-cff-interp-common.hh @@ -226,7 +226,7 @@ struct number_t void set_fixed (int32_t v) { value = v / 65536.0; } int32_t to_fixed () const { return (int32_t) (value * 65536.0); } - void set_real (double v) { value = v; } + void set_real (double v) { value = v; } double to_real () const { return value; } int ceil () const { return (int) ::ceil (value); } @@ -235,17 +235,10 @@ struct number_t bool in_int_range () const { return ((double) (int16_t) to_int () == value); } - bool operator > (const number_t &n) const - { return value > n.to_real (); } - - bool operator < (const number_t &n) const - { return n > *this; } - - bool operator >= (const number_t &n) const - { return !(*this < n); } - - bool operator <= (const number_t &n) const - { return !(*this > n); } + bool operator > (const number_t &n) const { return value > n.to_real (); } + bool operator < (const number_t &n) const { return n > *this; } + bool operator >= (const number_t &n) const { return !(*this < n); } + bool operator <= (const number_t &n) const { return !(*this > n); } const number_t &operator += (const number_t &n) { @@ -255,7 +248,7 @@ struct number_t } protected: - double value; + double value; }; /* byte string */ @@ -308,7 +301,7 @@ struct byte_str_t : hb_ubytes_t : hb_ubytes_t (s, l) {} byte_str_t (const hb_ubytes_t &ub) /* conversion from hb_ubytes_t */ : hb_ubytes_t (ub) {} - + /* sub-string */ byte_str_t sub_str (unsigned int offset, unsigned int len_) const { return byte_str_t (hb_ubytes_t::sub_array (offset, len_)); } @@ -320,8 +313,7 @@ struct byte_str_t : hb_ubytes_t /* A byte string associated with the current offset and an error condition */ struct byte_str_ref_t { - byte_str_ref_t () - { init (); } + byte_str_ref_t () { init (); } void init () { @@ -343,13 +335,12 @@ struct byte_str_ref_t } const unsigned char& operator [] (int i) { - if (unlikely ((unsigned int)(offset + i) >= str.length)) + if (unlikely ((unsigned int) (offset + i) >= str.length)) { set_error (); - return Null(unsigned char); + return Null (unsigned char); } - else - return str[offset + i]; + return str[offset + i]; } /* Conversion to byte_str_t */ @@ -359,9 +350,7 @@ struct byte_str_ref_t { return str.sub_str (offset_, len_); } bool avail (unsigned int count=1) const - { - return (!in_error () && str.check_limit (offset, count)); - } + { return (!in_error () && str.check_limit (offset, count)); } void inc (unsigned int count=1) { if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length))) @@ -400,11 +389,7 @@ struct stack_t for (unsigned int i = 0; i < elements.length; i++) elements[i].init (); } - - void fini () - { - elements.fini_deep (); - } + void fini () { elements.fini_deep (); } ELEM& operator [] (unsigned int i) { @@ -419,7 +404,6 @@ struct stack_t else set_error (); } - ELEM &push () { if (likely (count < elements.length)) @@ -441,7 +425,6 @@ struct stack_t return Crap(ELEM); } } - void pop (unsigned int n) { if (likely (count >= n)) @@ -452,13 +435,12 @@ struct stack_t const ELEM& peek () { - if (likely (count > 0)) - return elements[count-1]; - else + if (unlikely (count < 0)) { set_error (); return Null(ELEM); } + return elements[count - 1]; } void unpop () @@ -475,7 +457,7 @@ struct stack_t void set_error () { error = true; } unsigned int get_count () const { return count; } - bool is_empty () const { return count == 0; } + bool is_empty () const { return !count; } static constexpr unsigned kSizeLimit = LIMIT; @@ -519,7 +501,7 @@ struct arg_stack_t : stack_t i = 0; S::set_error (); } - return (unsigned)i; + return (unsigned) i; } void push_longint_from_substr (byte_str_ref_t& str_ref) @@ -538,9 +520,7 @@ struct arg_stack_t : stack_t } hb_array_t get_subarray (unsigned int start) const - { - return S::elements.sub_array (start); - } + { return S::elements.sub_array (start); } private: typedef stack_t S; @@ -605,7 +585,7 @@ struct parsed_values_t } unsigned get_count () const { return values.length; } - const VAL &get_value (unsigned int i) const { return values[i]; } + const VAL &get_value (unsigned int i) const { return values[i]; } const VAL &operator [] (unsigned int i) const { return get_value (i); } unsigned int opStart; @@ -644,30 +624,19 @@ struct interp_env_t return op; } - const ARG& eval_arg (unsigned int i) - { - return argStack[i]; - } + const ARG& eval_arg (unsigned int i) { return argStack[i]; } - ARG& pop_arg () - { - return argStack.pop (); - } + ARG& pop_arg () { return argStack.pop (); } + void pop_n_args (unsigned int n) { argStack.pop (n); } - void pop_n_args (unsigned int n) - { - argStack.pop (n); - } + void clear_args () { pop_n_args (argStack.get_count ()); } - void clear_args () - { - pop_n_args (argStack.get_count ()); - } - - byte_str_ref_t str_ref; - arg_stack_t argStack; + byte_str_ref_t + str_ref; + arg_stack_t + argStack; protected: - bool error; + bool error; }; typedef interp_env_t<> num_interp_env_t; @@ -711,8 +680,8 @@ struct opset_t }; template -struct interpreter_t { - +struct interpreter_t +{ ~interpreter_t() { fini (); } void fini () { env.fini (); } From ddd29e5594ccc9d0281e6da7373a1f115f6f6f3a Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 28 Jun 2019 23:44:14 +0430 Subject: [PATCH 581/617] minor, reuse StructAtOffset logic in StructAtOffsetOrNull --- src/hb-ot-cff-common.hh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index 8b8e59201..e89fd1e0d 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -40,14 +40,14 @@ using namespace OT; /* utility macro */ template -static inline const Type& StructAtOffsetOrNull(const void *P, unsigned int offset) -{ return offset? (* reinterpret_cast ((const char *) P + offset)): Null(Type); } +static inline const Type& StructAtOffsetOrNull (const void *P, unsigned int offset) +{ return offset ? StructAtOffset (P, offset) : Null (Type); } -inline unsigned int calcOffSize(unsigned int dataSize) +inline unsigned int calcOffSize (unsigned int dataSize) { unsigned int size = 1; unsigned int offset = dataSize + 1; - while ((offset & ~0xFF) != 0) + while (offset & ~0xFF) { size++; offset >>= 8; @@ -58,8 +58,8 @@ inline unsigned int calcOffSize(unsigned int dataSize) struct code_pair_t { - hb_codepoint_t code; - hb_codepoint_t glyph; + hb_codepoint_t code; + hb_codepoint_t glyph; }; typedef hb_vector_t str_buff_t; From 3f806673fbeacdbe1b31399394ccc26c773a794b Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Sat, 29 Jun 2019 00:00:00 +0430 Subject: [PATCH 582/617] Apply some minor improves on CFFIndex --- src/hb-ot-cff-common.hh | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh index e89fd1e0d..aced77c83 100644 --- a/src/hb-ot-cff-common.hh +++ b/src/hb-ot-cff-common.hh @@ -92,10 +92,8 @@ struct CFFIndex static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count, unsigned int dataSize) { - if (count == 0) - return COUNT::static_size; - else - return min_size + calculate_offset_array_size (offSize_, count) + dataSize; + if (count == 0) return COUNT::static_size; + return min_size + calculate_offset_array_size (offSize_, count) + dataSize; } bool serialize (hb_serialize_context_t *c, const CFFIndex &src) @@ -159,9 +157,7 @@ struct CFFIndex byteArray.init (); byteArray.resize (buffArray.length); for (unsigned int i = 0; i < byteArray.length; i++) - { byteArray[i] = byte_str_t (buffArray[i].arrayZ, buffArray[i].length); - } bool result = this->serialize (c, offSize_, byteArray); byteArray.fini (); return result; @@ -192,43 +188,35 @@ struct CFFIndex unsigned int length_at (unsigned int index) const { - if (likely ((offset_at (index + 1) >= offset_at (index)) && - (offset_at (index + 1) <= offset_at (count)))) - return offset_at (index + 1) - offset_at (index); - else + if (unlikely ((offset_at (index + 1) < offset_at (index)) || + (offset_at (index + 1) > offset_at (count)))) return 0; + return offset_at (index + 1) - offset_at (index); } const unsigned char *data_base () const - { return (const unsigned char *)this + min_size + offset_array_size (); } + { return (const unsigned char *) this + min_size + offset_array_size (); } unsigned int data_size () const { return HBINT8::static_size; } byte_str_t operator [] (unsigned int index) const { - if (likely (index < count)) - return byte_str_t (data_base () + offset_at (index) - 1, length_at (index)); - else - return Null (byte_str_t); + if (unlikely (index >= count)) return Null (byte_str_t); + return byte_str_t (data_base () + offset_at (index) - 1, length_at (index)); } unsigned int get_size () const { - if (this != &Null (CFFIndex)) - { - if (count > 0) - return min_size + offset_array_size () + (offset_at (count) - 1); - else - return count.static_size; /* empty CFFIndex contains count only */ - } - else - return 0; + if (this == &Null (CFFIndex)) return 0; + if (count > 0) + return min_size + offset_array_size () + (offset_at (count) - 1); + return count.static_size; /* empty CFFIndex contains count only */ } bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely ((count.sanitize (c) && count == 0) || /* empty INDEX */ + return_trace (likely ((c->check_struct (this) && count == 0) || /* empty INDEX */ (c->check_struct (this) && offSize >= 1 && offSize <= 4 && c->check_array (offsets, offSize, count + 1) && c->check_array ((const HBUINT8*) data_base (), 1, max_offset () - 1)))); From ad341d5f1624f4e30b2d0eb2a171054a973053b5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 28 Jun 2019 16:00:37 -0700 Subject: [PATCH 583/617] [config] Fix CoreText build with NO_AAT --- src/hb-aat-layout.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index c08bb11f4..4e506de16 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -75,9 +75,6 @@ AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) #endif -#ifndef HB_NO_AAT - - /** * SECTION:hb-aat-layout * @title: hb-aat-layout @@ -88,6 +85,8 @@ AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) **/ +#if !defined(HB_NO_AAT) || defined(HAVE_CORETEXT) + /* Table data courtesy of Apple. Converted from mnemonics to integers * when moving to this file. */ static const hb_aat_feature_mapping_t feature_mappings[] = @@ -179,8 +178,11 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) sizeof (feature_mappings[0]), hb_aat_feature_mapping_t::cmp); } +#endif +#ifndef HB_NO_AAT + /* * mort/morx/kerx/trak */ From 601b6825b05f67354b48dd3629b95e0d8bf68a14 Mon Sep 17 00:00:00 2001 From: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Sun, 30 Jun 2019 15:03:44 +0200 Subject: [PATCH 584/617] Dynamically load DWRITE Also checks if DWriteCreateFactory() has been executed successfully. --- src/hb-directwrite.cc | 45 +++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 9b851148b..1f00aa478 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -33,6 +33,13 @@ #include "hb-directwrite.h" +/* Declare object creator for dynamic support of DWRITE */ +typedef HRESULT (* WINAPI t_DWriteCreateFactory)( + DWRITE_FACTORY_TYPE factoryType, + REFIID iid, + IUnknown **factory +); + /* * hb-directwrite uses new/delete syntatically but as we let users * to override malloc/free, we will redefine new/delete so users @@ -138,6 +145,7 @@ public: struct hb_directwrite_face_data_t { + HMODULE dwrite_dll; IDWriteFactory *dwriteFactory; IDWriteFontFile *fontFile; DWriteFontFileStream *fontFileStream; @@ -153,12 +161,33 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) if (unlikely (!data)) return nullptr; - // TODO: factory and fontFileLoader should be cached separately - IDWriteFactory* dwriteFactory; - DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), - (IUnknown**) &dwriteFactory); +#define FAIL(...) \ + HB_STMT_START { \ + DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \ + return nullptr; \ + } HB_STMT_END + + data->dwrite_dll = LoadLibrary(TEXT("DWRITE")); + if (data->dwrite_dll == NULL) + FAIL ("Cannot find DWrite.DLL"); + + t_DWriteCreateFactory p_DWriteCreateFactory; + + p_DWriteCreateFactory = (t_DWriteCreateFactory) + GetProcAddress(data->dwrite_dll, "DWriteCreateFactory"); + if (p_DWriteCreateFactory == NULL) + FAIL ("Cannot find DWriteCreateFactory()."); HRESULT hr; + + // TODO: factory and fontFileLoader should be cached separately + IDWriteFactory* dwriteFactory; + hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), + (IUnknown**) &dwriteFactory); + + if (hr != S_OK) + FAIL ("Failed to run DWriteCreateFactory()."); + hb_blob_t *blob = hb_face_reference_blob (face); DWriteFontFileStream *fontFileStream; fontFileStream = new DWriteFontFileStream ((uint8_t *) hb_blob_get_data (blob, nullptr), @@ -172,12 +201,6 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) hr = dwriteFactory->CreateCustomFontFileReference (&fontFileKey, sizeof (fontFileKey), fontFileLoader, &fontFile); -#define FAIL(...) \ - HB_STMT_START { \ - DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \ - return nullptr; \ - } HB_STMT_END - if (FAILED (hr)) FAIL ("Failed to load font file from data!"); @@ -224,6 +247,8 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data) delete data->fontFileStream; if (data->faceBlob) hb_blob_destroy (data->faceBlob); + if (data->dwrite_dll != NULL) + FreeLibrary(data->dwrite_dll); if (data) delete data; } From a4543d408b31376c38bab878b2f72d4323abc564 Mon Sep 17 00:00:00 2001 From: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Sun, 30 Jun 2019 15:06:30 +0200 Subject: [PATCH 585/617] Empty DIRECTWRITE_LIBS Not used anymore since DWRITE is loaded dynamically. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0dc672a81..09ce4e6ec 100644 --- a/configure.ac +++ b/configure.ac @@ -376,7 +376,7 @@ if test "x$with_directwrite" = "xyes" -a "x$have_directwrite" != "xtrue"; then fi if $have_directwrite; then DIRECTWRITE_CXXFLAGS= - DIRECTWRITE_LIBS="-ldwrite" + DIRECTWRITE_LIBS= AC_SUBST(DIRECTWRITE_CXXFLAGS) AC_SUBST(DIRECTWRITE_LIBS) AC_DEFINE(HAVE_DIRECTWRITE, 1, [Have DirectWrite library]) From 693dacbb1c0bc805e3e6aedaca5a57f04eb6ec9c Mon Sep 17 00:00:00 2001 From: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Mon, 1 Jul 2019 13:31:26 +0200 Subject: [PATCH 586/617] Use lower case file name with #include I tried to cross compile harfbuzz for Windows and an error was generated because `DWrite_1.h` was not found. This happened because the filesystem is case sensitive and for this reason that include file was not found. The right name of the file to be used is `dwrite_1.h`, with all letters not capitalized: https://docs.microsoft.com/en-us/windows/desktop/api/dwrite_1/ I also verified in the installation of VS2017 with Windows Kit v10 and in that place it was also lower case. So, in my opinion it should be better to change this. --- src/hb-directwrite.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 1f00aa478..1b2bd1964 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -28,7 +28,7 @@ #include "hb-shaper-impl.hh" -#include +#include #include "hb-directwrite.h" From 5ebd265e66cbcd167469837dcf8647484310dfb5 Mon Sep 17 00:00:00 2001 From: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Mon, 1 Jul 2019 16:06:43 +0200 Subject: [PATCH 587/617] Fix error rised by GCC8+ --- src/hb-directwrite.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 1b2bd1964..865100aa2 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -173,8 +173,18 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) t_DWriteCreateFactory p_DWriteCreateFactory; +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" +#endif + p_DWriteCreateFactory = (t_DWriteCreateFactory) GetProcAddress(data->dwrite_dll, "DWriteCreateFactory"); + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + if (p_DWriteCreateFactory == NULL) FAIL ("Cannot find DWriteCreateFactory()."); From 4ab2d1d6767568c45495be515e016805cce0c69a Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 1 Jul 2019 19:30:21 +0430 Subject: [PATCH 588/617] [dwrite] Apply minor style improves --- src/hb-directwrite.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 865100aa2..a625763da 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -167,8 +167,8 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) return nullptr; \ } HB_STMT_END - data->dwrite_dll = LoadLibrary(TEXT("DWRITE")); - if (data->dwrite_dll == NULL) + data->dwrite_dll = LoadLibrary (TEXT ("DWRITE")); + if (unlikely (!data->dwrite_dll)) FAIL ("Cannot find DWrite.DLL"); t_DWriteCreateFactory p_DWriteCreateFactory; @@ -179,13 +179,13 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) #endif p_DWriteCreateFactory = (t_DWriteCreateFactory) - GetProcAddress(data->dwrite_dll, "DWriteCreateFactory"); + GetProcAddress (data->dwrite_dll, "DWriteCreateFactory"); #if defined(__GNUC__) #pragma GCC diagnostic pop #endif - if (p_DWriteCreateFactory == NULL) + if (unlikely (!p_DWriteCreateFactory)) FAIL ("Cannot find DWriteCreateFactory()."); HRESULT hr; @@ -193,9 +193,9 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) // TODO: factory and fontFileLoader should be cached separately IDWriteFactory* dwriteFactory; hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), - (IUnknown**) &dwriteFactory); + (IUnknown**) &dwriteFactory); - if (hr != S_OK) + if (unlikely (hr != S_OK)) FAIL ("Failed to run DWriteCreateFactory()."); hb_blob_t *blob = hb_face_reference_blob (face); @@ -257,8 +257,8 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data) delete data->fontFileStream; if (data->faceBlob) hb_blob_destroy (data->faceBlob); - if (data->dwrite_dll != NULL) - FreeLibrary(data->dwrite_dll); + if (data->dwrite_dll) + FreeLibrary (data->dwrite_dll); if (data) delete data; } From 040b261deeed8924edcb087e27a61392d1f85023 Mon Sep 17 00:00:00 2001 From: Michiharu Ariza Date: Sun, 30 Jun 2019 16:13:07 -0700 Subject: [PATCH 589/617] add bimap test along with bug fix/tweaks --- src/Makefile.am | 6 +++- src/hb-bimap.hh | 4 +++ src/test-bimap.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/test-bimap.cc diff --git a/src/Makefile.am b/src/Makefile.am index 51f9aac88..d4ba39afc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -374,7 +374,7 @@ dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc dump_use_data_CPPFLAGS = $(HBCFLAGS) dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) -COMPILED_TESTS = test-algs test-iter test-meta test-ot-tag test-unicode-ranges +COMPILED_TESTS = test-algs test-iter test-meta test-ot-tag test-unicode-ranges test-bimap COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) check_PROGRAMS += $(COMPILED_TESTS) @@ -400,6 +400,10 @@ test_unicode_ranges_SOURCES = test-unicode-ranges.cc test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD) +test_bimap_SOURCES = test-bimap.cc hb-static.cc +test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_bimap_LDADD = $(COMPILED_TESTS_LDADD) + TESTS_ENVIRONMENT = \ srcdir="$(srcdir)" \ MAKE="$(MAKE) $(AM_MAKEFLAGS)" \ diff --git a/src/hb-bimap.hh b/src/hb-bimap.hh index 29291506a..a773951ab 100644 --- a/src/hb-bimap.hh +++ b/src/hb-bimap.hh @@ -28,6 +28,7 @@ #define HB_BIMAP_HH #include "hb.hh" +#include "hb-map.hh" /* Bi-directional map */ struct hb_bimap_t @@ -57,6 +58,8 @@ struct hb_bimap_t void set (hb_codepoint_t lhs, hb_codepoint_t rhs) { + if (unlikely (lhs == HB_MAP_VALUE_INVALID)) return; + if (unlikely (rhs == HB_MAP_VALUE_INVALID)) { del (lhs); return; } forw_map.set (lhs, rhs); back_map.set (rhs, lhs); } @@ -131,6 +134,7 @@ struct hb_inc_bimap_t : hb_bimap_t work.qsort (cmp_id); + clear (); for (hb_codepoint_t rhs = 0; rhs < count; rhs++) set (work[rhs], rhs); } diff --git a/src/test-bimap.cc b/src/test-bimap.cc new file mode 100644 index 000000000..1253d0c1d --- /dev/null +++ b/src/test-bimap.cc @@ -0,0 +1,76 @@ +/* + * Copyright © 2019 Adobe, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Adobe Author(s): Michiharu Ariza + */ + +#include "hb.hh" +#include "hb-bimap.hh" + +int +main (int argc, char **argv) +{ + hb_bimap_t bm; + + assert (bm.is_empty () == true); + bm.set (1, 4); + bm.set (2, 5); + bm.set (3, 6); + assert (bm.get_population () == 3); + assert (bm.has (1) == true); + assert (bm.has (4) == false); + assert (bm[2] == 5); + assert (bm.backward (6) == 3); + bm.del (1); + assert (bm.has (1) == false); + assert (bm.has (3) == true); + bm.clear (); + assert (bm.get_population () == 0); + + hb_inc_bimap_t ibm; + + assert (ibm.add (13) == 0); + assert (ibm.add (8) == 1); + assert (ibm.add (10) == 2); + assert (ibm.add (8) == 1); + assert (ibm.add (7) == 3); + assert (ibm.get_population () == 4); + assert (ibm[7] == 3); + + ibm.sort (); + assert (ibm.get_population () == 4); + assert (ibm[7] == 0); + assert (ibm[13] == 3); + + ibm.identity (3); + assert (ibm.get_population () == 3); + assert (ibm[0] == 0); + assert (ibm[1] == 1); + assert (ibm[2] == 2); + assert (ibm.backward (0) == 0); + assert (ibm.backward (1) == 1); + assert (ibm.backward (2) == 2); + assert (ibm.has (4) == false); + + return 0; +} From f1d20d9b4dcbeead3757650b9286393918b4be8a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 14:18:38 -0700 Subject: [PATCH 590/617] Add ucd-table make target --- src/Makefile.am | 23 +++++++++++++++-------- src/gen-ucd-table.py | 8 +++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index d4ba39afc..e7b279ddc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -253,31 +253,38 @@ GENERATORS = \ $(NULL) EXTRA_DIST += $(GENERATORS) -unicode-tables: arabic-table indic-table tag-table use-table emoji-table +unicode-tables: \ + arabic-table \ + emoji-table \ + indic-table \ + tag-table \ + ucd-table \ + use-table \ + emoji-table \ + $(NULL) arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \ || ($(RM) $(srcdir)/hb-ot-shape-complex-arabic-table.hh; false) - +emoji-table: gen-emoji-table.py emoji-data.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \ + || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false) indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false) - tag-table: gen-tag-table.py languagetags language-subtag-registry $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \ || ($(RM) $(srcdir)/hb-ot-tag-table.hh; false) - +ucd-table: gen-ucd-table.py ucd.nounihan.grouped.zip hb-common.h + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ucd-table.hh \ + || ($(RM) $(srcdir)/hb-ucd-table.hh; false) use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) - vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false) -emoji-table: gen-emoji-table.py emoji-data.txt - $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \ - || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false) built-sources: $(BUILT_SOURCES) diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py index a152375dd..552c3c675 100755 --- a/src/gen-ucd-table.py +++ b/src/gen-ucd-table.py @@ -6,8 +6,8 @@ import io, os.path, sys, re import logging logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) -if len (sys.argv) != 2: - print("usage: ./gen-ucd-table ucd.nounihan.grouped.xml", file=sys.stderr) +if len (sys.argv) not in (2, 3): + print("usage: ./gen-ucd-table ucd.nounihan.grouped.xml [/path/to/hb-common.h]", file=sys.stderr) sys.exit(1) # https://github.com/harfbuzz/packtab @@ -18,6 +18,8 @@ logging.info('Loading UCDXML...') ucdxml = packTab.ucdxml.load_ucdxml(sys.argv[1]) ucd = packTab.ucdxml.ucdxml_get_repertoire(ucdxml) +hb_common_h = 'hb-common.h' if len (sys.argv) < 3 else sys.argv[2] + logging.info('Preparing data tables...') gc = [u['gc'] for u in ucd] @@ -68,7 +70,7 @@ for i,v in enumerate(('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu' sc_order = dict() sc_array = [] sc_re = re.compile(r"\b(HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") -for line in open('hb-common.h'): +for line in open(hb_common_h): m = sc_re.search (line) if not m: continue name = m.group(1) From c073233f45da6ad8131dd38cb43b125f48c17432 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 14:26:45 -0700 Subject: [PATCH 591/617] Add make rule to build hb.cc Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/Makefile.am | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index e7b279ddc..c276118e8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -303,6 +303,12 @@ $(srcdir)/%.hh: $(srcdir)/%.rl $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \ || ($(RM) "$@"; false) +hb.cc: Makefile.sources + $(AM_V_GEN) \ + for f in $(HB_BASE_sources); do echo '#include "'$$f'"'; done | \ + grep '[.]cc"' > $(srcdir)/hb.cc \ + || ($(RM) $(srcdir)/hb.cc; false) + noinst_PROGRAMS = \ main \ test \ From d115a9e022c0b687fb402cfd2b90d516beded5c0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 14:42:45 -0700 Subject: [PATCH 592/617] [amalgam] Fix most duplicate-id instances in Indic-like shapers Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/hb-ot-layout.hh | 22 +++ src/hb-ot-shape-complex-indic-machine.hh | 6 +- src/hb-ot-shape-complex-indic-machine.rl | 6 +- src/hb-ot-shape-complex-indic.cc | 130 ++++++------------ src/hb-ot-shape-complex-indic.hh | 26 ++++ src/hb-ot-shape-complex-khmer-machine.hh | 6 +- src/hb-ot-shape-complex-khmer-machine.rl | 6 +- src/hb-ot-shape-complex-khmer.cc | 97 ++++--------- src/hb-ot-shape-complex-myanmar-machine.hh | 4 +- src/hb-ot-shape-complex-myanmar-machine.rl | 4 +- src/hb-ot-shape-complex-myanmar.cc | 69 ++++------ src/hb-ot-shape-complex-use-machine.hh | 4 +- src/hb-ot-shape-complex-use-machine.rl | 4 +- src/hb-ot-shape-complex-use.cc | 150 +++++++++------------ 14 files changed, 231 insertions(+), 303 deletions(-) diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index be7ef0263..f3bb15581 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -168,6 +168,17 @@ _hb_next_syllable (hb_buffer_t *buffer, unsigned int start) return start; } +static inline void +_hb_clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + info[i].syllable() = 0; +} + /* unicode_props */ @@ -551,6 +562,17 @@ _hb_glyph_info_clear_substituted (hb_glyph_info_t *info) info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED); } +static inline void +_hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + _hb_glyph_info_clear_substituted (&info[i]); +} + /* Allocation / deallocation. */ diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index ca26ecbae..670b6bf48 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -395,13 +395,13 @@ static const int indic_syllable_machine_en_main = 39; HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_indic (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act; int cs; @@ -569,4 +569,6 @@ _again: } +#undef found_syllable + #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl index a2a88af0d..5f819bd29 100644 --- a/src/hb-ot-shape-complex-indic-machine.rl +++ b/src/hb-ot-shape-complex-indic-machine.rl @@ -96,13 +96,13 @@ main := |* HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_indic (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act; int cs; @@ -121,4 +121,6 @@ find_syllables (hb_buffer_t *buffer) }%% } +#undef found_syllable + #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 6405d9c2d..23a1be2da 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -172,21 +172,17 @@ enum { }; static void -setup_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +setup_syllables_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void -initial_reordering (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +initial_reordering_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void -final_reordering (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -clear_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +final_reordering_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void collect_features_indic (hb_ot_shape_planner_t *plan) @@ -194,7 +190,7 @@ collect_features_indic (hb_ot_shape_planner_t *plan) hb_ot_map_builder_t *map = &plan->map; /* Do this before any lookups have been applied. */ - map->add_gsub_pause (setup_syllables); + map->add_gsub_pause (setup_syllables_indic); map->enable_feature (HB_TAG('l','o','c','l')); /* The Indic specs do not require ccmp, but we apply it here since if @@ -203,14 +199,14 @@ collect_features_indic (hb_ot_shape_planner_t *plan) unsigned int i = 0; - map->add_gsub_pause (initial_reordering); + map->add_gsub_pause (initial_reordering_indic); for (; i < INDIC_BASIC_FEATURES; i++) { map->add_feature (indic_features[i]); map->add_gsub_pause (nullptr); } - map->add_gsub_pause (final_reordering); + map->add_gsub_pause (final_reordering_indic); for (; i < INDIC_NUM_FEATURES; i++) map->add_feature (indic_features[i]); @@ -218,7 +214,7 @@ collect_features_indic (hb_ot_shape_planner_t *plan) map->enable_feature (HB_TAG('c','a','l','t')); map->enable_feature (HB_TAG('c','l','i','g')); - map->add_gsub_pause (clear_syllables); + map->add_gsub_pause (_hb_clear_syllables); } static void @@ -228,32 +224,6 @@ override_features_indic (hb_ot_shape_planner_t *plan) } -struct would_substitute_feature_t -{ - void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_) - { - zero_context = zero_context_; - map->get_stage_lookups (0/*GSUB*/, - map->get_feature_stage (0/*GSUB*/, feature_tag), - &lookups, &count); - } - - bool would_substitute (const hb_codepoint_t *glyphs, - unsigned int glyphs_count, - hb_face_t *face) const - { - for (unsigned int i = 0; i < count; i++) - if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context)) - return true; - return false; - } - - private: - const hb_ot_map_t::lookup_map_t *lookups; - unsigned int count; - bool zero_context; -}; - struct indic_shape_plan_t { bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const @@ -285,10 +255,10 @@ struct indic_shape_plan_t #endif mutable hb_atomic_int_t virama_glyph; - would_substitute_feature_t rphf; - would_substitute_feature_t pref; - would_substitute_feature_t blwf; - would_substitute_feature_t pstf; + hb_indic_would_substitute_feature_t rphf; + hb_indic_would_substitute_feature_t pref; + hb_indic_would_substitute_feature_t blwf; + hb_indic_would_substitute_feature_t pstf; hb_mask_t mask_array[INDIC_NUM_FEATURES]; }; @@ -371,13 +341,13 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan, } -enum syllable_type_t { - consonant_syllable, - vowel_syllable, - standalone_cluster, - symbol_cluster, - broken_cluster, - non_indic_cluster, +enum indic_syllable_type_t { + indic_consonant_syllable, + indic_vowel_syllable, + indic_standalone_cluster, + indic_symbol_cluster, + indic_broken_cluster, + indic_non_indic_cluster, }; #include "hb-ot-shape-complex-indic-machine.hh" @@ -401,11 +371,11 @@ setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { - find_syllables (buffer); + find_syllables_indic (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); } @@ -950,21 +920,21 @@ initial_reordering_syllable (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, unsigned int start, unsigned int end) { - syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F); + indic_syllable_type_t syllable_type = (indic_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) { - case vowel_syllable: /* We made the vowels look like consonants. So let's call the consonant logic! */ - case consonant_syllable: + case indic_vowel_syllable: /* We made the vowels look like consonants. So let's call the consonant logic! */ + case indic_consonant_syllable: initial_reordering_consonant_syllable (plan, face, buffer, start, end); break; - case broken_cluster: /* We already inserted dotted-circles, so just call the standalone_cluster. */ - case standalone_cluster: + case indic_broken_cluster: /* We already inserted dotted-circles, so just call the standalone_cluster. */ + case indic_standalone_cluster: initial_reordering_standalone_cluster (plan, face, buffer, start, end); break; - case symbol_cluster: - case non_indic_cluster: + case indic_symbol_cluster: + case indic_non_indic_cluster: break; } } @@ -983,7 +953,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - if ((info[i].syllable() & 0x0F) == broken_cluster) + if ((info[i].syllable() & 0x0F) == indic_broken_cluster) { has_broken_syllables = true; break; @@ -1008,8 +978,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, while (buffer->idx < buffer->len && buffer->successful) { unsigned int syllable = buffer->cur().syllable(); - syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); - if (unlikely (last_syllable != syllable && syllable_type == broken_cluster)) + indic_syllable_type_t syllable_type = (indic_syllable_type_t) (syllable & 0x0F); + if (unlikely (last_syllable != syllable && syllable_type == indic_broken_cluster)) { last_syllable = syllable; @@ -1033,9 +1003,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -initial_reordering (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) +initial_reordering_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { update_consonant_positions (plan, font, buffer); insert_dotted_circles (plan, font, buffer); @@ -1508,9 +1478,9 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, static void -final_reordering (const hb_ot_shape_plan_t *plan, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +final_reordering_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { unsigned int count = buffer->len; if (unlikely (!count)) return; @@ -1523,18 +1493,6 @@ final_reordering (const hb_ot_shape_plan_t *plan, } -static void -clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - info[i].syllable() = 0; -} - - static void preprocess_text_indic (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, diff --git a/src/hb-ot-shape-complex-indic.hh b/src/hb-ot-shape-complex-indic.hh index d207728c4..f3f195806 100644 --- a/src/hb-ot-shape-complex-indic.hh +++ b/src/hb-ot-shape-complex-indic.hh @@ -398,5 +398,31 @@ set_indic_properties (hb_glyph_info_t &info) info.indic_position() = pos; } +struct hb_indic_would_substitute_feature_t +{ + void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_) + { + zero_context = zero_context_; + map->get_stage_lookups (0/*GSUB*/, + map->get_feature_stage (0/*GSUB*/, feature_tag), + &lookups, &count); + } + + bool would_substitute (const hb_codepoint_t *glyphs, + unsigned int glyphs_count, + hb_face_t *face) const + { + for (unsigned int i = 0; i < count; i++) + if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context)) + return true; + return false; + } + + private: + const hb_ot_map_t::lookup_map_t *lookups; + unsigned int count; + bool zero_context; +}; + #endif /* HB_OT_SHAPE_COMPLEX_INDIC_HH */ diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh index 65e0ffc85..a040318d3 100644 --- a/src/hb-ot-shape-complex-khmer-machine.hh +++ b/src/hb-ot-shape-complex-khmer-machine.hh @@ -226,13 +226,13 @@ static const int khmer_syllable_machine_en_main = 20; HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_khmer (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act HB_UNUSED; int cs; @@ -367,4 +367,6 @@ _again: } +#undef found_syllable + #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-khmer-machine.rl b/src/hb-ot-shape-complex-khmer-machine.rl index 1076a08e8..e7f14533d 100644 --- a/src/hb-ot-shape-complex-khmer-machine.rl +++ b/src/hb-ot-shape-complex-khmer-machine.rl @@ -83,13 +83,13 @@ main := |* HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_khmer (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act HB_UNUSED; int cs; @@ -108,4 +108,6 @@ find_syllables (hb_buffer_t *buffer) }%% } +#undef found_syllable + #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */ diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc index eba7d86ea..2bc62bb56 100644 --- a/src/hb-ot-shape-complex-khmer.cc +++ b/src/hb-ot-shape-complex-khmer.cc @@ -89,17 +89,13 @@ enum { }; static void -setup_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +setup_syllables_khmer (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -clear_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +reorder_khmer (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void collect_features_khmer (hb_ot_shape_planner_t *plan) @@ -107,8 +103,8 @@ collect_features_khmer (hb_ot_shape_planner_t *plan) hb_ot_map_builder_t *map = &plan->map; /* Do this before any lookups have been applied. */ - map->add_gsub_pause (setup_syllables); - map->add_gsub_pause (reorder); + map->add_gsub_pause (setup_syllables_khmer); + map->add_gsub_pause (reorder_khmer); /* Testing suggests that Uniscribe does NOT pause between basic * features. Test with KhmerUI.ttf and the following three @@ -127,7 +123,7 @@ collect_features_khmer (hb_ot_shape_planner_t *plan) for (; i < KHMER_BASIC_FEATURES; i++) map->add_feature (khmer_features[i]); - map->add_gsub_pause (clear_syllables); + map->add_gsub_pause (_hb_clear_syllables); for (; i < KHMER_NUM_FEATURES; i++) map->add_feature (khmer_features[i]); @@ -153,32 +149,6 @@ override_features_khmer (hb_ot_shape_planner_t *plan) } -struct would_substitute_feature_t -{ - void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_) - { - zero_context = zero_context_; - map->get_stage_lookups (0/*GSUB*/, - map->get_feature_stage (0/*GSUB*/, feature_tag), - &lookups, &count); - } - - bool would_substitute (const hb_codepoint_t *glyphs, - unsigned int glyphs_count, - hb_face_t *face) const - { - for (unsigned int i = 0; i < count; i++) - if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context)) - return true; - return false; - } - - private: - const hb_ot_map_t::lookup_map_t *lookups; - unsigned int count; - bool zero_context; -}; - struct khmer_shape_plan_t { bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const @@ -202,7 +172,7 @@ struct khmer_shape_plan_t mutable hb_codepoint_t virama_glyph; - would_substitute_feature_t pref; + hb_indic_would_substitute_feature_t pref; hb_mask_t mask_array[KHMER_NUM_FEATURES]; }; @@ -232,10 +202,10 @@ data_destroy_khmer (void *data) } -enum syllable_type_t { - consonant_syllable, - broken_cluster, - non_khmer_cluster, +enum khmer_syllable_type_t { + khmer_consonant_syllable, + khmer_broken_cluster, + khmer_non_khmer_cluster, }; #include "hb-ot-shape-complex-khmer-machine.hh" @@ -257,11 +227,11 @@ setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { - find_syllables (buffer); + find_syllables_khmer (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); } @@ -351,15 +321,15 @@ initial_reordering_syllable (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, unsigned int start, unsigned int end) { - syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F); + khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) { - case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */ - case consonant_syllable: + case khmer_broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */ + case khmer_consonant_syllable: reorder_consonant_syllable (plan, face, buffer, start, end); break; - case non_khmer_cluster: + case khmer_non_khmer_cluster: break; } } @@ -378,7 +348,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - if ((info[i].syllable() & 0x0F) == broken_cluster) + if ((info[i].syllable() & 0x0F) == khmer_broken_cluster) { has_broken_syllables = true; break; @@ -403,8 +373,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, while (buffer->idx < buffer->len && buffer->successful) { unsigned int syllable = buffer->cur().syllable(); - syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); - if (unlikely (last_syllable != syllable && syllable_type == broken_cluster)) + khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (syllable & 0x0F); + if (unlikely (last_syllable != syllable && syllable_type == khmer_broken_cluster)) { last_syllable = syllable; @@ -428,9 +398,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) +reorder_khmer (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { insert_dotted_circles (plan, font, buffer); @@ -440,17 +410,6 @@ reorder (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category); } -static void -clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - info[i].syllable() = 0; -} - static bool decompose_khmer (const hb_ot_shape_normalize_context_t *c, diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index b7b04cb6d..c2f4c0045 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -304,13 +304,13 @@ static const int myanmar_syllable_machine_en_main = 0; HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_myanmar (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act HB_UNUSED; int cs; diff --git a/src/hb-ot-shape-complex-myanmar-machine.rl b/src/hb-ot-shape-complex-myanmar-machine.rl index 665998938..67133cd73 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/src/hb-ot-shape-complex-myanmar-machine.rl @@ -97,13 +97,13 @@ main := |* HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_myanmar (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act HB_UNUSED; int cs; diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index 5b819cf47..d1aabf46e 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -80,15 +80,11 @@ positioning_features[] = }; static void -setup_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); +setup_syllables_myanmar (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -clear_syllables (const hb_ot_shape_plan_t *plan, +reorder_myanmar (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); @@ -98,7 +94,7 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan) hb_ot_map_builder_t *map = &plan->map; /* Do this before any lookups have been applied. */ - map->add_gsub_pause (setup_syllables); + map->add_gsub_pause (setup_syllables_myanmar); map->enable_feature (HB_TAG('l','o','c','l')); /* The Indic specs do not require ccmp, but we apply it here since if @@ -106,7 +102,7 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan) map->enable_feature (HB_TAG('c','c','m','p')); - map->add_gsub_pause (reorder); + map->add_gsub_pause (reorder_myanmar); for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++) { @@ -114,7 +110,7 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan) map->add_gsub_pause (nullptr); } - map->add_gsub_pause (clear_syllables); + map->add_gsub_pause (_hb_clear_syllables); for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++) map->enable_feature (other_features[i], F_MANUAL_ZWJ); @@ -130,11 +126,11 @@ override_features_myanmar (hb_ot_shape_planner_t *plan) } -enum syllable_type_t { - consonant_syllable, - punctuation_cluster, - broken_cluster, - non_myanmar_cluster, +enum myanmar_syllable_type_t { + myanmar_consonant_syllable, + myanmar_punctuation_cluster, + myanmar_broken_cluster, + myanmar_non_myanmar_cluster, }; #include "hb-ot-shape-complex-myanmar-machine.hh" @@ -158,11 +154,11 @@ setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { - find_syllables (buffer); + find_syllables_myanmar (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); } @@ -283,16 +279,16 @@ initial_reordering_syllable (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, unsigned int start, unsigned int end) { - syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F); + myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) { - case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */ - case consonant_syllable: + case myanmar_broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */ + case myanmar_consonant_syllable: initial_reordering_consonant_syllable (buffer, start, end); break; - case punctuation_cluster: - case non_myanmar_cluster: + case myanmar_punctuation_cluster: + case myanmar_non_myanmar_cluster: break; } } @@ -311,7 +307,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - if ((info[i].syllable() & 0x0F) == broken_cluster) + if ((info[i].syllable() & 0x0F) == myanmar_broken_cluster) { has_broken_syllables = true; break; @@ -336,8 +332,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, while (buffer->idx < buffer->len && buffer->successful) { unsigned int syllable = buffer->cur().syllable(); - syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); - if (unlikely (last_syllable != syllable && syllable_type == broken_cluster)) + myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (syllable & 0x0F); + if (unlikely (last_syllable != syllable && syllable_type == myanmar_broken_cluster)) { last_syllable = syllable; @@ -355,9 +351,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) +reorder_myanmar (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { insert_dotted_circles (plan, font, buffer); @@ -368,17 +364,6 @@ reorder (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position); } -static void -clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - info[i].syllable() = 0; -} - const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = { diff --git a/src/hb-ot-shape-complex-use-machine.hh b/src/hb-ot-shape-complex-use-machine.hh index 01fe3d788..462342c61 100644 --- a/src/hb-ot-shape-complex-use-machine.hh +++ b/src/hb-ot-shape-complex-use-machine.hh @@ -380,13 +380,13 @@ static const int use_syllable_machine_en_main = 5; HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_use (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act; int cs; diff --git a/src/hb-ot-shape-complex-use-machine.rl b/src/hb-ot-shape-complex-use-machine.rl index aca7ea683..9b75b5c6e 100644 --- a/src/hb-ot-shape-complex-use-machine.rl +++ b/src/hb-ot-shape-complex-use-machine.rl @@ -165,13 +165,13 @@ main := |* HB_STMT_START { \ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \ for (unsigned int i = ts; i < te; i++) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \ syllable_serial++; \ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ } HB_STMT_END static void -find_syllables (hb_buffer_t *buffer) +find_syllables_use (hb_buffer_t *buffer) { unsigned int p, pe, eof, ts, te, act; int cs; diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 91c0b8c04..716ffd376 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -106,29 +106,21 @@ positioning_features[] = }; static void -setup_syllables (const hb_ot_shape_plan_t *plan, +setup_syllables_use (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); +static void +record_rphf_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); static void -clear_substitution_flags (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -record_rphf (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -record_pref (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); -static void -clear_syllables (const hb_ot_shape_plan_t *plan, +record_pref_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); +static void +reorder_use (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); static void collect_features_use (hb_ot_shape_planner_t *plan) @@ -136,7 +128,7 @@ collect_features_use (hb_ot_shape_planner_t *plan) hb_ot_map_builder_t *map = &plan->map; /* Do this before any lookups have been applied. */ - map->add_gsub_pause (setup_syllables); + map->add_gsub_pause (setup_syllables_use); /* "Default glyph pre-processing group" */ map->enable_feature (HB_TAG('l','o','c','l')); @@ -145,19 +137,19 @@ collect_features_use (hb_ot_shape_planner_t *plan) map->enable_feature (HB_TAG('a','k','h','n'), F_MANUAL_ZWJ); /* "Reordering group" */ - map->add_gsub_pause (clear_substitution_flags); + map->add_gsub_pause (_hb_clear_substitution_flags); map->add_feature (HB_TAG('r','p','h','f'), F_MANUAL_ZWJ); - map->add_gsub_pause (record_rphf); - map->add_gsub_pause (clear_substitution_flags); + map->add_gsub_pause (record_rphf_use); + map->add_gsub_pause (_hb_clear_substitution_flags); map->enable_feature (HB_TAG('p','r','e','f'), F_MANUAL_ZWJ); - map->add_gsub_pause (record_pref); + map->add_gsub_pause (record_pref_use); /* "Orthographic unit shaping group" */ for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++) map->enable_feature (basic_features[i], F_MANUAL_ZWJ); - map->add_gsub_pause (reorder); - map->add_gsub_pause (clear_syllables); + map->add_gsub_pause (reorder_use); + map->add_gsub_pause (_hb_clear_syllables); /* "Topographical features" */ for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++) @@ -247,16 +239,16 @@ data_destroy_use (void *data) free (data); } -enum syllable_type_t { - independent_cluster, - virama_terminated_cluster, - sakot_terminated_cluster, - standard_cluster, - number_joiner_terminated_cluster, - numeral_cluster, - symbol_cluster, - broken_cluster, - non_cluster, +enum use_syllable_type_t { + use_independent_cluster, + use_virama_terminated_cluster, + use_sakot_terminated_cluster, + use_standard_cluster, + use_number_joiner_terminated_cluster, + use_numeral_cluster, + use_symbol_cluster, + use_broken_cluster, + use_non_cluster, }; #include "hb-ot-shape-complex-use-machine.hh" @@ -331,22 +323,22 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, hb_glyph_info_t *info = buffer->info; foreach_syllable (buffer, start, end) { - syllable_type_t syllable_type = (syllable_type_t) (info[start].syllable() & 0x0F); + use_syllable_type_t syllable_type = (use_syllable_type_t) (info[start].syllable() & 0x0F); switch (syllable_type) { - case independent_cluster: - case symbol_cluster: - case non_cluster: + case use_independent_cluster: + case use_symbol_cluster: + case use_non_cluster: /* These don't join. Nothing to do. */ last_form = _NONE; break; - case virama_terminated_cluster: - case sakot_terminated_cluster: - case standard_cluster: - case number_joiner_terminated_cluster: - case numeral_cluster: - case broken_cluster: + case use_virama_terminated_cluster: + case use_sakot_terminated_cluster: + case use_standard_cluster: + case use_number_joiner_terminated_cluster: + case use_numeral_cluster: + case use_broken_cluster: bool join = last_form == FINA || last_form == ISOL; @@ -371,11 +363,11 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, } static void -setup_syllables (const hb_ot_shape_plan_t *plan, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +setup_syllables_use (const hb_ot_shape_plan_t *plan, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { - find_syllables (buffer); + find_syllables_use (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); setup_rphf_mask (plan, buffer); @@ -383,20 +375,9 @@ setup_syllables (const hb_ot_shape_plan_t *plan, } static void -clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - _hb_glyph_info_clear_substituted (&info[i]); -} - -static void -record_rphf (const hb_ot_shape_plan_t *plan, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +record_rphf_use (const hb_ot_shape_plan_t *plan, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data; @@ -417,9 +398,9 @@ record_rphf (const hb_ot_shape_plan_t *plan, } static void -record_pref (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) +record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) { hb_glyph_info_t *info = buffer->info; @@ -443,15 +424,15 @@ is_halant (const hb_glyph_info_t &info) } static void -reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) +reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end) { - syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F); + use_syllable_type_t syllable_type = (use_syllable_type_t) (buffer->info[start].syllable() & 0x0F); /* Only a few syllable types need reordering. */ if (unlikely (!(FLAG_UNSAFE (syllable_type) & - (FLAG (virama_terminated_cluster) | - FLAG (sakot_terminated_cluster) | - FLAG (standard_cluster) | - FLAG (broken_cluster) | + (FLAG (use_virama_terminated_cluster) | + FLAG (use_sakot_terminated_cluster) | + FLAG (use_standard_cluster) | + FLAG (use_broken_cluster) | 0)))) return; @@ -539,7 +520,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - if ((info[i].syllable() & 0x0F) == broken_cluster) + if ((info[i].syllable() & 0x0F) == use_broken_cluster) { has_broken_syllables = true; break; @@ -559,8 +540,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, while (buffer->idx < buffer->len && buffer->successful) { unsigned int syllable = buffer->cur().syllable(); - syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); - if (unlikely (last_syllable != syllable && syllable_type == broken_cluster)) + use_syllable_type_t syllable_type = (use_syllable_type_t) (syllable & 0x0F); + if (unlikely (last_syllable != syllable && syllable_type == use_broken_cluster)) { last_syllable = syllable; @@ -584,29 +565,18 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, } static void -reorder (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) +reorder_use (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { insert_dotted_circles (plan, font, buffer); foreach_syllable (buffer, start, end) - reorder_syllable (buffer, start, end); + reorder_syllable_use (buffer, start, end); HB_BUFFER_DEALLOCATE_VAR (buffer, use_category); } -static void -clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font HB_UNUSED, - hb_buffer_t *buffer) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - info[i].syllable() = 0; -} - static void preprocess_text_use (const hb_ot_shape_plan_t *plan, From d8b5353e07650cf243ba182dbf52e7f198719762 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 15:09:26 -0700 Subject: [PATCH 593/617] [amalgam] More Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/hb-ot-shape-complex-myanmar.cc | 28 ++++++++++++++-------------- src/hb-ot-shape-complex-use.cc | 28 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index d1aabf46e..21793b4c4 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -36,7 +36,7 @@ */ static const hb_tag_t -basic_features[] = +myanmar_basic_features[] = { /* * Basic features. @@ -48,7 +48,7 @@ basic_features[] = HB_TAG('p','s','t','f'), }; static const hb_tag_t -other_features[] = +myanmar_other_features[] = { /* * Other features. @@ -60,7 +60,7 @@ other_features[] = HB_TAG('p','s','t','s'), }; static const hb_tag_t -positioning_features[] = +myanmar_positioning_features[] = { /* * Positioning features. @@ -104,19 +104,19 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan) map->add_gsub_pause (reorder_myanmar); - for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++) + for (unsigned int i = 0; i < ARRAY_LENGTH (myanmar_basic_features); i++) { - map->enable_feature (basic_features[i], F_MANUAL_ZWJ); + map->enable_feature (myanmar_basic_features[i], F_MANUAL_ZWJ); map->add_gsub_pause (nullptr); } map->add_gsub_pause (_hb_clear_syllables); - for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++) - map->enable_feature (other_features[i], F_MANUAL_ZWJ); + for (unsigned int i = 0; i < ARRAY_LENGTH (myanmar_other_features); i++) + map->enable_feature (myanmar_other_features[i], F_MANUAL_ZWJ); - for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++) - map->enable_feature (positioning_features[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (myanmar_positioning_features); i++) + map->enable_feature (myanmar_positioning_features[i]); } static void @@ -274,10 +274,10 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer, } static void -initial_reordering_syllable (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_face_t *face HB_UNUSED, - hb_buffer_t *buffer, - unsigned int start, unsigned int end) +reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_face_t *face HB_UNUSED, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) { myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) { @@ -358,7 +358,7 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan, insert_dotted_circles (plan, font, buffer); foreach_syllable (buffer, start, end) - initial_reordering_syllable (plan, font->face, buffer, start, end); + reorder_syllable_myanmar (plan, font->face, buffer, start, end); HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category); HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position); diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 716ffd376..f3b150d1c 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -44,7 +44,7 @@ */ static const hb_tag_t -basic_features[] = +use_basic_features[] = { /* * Basic features. @@ -59,7 +59,7 @@ basic_features[] = HB_TAG('c','j','c','t'), }; static const hb_tag_t -arabic_features[] = +use_arabic_features[] = { HB_TAG('i','s','o','l'), HB_TAG('i','n','i','t'), @@ -71,7 +71,7 @@ arabic_features[] = HB_TAG('f','i','n','2'), HB_TAG('f','i','n','3'), }; -/* Same order as arabic_features. Don't need Syriac stuff.*/ +/* Same order as use_arabic_features. Don't need Syriac stuff.*/ enum joining_form_t { ISOL, INIT, @@ -80,7 +80,7 @@ enum joining_form_t { _NONE }; static const hb_tag_t -other_features[] = +use_other_features[] = { /* * Other features. @@ -94,7 +94,7 @@ other_features[] = HB_TAG('p','s','t','s'), }; static const hb_tag_t -positioning_features[] = +use_positioning_features[] = { /* * Positioning features. @@ -145,24 +145,24 @@ collect_features_use (hb_ot_shape_planner_t *plan) map->add_gsub_pause (record_pref_use); /* "Orthographic unit shaping group" */ - for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++) - map->enable_feature (basic_features[i], F_MANUAL_ZWJ); + for (unsigned int i = 0; i < ARRAY_LENGTH (use_basic_features); i++) + map->enable_feature (use_basic_features[i], F_MANUAL_ZWJ); map->add_gsub_pause (reorder_use); map->add_gsub_pause (_hb_clear_syllables); /* "Topographical features" */ - for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++) - map->add_feature (arabic_features[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (use_arabic_features); i++) + map->add_feature (use_arabic_features[i]); map->add_gsub_pause (nullptr); /* "Standard typographic presentation" */ - for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++) - map->enable_feature (other_features[i], F_MANUAL_ZWJ); + for (unsigned int i = 0; i < ARRAY_LENGTH (use_other_features); i++) + map->enable_feature (use_other_features[i], F_MANUAL_ZWJ); /* "Positional feature application" */ - for (unsigned int i = 0; i < ARRAY_LENGTH (positioning_features); i++) - map->enable_feature (positioning_features[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (use_positioning_features); i++) + map->enable_feature (use_positioning_features[i]); } struct use_shape_plan_t @@ -309,7 +309,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, hb_mask_t masks[4], all_masks = 0; for (unsigned int i = 0; i < 4; i++) { - masks[i] = plan->map.get_1_mask (arabic_features[i]); + masks[i] = plan->map.get_1_mask (use_arabic_features[i]); if (masks[i] == plan->map.get_global_mask ()) masks[i] = 0; all_masks |= masks[i]; From dc480fc4717937d53cf38860a5c5d48211e8cbc8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 15:17:56 -0700 Subject: [PATCH 594/617] [amalgam] More Indic-like issues Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/hb-ot-shape-complex-indic.cc | 72 ++++++++++++++++---------------- src/hb-ot-shape-complex-khmer.cc | 36 ++++++++-------- src/hb-ot-shape-complex-use.cc | 32 +++++++------- 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 23a1be2da..43f377b66 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -144,31 +144,31 @@ indic_features[] = * Must be in the same order as the indic_features array. */ enum { - _NUKT, - _AKHN, - RPHF, - _RKRF, - PREF, - BLWF, - ABVF, - HALF, - PSTF, - _VATU, - _CJCT, + _INDIC_NUKT, + _INDIC_AKHN, + INDIC_RPHF, + _INDIC_RKRF, + INDIC_PREF, + INDIC_BLWF, + INDIC_ABVF, + INDIC_HALF, + INDIC_PSTF, + _INDIC_VATU, + _INDIC_CJCT, - INIT, - _PRES, - _ABVS, - _BLWS, - _PSTS, - _HALN, + INDIC_INIT, + _INDIC_PRES, + _INDIC_ABVS, + _INDIC_BLWS, + _INDIC_PSTS, + _INDIC_HALN, - _DIST, - _ABVM, - _BLWM, + _INDIC_DIST, + _INDIC_ABVM, + _INDIC_BLWM, INDIC_NUM_FEATURES, - INDIC_BASIC_FEATURES = INIT, /* Don't forget to update this! */ + INDIC_BASIC_FEATURES = INDIC_INIT, /* Don't forget to update this! */ }; static void @@ -467,7 +467,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, * and has more than one consonant, Ra is excluded from candidates for * base consonants. */ unsigned int limit = start; - if (indic_plan->mask_array[RPHF] && + if (indic_plan->mask_array[INDIC_RPHF] && start + 3 <= end && ( (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) || @@ -803,13 +803,13 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Reph */ for (unsigned int i = start; i < end && info[i].indic_position() == POS_RA_TO_BECOME_REPH; i++) - info[i].mask |= indic_plan->mask_array[RPHF]; + info[i].mask |= indic_plan->mask_array[INDIC_RPHF]; /* Pre-base */ - mask = indic_plan->mask_array[HALF]; + mask = indic_plan->mask_array[INDIC_HALF]; if (!indic_plan->is_old_spec && indic_plan->config->blwf_mode == BLWF_MODE_PRE_AND_POST) - mask |= indic_plan->mask_array[BLWF]; + mask |= indic_plan->mask_array[INDIC_BLWF]; for (unsigned int i = start; i < base; i++) info[i].mask |= mask; /* Base */ @@ -817,7 +817,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, if (base < end) info[base].mask |= mask; /* Post-base */ - mask = indic_plan->mask_array[BLWF] | indic_plan->mask_array[ABVF] | indic_plan->mask_array[PSTF]; + mask = indic_plan->mask_array[INDIC_BLWF] | + indic_plan->mask_array[INDIC_ABVF] | + indic_plan->mask_array[INDIC_PSTF]; for (unsigned int i = base + 1; i < end; i++) info[i].mask |= mask; } @@ -849,13 +851,13 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, (i + 2 == base || info[i+2].indic_category() != OT_ZWJ)) { - info[i ].mask |= indic_plan->mask_array[BLWF]; - info[i+1].mask |= indic_plan->mask_array[BLWF]; + info[i ].mask |= indic_plan->mask_array[INDIC_BLWF]; + info[i+1].mask |= indic_plan->mask_array[INDIC_BLWF]; } } unsigned int pref_len = 2; - if (indic_plan->mask_array[PREF] && base + pref_len < end) + if (indic_plan->mask_array[INDIC_PREF] && base + pref_len < end) { /* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */ for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) { @@ -865,7 +867,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, if (indic_plan->pref.would_substitute (glyphs, pref_len, face)) { for (unsigned int j = 0; j < pref_len; j++) - info[i++].mask |= indic_plan->mask_array[PREF]; + info[i++].mask |= indic_plan->mask_array[INDIC_PREF]; break; } } @@ -886,7 +888,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* A ZWNJ disables HALF. */ if (non_joiner) - info[j].mask &= ~indic_plan->mask_array[HALF]; + info[j].mask &= ~indic_plan->mask_array[INDIC_HALF]; } while (j > start && !is_consonant (info[j])); } @@ -1053,7 +1055,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * syllable. */ - bool try_pref = !!indic_plan->mask_array[PREF]; + bool try_pref = !!indic_plan->mask_array[INDIC_PREF]; /* Find base again */ unsigned int base; @@ -1063,7 +1065,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (try_pref && base + 1 < end) { for (unsigned int i = base + 1; i < end; i++) - if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) + if ((info[i].mask & indic_plan->mask_array[INDIC_PREF]) != 0) { if (!(_hb_glyph_info_substituted (&info[i]) && _hb_glyph_info_ligated_and_didnt_multiply (&info[i]))) @@ -1385,7 +1387,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */ { for (unsigned int i = base + 1; i < end; i++) - if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) + if ((info[i].mask & indic_plan->mask_array[INDIC_PREF]) != 0) { /* 1. Only reorder a glyph produced by substitution during application * of the feature. (Note that a font may shape a Ra consonant with @@ -1448,7 +1450,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (!start || !(FLAG_UNSAFE (_hb_glyph_info_get_general_category (&info[start - 1])) & FLAG_RANGE (HB_UNICODE_GENERAL_CATEGORY_FORMAT, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) - info[start].mask |= indic_plan->mask_array[INIT]; + info[start].mask |= indic_plan->mask_array[INDIC_INIT]; else buffer->unsafe_to_break (start - 1, start + 1); } diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc index 2bc62bb56..6eec2438d 100644 --- a/src/hb-ot-shape-complex-khmer.cc +++ b/src/hb-ot-shape-complex-khmer.cc @@ -69,23 +69,23 @@ khmer_features[] = * Must be in the same order as the khmer_features array. */ enum { - PREF, - BLWF, - ABVF, - PSTF, - CFAR, + KHMER_PREF, + KHMER_BLWF, + KHMER_ABVF, + KHMER_PSTF, + KHMER_CFAR, - _PRES, - _ABVS, - _BLWS, - _PSTS, + _KHMER_PRES, + _KHMER_ABVS, + _KHMER_BLWS, + _KHMER_PSTS, - _DIST, - _ABVM, - _BLWM, + _KHMER_DIST, + _KHMER_ABVM, + _KHMER_BLWM, KHMER_NUM_FEATURES, - KHMER_BASIC_FEATURES = _PRES, /* Don't forget to update this! */ + KHMER_BASIC_FEATURES = _KHMER_PRES, /* Don't forget to update this! */ }; static void @@ -252,7 +252,9 @@ reorder_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Setup masks. */ { /* Post-base */ - hb_mask_t mask = khmer_plan->mask_array[BLWF] | khmer_plan->mask_array[ABVF] | khmer_plan->mask_array[PSTF]; + hb_mask_t mask = khmer_plan->mask_array[KHMER_BLWF] | + khmer_plan->mask_array[KHMER_ABVF] | + khmer_plan->mask_array[KHMER_PSTF]; for (unsigned int i = start + 1; i < end; i++) info[i].mask |= mask; } @@ -279,7 +281,7 @@ reorder_consonant_syllable (const hb_ot_shape_plan_t *plan, if (info[i + 1].khmer_category() == OT_Ra) { for (unsigned int j = 0; j < 2; j++) - info[i + j].mask |= khmer_plan->mask_array[PREF]; + info[i + j].mask |= khmer_plan->mask_array[KHMER_PREF]; /* Move the Coeng,Ro sequence to the start. */ buffer->merge_clusters (start, i + 2); @@ -295,9 +297,9 @@ reorder_consonant_syllable (const hb_ot_shape_plan_t *plan, * U+1784,U+17D2,U+179A,U+17D2,U+1782 * U+1784,U+17D2,U+1782,U+17D2,U+179A */ - if (khmer_plan->mask_array[CFAR]) + if (khmer_plan->mask_array[KHMER_CFAR]) for (unsigned int j = i + 2; j < end; j++) - info[j].mask |= khmer_plan->mask_array[CFAR]; + info[j].mask |= khmer_plan->mask_array[KHMER_CFAR]; num_coengs = 2; /* Done. */ } diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index f3b150d1c..003d897b2 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -59,7 +59,7 @@ use_basic_features[] = HB_TAG('c','j','c','t'), }; static const hb_tag_t -use_arabic_features[] = +use_topographical_features[] = { HB_TAG('i','s','o','l'), HB_TAG('i','n','i','t'), @@ -71,13 +71,13 @@ use_arabic_features[] = HB_TAG('f','i','n','2'), HB_TAG('f','i','n','3'), }; -/* Same order as use_arabic_features. Don't need Syriac stuff.*/ +/* Same order as use_topographical_features. Don't need Syriac stuff.*/ enum joining_form_t { - ISOL, - INIT, - MEDI, - FINA, - _NONE + USE_ISOL, + USE_INIT, + USE_MEDI, + USE_FINA, + _USE_NONE }; static const hb_tag_t use_other_features[] = @@ -152,8 +152,8 @@ collect_features_use (hb_ot_shape_planner_t *plan) map->add_gsub_pause (_hb_clear_syllables); /* "Topographical features" */ - for (unsigned int i = 0; i < ARRAY_LENGTH (use_arabic_features); i++) - map->add_feature (use_arabic_features[i]); + for (unsigned int i = 0; i < ARRAY_LENGTH (use_topographical_features); i++) + map->add_feature (use_topographical_features[i]); map->add_gsub_pause (nullptr); /* "Standard typographic presentation" */ @@ -305,11 +305,11 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, if (use_plan->arabic_plan) return; - static_assert ((INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4), ""); + static_assert ((USE_INIT < 4 && USE_ISOL < 4 && USE_MEDI < 4 && USE_FINA < 4), ""); hb_mask_t masks[4], all_masks = 0; for (unsigned int i = 0; i < 4; i++) { - masks[i] = plan->map.get_1_mask (use_arabic_features[i]); + masks[i] = plan->map.get_1_mask (use_topographical_features[i]); if (masks[i] == plan->map.get_global_mask ()) masks[i] = 0; all_masks |= masks[i]; @@ -319,7 +319,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, hb_mask_t other_masks = ~all_masks; unsigned int last_start = 0; - joining_form_t last_form = _NONE; + joining_form_t last_form = _USE_NONE; hb_glyph_info_t *info = buffer->info; foreach_syllable (buffer, start, end) { @@ -330,7 +330,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, case use_symbol_cluster: case use_non_cluster: /* These don't join. Nothing to do. */ - last_form = _NONE; + last_form = _USE_NONE; break; case use_virama_terminated_cluster: @@ -340,18 +340,18 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, case use_numeral_cluster: case use_broken_cluster: - bool join = last_form == FINA || last_form == ISOL; + bool join = last_form == USE_FINA || last_form == USE_ISOL; if (join) { /* Fixup previous syllable's form. */ - last_form = last_form == FINA ? MEDI : INIT; + last_form = last_form == USE_FINA ? USE_MEDI : USE_INIT; for (unsigned int i = last_start; i < start; i++) info[i].mask = (info[i].mask & other_masks) | masks[last_form]; } /* Form for this syllable. */ - last_form = join ? FINA : ISOL; + last_form = join ? USE_FINA : USE_ISOL; for (unsigned int i = start; i < end; i++) info[i].mask = (info[i].mask & other_masks) | masks[last_form]; From eb37bc9d93b3abebee24390708940510fe37477a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 15:19:39 -0700 Subject: [PATCH 595/617] [use] Remove Syriac features This was non-standard, and unused anyway. --- src/hb-ot-shape-complex-use.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 003d897b2..0a8c4e5d0 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -65,13 +65,8 @@ use_topographical_features[] = HB_TAG('i','n','i','t'), HB_TAG('m','e','d','i'), HB_TAG('f','i','n','a'), - /* The spec doesn't specify these but we apply anyway, since our Arabic shaper - * does. These are only used in Syriac spec. */ - HB_TAG('m','e','d','2'), - HB_TAG('f','i','n','2'), - HB_TAG('f','i','n','3'), }; -/* Same order as use_topographical_features. Don't need Syriac stuff.*/ +/* Same order as use_topographical_features. */ enum joining_form_t { USE_ISOL, USE_INIT, From 3724f13ba0292055197efdbfcacfe3d7b067175c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 15:23:00 -0700 Subject: [PATCH 596/617] [amalgam] Finish fixing Indic-like shapers Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/hb-ot-shape-complex-indic.cc | 34 +++++++++++++++--------------- src/hb-ot-shape-complex-indic.hh | 9 +++++++- src/hb-ot-shape-complex-khmer.cc | 18 ++++++++-------- src/hb-ot-shape-complex-khmer.hh | 17 +++++++-------- src/hb-ot-shape-complex-myanmar.cc | 8 +++---- src/hb-ot-shape-complex-myanmar.hh | 16 +++++++------- src/hb-ot-shape-complex-use.cc | 14 ++++++------ 7 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 43f377b66..fd099cac7 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -392,9 +392,9 @@ compare_indic_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb) static void -update_consonant_positions (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) +update_consonant_positions_indic (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; @@ -917,10 +917,10 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, } static void -initial_reordering_syllable (const hb_ot_shape_plan_t *plan, - hb_face_t *face, - hb_buffer_t *buffer, - unsigned int start, unsigned int end) +initial_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, + hb_face_t *face, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) { indic_syllable_type_t syllable_type = (indic_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) @@ -942,9 +942,9 @@ initial_reordering_syllable (const hb_ot_shape_plan_t *plan, } static inline void -insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font, - hb_buffer_t *buffer) +insert_dotted_circles_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font, + hb_buffer_t *buffer) { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; @@ -1009,17 +1009,17 @@ initial_reordering_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { - update_consonant_positions (plan, font, buffer); - insert_dotted_circles (plan, font, buffer); + update_consonant_positions_indic (plan, font, buffer); + insert_dotted_circles_indic (plan, font, buffer); foreach_syllable (buffer, start, end) - initial_reordering_syllable (plan, font->face, buffer, start, end); + initial_reordering_syllable_indic (plan, font->face, buffer, start, end); } static void -final_reordering_syllable (const hb_ot_shape_plan_t *plan, - hb_buffer_t *buffer, - unsigned int start, unsigned int end) +final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) { const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; hb_glyph_info_t *info = buffer->info; @@ -1488,7 +1488,7 @@ final_reordering_indic (const hb_ot_shape_plan_t *plan, if (unlikely (!count)) return; foreach_syllable (buffer, start, end) - final_reordering_syllable (plan, buffer, start, end); + final_reordering_syllable_indic (plan, buffer, start, end); HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category); HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position); diff --git a/src/hb-ot-shape-complex-indic.hh b/src/hb-ot-shape-complex-indic.hh index f3f195806..1eeed68c5 100644 --- a/src/hb-ot-shape-complex-indic.hh +++ b/src/hb-ot-shape-complex-indic.hh @@ -64,7 +64,14 @@ enum indic_category_t { OT_Ra = 16, OT_CM = 17, /* Consonant-Medial. */ OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ - OT_CS = 19 + OT_CS = 19, + + /* The following are used by Khmer & Myanmar shapers. Defined + * here for them to share. */ + OT_VAbv = 26, + OT_VBlw = 27, + OT_VPre = 28, + OT_VPst = 29, }; #define MEDIAL_FLAGS (FLAG (OT_CM)) diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc index 6eec2438d..b1fa0156a 100644 --- a/src/hb-ot-shape-complex-khmer.cc +++ b/src/hb-ot-shape-complex-khmer.cc @@ -318,10 +318,10 @@ reorder_consonant_syllable (const hb_ot_shape_plan_t *plan, } static void -initial_reordering_syllable (const hb_ot_shape_plan_t *plan, - hb_face_t *face, - hb_buffer_t *buffer, - unsigned int start, unsigned int end) +reorder_syllable_khmer (const hb_ot_shape_plan_t *plan, + hb_face_t *face, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) { khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (buffer->info[start].syllable() & 0x0F); switch (syllable_type) @@ -337,9 +337,9 @@ initial_reordering_syllable (const hb_ot_shape_plan_t *plan, } static inline void -insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font, - hb_buffer_t *buffer) +insert_dotted_circles_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font, + hb_buffer_t *buffer) { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; @@ -404,10 +404,10 @@ reorder_khmer (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { - insert_dotted_circles (plan, font, buffer); + insert_dotted_circles_khmer (plan, font, buffer); foreach_syllable (buffer, start, end) - initial_reordering_syllable (plan, font->face, buffer, start, end); + reorder_syllable_khmer (plan, font->face, buffer, start, end); HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category); } diff --git a/src/hb-ot-shape-complex-khmer.hh b/src/hb-ot-shape-complex-khmer.hh index 21015c730..11a77bfd4 100644 --- a/src/hb-ot-shape-complex-khmer.hh +++ b/src/hb-ot-shape-complex-khmer.hh @@ -43,11 +43,10 @@ enum khmer_category_t OT_Robatic = 20, OT_Xgroup = 21, OT_Ygroup = 22, - - OT_VAbv = 26, - OT_VBlw = 27, - OT_VPre = 28, - OT_VPst = 29, + //OT_VAbv = 26, + //OT_VBlw = 27, + //OT_VPre = 28, + //OT_VPst = 29, }; static inline void @@ -100,10 +99,10 @@ set_khmer_properties (hb_glyph_info_t &info) if (cat == (khmer_category_t) OT_M) switch ((int) pos) { - case POS_PRE_C: cat = OT_VPre; break; - case POS_BELOW_C: cat = OT_VBlw; break; - case POS_ABOVE_C: cat = OT_VAbv; break; - case POS_POST_C: cat = OT_VPst; break; + case POS_PRE_C: cat = (khmer_category_t) OT_VPre; break; + case POS_BELOW_C: cat = (khmer_category_t) OT_VBlw; break; + case POS_ABOVE_C: cat = (khmer_category_t) OT_VAbv; break; + case POS_POST_C: cat = (khmer_category_t) OT_VPst; break; default: assert (0); } diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index 21793b4c4..14d215eac 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -294,9 +294,9 @@ reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, } static inline void -insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font, - hb_buffer_t *buffer) +insert_dotted_circles_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font, + hb_buffer_t *buffer) { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; @@ -355,7 +355,7 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { - insert_dotted_circles (plan, font, buffer); + insert_dotted_circles_myanmar (plan, font, buffer); foreach_syllable (buffer, start, end) reorder_syllable_myanmar (plan, font->face, buffer, start, end); diff --git a/src/hb-ot-shape-complex-myanmar.hh b/src/hb-ot-shape-complex-myanmar.hh index 9ec78ef89..7b9821e6b 100644 --- a/src/hb-ot-shape-complex-myanmar.hh +++ b/src/hb-ot-shape-complex-myanmar.hh @@ -49,10 +49,10 @@ enum myanmar_category_t { OT_MW = 23, /* Various consonant medial types */ OT_MY = 24, /* Various consonant medial types */ OT_PT = 25, /* Pwo and other tones */ - OT_VAbv = 26, - OT_VBlw = 27, - OT_VPre = 28, - OT_VPst = 29, + //OT_VAbv = 26, + //OT_VBlw = 27, + //OT_VPre = 28, + //OT_VPst = 29, OT_VS = 30, /* Variation selectors */ OT_P = 31, /* Punctuation */ OT_D = 32, /* Digits except zero */ @@ -155,11 +155,11 @@ set_myanmar_properties (hb_glyph_info_t &info) { switch ((int) pos) { - case POS_PRE_C: cat = OT_VPre; + case POS_PRE_C: cat = (myanmar_category_t) OT_VPre; pos = POS_PRE_M; break; - case POS_ABOVE_C: cat = OT_VAbv; break; - case POS_BELOW_C: cat = OT_VBlw; break; - case POS_POST_C: cat = OT_VPst; break; + case POS_ABOVE_C: cat = (myanmar_category_t) OT_VAbv; break; + case POS_BELOW_C: cat = (myanmar_category_t) OT_VBlw; break; + case POS_POST_C: cat = (myanmar_category_t) OT_VPst; break; } } diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 0a8c4e5d0..1ea2957f2 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -412,7 +412,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED, } static inline bool -is_halant (const hb_glyph_info_t &info) +is_halant_use (const hb_glyph_info_t &info) { return (info.use_category() == USE_H || info.use_category() == USE_HVM) && !_hb_glyph_info_ligated (&info); @@ -458,7 +458,7 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end) for (unsigned int i = start + 1; i < end; i++) { bool is_post_base_glyph = (FLAG64_UNSAFE (info[i].use_category()) & POST_BASE_FLAGS64) || - is_halant (info[i]); + is_halant_use (info[i]); if (is_post_base_glyph || i == end - 1) { /* If we hit a post-base glyph, move before it; otherwise move to the @@ -482,7 +482,7 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end) for (unsigned int i = start; i < end; i++) { uint32_t flag = FLAG_UNSAFE (info[i].use_category()); - if (is_halant (info[i])) + if (is_halant_use (info[i])) { /* If we hit a halant, move after it; otherwise move to the beginning, and * shift things in between forward. */ @@ -502,9 +502,9 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end) } static inline void -insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, - hb_font_t *font, - hb_buffer_t *buffer) +insert_dotted_circles_use (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font, + hb_buffer_t *buffer) { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; @@ -564,7 +564,7 @@ reorder_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { - insert_dotted_circles (plan, font, buffer); + insert_dotted_circles_use (plan, font, buffer); foreach_syllable (buffer, start, end) reorder_syllable_use (buffer, start, end); From 7ca54811f471a28163de6b3c561990c85aa39880 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 16:00:58 -0700 Subject: [PATCH 597/617] [amalgam] Fix CFF Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/hb-ot-cff1-table.cc | 18 +++++++++--------- src/hb-ot-cff2-table.cc | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index 3238ad73a..3e4fc204f 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -210,7 +210,7 @@ struct bounds_t point_t max; }; -struct extents_param_t +struct cff1_extents_param_t { void init (const OT::cff1::accelerator_t *_cff) { @@ -229,15 +229,15 @@ struct extents_param_t const OT::cff1::accelerator_t *cff; }; -struct cff1_path_procs_extents_t : path_procs_t +struct cff1_path_procs_extents_t : path_procs_t { - static void moveto (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt) + static void moveto (cff1_cs_interp_env_t &env, cff1_extents_param_t& param, const point_t &pt) { param.end_path (); env.moveto (pt); } - static void line (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1) + static void line (cff1_cs_interp_env_t &env, cff1_extents_param_t& param, const point_t &pt1) { if (!param.is_path_open ()) { @@ -248,7 +248,7 @@ struct cff1_path_procs_extents_t : path_procs_t +struct cff1_cs_opset_extents_t : cff1_cs_opset_t { - static void process_seac (cff1_cs_interp_env_t &env, extents_param_t& param) + static void process_seac (cff1_cs_interp_env_t &env, cff1_extents_param_t& param) { unsigned int n = env.argStack.get_count (); point_t delta; @@ -296,11 +296,11 @@ bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, boun if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false; unsigned int fd = cff->fdSelect->get_fd (glyph); - cff1_cs_interpreter_t interp; + cff1_cs_interpreter_t interp; const byte_str_t str = (*cff->charStrings)[glyph]; interp.env.init (str, *cff, fd); interp.env.set_in_seac (in_seac); - extents_param_t param; + cff1_extents_param_t param; param.init (cff); if (unlikely (!interp.interpret (param))) return false; bounds = param.bounds; diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc index 9c9e37bd0..33b51fea4 100644 --- a/src/hb-ot-cff2-table.cc +++ b/src/hb-ot-cff2-table.cc @@ -33,7 +33,7 @@ using namespace CFF; -struct extents_param_t +struct cff2_extents_param_t { void init () { @@ -63,15 +63,15 @@ struct extents_param_t number_t max_y; }; -struct cff2_path_procs_extents_t : path_procs_t +struct cff2_path_procs_extents_t : path_procs_t { - static void moveto (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt) + static void moveto (cff2_cs_interp_env_t &env, cff2_extents_param_t& param, const point_t &pt) { param.end_path (); env.moveto (pt); } - static void line (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1) + static void line (cff2_cs_interp_env_t &env, cff2_extents_param_t& param, const point_t &pt1) { if (!param.is_path_open ()) { @@ -82,7 +82,7 @@ struct cff2_path_procs_extents_t : path_procs_t {}; +struct cff2_cs_opset_extents_t : cff2_cs_opset_t {}; bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph, @@ -113,10 +113,10 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, unsigned int num_coords; const int *coords = hb_font_get_var_coords_normalized (font, &num_coords); unsigned int fd = fdSelect->get_fd (glyph); - cff2_cs_interpreter_t interp; + cff2_cs_interpreter_t interp; const byte_str_t str = (*charStrings)[glyph]; interp.env.init (str, *this, fd, coords, num_coords); - extents_param_t param; + cff2_extents_param_t param; param.init (); if (unlikely (!interp.interpret (param))) return false; From ceb4c212dc91a277f646c4a5354e4362f548a9f6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 16:02:13 -0700 Subject: [PATCH 598/617] [amalgam] Fix UCD issue This actually makes it build now! Part https://github.com/harfbuzz/harfbuzz/issues/1809 Keeping open to add tests, CI, etc. --- src/hb-ucd.cc | 5 +---- src/hb-unicode.cc | 2 -- src/hb-unicode.hh | 3 +++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc index 69949a288..b29f2a9c7 100644 --- a/src/hb-ucd.cc +++ b/src/hb-ucd.cc @@ -15,6 +15,7 @@ */ #include "hb.hh" +#include "hb-unicode.hh" #include "hb-machinery.hh" #include "hb-ucd-table.hh" @@ -235,10 +236,6 @@ void free_static_ucd_funcs () } #endif -extern "C" HB_INTERNAL -hb_unicode_funcs_t * -hb_ucd_get_unicode_funcs (); - hb_unicode_funcs_t * hb_ucd_get_unicode_funcs () { diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index ed4fb7782..e2deaa240 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -126,8 +126,6 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED } #endif - -extern "C" hb_unicode_funcs_t *hb_ucd_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); diff --git a/src/hb-unicode.hh b/src/hb-unicode.hh index 021fa461d..9b181c11c 100644 --- a/src/hb-unicode.hh +++ b/src/hb-unicode.hh @@ -395,4 +395,7 @@ HB_INTERNAL bool _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp); +extern "C" HB_INTERNAL hb_unicode_funcs_t *hb_ucd_get_unicode_funcs (); + + #endif /* HB_UNICODE_HH */ From 62e60322cb9e18b3ee75f1b4a2a6d3069f587407 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 16:07:03 -0700 Subject: [PATCH 599/617] Minor --- src/hb-unicode.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index e2deaa240..663415b26 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -126,17 +126,16 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED } #endif -extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); -extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); - hb_unicode_funcs_t * hb_unicode_funcs_get_default () { #if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD) return hb_ucd_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) + extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); return hb_glib_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) + extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); return hb_icu_get_unicode_funcs (); #else #define HB_UNICODE_FUNCS_NIL 1 From 04a4957040380bba58880ff51d529c5cccf1d2c7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 16:19:18 -0700 Subject: [PATCH 600/617] [amalgam] Add hb.cc to git Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/Makefile.am | 1 + src/hb.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/hb.cc diff --git a/src/Makefile.am b/src/Makefile.am index c276118e8..0d85dd757 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -308,6 +308,7 @@ hb.cc: Makefile.sources for f in $(HB_BASE_sources); do echo '#include "'$$f'"'; done | \ grep '[.]cc"' > $(srcdir)/hb.cc \ || ($(RM) $(srcdir)/hb.cc; false) +EXTRA_DIST += hb.cc noinst_PROGRAMS = \ main \ diff --git a/src/hb.cc b/src/hb.cc new file mode 100644 index 000000000..a9581d246 --- /dev/null +++ b/src/hb.cc @@ -0,0 +1,44 @@ +#include "hb-aat-layout.cc" +#include "hb-aat-map.cc" +#include "hb-blob.cc" +#include "hb-buffer-serialize.cc" +#include "hb-buffer.cc" +#include "hb-common.cc" +#include "hb-face.cc" +#include "hb-fallback-shape.cc" +#include "hb-font.cc" +#include "hb-map.cc" +#include "hb-ot-cff1-table.cc" +#include "hb-ot-cff2-table.cc" +#include "hb-ot-color.cc" +#include "hb-ot-face.cc" +#include "hb-ot-font.cc" +#include "hb-ot-layout.cc" +#include "hb-ot-map.cc" +#include "hb-ot-math.cc" +#include "hb-ot-name.cc" +#include "hb-ot-shape-complex-arabic.cc" +#include "hb-ot-shape-complex-default.cc" +#include "hb-ot-shape-complex-hangul.cc" +#include "hb-ot-shape-complex-hebrew.cc" +#include "hb-ot-shape-complex-indic-table.cc" +#include "hb-ot-shape-complex-indic.cc" +#include "hb-ot-shape-complex-khmer.cc" +#include "hb-ot-shape-complex-myanmar.cc" +#include "hb-ot-shape-complex-thai.cc" +#include "hb-ot-shape-complex-use-table.cc" +#include "hb-ot-shape-complex-use.cc" +#include "hb-ot-shape-complex-vowel-constraints.cc" +#include "hb-ot-shape-fallback.cc" +#include "hb-ot-shape-normalize.cc" +#include "hb-ot-shape.cc" +#include "hb-ot-tag.cc" +#include "hb-ot-var.cc" +#include "hb-set.cc" +#include "hb-shape-plan.cc" +#include "hb-shape.cc" +#include "hb-shaper.cc" +#include "hb-static.cc" +#include "hb-ucd.cc" +#include "hb-unicode.cc" +#include "hb-warning.cc" From df4448064e370a410404708a15ce819daf1d9386 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 17:11:09 -0700 Subject: [PATCH 601/617] Remove unused 'inline' specifier --- src/hb-ot-map.hh | 4 ++-- src/hb-shape-plan.hh | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hb-ot-map.hh b/src/hb-ot-map.hh index dd6778638..0a4827d74 100644 --- a/src/hb-ot-map.hh +++ b/src/hb-ot-map.hh @@ -154,8 +154,8 @@ struct hb_ot_map_t HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const; template - HB_INTERNAL inline void apply (const Proxy &proxy, - const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const; + HB_INTERNAL void apply (const Proxy &proxy, + const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const; HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const; HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const; diff --git a/src/hb-shape-plan.hh b/src/hb-shape-plan.hh index 8e8d7632b..6da7edb2f 100644 --- a/src/hb-shape-plan.hh +++ b/src/hb-shape-plan.hh @@ -46,16 +46,16 @@ struct hb_shape_plan_key_t hb_shape_func_t *shaper_func; const char *shaper_name; - HB_INTERNAL inline bool init (bool copy, - hb_face_t *face, - const hb_segment_properties_t *props, - const hb_feature_t *user_features, - unsigned int num_user_features, - const int *coords, - unsigned int num_coords, - const char * const *shaper_list); + HB_INTERNAL bool init (bool copy, + hb_face_t *face, + const hb_segment_properties_t *props, + const hb_feature_t *user_features, + unsigned int num_user_features, + const int *coords, + unsigned int num_coords, + const char * const *shaper_list); - HB_INTERNAL inline void free () { ::free ((void *) user_features); } + HB_INTERNAL void free () { ::free ((void *) user_features); } HB_INTERNAL bool user_features_match (const hb_shape_plan_key_t *other); From 2e48fd077954410f59156b3100c16bf56a507948 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 17:55:58 -0700 Subject: [PATCH 602/617] Sprinkle constexpr around Being conservative. Also not sure it makes any real difference in our codebase. --- src/hb-algs.hh | 48 ++++++++++++++++++++++++------------------------ src/hb-meta.hh | 18 +++++++++--------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index c8d83c828..788689478 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -50,31 +50,31 @@ struct { /* Note. This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */ - template auto + template constexpr auto operator () (T&& v) const HB_AUTO_RETURN ( hb_forward (v) ) } HB_FUNCOBJ (hb_identity); struct { /* Like identity(), but only retains lvalue-references. Rvalues are returned as rvalues. */ - template T& + template constexpr T& operator () (T& v) const { return v; } - template hb_remove_reference + template constexpr hb_remove_reference operator () (T&& v) const { return v; } } HB_FUNCOBJ (hb_lidentity); struct { /* Like identity(), but always returns rvalue. */ - template hb_remove_reference + template constexpr hb_remove_reference operator () (T&& v) const { return v; } } HB_FUNCOBJ (hb_ridentity); struct { - template bool + template constexpr bool operator () (T&& v) const { return bool (hb_forward (v)); } } HB_FUNCOBJ (hb_bool); @@ -82,11 +82,11 @@ HB_FUNCOBJ (hb_bool); struct { private: - template auto + template constexpr auto impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) template auto + hb_enable_if (hb_is_integral (T))> constexpr auto impl (const T& v, hb_priority<0>) const HB_AUTO_RETURN ( /* Knuth's multiplicative method: */ @@ -95,7 +95,7 @@ struct public: - template auto + template constexpr auto operator () (const T& v) const HB_RETURN (uint32_t, impl (v, hb_prioritize)) } HB_FUNCOBJ (hb_hash); @@ -328,14 +328,14 @@ hb_pair (T1&& a, T2&& b) { return hb_pair_t (a, b); } struct { - template typename Pair::first_t + template constexpr typename Pair::first_t operator () (const Pair& pair) const { return pair.first; } } HB_FUNCOBJ (hb_first); struct { - template typename Pair::second_t + template constexpr typename Pair::second_t operator () (const Pair& pair) const { return pair.second; } } HB_FUNCOBJ (hb_second); @@ -346,14 +346,14 @@ HB_FUNCOBJ (hb_second); * comparing integers of different signedness. */ struct { - template auto + template constexpr auto operator () (T&& a, T2&& b) const HB_AUTO_RETURN (hb_forward (a) <= hb_forward (b) ? hb_forward (a) : hb_forward (b)) } HB_FUNCOBJ (hb_min); struct { - template auto + template constexpr auto operator () (T&& a, T2&& b) const HB_AUTO_RETURN (hb_forward (a) >= hb_forward (b) ? hb_forward (a) : hb_forward (b)) } @@ -917,7 +917,7 @@ struct hb_bitwise_and { HB_PARTIALIZE(2); static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; - template auto + template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); @@ -925,7 +925,7 @@ struct hb_bitwise_or { HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template auto + template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) } HB_FUNCOBJ (hb_bitwise_or); @@ -933,7 +933,7 @@ struct hb_bitwise_xor { HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template auto + template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) } HB_FUNCOBJ (hb_bitwise_xor); @@ -941,56 +941,56 @@ struct hb_bitwise_sub { HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = false; - template auto + template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } HB_FUNCOBJ (hb_bitwise_sub); struct { - template auto + template constexpr auto operator () (const T &a) const HB_AUTO_RETURN (~a) } HB_FUNCOBJ (hb_bitwise_neg); struct { HB_PARTIALIZE(2); - template auto + template constexpr auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) } HB_FUNCOBJ (hb_add); struct { HB_PARTIALIZE(2); - template auto + template constexpr auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) } HB_FUNCOBJ (hb_sub); struct { HB_PARTIALIZE(2); - template auto + template constexpr auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) } HB_FUNCOBJ (hb_mul); struct { HB_PARTIALIZE(2); - template auto + template constexpr auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) } HB_FUNCOBJ (hb_div); struct { HB_PARTIALIZE(2); - template auto + template constexpr auto operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) } HB_FUNCOBJ (hb_mod); struct { - template auto + template constexpr auto operator () (const T &a) const HB_AUTO_RETURN (+a) } HB_FUNCOBJ (hb_pos); struct { - template auto + template constexpr auto operator () (const T &a) const HB_AUTO_RETURN (-a) } HB_FUNCOBJ (hb_neg); diff --git a/src/hb-meta.hh b/src/hb-meta.hh index df8ebd175..2dfaeb7b4 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -80,8 +80,8 @@ template using hb_type_identity = typename hb_type_identity_t::t struct { - template - T* operator () (T& arg) const + template constexpr T* + operator () (T& arg) const { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" @@ -171,29 +171,29 @@ using hb_is_cr_convertible = hb_bool_constant< /* std::move and std::forward */ template -static hb_remove_reference&& hb_move (T&& t) { return (hb_remove_reference&&) (t); } +static constexpr hb_remove_reference&& hb_move (T&& t) { return (hb_remove_reference&&) (t); } template -static T&& hb_forward (hb_remove_reference& t) { return (T&&) t; } +static constexpr T&& hb_forward (hb_remove_reference& t) { return (T&&) t; } template -static T&& hb_forward (hb_remove_reference&& t) { return (T&&) t; } +static constexpr T&& hb_forward (hb_remove_reference&& t) { return (T&&) t; } struct { - template auto + template constexpr auto operator () (T&& v) const HB_AUTO_RETURN (hb_forward (v)) - template auto + template constexpr auto operator () (T *v) const HB_AUTO_RETURN (*v) } HB_FUNCOBJ (hb_deref); struct { - template auto + template constexpr auto operator () (T&& v) const HB_AUTO_RETURN (hb_forward (v)) - template auto + template constexpr auto operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v)) } HB_FUNCOBJ (hb_ref); From c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 19:15:03 -0700 Subject: [PATCH 603/617] Use constexpr to replace passthru_ bools --- src/hb-algs.hh | 8 -------- src/hb-set.hh | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 788689478..5d8c8dd82 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -915,32 +915,24 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o struct hb_bitwise_and { HB_PARTIALIZE(2); - static constexpr bool passthru_left = false; - static constexpr bool passthru_right = false; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); struct hb_bitwise_or { HB_PARTIALIZE(2); - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = true; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) } HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor { HB_PARTIALIZE(2); - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = true; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) } HB_FUNCOBJ (hb_bitwise_xor); struct hb_bitwise_sub { HB_PARTIALIZE(2); - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = false; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } diff --git a/src/hb-set.hh b/src/hb-set.hh index ad449d0ce..11034af4b 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -448,6 +448,8 @@ struct hb_set_t dirty (); + constexpr bool passthru_left = op (0, 0) || op (1, 0); + constexpr bool passthru_right = op (0, 0) || op (0, 1); unsigned int na = pages.length; unsigned int nb = other->pages.length; unsigned int next_page = na; @@ -464,20 +466,20 @@ struct hb_set_t } else if (page_map[a].major < other->page_map[b].major) { - if (Op::passthru_left) + if (passthru_left) count++; a++; } else { - if (Op::passthru_right) + if (passthru_right) count++; b++; } } - if (Op::passthru_left) + if (passthru_left) count += na - a; - if (Op::passthru_right) + if (passthru_right) count += nb - b; if (count > pages.length) @@ -501,7 +503,7 @@ struct hb_set_t else if (page_map[a - 1].major > other->page_map[b - 1].major) { a--; - if (Op::passthru_left) + if (passthru_left) { count--; page_map[count] = page_map[a]; @@ -510,7 +512,7 @@ struct hb_set_t else { b--; - if (Op::passthru_right) + if (passthru_right) { count--; page_map[count].major = other->page_map[b].major; @@ -519,14 +521,14 @@ struct hb_set_t } } } - if (Op::passthru_left) + if (passthru_left) while (a) { a--; count--; page_map[count] = page_map [a]; } - if (Op::passthru_right) + if (passthru_right) while (b) { b--; From 4cb180d227c1adc32e921c241a93cd1f50a98d33 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 2 Jul 2019 19:44:18 -0700 Subject: [PATCH 604/617] Revert "Use constexpr to replace passthru_ bools" This reverts commit c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395. Broke several compilers... Sigh. The version without constexpr didn't fully optimize out the unreachable code on clang. So, revert it is... --- src/hb-algs.hh | 8 ++++++++ src/hb-set.hh | 18 ++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 5d8c8dd82..788689478 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -915,24 +915,32 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o struct hb_bitwise_and { HB_PARTIALIZE(2); + static constexpr bool passthru_left = false; + static constexpr bool passthru_right = false; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) } HB_FUNCOBJ (hb_bitwise_and); struct hb_bitwise_or { HB_PARTIALIZE(2); + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = true; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) } HB_FUNCOBJ (hb_bitwise_or); struct hb_bitwise_xor { HB_PARTIALIZE(2); + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = true; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) } HB_FUNCOBJ (hb_bitwise_xor); struct hb_bitwise_sub { HB_PARTIALIZE(2); + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = false; template constexpr auto operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) } diff --git a/src/hb-set.hh b/src/hb-set.hh index 11034af4b..ad449d0ce 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -448,8 +448,6 @@ struct hb_set_t dirty (); - constexpr bool passthru_left = op (0, 0) || op (1, 0); - constexpr bool passthru_right = op (0, 0) || op (0, 1); unsigned int na = pages.length; unsigned int nb = other->pages.length; unsigned int next_page = na; @@ -466,20 +464,20 @@ struct hb_set_t } else if (page_map[a].major < other->page_map[b].major) { - if (passthru_left) + if (Op::passthru_left) count++; a++; } else { - if (passthru_right) + if (Op::passthru_right) count++; b++; } } - if (passthru_left) + if (Op::passthru_left) count += na - a; - if (passthru_right) + if (Op::passthru_right) count += nb - b; if (count > pages.length) @@ -503,7 +501,7 @@ struct hb_set_t else if (page_map[a - 1].major > other->page_map[b - 1].major) { a--; - if (passthru_left) + if (Op::passthru_left) { count--; page_map[count] = page_map[a]; @@ -512,7 +510,7 @@ struct hb_set_t else { b--; - if (passthru_right) + if (Op::passthru_right) { count--; page_map[count].major = other->page_map[b].major; @@ -521,14 +519,14 @@ struct hb_set_t } } } - if (passthru_left) + if (Op::passthru_left) while (a) { a--; count--; page_map[count] = page_map [a]; } - if (passthru_right) + if (Op::passthru_right) while (b) { b--; From d51524204528b36907ab0f48bf2a48ec124c93d9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Jul 2019 12:10:03 -0700 Subject: [PATCH 605/617] [amalgam] Rename hb.cc to harfbuzz.cc Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/Makefile.am | 8 ++++---- src/{hb.cc => harfbuzz.cc} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename src/{hb.cc => harfbuzz.cc} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index 0d85dd757..746b8f022 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -303,12 +303,12 @@ $(srcdir)/%.hh: $(srcdir)/%.rl $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \ || ($(RM) "$@"; false) -hb.cc: Makefile.sources +harfbuzz.cc: Makefile.sources $(AM_V_GEN) \ for f in $(HB_BASE_sources); do echo '#include "'$$f'"'; done | \ - grep '[.]cc"' > $(srcdir)/hb.cc \ - || ($(RM) $(srcdir)/hb.cc; false) -EXTRA_DIST += hb.cc + grep '[.]cc"' > $(srcdir)/harfbuzz.cc \ + || ($(RM) $(srcdir)/harfbuzz.cc; false) +EXTRA_DIST += harfbuzz.cc noinst_PROGRAMS = \ main \ diff --git a/src/hb.cc b/src/harfbuzz.cc similarity index 100% rename from src/hb.cc rename to src/harfbuzz.cc From b240d701fd98efa59a7f772ff39654fc95b8fc8f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Jul 2019 12:17:57 -0700 Subject: [PATCH 606/617] [amalgam] Include integration source files as well Just for those that are normally built into libharfbuzz itself. Part of https://github.com/harfbuzz/harfbuzz/issues/1809 --- src/Makefile.am | 12 ++++++++++-- src/harfbuzz.cc | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 746b8f022..5c15a3d3d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -305,10 +305,18 @@ $(srcdir)/%.hh: $(srcdir)/%.rl harfbuzz.cc: Makefile.sources $(AM_V_GEN) \ - for f in $(HB_BASE_sources); do echo '#include "'$$f'"'; done | \ + for f in \ + $(HB_BASE_sources) \ + $(HB_GLIB_sources) \ + $(HB_FT_sources) \ + $(HB_GRAPHITE2_sources) \ + $(HB_UNISCRIBE_sources) \ + $(HB_DIRECTWRITE_sources) \ + $(HB_CORETEXT_sources) \ + ; do echo '#include "'$$f'"'; done | \ grep '[.]cc"' > $(srcdir)/harfbuzz.cc \ || ($(RM) $(srcdir)/harfbuzz.cc; false) -EXTRA_DIST += harfbuzz.cc +BUILT_SOURCES += harfbuzz.cc noinst_PROGRAMS = \ main \ diff --git a/src/harfbuzz.cc b/src/harfbuzz.cc index a9581d246..8f5bb79a1 100644 --- a/src/harfbuzz.cc +++ b/src/harfbuzz.cc @@ -42,3 +42,9 @@ #include "hb-ucd.cc" #include "hb-unicode.cc" #include "hb-warning.cc" +#include "hb-glib.cc" +#include "hb-ft.cc" +#include "hb-graphite2.cc" +#include "hb-uniscribe.cc" +#include "hb-directwrite.cc" +#include "hb-coretext.cc" From 9fea6b4dd41bfe2b85f788523162658a7ab9bd49 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Fri, 5 Jul 2019 18:46:41 +0430 Subject: [PATCH 607/617] [amalgam] Use it in cmake port and fix conflicts (#1812) --- .circleci/config.yml | 8 ++-- CMakeLists.txt | 74 +++------------------------------- src/Makefile.am | 2 + src/hb-cff-interp-common.hh | 6 +-- src/hb-cff-interp-cs-common.hh | 2 +- src/hb-coretext.cc | 4 +- src/hb-directwrite.cc | 14 +++---- src/hb-ft.cc | 4 +- 8 files changed, 27 insertions(+), 87 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ce6a8e22..6ad98d237 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -264,7 +264,7 @@ jobs: - image: dockcross/android-arm steps: - checkout - - run: cmake -Bbuild -H. -GNinja + - run: cmake -Bbuild -H. -GNinja -DHB_BUILD_TESTS=OFF - run: ninja -Cbuild crosscompile-cmake-notest-browser-asmjs-hb_tiny: @@ -272,7 +272,7 @@ jobs: - image: dockcross/browser-asmjs steps: - checkout - - run: cmake -Bbuild -H. -GNinja -DCMAKE_CXX_FLAGS="-DHB_TINY" + - run: cmake -Bbuild -H. -GNinja -DCMAKE_CXX_FLAGS="-DHB_TINY" -DHB_BUILD_TESTS=OFF - run: ninja -Cbuild crosscompile-cmake-notest-linux-arm64: @@ -280,7 +280,7 @@ jobs: - image: dockcross/linux-arm64 steps: - checkout - - run: cmake -Bbuild -H. -GNinja + - run: cmake -Bbuild -H. -GNinja -DHB_BUILD_TESTS=OFF - run: ninja -Cbuild crosscompile-cmake-notest-linux-mips: @@ -288,7 +288,7 @@ jobs: - image: dockcross/linux-mips steps: - checkout - - run: cmake -Bbuild -H. -GNinja + - run: cmake -Bbuild -H. -GNinja -DHB_BUILD_TESTS=OFF - run: ninja -Cbuild #crosscompile-cmake-notest-windows-x64: diff --git a/CMakeLists.txt b/CMakeLists.txt index c9ba0160c..c41579c1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,8 +157,6 @@ endfunction () file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES) file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES) -extract_make_variable(HB_BASE_sources ${SRCSOURCES}) -add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/") extract_make_variable(HB_BASE_headers ${SRCSOURCES}) add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/") @@ -192,59 +190,12 @@ set (HB_VERSION_MAJOR ${CMAKE_MATCH_2}) set (HB_VERSION_MINOR ${CMAKE_MATCH_3}) set (HB_VERSION_MICRO ${CMAKE_MATCH_4}) - -## Define ragel tasks -# if (NOT IN_HB_DIST) -# foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources}) -# string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output}) -# set (target_name ${CMAKE_MATCH_1}) -# add_custom_command(OUTPUT ${ragel_output} -# COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN} -# DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -# ) -# add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name}) -# endforeach () - -# mark_as_advanced(RAGEL) -# endif () - - -## Generate hb-version.h -# if (NOT IN_HB_DIST) -# set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in") -# set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h") -# set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true) -# configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY) -# execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different -# "${HB_VERSION_H}.tmp" -# "${HB_VERSION_H}" -# ) -# file(REMOVE "${HB_VERSION_H}.tmp") -# endif () - - ## Define sources and headers of the project -set (project_sources - ${HB_BASE_sources} - ${HB_BASE_RAGEL_GENERATED_sources} -) - -set (subset_project_sources - ${HB_SUBSET_sources} -) - +set (project_sources ${PROJECT_SOURCE_DIR}/src/harfbuzz.cc) # use amalgam source +set (subset_project_sources ${HB_SUBSET_sources}) set (project_extra_sources) - -set (project_headers - #${HB_VERSION_H} - - ${HB_BASE_headers} -) - -set (subset_project_headers - ${HB_SUBSET_headers} -) - +set (project_headers ${HB_BASE_headers}) +set (subset_project_headers ${HB_SUBSET_headers}) ## Find and include needed header folders and libraries if (HB_HAVE_FREETYPE) @@ -257,7 +208,6 @@ if (HB_HAVE_FREETYPE) include_directories(AFTER ${FREETYPE_INCLUDE_DIRS}) add_definitions(-DHAVE_FREETYPE=1) - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h) # So check_funcs can find its headers @@ -275,7 +225,6 @@ if (HB_HAVE_GRAPHITE2) include_directories(${GRAPHITE2_INCLUDE_DIR}) - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-graphite2.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-graphite2.h) list(APPEND THIRD_PARTY_LIBS ${GRAPHITE2_LIBRARY}) @@ -296,7 +245,6 @@ if (HB_HAVE_GLIB) include_directories(${GLIBCONFIG_INCLUDE_DIR} ${GLIB_INCLUDE_DIR}) - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-glib.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-glib.h) list(APPEND THIRD_PARTY_LIBS ${GLIB_LIBRARIES}) @@ -316,7 +264,6 @@ if (HB_HAVE_ICU) include_directories(${ICU_INCLUDE_DIR}) - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-icu.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-icu.h) list(APPEND THIRD_PARTY_LIBS ${ICU_LIBRARY}) @@ -328,7 +275,6 @@ if (APPLE AND HB_HAVE_CORETEXT) # Apple Advanced Typography add_definitions(-DHAVE_CORETEXT) - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-coretext.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-coretext.h) if (HB_IOS) @@ -361,19 +307,13 @@ endif () if (WIN32 AND HB_HAVE_UNISCRIBE) add_definitions(-DHAVE_UNISCRIBE) - - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.h) - list(APPEND THIRD_PARTY_LIBS usp10 gdi32 rpcrt4) endif () if (WIN32 AND HB_HAVE_DIRECTWRITE) add_definitions(-DHAVE_DIRECTWRITE) - - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-directwrite.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h) - list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4) endif () @@ -481,7 +421,6 @@ if (HB_HAVE_GOBJECT) ) endif () - ## Atomic ops availability detection file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c" " void memory_barrier (void) { __sync_synchronize (); } @@ -590,7 +529,6 @@ if (WIN32) endif () if (HB_HAVE_INTROSPECTION) - find_package(PkgConfig) pkg_check_modules(PC_GI QUIET gobject-introspection-1.0) @@ -824,7 +762,7 @@ endif () if (HB_BUILD_TESTS) ## src/ executables - foreach (prog main test test-gsub-would-substitute test-gpos-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) + foreach (prog main test test-gsub-would-substitute test-gpos-size-params test-buffer-serialize test-unicode-ranges) # hb-ot-tag set (prog_name ${prog}) if (${prog_name} STREQUAL "test") # test can not be used as a valid executable name on cmake, lets special case it @@ -833,7 +771,7 @@ if (HB_BUILD_TESTS) add_executable(${prog_name} ${PROJECT_SOURCE_DIR}/src/${prog}.cc) target_link_libraries(${prog_name} harfbuzz ${THIRD_PARTY_LIBS}) endforeach () - set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN") + # set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN") ## Tests if (UNIX OR MINGW) diff --git a/src/Makefile.am b/src/Makefile.am index 5c15a3d3d..1e79483c9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,8 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-introspection TESTS = check_PROGRAMS = +EXTRA_DIST += harfbuzz.cc + # Convenience targets: lib: $(BUILT_SOURCES) libharfbuzz.la libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES) diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh index 948772b0e..fdc5c683a 100644 --- a/src/hb-cff-interp-common.hh +++ b/src/hb-cff-interp-common.hh @@ -378,7 +378,7 @@ typedef hb_vector_t byte_str_array_t; /* stack */ template -struct stack_t +struct cff_stack_t { void init () { @@ -469,7 +469,7 @@ struct stack_t /* argument stack */ template -struct arg_stack_t : stack_t +struct arg_stack_t : cff_stack_t { void push_int (int v) { @@ -523,7 +523,7 @@ struct arg_stack_t : stack_t { return S::elements.sub_array (start); } private: - typedef stack_t S; + typedef cff_stack_t S; }; /* an operator prefixed by its operands in a byte string */ diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index cf9ce4dc3..d9ad4d0d6 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -57,7 +57,7 @@ struct call_context_t /* call stack */ const unsigned int kMaxCallLimit = 10; -struct call_stack_t : stack_t {}; +struct call_stack_t : cff_stack_t {}; template struct biased_subrs_t diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index a57b97026..e8a4fd51e 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -75,7 +75,7 @@ release_table_data (void *user_data) } static hb_blob_t * -reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) +_hb_cg_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { CGFontRef cg_font = reinterpret_cast (user_data); CFDataRef cf_data = CGFontCopyTableForTag (cg_font, tag); @@ -299,7 +299,7 @@ _hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data) hb_face_t * hb_coretext_face_create (CGFontRef cg_font) { - return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), _hb_cg_font_release); + return hb_face_create_for_tables (_hb_cg_reference_table, CGFontRetain (cg_font), _hb_cg_font_release); } /* diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index a625763da..810c5e553 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -539,10 +539,10 @@ protected: Run mRunHead; }; -static inline uint16_t hb_uint16_swap (const uint16_t v) +static inline uint16_t hb_dw_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); } +static inline uint32_t hb_dw_uint32_swap (const uint32_t v) +{ return (hb_dw_uint16_swap (v) << 16) | hb_dw_uint16_swap (v >> 16); } /* * shaper @@ -653,7 +653,7 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, for (unsigned int i = 0; i < num_features; ++i) { typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG) - hb_uint32_swap (features[i].tag); + hb_dw_uint32_swap (features[i].tag); typographic_features.features[i].parameter = features[i].value; } } @@ -934,14 +934,14 @@ _hb_directwrite_table_data_release (void *data) } static hb_blob_t * -reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) +_hb_directwrite_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { IDWriteFontFace *dw_face = ((IDWriteFontFace *) user_data); const void *data; uint32_t length; void *table_context; BOOL exists; - if (!dw_face || FAILED (dw_face->TryGetFontTable (hb_uint32_swap (tag), &data, + if (!dw_face || FAILED (dw_face->TryGetFontTable (hb_dw_uint32_swap (tag), &data, &length, &table_context, &exists))) return nullptr; @@ -979,7 +979,7 @@ hb_directwrite_face_create (IDWriteFontFace *font_face) { if (font_face) font_face->AddRef (); - return hb_face_create_for_tables (reference_table, font_face, + return hb_face_create_for_tables (_hb_directwrite_reference_table, font_face, _hb_directwrite_font_release); } diff --git a/src/hb-ft.cc b/src/hb-ft.cc index c01f02991..2d7f2b959 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -564,7 +564,7 @@ _hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) static hb_blob_t * -reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) +_hb_ft_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { FT_Face ft_face = (FT_Face) user_data; FT_Byte *buffer; @@ -619,7 +619,7 @@ hb_ft_face_create (FT_Face ft_face, face = hb_face_create (blob, ft_face->face_index); hb_blob_destroy (blob); } else { - face = hb_face_create_for_tables (reference_table, ft_face, destroy); + face = hb_face_create_for_tables (_hb_ft_reference_table, ft_face, destroy); } hb_face_set_index (face, ft_face->face_index); From 641f33738089ef7ccbedce09886309edcd2e1718 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 4 Jul 2019 23:03:45 +0200 Subject: [PATCH 608/617] =?UTF-8?q?Docs=20typo=20fix:=20slower=20=E2=86=92?= =?UTF-8?q?=20lower?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hb-set.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-set.cc b/src/hb-set.cc index fa9868809..8e6790760 100644 --- a/src/hb-set.cc +++ b/src/hb-set.cc @@ -479,7 +479,7 @@ hb_set_next (const hb_set_t *set, * @set: a set. * @codepoint: (inout): * - * Gets the previous number in @set that is slower than current value of @codepoint. + * Gets the previous number in @set that is lower than current value of @codepoint. * * Set @codepoint to %HB_SET_VALUE_INVALID to get started. * From ffa736f151f27adb76fb0bf91e18e1ec5cb8fe8d Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 4 Jul 2019 23:05:50 +0200 Subject: [PATCH 609/617] hb_set_previous_range docs: fix presumed copy/paste error --- src/hb-set.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-set.cc b/src/hb-set.cc index 8e6790760..10638a7e6 100644 --- a/src/hb-set.cc +++ b/src/hb-set.cc @@ -524,7 +524,7 @@ hb_set_next_range (const hb_set_t *set, * @last: (out): output last codepoint in the range. * * Gets the previous consecutive range of numbers in @set that - * are greater than current value of @last. + * are less than current value of @first. * * Set @first to %HB_SET_VALUE_INVALID to get started. * From cf1a782a5ca82a880906cae3d4cb76b10ec2aad2 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 4 Jul 2019 21:06:59 +0200 Subject: [PATCH 610/617] Docs: fix a typo in function name --- docs/usermanual-fonts-and-faces.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usermanual-fonts-and-faces.xml b/docs/usermanual-fonts-and-faces.xml index b87f0e5e8..1258bec8c 100644 --- a/docs/usermanual-fonts-and-faces.xml +++ b/docs/usermanual-fonts-and-faces.xml @@ -86,7 +86,7 @@ objects. hb_font_set_ppem(font, x_ppem, y_ppem) sets the pixels-per-EM value of the font. You can also set the point size of the font with - hb_font_set_ppem(font, ptem). HarfBuzz uses the + hb_font_set_ptem(font, ptem). HarfBuzz uses the industry standard 72 points per inch. From 144326e215671a42fb3ac9f00ddef779ba354345 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 5 Jul 2019 19:05:11 +0200 Subject: [PATCH 611/617] Clusters are reversed based on the direction, not script Fixes https://github.com/harfbuzz/harfbuzz/issues/1818 --- docs/usermanual-clusters.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/usermanual-clusters.xml b/docs/usermanual-clusters.xml index a7b16580a..9147ff0a5 100644 --- a/docs/usermanual-clusters.xml +++ b/docs/usermanual-clusters.xml @@ -156,14 +156,16 @@ order. - For left-to-right scripts (LTR) and top-to-bottom scripts (TTB), + For buffers in the left-to-right (LTR) + or top-to-bottom (TTB) text flow direction, HarfBuzz will preserve the monotonic property: client programs are guaranteed that monotonically increasing initial cluster values will be returned as monotonically increasing final cluster values. - For right-to-left scripts (RTL) and bottom-to-top scripts (BTT), + For buffers in the right-to-left (RTL) + or bottom-to-top (BTT) text flow direction, the directionality of the buffer itself is reversed for final output as a matter of design. Therefore, HarfBuzz inverts the monotonic property: client programs are guaranteed that From 0d425e1eeaea97bf5e4fc9ce40e549332bc0cea1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 5 Jul 2019 13:18:05 -0700 Subject: [PATCH 612/617] [ot-font] Optimize rounding Part of https://github.com/harfbuzz/harfbuzz/issues/1801 The assumption that compiler optimizes "upem/2" to a shift only works if upem is unsigned... Anyway, spoon-feed the compiler. --- src/hb-font.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-font.hh b/src/hb-font.hh index 3b917d129..d807874f6 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -609,9 +609,11 @@ struct hb_font_t hb_position_t em_scale (int16_t v, int scale) { - int upem = face->get_upem (); + signed upem = face->get_upem (); + signed upem2 = upem >> 1; int64_t scaled = v * (int64_t) scale; - scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */ + + scaled += scaled >= 0 ? upem2 : -upem2; /* Round. */ return (hb_position_t) (scaled / upem); } hb_position_t em_scalef (float v, int scale) From df6edcd44ceb63d01d9c0d6d2aa06b6c6cbb914d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 5 Jul 2019 13:45:15 -0700 Subject: [PATCH 613/617] Make face immutable in hb_font_set_face() --- src/hb-font.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-font.cc b/src/hb-font.cc index f450d8889..5727247af 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -1601,6 +1601,7 @@ hb_font_set_face (hb_font_t *font, hb_face_t *old = font->face; + hb_face_make_immutable (face); font->face = hb_face_reference (face); hb_face_destroy (old); From b847769292aca13345fd1facae35aaf999198ad4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 5 Jul 2019 13:52:09 -0700 Subject: [PATCH 614/617] [font] Keep font-space to user-space multiplier Part of https://github.com/harfbuzz/harfbuzz/issues/1801 --- src/hb-font.cc | 5 +++++ src/hb-font.hh | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/hb-font.cc b/src/hb-font.cc index 5727247af..9cd501170 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -1300,6 +1300,8 @@ DEFINE_NULL_INSTANCE (hb_font_t) = 1000, /* x_scale */ 1000, /* y_scale */ + 1<<16, /* x_mult */ + 1<<16, /* y_mult */ 0, /* x_ppem */ 0, /* y_ppem */ @@ -1330,6 +1332,7 @@ _hb_font_create (hb_face_t *face) font->klass = hb_font_funcs_get_empty (); font->data.init0 (font); font->x_scale = font->y_scale = hb_face_get_upem (face); + font->x_mult = font->y_mult = 1 << 16; return font; } @@ -1603,6 +1606,7 @@ hb_font_set_face (hb_font_t *font, hb_face_make_immutable (face); font->face = hb_face_reference (face); + font->mults_changed (); hb_face_destroy (old); } @@ -1712,6 +1716,7 @@ hb_font_set_scale (hb_font_t *font, font->x_scale = x_scale; font->y_scale = y_scale; + font->mults_changed (); } /** diff --git a/src/hb-font.hh b/src/hb-font.hh index d807874f6..e379f125c 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -107,8 +107,10 @@ struct hb_font_t hb_font_t *parent; hb_face_t *face; - int x_scale; - int y_scale; + int32_t x_scale; + int32_t y_scale; + int64_t x_mult; + int64_t y_mult; unsigned int x_ppem; unsigned int y_ppem; @@ -607,6 +609,13 @@ struct hb_font_t return false; } + void mults_changed () + { + signed upem = face->get_upem (); + x_mult = ((int64_t) x_scale << 16) / upem; + y_mult = ((int64_t) y_scale << 16) / upem; + } + hb_position_t em_scale (int16_t v, int scale) { signed upem = face->get_upem (); From f18ea1dd3a9961661a383b2966de57ea68a267e7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 5 Jul 2019 13:56:45 -0700 Subject: [PATCH 615/617] [font] Remove division when scaling Yoohoo. This seems to be precise enough! Let's see if it sticks. I'm asking Dominik to run this in Chrome test suite and report. Fixes https://github.com/harfbuzz/harfbuzz/issues/1801 --- src/hb-font.hh | 23 +++++++++-------------- src/hb-ot-math-table.hh | 16 ++++++++-------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/hb-font.hh b/src/hb-font.hh index e379f125c..4adf6ae99 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -129,16 +129,16 @@ struct hb_font_t /* Convert from font-space to user-space */ - int dir_scale (hb_direction_t direction) - { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; } - hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); } - hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); } - hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); } - hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); } + int64_t dir_mult (hb_direction_t direction) + { return HB_DIRECTION_IS_VERTICAL(direction) ? y_mult : x_mult; } + hb_position_t em_scale_x (int16_t v) { return em_mult (v, x_mult); } + hb_position_t em_scale_y (int16_t v) { return em_mult (v, y_mult); } + hb_position_t em_scalef_x (float v) { return em_scalef (v, x_scale); } + hb_position_t em_scalef_y (float v) { return em_scalef (v, y_scale); } float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); } float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); } hb_position_t em_scale_dir (int16_t v, hb_direction_t direction) - { return em_scale (v, dir_scale (direction)); } + { return em_mult (v, dir_mult (direction)); } /* Convert from parent-font user-space to our user-space */ hb_position_t parent_scale_x_distance (hb_position_t v) @@ -616,14 +616,9 @@ struct hb_font_t y_mult = ((int64_t) y_scale << 16) / upem; } - hb_position_t em_scale (int16_t v, int scale) + hb_position_t em_mult (int16_t v, int64_t mult) { - signed upem = face->get_upem (); - signed upem2 = upem >> 1; - int64_t scaled = v * (int64_t) scale; - - scaled += scaled >= 0 ? upem2 : -upem2; /* Round. */ - return (hb_position_t) (scaled / upem); + return (hb_position_t) ((v * mult) >> 16); } hb_position_t em_scalef (float v, int scale) { return (hb_position_t) roundf (v * scale / face->get_upem ()); } diff --git a/src/hb-ot-math-table.hh b/src/hb-ot-math-table.hh index 0b16e0b9b..b4592ccde 100644 --- a/src/hb-ot-math-table.hh +++ b/src/hb-ot-math-table.hh @@ -453,14 +453,14 @@ struct MathGlyphPartRecord } void extract (hb_ot_math_glyph_part_t &out, - int scale, + int64_t mult, hb_font_t *font) const { out.glyph = glyph; - out.start_connector_length = font->em_scale (startConnectorLength, scale); - out.end_connector_length = font->em_scale (endConnectorLength, scale); - out.full_advance = font->em_scale (fullAdvance, scale); + out.start_connector_length = font->em_mult (startConnectorLength, mult); + out.end_connector_length = font->em_mult (endConnectorLength, mult); + out.full_advance = font->em_mult (fullAdvance, mult); static_assert ((unsigned int) HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER == (unsigned int) PartFlags::Extender, ""); @@ -508,11 +508,11 @@ struct MathGlyphAssembly { if (parts_count) { - int scale = font->dir_scale (direction); + int64_t mult = font->dir_mult (direction); hb_array_t arr = partRecords.sub_array (start_offset, parts_count); unsigned int count = arr.length; for (unsigned int i = 0; i < count; i++) - arr[i].extract (parts[i], scale, font); + arr[i].extract (parts[i], mult, font); } if (italics_correction) @@ -553,13 +553,13 @@ struct MathGlyphConstruction { if (variants_count) { - int scale = font->dir_scale (direction); + int64_t mult = font->dir_mult (direction); hb_array_t arr = mathGlyphVariantRecord.sub_array (start_offset, variants_count); unsigned int count = arr.length; for (unsigned int i = 0; i < count; i++) { variants[i].glyph = arr[i].variantGlyph; - variants[i].advance = font->em_scale (arr[i].advanceMeasurement, scale); + variants[i].advance = font->em_mult (arr[i].advanceMeasurement, mult); } } return mathGlyphVariantRecord.len; From 2e7021da7d1726a37822e6a001b9218f82255bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Mon, 8 Jul 2019 10:19:49 +0300 Subject: [PATCH 616/617] Revert "Minor" - revert moving extern "C" definitions in-function This reverts commit 62e60322cb9e18b3ee75f1b4a2a6d3069f587407 since it breaks building HarfBuzz as part of Chromium. Fixes https://github.com/harfbuzz/harfbuzz/issues/1821. --- src/hb-unicode.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 663415b26..e2deaa240 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -126,16 +126,17 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED } #endif +extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); +extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); + hb_unicode_funcs_t * hb_unicode_funcs_get_default () { #if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD) return hb_ucd_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) - extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); return hb_glib_get_unicode_funcs (); #elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) - extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); return hb_icu_get_unicode_funcs (); #else #define HB_UNICODE_FUNCS_NIL 1 From 6e35668b452cef86702e2563f4006a1db5d8fd74 Mon Sep 17 00:00:00 2001 From: blueshade7 Date: Tue, 9 Jul 2019 09:47:54 -0700 Subject: [PATCH 617/617] fix var-subset build --- src/harfbuzz.cc | 1 + test/subset/run-tests.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/harfbuzz.cc b/src/harfbuzz.cc index 8f5bb79a1..5e6527f13 100644 --- a/src/harfbuzz.cc +++ b/src/harfbuzz.cc @@ -13,6 +13,7 @@ #include "hb-ot-color.cc" #include "hb-ot-face.cc" #include "hb-ot-font.cc" +#include "hb-ot-hmtx-table.cc" #include "hb-ot-layout.cc" #include "hb-ot-map.cc" #include "hb-ot-math.cc" diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index 4bf57140f..7bea7948c 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -67,7 +67,7 @@ def run_test (test, should_check_ots): "--font-file=" + test.font_path, "--output-file=" + out_file, "--unicodes=%s" % test.unicodes (), - "--drop-tables+=DSIG,GPOS,GSUB,GDEF"] + "--drop-tables+=DSIG,GPOS,GSUB,GDEF,HVAR,VVAR,gvar"] cli_args.extend (test.get_profile_flags ()) print (' '.join (cli_args)) _, return_code = cmd (cli_args)