texlive[46498] Build/source/libs: harfbuzz 1.7.5

commits+kakuto at tug.org commits+kakuto at tug.org
Wed Jan 31 02:12:00 CET 2018


Revision: 46498
          http://tug.org/svn/texlive?view=revision&revision=46498
Author:   kakuto
Date:     2018-01-31 02:11:59 +0100 (Wed, 31 Jan 2018)
Log Message:
-----------
harfbuzz 1.7.5

Modified Paths:
--------------
    trunk/Build/source/libs/README
    trunk/Build/source/libs/harfbuzz/ChangeLog
    trunk/Build/source/libs/harfbuzz/Makefile.am
    trunk/Build/source/libs/harfbuzz/Makefile.in
    trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
    trunk/Build/source/libs/harfbuzz/configure
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/README
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc
    trunk/Build/source/libs/harfbuzz/version.ac

Added Paths:
-----------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/README	2018-01-31 01:11:59 UTC (rev 46498)
@@ -24,7 +24,7 @@
 graphite2 1.3.10 - checked 20jun17
   http://sourceforge.net/projects/silgraphite/files/graphite2/
 
-harfbuzz 1.7.4 - checked 20dec17
+harfbuzz 1.7.5 - checked 31jan18
   http://www.freedesktop.org/software/harfbuzz/release/
 
 icu 60.2 - checked 11jan18

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,3 +1,8 @@
+2018-01-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Import harfbuzz-1.7.5.
+	* Makefile.am, version.ac: Adjusted.
+
 2018-01-09  Karl Berry  <karl at freefriends.org>
 
 	* configure.ac: use AX_CXX_COMPILE_STDCXX([11],,[optional])

Modified: trunk/Build/source/libs/harfbuzz/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.am	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/Makefile.am	2018-01-31 01:11:59 UTC (rev 46498)
@@ -108,6 +108,8 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-private.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-private.hh \

Modified: trunk/Build/source/libs/harfbuzz/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.in	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/Makefile.in	2018-01-31 01:11:59 UTC (rev 46498)
@@ -145,6 +145,7 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-hebrew.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-tibetan.$(OBJEXT) \
@@ -721,6 +722,8 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-private.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-private.hh \
@@ -898,6 +901,9 @@
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -969,6 +975,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hebrew.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic-table.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-tibetan.Po at am__quote@

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,3 +1,8 @@
+2018-01-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Imported harfbuzz-1.7.5 source tree from:
+	  http://www.freedesktop.org/software/harfbuzz/release/
+
 2017-12-20  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Imported harfbuzz-1.7.4 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,4 +1,4 @@
-Changes applied to the harfbuzz-1.7.4/ tree as obtained from:
+Changes applied to the harfbuzz-1.7.5/ tree as obtained from:
 	http://www.freedesktop.org/software/harfbuzz/release/
 
 Removed:

Modified: trunk/Build/source/libs/harfbuzz/configure
===================================================================
--- trunk/Build/source/libs/harfbuzz/configure	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/configure	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 1.7.4.
+# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 1.7.5.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='harfbuzz (TeX Live)'
 PACKAGE_TARNAME='harfbuzz--tex-live-'
-PACKAGE_VERSION='1.7.4'
-PACKAGE_STRING='harfbuzz (TeX Live) 1.7.4'
+PACKAGE_VERSION='1.7.5'
+PACKAGE_STRING='harfbuzz (TeX Live) 1.7.5'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -1317,7 +1317,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures harfbuzz (TeX Live) 1.7.4 to adapt to many kinds of systems.
+\`configure' configures harfbuzz (TeX Live) 1.7.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1388,7 +1388,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 1.7.4:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 1.7.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1495,7 +1495,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-harfbuzz (TeX Live) configure 1.7.4
+harfbuzz (TeX Live) configure 1.7.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2085,7 +2085,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by harfbuzz (TeX Live) $as_me 1.7.4, which was
+It was created by harfbuzz (TeX Live) $as_me 1.7.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4008,7 +4008,7 @@
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='1.7.4'
+ VERSION='1.7.5'
 
 
 # Some tools Automake needs.
@@ -4202,8 +4202,8 @@
 
 HB_VERSION_MAJOR=1
 HB_VERSION_MINOR=7
-HB_VERSION_MICRO=4
-HB_VERSION=1.7.4
+HB_VERSION_MICRO=5
+HB_VERSION=1.7.5
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -8065,7 +8065,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by harfbuzz (TeX Live) $as_me 1.7.4, which was
+This file was extended by harfbuzz (TeX Live) $as_me 1.7.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8131,7 +8131,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-harfbuzz (TeX Live) config.status 1.7.4
+harfbuzz (TeX Live) config.status 1.7.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,10 +1,12 @@
 On Linux, install the development packages for FreeType,
 Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
-* sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
 
+    sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
+
 whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do:
-* sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
 
+    sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
+
 on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg),
 provided by Microsoft, for building HarfBuzz and other open-source libraries
 but if you need to build harfbuzz from source, put ragel binary on your
@@ -12,29 +14,37 @@
 [build steps](https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml).
 
 on macOS, using MacPorts:
-* sudo port install freetype glib2 cairo
 
+    sudo port install freetype glib2 cairo
+
 or using Homebrew:
-* brew install freetype glib cairo
 
+    brew install freetype glib cairo
+
 If you are using a tarball, you can now proceed to running configure and make
 as with any other standard package. That should leave you with a shared
-library in src/, and a few utility programs including hb-view and hb-shape
-under util/.
+library in `src/`, and a few utility programs including `hb-view` and `hb-shape`
+under `util/`.
+
 If you are bootstraping from git, you need a few more tools before you can
-run autogen.sh for the first time. Namely, pkg-config and ragel. Again,
-on Ubuntu / Debian:
-* sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
+run `autogen.sh` for the first time. Namely, `pkg-config` and `ragel`.
 
+Again, on Ubuntu / Debian:
+
+    sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
+
 and on Fedora, RHEL, CentOS:
-* sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
 
+    sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
+
 on the Mac, using MacPorts:
-* sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
 
+    sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
+
 or using Homebrew:
-* brew install autoconf automake libtool pkgconfig ragel gtk-doc
 
+    brew install autoconf automake libtool pkgconfig ragel gtk-doc
+
 To build the Python bindings, you also need:
 
-* brew install pygobject3
+    brew install pygobject3

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2018-01-31 01:11:59 UTC (rev 46498)
@@ -5,14 +5,15 @@
 
 ## Limit framework build to Xcode generator
 if (BUILD_FRAMEWORK)
-  # for a framework on macOS, use `cmake .. -DBUILD_FRAMEWORK:BOOL=true -G Xcode`
+  # for a framework build on macOS, use:
+  # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build
   if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
     message(FATAL_ERROR
       "You should use Xcode generator with BUILD_FRAMEWORK enabled")
   endif ()
-  set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
-  set(CMAKE_MACOSX_RPATH ON)
-  set(BUILD_SHARED_LIBS ON)
+  set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
+  set (CMAKE_MACOSX_RPATH ON)
+  set (BUILD_SHARED_LIBS ON)
 endif ()
 
 
@@ -39,6 +40,7 @@
 option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
 if (APPLE)
   option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
+  set (CMAKE_MACOSX_RPATH ON)
 endif ()
 if (WIN32)
   option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
@@ -46,98 +48,156 @@
 endif ()
 option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
 if (HB_BUILD_UTILS)
-  set(HB_HAVE_GLIB ON)
-  set(HB_HAVE_FREETYPE ON)
+  set (HB_HAVE_GLIB ON)
+  set (HB_HAVE_FREETYPE ON)
 endif ()
 
 option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
 if (HB_HAVE_GOBJECT)
-  set(HB_HAVE_GLIB ON)
+  set (HB_HAVE_GLIB ON)
 endif ()
 
 option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF)
 if (HB_HAVE_INTROSPECTION)
-  set(HB_HAVE_GOBJECT ON)
-  set(HB_HAVE_GLIB ON)
+  set (HB_HAVE_GOBJECT ON)
+  set (HB_HAVE_GLIB ON)
 endif ()
 
+option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and enable all options)")
+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)
+  #set (HB_HAVE_INTROSPECTION ON)
+  set (HB_HAVE_FREETYPE ON)
+  set (HB_HAVE_GRAPHITE2 ON)
+  if (WIN32)
+    set (HB_HAVE_UNISCRIBE ON)
+    set (HB_HAVE_DIRECTWRITE ON)
+  elseif (APPLE)
+    set (HB_HAVE_CORETEXT ON)
+  endif ()
+endif ()
+
 include_directories(AFTER
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
-  )
+)
 
 add_definitions(-DHAVE_OT)
 add_definitions(-DHAVE_FALLBACK)
 
-if (BUILD_SHARED_LIBS)
-  add_definitions(-DHAVE_ATEXIT)
+
+include (CheckFunctionExists)
+include (CheckIncludeFile)
+macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
+  foreach (func_name ${ARGN})
+    string(TOUPPER ${func_name} definiton_to_add)
+    check_function_exists(${func_name} HAVE_${definiton_to_add})
+    if (${HAVE_${definiton_to_add}})
+      add_definitions(-DHAVE_${definiton_to_add})
+    endif ()
+  endforeach ()
+endmacro ()
+check_funcs(atexit mprotect sysconf mmap strtod_l) #TODO: getpagesize newlocale isatty
+
+check_include_file(unistd.h HAVE_UNIST_H)
+if (${HAVE_UNIST_H})
+  add_definitions(-DHAVE_UNIST_H)
 endif ()
+#check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+#if (${HAVE_SYS_MMAN_H})
+#  add_definitions(-DHAVE_SYS_MMAN_H)
+#endif ()
+check_include_file(xlocale.h HAVE_XLOCALE_H)
+if (${HAVE_XLOCALE_H})
+  add_definitions(-DHAVE_XLOCALE_H)
+endif ()
 
+
 if (MSVC)
   add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
 endif ()
 
-if (WIN32 AND NOT MINGW AND BUILD_SHARED_LIBS)
-  add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
+if (BUILD_SHARED_LIBS)
+  if (WIN32 AND NOT MINGW)
+    add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
+  else ()
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
+  endif ()
 endif ()
 
 
 ## Detect if we are running inside a distribution or regular repository folder
-set(IN_HB_DIST FALSE)
+set (IN_HB_DIST FALSE)
 if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
   # perhaps we are on dist directory
-  set(IN_HB_DIST TRUE)
-  set(HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+  set (IN_HB_DIST TRUE)
+  set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
 endif ()
 
 
 ## Extract variables from Makefile files
-# http://stackoverflow.com/a/27630120/1414809
-function (prepend var prefix)
-  set(listVar "")
-  foreach (f ${ARGN})
+function (extract_make_variable variable makefile_source)
+  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${makefile_source})
+  string(REGEX MATCHALL "[^ \n\t\\]+" listVar ${CMAKE_MATCH_1})
+  set (${variable} ${listVar} PARENT_SCOPE)
+endfunction ()
+
+# http://stackoverflow.com/a/27630120
+function (add_prefix_to_list var prefix)
+  set (listVar "")
+  foreach (f ${${var}})
     list(APPEND listVar "${prefix}${f}")
   endforeach ()
-  set(${var} "${listVar}" PARENT_SCOPE)
+  set (${var} "${listVar}" PARENT_SCOPE)
 endfunction ()
 
-function (extract_make_variable variable file prefix)
-  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${file})
-  string(REGEX MATCHALL "[^ \n\t\\]+" list ${CMAKE_MATCH_1})
-  prepend(list ${prefix} ${list})
-  set(${variable} ${list} PARENT_SCOPE)
-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} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_BASE_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_OT_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_OT_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
+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_OT_sources ${SRCSOURCES})
+add_prefix_to_list(HB_OT_sources "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_OT_headers ${SRCSOURCES})
+add_prefix_to_list(HB_OT_headers "${PROJECT_SOURCE_DIR}/src/")
 
+extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES})
+extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES})
 if (IN_HB_DIST)
-  set(RAGEL_GENERATED_DIR "${PROJECT_SOURCE_DIR}/src/")
+  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
+  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
 else ()
-  set(RAGEL_GENERATED_DIR "${PROJECT_BINARY_DIR}/src/")
+  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
 endif ()
-extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR})
-extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR})
 
-extract_make_variable(HB_VIEW_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
-extract_make_variable(HB_SHAPE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
-extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_VIEW_sources ${UTILSOURCES})
+add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SHAPE_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SHAPE_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} "${PROJECT_SOURCE_DIR}/src/hb-ucdn/")
+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})
-set(HB_VERSION ${CMAKE_MATCH_1})
-set(HB_VERSION_MAJOR ${CMAKE_MATCH_2})
-set(HB_VERSION_MINOR ${CMAKE_MATCH_3})
-set(HB_VERSION_MICRO ${CMAKE_MATCH_4})
+set (HB_VERSION ${CMAKE_MATCH_1})
+set (HB_VERSION_MAJOR ${CMAKE_MATCH_2})
+set (HB_VERSION_MINOR ${CMAKE_MATCH_3})
+set (HB_VERSION_MICRO ${CMAKE_MATCH_4})
 
 
 ## Define ragel tasks
@@ -152,11 +212,11 @@
 
   foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
     string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
-    set(target_name ${CMAKE_MATCH_1})
+    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 ()
 
@@ -166,20 +226,20 @@
 
 ## 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 (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
+set (project_sources
   ${HB_BASE_sources}
   ${HB_BASE_RAGEL_GENERATED_sources}
 
@@ -186,33 +246,37 @@
   ${HB_FALLBACK_sources}
   ${HB_OT_sources}
   ${HB_OT_RAGEL_GENERATED_sources}
-  )
+)
 
-set(project_extra_sources)
+set (project_extra_sources)
 
-set(project_headers
+set (project_headers
   ${HB_VERSION_H}
 
   ${HB_BASE_headers}
   ${HB_OT_headers}
-  )
+)
 
 
 ## Find and include needed header folders and libraries
 if (HB_HAVE_FREETYPE)
-
-  include(FindFreetype)
+  include (FindFreetype)
   if (NOT FREETYPE_FOUND)
     message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
-  endif()
+  endif ()
 
   list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES})
   include_directories(AFTER ${FREETYPE_INCLUDE_DIRS})
-  add_definitions(-DHAVE_FREETYPE=1 -DHAVE_FT_FACE_GETCHARVARIANTINDEX=1)
+  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
+  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS})
+  set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES})
+
+  check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
 endif ()
 
 if (HB_HAVE_GRAPHITE2)
@@ -291,7 +355,7 @@
   if (APPLICATION_SERVICES_FRAMEWORK)
     list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
   endif (APPLICATION_SERVICES_FRAMEWORK)
-  
+
   mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
 endif ()
 
@@ -314,16 +378,16 @@
 endif ()
 
 if (HB_HAVE_GOBJECT)
-  include(FindPythonInterp)
-  include(FindPerl)
-  
+  include (FindPythonInterp)
+  include (FindPerl)
+
   # Use the hints from glib-2.0.pc to find glib-mkenums
   find_package(PkgConfig)
   pkg_check_modules(PC_GLIB QUIET glib-2.0)
   find_program(GLIB_MKENUMS glib-mkenums
     HINTS ${PC_glib_mkenums}
-    )
-  set(GLIB_MKENUMS_CMD)
+  )
+  set (GLIB_MKENUMS_CMD)
 
   if (WIN32 AND NOT MINGW)
     # In Visual Studio builds, shebang lines are not supported
@@ -333,29 +397,29 @@
     execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}" --version
       RESULT_VARIABLE GLIB_MKENUMS_PYTHON
       OUTPUT_QUIET ERROR_QUIET
-      )
+    )
     if (GLIB_MKENUMS_PYTHON EQUAL 0)
       message("${GLIB_MKENUMS} is a Python script.")
-      set(GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}")
+      set (GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}")
     else ()
       execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version
         RESULT_VARIABLE GLIB_MKENUMS_PERL
         OUTPUT_QUIET ERROR_QUIET
-        )
+      )
       if (GLIB_MKENUMS_PERL EQUAL 0)
         message("${GLIB_MKENUMS} is a PERL script.")
-        set(GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
+        set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
       endif ()
       if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0)
         message(FATAL_ERROR "Unable to determine type of glib-mkenums script")
       endif ()
-	endif ()
+    endif ()
   else ()
-    set(GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
+    set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
   endif ()
   if (NOT GLIB_MKENUMS_CMD)
     message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required")
-  endif()
+  endif ()
 
   pkg_check_modules(PC_GOBJECT QUIET gobject-2.0)
 
@@ -368,19 +432,19 @@
   list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc)
   list(APPEND hb_gobject_gen_sources
     ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
-    )
+  )
   list(APPEND hb_gobject_structs_headers
     ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h
-    )
+  )
   list(APPEND hb_gobject_headers
     ${PROJECT_SOURCE_DIR}/src/hb-gobject.h
     ${hb_gobject_structs_headers}
-    )
+  )
   list(APPEND hb_gobject_gen_headers
     ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
-    )
+  )
 
-  add_custom_command (
+  add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
     COMMAND ${GLIB_MKENUMS_CMD}
       --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
@@ -396,9 +460,9 @@
     DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
       ${hb_gobject_header}
       ${project_headers}
-    )
+  )
 
-  add_custom_command (
+  add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
     COMMAND ${GLIB_MKENUMS_CMD}
       --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
@@ -415,9 +479,10 @@
       ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
       ${hb_gobject_header}
       ${project_headers}
-    )
+  )
 endif ()
 
+
 ## Atomic ops availability detection
 file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
 "		void memory_barrier (void) { __sync_synchronize (); }
@@ -428,7 +493,7 @@
 ")
 try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
   ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
-  SOURCES ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
+  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
 if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
   add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
 endif ()
@@ -444,7 +509,7 @@
 ")
 try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
   ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
-  SOURCES ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
+  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
 if (HB_HAVE_SOLARIS_ATOMIC_OPS)
   add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
 endif ()
@@ -454,6 +519,25 @@
 add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
+if (UNIX OR MINGW)
+  # Make symbols link locally
+  link_libraries(-Bsymbolic-functions)
+
+  # Make sure we don't link to libstdc++
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
+    set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
+    set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
+    set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
+  endif ()
+
+  # No threadsafe statics as we do it ourselves
+  if (BUILD_SHARED_LIBS)
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
+  endif ()
+endif ()
+
+
 ## Define harfbuzz-gobject library
 if (HB_HAVE_GOBJECT)
   add_library(harfbuzz-gobject
@@ -461,7 +545,7 @@
     ${hb_gobject_gen_sources}
     ${hb_gobject_headers}
     ${hb_gobject_gen_headers}
-    )
+  )
   include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src)
   add_dependencies(harfbuzz-gobject harfbuzz)
   target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS})
@@ -471,7 +555,7 @@
 if (WIN32)
   if (NOT BUILD_SHARED_LIBS)
     message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.")
-    set(HB_HAVE_INTROSPECTION OFF)
+    set (HB_HAVE_INTROSPECTION OFF)
   endif ()
 endif ()
 
@@ -482,23 +566,23 @@
 
   find_program(G_IR_SCANNER g-ir-scanner
     HINTS ${PC_g_ir_scanner}
-    )
+  )
 
   find_program(G_IR_COMPILER g-ir-compiler
     HINTS ${PC_g_ir_compiler}
-    )
+  )
 
   if (WIN32 AND NOT MINGW)
     # Note that since we already enable HB_HAVE_GOBJECT
     # we would already have PYTHON_EXECUTABLE handy
-    set(G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}")
+    set (G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}")
   else ()
-    set(G_IR_SCANNER_CMD "${G_IR_SCANNER}")
+    set (G_IR_SCANNER_CMD "${G_IR_SCANNER}")
   endif ()
 
   # We need to account for the varying output directories
   # when we build using Visual Studio projects
-  if("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
     set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
   else ()
     set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
@@ -506,9 +590,9 @@
 
   # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject
   set (hb_defines_cflags "")
-  foreach(hb_cflag ${hb_cflags})
+  foreach (hb_cflag ${hb_cflags})
     list(APPEND hb_defines_cflags "-D${hb_cflag}")
-  endforeach(hb_cflag)
+  endforeach (hb_cflag)
 
   # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject
   set (extra_libs "")
@@ -518,7 +602,7 @@
     list(APPEND extra_libs "--extra-library=${extra_lib_stripped}")
   endforeach ()
 
-  set(introspected_sources)
+  set (introspected_sources)
   foreach (f
     ${project_headers}
     ${project_sources}
@@ -526,7 +610,7 @@
     ${hb_gobject_gen_headers}
     ${hb_gobject_sources}
     ${hb_gobject_headers}
-    )
+  )
     if (WIN32)
       # Nasty issue: We need to make drive letters lower case,
       # otherwise g-ir-scanner won't like it and give us a bunch
@@ -545,7 +629,7 @@
   endforeach ()
 
   # Finally, build the introspection files...
-  add_custom_command (
+  add_custom_command(
     TARGET harfbuzz-gobject
     POST_BUILD
     COMMAND ${G_IR_SCANNER_CMD}
@@ -576,9 +660,9 @@
       ${introspected_sources}
       -o ${hb_libpath}/HarfBuzz-0.0.gir
     DEPENDS harfbuzz-gobject harfbuzz
-    )
+  )
 
-  add_custom_command (
+  add_custom_command(
     TARGET harfbuzz-gobject
     POST_BUILD
     COMMAND "${G_IR_COMPILER}"
@@ -587,20 +671,21 @@
       ${hb_libpath}/HarfBuzz-0.0.gir
       -o ${hb_libpath}/HarfBuzz-0.0.typelib
     DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject
-    )
+  )
 endif ()
 
+
 ## Additional framework build configs
 if (BUILD_FRAMEWORK)
-  set(CMAKE_MACOSX_RPATH ON)
+  set (CMAKE_MACOSX_RPATH ON)
   set_target_properties(harfbuzz PROPERTIES
     FRAMEWORK TRUE
     PUBLIC_HEADER "${project_headers}"
     XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
   )
-  set(MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
-  set(MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
-  set(MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
+  set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
+  set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
+  set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
 endif ()
 
 
@@ -631,44 +716,46 @@
 
 
 ## Install
+include (GNUInstallDirs)
+
 if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
-  install(FILES ${project_headers} DESTINATION include/harfbuzz)
+  install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
   if (HB_HAVE_GOBJECT)
-    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION include/harfbuzz)
+    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
   endif ()
 endif ()
 
 if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
   install(TARGETS harfbuzz
-    ARCHIVE DESTINATION lib
-    LIBRARY DESTINATION lib
-    RUNTIME DESTINATION bin
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     FRAMEWORK DESTINATION Library/Frameworks
-    )
+  )
   if (HB_BUILD_UTILS)
     install(TARGETS hb-view
-      RUNTIME DESTINATION bin
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
     install(TARGETS hb-view
-      RUNTIME DESTINATION bin
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
 
     install(TARGETS hb-shape
-      RUNTIME DESTINATION bin
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
 
     install(TARGETS hb-ot-shape-closure
-      RUNTIME DESTINATION bin
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
   endif ()
   if (HB_HAVE_GOBJECT)
     install(TARGETS harfbuzz-gobject
-      ARCHIVE DESTINATION lib
-      LIBRARY DESTINATION lib
-      RUNTIME DESTINATION bin
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
     if (HB_HAVE_INTROSPECTION)
-      if("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+      if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
         set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
       else ()
         set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
@@ -675,16 +762,71 @@
       endif ()
 
       install(FILES "${hb_libpath}/HarfBuzz-0.0.gir"
-        DESTINATION share/gir-1.0
-        )
+        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0
+      )
 
       install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib"
-        DESTINATION lib/girepository-1.0
-        )
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0
+      )
     endif ()
   endif ()
 endif ()
 
+if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics")
+  endif ()
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color")
+  endif ()
+endif ()
+
+
+## src/ executables
+foreach (prog main test test-would-substitute test-size-params test-buffer-serialize 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
+    set (prog_name test-test)
+  endif ()
+  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")
+
+
+## Tests
+if (UNIX OR MINGW)
+  if (BUILD_SHARED_LIBS)
+    # generate harfbuzz.def after build completion
+    string(REPLACE ";" " " space_separated_headers "${project_headers}")
+    add_custom_command(TARGET harfbuzz POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E env "headers=${space_separated_headers}" python ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
+
+    add_test(NAME check-static-inits.sh
+      COMMAND ${PROJECT_SOURCE_DIR}/src/check-static-inits.sh
+      WORKING_DIRECTORY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/harfbuzz.dir/src # ugly hack
+    )
+    add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh)
+    add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh)
+    add_test(NAME check-defs.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-defs.sh)
+
+    set_tests_properties(check-static-inits.sh check-libstdc++.sh check-symbols.sh check-defs.sh
+      PROPERTIES ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src")
+  endif ()
+
+  add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh)
+  add_test(NAME check-header-guards.sh COMMAND ./check-header-guards.sh)
+  add_test(NAME check-externs.sh COMMAND ./check-externs.sh)
+  add_test(NAME check-includes.sh COMMAND ./check-includes.sh)
+  set_tests_properties(
+    check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh
+    PROPERTIES WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
+endif ()
+
 # Needs to come last so that variables defined above are passed to
 # subdirectories.
 add_subdirectory(test)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,3 +1,3001 @@
+commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 30 11:16:51 2018 -0800
+
+    1.7.5
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 585b5760987e1ddd31e11fc55a2ce55ddb5b1663
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 30 11:51:56 2018 -0800
+
+    Fix distcheck
+
+ test/shaping/data/in-house/Makefile.am             | 2 +-
+ test/shaping/data/text-rendering-tests/Makefile.am | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e89df6e1aee9cb6fe1268643ce19816808baf0c4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 30 10:58:44 2018 -0800
+
+    [aat] Limit number of DontAdvance transitions
+
+    Remove the faulty loop-detection logic. Use max-ops for breaking
+    out of infinite loops or heavy work.
+
+    https://twitter.com/behdadesfahbod/status/958065026262183936
+
+ src/hb-aat-layout-common-private.hh | 33
+ ++-------------------------------
+ 1 file changed, 2 insertions(+), 31 deletions(-)
+
+commit e00743b47d25a2487b7f232a514a042e2962a089
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 29 10:07:05 2018 -0800
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   7 +++++++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   7 +++++++
+ .../data/text-rendering-tests/fonts/TestMORXEighteen.ttf | Bin 0 ->
+ 3256 bytes
+ .../text-rendering-tests/fonts/TestMORXSeventeen.ttf     | Bin 0 ->
+ 1788 bytes
+ .../data/text-rendering-tests/fonts/TestMORXSixteen.ttf  | Bin 0 ->
+ 1812 bytes
+ .../data/text-rendering-tests/fonts/TestMORXTwenty.ttf   | Bin 0 ->
+ 3232 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentyone.ttf     | Bin 0 ->
+ 3244 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentytwo.ttf     | Bin 0 ->
+ 3256 bytes
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-16.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-17.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-18.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-19.tests        |   2 ++
+ .../data/text-rendering-tests/tests/MORX-20.tests        |   7 +++++++
+ .../data/text-rendering-tests/tests/MORX-21.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-22.tests        |   1 +
+ 16 files changed, 32 insertions(+)
+
+commit 29d901286e632fa4de5ea198cc455cae56bc09a8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Jan 30 10:01:46 2018 +0330
+
+    [cmake] Build src/ executables (#733)
+
+ CMakeLists.txt | 40 ++++++++++++++++++++++++++--------------
+ 1 file changed, 26 insertions(+), 14 deletions(-)
+
+commit 55cae0d72eecb5116008815b598481dd1404fc6a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 29 18:05:24 2018 +0330
+
+    [test] Use 'otool -L' where ldd doesn't exist (macOS) (#732)
+
+ src/check-libstdc++.sh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit 2ec7dd1f6cb78ee6a0621aa98f18500d3318c90c
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Sun Jan 28 17:48:28 2018 -0500
+
+    Fix Travis build on macOS (#731)
+
+ .travis.yml       | 2 +-
+ src/check-defs.sh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 12757b692905062fe0fc266a6230238b3492abfd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 26 18:14:05 2018 -0800
+
+    Misc warning fixes
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/712
+
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++++-----
+ src/hb-ot-map-private.hh             | 1 -
+ src/hb-ot-map.cc                     | 5 ++---
+ 3 files changed, 6 insertions(+), 9 deletions(-)
+
+commit 85be365ed9238caf0283346ab4e5c5127096fc8a
+Author: bungeman <bungeman at chromium.org>
+Date:   Fri Jan 26 13:38:06 2018 -0500
+
+    Use KernSubTableFormat2::rightClassTable
+
+    Issue originally reported at http://cppfiles.com/chromium.txt .
+
+    This fixes what appears to be a copy - paste issue which causes both
+    KernSubTableFormat2::rightClassTable and the 'right' argument to
+    KernSubTableFormat2::get_kerning to go unused.
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c41b7fc10588323b5d8c0007befa701994115f7b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 25 09:53:32 2018 +0330
+
+    [cmake] Use -fvisibility-inlines-hidden instead (#726)
+
+ CMakeLists.txt | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 3d615766060e34a6e716c8737f651b6d6871ae85
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 22 21:23:19 2018 +0330
+
+    [cmake] fix symbol exporting issue on newer gcc (#724)
+
+ CMakeLists.txt | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 8b60e7c2c301a24906d591c80c42fd5e506072d2
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 22 18:37:26 2018 +0330
+
+    [ci] minor, less hacks (#722)
+
+ .circleci/config.yml | 20 ++++++--------------
+ .travis.yml          |  8 ++++----
+ CMakeLists.txt       | 11 +++++++----
+ 3 files changed, 17 insertions(+), 22 deletions(-)
+
+commit aaf934de3b9e3447897b4da566655d6d0494e87b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 22 13:16:54 2018 +0330
+
+    [ci] minor (#721)
+
+ .circleci/config.yml | 4 ++--
+ .travis.yml          | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit bd752db733e3d8c2c8773d831aebdd8a5cbb5e04
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 22 13:08:35 2018 +0330
+
+    [ci] unbreak bots with outdated freetype version (#718)
+
+ .circleci/config.yml | 10 +++++++++-
+ .travis.yml          | 10 +++++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 19a93fcf1946ad29f07306a0b6c65377bdaa49f0
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Sun Jan 21 20:40:34 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.h   | 2 +-
+ src/hb-buffer.h | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 51ce3828e67a8ca7e4ea4b69e88c395e243bf01f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 19 18:36:39 2018 -0800
+
+    [aat] Fix Ligature matching
+
+    I hope... Makes "ffi" work with Zapfino. I'm not sure if doing it
+    correctly though...
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bef509855c7a2c4400a947d2527d1dc048da1284
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 19 18:24:00 2018 -0800
+
+    [aat] Add TODO
+
+ src/hb-aat-layout-morx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e6f283ed7db6f8e2f8016dcbf07e589c40976aa6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 19 18:08:56 2018 -0800
+
+    [aat] Implement LigatureSubtable
+
+    We form the Zapfino ligature now. Yay! No further testing done.
+
+ src/hb-aat-layout-common-private.hh |  25 ++++++---
+ src/hb-aat-layout-morx-table.hh     | 108
+ +++++++++++++++++++++++++++++++++---
+ 2 files changed, 115 insertions(+), 18 deletions(-)
+
+commit f07ce661a2056965c573c99bdb721c065563ea7b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 19 16:52:01 2018 -0800
+
+    [aat] Embed a sanitizer context in hb_aat_apply_context_t
+
+    For run-time checking.
+
+ src/hb-aat-layout-common-private.hh | 22 ++++++++++++++++------
+ src/hb-aat-layout.cc                | 16 ++++++++--------
+ 2 files changed, 24 insertions(+), 14 deletions(-)
+
+commit 046690a4df0fdc93e3490210ef105f26057b1462
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 17 16:59:55 2018 -0800
+
+    [aat] Add hb_aat_apply_context_t
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 27 +++++++++++++--------------
+ src/hb-aat-layout-private.hh        |  2 +-
+ src/hb-aat-layout.cc                |  8 +++++---
+ src/hb-ot-shape.cc                  |  3 +--
+ 5 files changed, 43 insertions(+), 20 deletions(-)
+
+commit fd034490942c06e31cfb42f32023c78734f8aeeb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 17 16:46:51 2018 -0800
+
+    Rename hb_apply_context_t to hb_ot_apply_context_t
+
+ src/hb-aat-layout-morx-table.hh            | 16 ++++-----
+ src/hb-aat-layout-private.hh               |  2 +-
+ src/hb-aat-layout.cc                       |  2 +-
+ src/hb-ot-layout-gpos-table.hh             | 48 ++++++++++++-------------
+ src/hb-ot-layout-gsub-table.hh             | 24 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh       | 58
+ +++++++++++++++---------------
+ src/hb-ot-layout-private.hh                |  4 +--
+ src/hb-ot-layout.cc                        | 16 ++++-----
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-fallback.cc                |  4 +--
+ src/hb-ot-shape.cc                         |  2 +-
+ 11 files changed, 89 insertions(+), 89 deletions(-)
+
+commit 94b49beee972fec98cbb80658df3d8491b45485d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 17 12:46:08 2018 -0800
+
+    Whitespace
+
+ src/hb-ot-head-table.hh | 20 +++++++++-----------
+ src/hb-ot-post-table.hh | 10 +++++-----
+ 2 files changed, 14 insertions(+), 16 deletions(-)
+
+commit e849b8a85bb66219db4d797d86ddd60ed7c26a2e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Jan 19 16:12:24 2018 +0330
+
+    [cmake] Always put test/api/CMakeLists.txt on distributions
+
+ test/api/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c8f2a4f5b99d3be3079286817386b4185d35a545
+Author: Cosimo Lupo <cosimo at anthrotype.com>
+Date:   Thu Jan 18 22:49:40 2018 +0100
+
+    hb-common.cc: Hatran script is right-to-left (#714)
+
+    "Hatran is written from right to left horizontally"
+
+    http://www.unicode.org/L2/L2012/12312-n4324-hatran.pdf
+
+    This ancient script was added with Unicode 8.0.
+
+    Also this spreadsheet (referenced in an inline comment in the
+    source code) has it as RTL: http://goo.gl/x9ilM
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 00806149b9b591e4ec15996d3d56bdbd60687821
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Jan 19 01:12:31 2018 +0330
+
+    Improve avoiding C++ linkage, definition creation and cmake tests
+    (#710)
+
+ .circleci/config.yml |  4 ++--
+ CMakeLists.txt       | 46 ++++++++++++++++++++++++++--------------------
+ configure.ac         |  3 +++
+ src/Makefile.am      | 11 ++---------
+ src/check-defs.sh    | 37 +++++++++++++++++++++++--------------
+ src/gen-def.py       | 16 ++++++++++++++++
+ 6 files changed, 72 insertions(+), 45 deletions(-)
+
+commit 9b693212a834a96252f4ebe0b006b85e9f35fc91
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Thu Jan 18 16:34:13 2018 -0500
+
+    Update record-test.sh to the new directory layout (#716)
+
+ test/shaping/README.md      | 11 ++++++-----
+ test/shaping/record-test.sh | 17 +++++++++++++----
+ 2 files changed, 19 insertions(+), 9 deletions(-)
+
+commit 461a605fdec3361a038d3715adf615353c4f91fa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 17 10:02:48 2018 -0800
+
+    [aat] Allocate set dynamically
+
+ src/hb-aat-layout-common-private.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 4c4a9fc8617fed9bc1a7805c9aed294b4f6b66ea
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 17 09:47:50 2018 -0800
+
+    Typo
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/711
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90f01bad637c8b1214f46d4df6d9552a6a728e29
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Jan 16 22:00:21 2018 +0330
+
+    [cmake] don't link to libstdc++ (#707)
+
+ CMakeLists.txt | 38 +++++++++++++++++++++++++-------------
+ 1 file changed, 25 insertions(+), 13 deletions(-)
+
+commit 5e14e5f65d3dd1ed471ed73fab7e3207ae04e8fb
+Author: rdb <rdb at users.noreply.github.com>
+Date:   Tue Jan 16 17:04:33 2018 +0100
+
+    [cmake] Fix for CMake 3.0 and below (#706)
+
+ CMakeLists.txt | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c97a7eca7f7b6fc1c50a4ac7fccf3fa2d777430e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Jan 16 14:18:09 2018 +0330
+
+    [cmake] Fix symbols visibility and enable check-symbols.sh test (#705)
+
+ .circleci/config.yml |  2 +-
+ CMakeLists.txt       | 22 ++++++++++++++--------
+ 2 files changed, 15 insertions(+), 9 deletions(-)
+
+commit 60f84ef014f9280da24d5eb9ce833a7f37210242
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 15 20:46:58 2018 -0500
+
+    Disable MORX-13/14
+
+    Really, need better way to catch these :(.
+
+ test/shaping/data/text-rendering-tests/DISABLED         | 2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 949f6af2897b8982c81a059ea98e1c29bbce4772
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 15 20:44:10 2018 -0500
+
+    Disallow sanitize recursing into Extension subtables multiple times
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5216838347653120
+    which is a stack overflow, not by way of infinite recursion, just
+    being deep.  That's disallowed anyway, so catch it as it happens,
+    not afterwards.
+
+ src/hb-ot-layout-gsub-table.hh       | 5 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit bcb6f1ae0a08e5c7af88a7affaad42a67c5adac5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 15 20:34:05 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 12fffce10eb6ffebdedd655d0b1f10a99adf1808
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 15 15:41:51 2018 -0500
+
+    [aat] Sanitize classTable in StateTable
+
+ src/hb-aat-layout-common-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e6263c7142ca22efd9a3c93353a513f475c1c48d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 15 15:37:55 2018 -0500
+
+    [aat] Wire up table length to apply()
+
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++--------
+ src/hb-aat-layout.cc            | 20 +++++++++++++++-----
+ src/hb-open-type-private.hh     |  6 +++---
+ 3 files changed, 27 insertions(+), 16 deletions(-)
+
+commit 679ae744d07db7746a983ece54c22635a9dc3cff
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jan 14 15:03:31 2018 -0500
+
+    [aat] Towards implementing LigatureSubtable
+
+ src/hb-aat-layout-morx-table.hh | 61
+ +++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 58 insertions(+), 3 deletions(-)
+
+commit c9e12a2b9b34d73d37def2261a5c1a7ef20b8349
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Jan 13 17:05:12 2018 +0000
+
+    Fix set initializer
+
+ src/hb-set-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 54a1e250a839f030b43dbeba66cadc50ab5f90f6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Jan 13 14:44:39 2018 +0000
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXFourteen.ttf | Bin 0 ->
+ 1816 bytes
+ .../data/text-rendering-tests/fonts/TestMORXThirteen.ttf | Bin 0 ->
+ 1820 bytes
+ .../data/text-rendering-tests/tests/MORX-13.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit 9009b341c46caaa81deae8ea55e6f7dd98565f59
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 12:04:53 2018 +0100
+
+    [aat] Fix some struct sizes
+
+    I hate it that with my compiler at least, it doesn't catch totally
+    uncompilable
+    statements in templates if they are not used...
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-aat-layout-morx-table.hh     | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 57051b4f672d7d9dd10c45cc95b1e50e32cd42a9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:42:25 2018 +0100
+
+    [aat] Flush rest of buffer if state machine failed
+
+ src/hb-aat-layout-common-private.hh | 12 +++++++++---
+ src/hb-aat-layout-morx-table.hh     |  2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 369dfab0f8b7f22338bbd7a58a27e2e02e1efc29
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:37:01 2018 +0100
+
+    Minor
+
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25364c4f0020a66bd6f4bce1656ea47f1093396d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:31:20 2018 +0100
+
+    [aat] Fix symbol visibility
+
+    Not sure why only one of the bots sees this as visible...
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee16b9d8d35af1e74369edf7b733886c4b743a68
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:28:09 2018 +0100
+
+    Revert accidental morx enablement
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 44f0ee346f53c51ec4abccc81cc24abf6f018e85
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:27:51 2018 +0100
+
+    Fix docs
+
+ docs/harfbuzz-sections.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cdfa801ff4fe301d7bd41c9eee57cae75001ce4b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:12:20 2018 +0100
+
+    [aat] Tweak previous commit
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-ot-shape.cc                  | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit f7600228a4b37e6f6b65394aceeeb14bf4133c23
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 11:09:21 2018 +0100
+
+    [aat] Detect infinite-loops in state machine
+
+ src/hb-aat-layout-common-private.hh | 36
+ +++++++++++++++++++++++++++++-------
+ 1 file changed, 29 insertions(+), 7 deletions(-)
+
+commit d514f1480cffb81850ef212155c66ee9e0383350
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 10:55:44 2018 +0100
+
+    [circleci] cat test logs on failure on autotools-based builds
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1facef337862a0ceee9a8ac1d4dc94ff94fcb3b3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 10:53:52 2018 +0100
+
+    [travis] On test failure, cat all .log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit cdd86bf3a28961e85a8918d77937587df313d47b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 10:51:51 2018 +0100
+
+    [travis] Update cat'ing test-suite.log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 22d8c765e7b556601173a3e70f5bc9f310263a98
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 09:46:38 2018 +0100
+
+    Disable C++11
+
+    To better catch errors locally.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd38db523a1001178bf4cae3721c098466534736
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 09:45:42 2018 +0100
+
+    [aat] Fix more builds
+
+    Maybe I should disable C++11 detection such that my compiler also
+    catches
+    these.  Doesn't look like we can switch to it for a while anyway...
+
+ src/hb-aat-layout-common-private.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh     | 18 +++++++++---------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 72cb2b1f57ba79938c74e0406fc7457fce287f69
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 09:38:55 2018 +0100
+
+    [aat] Fix builds
+
+ src/hb-aat-layout-morx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3a15d0c6d088963e61f7fbebe25e1096d8e2903
+Author: Ting-Wei Lan <lantw at src.gnome.org>
+Date:   Fri Jan 12 15:33:16 2018 +0800
+
+    Update _POSIX_C_SOURCE to the latest version
+
+    Defining _POSIX_C_SOURCE to an old version on FreeBSD can cause C99 to
+    be disabled in libc.
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c70d58f97da7dcbdd7ea72a44f39130a75a279f7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 00:08:22 2018 +0100
+
+    [aat] Port RearrangementSubtable to StateTableDriver
+
+ src/hb-aat-layout-morx-table.hh | 91
+ ++++++++++++++++++++---------------------
+ 1 file changed, 44 insertions(+), 47 deletions(-)
+
+commit 117cfe7bb7cef682eb151b94f1eb12363ba3af67
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 12 00:01:36 2018 +0100
+
+    [aat] Add StateTableDriver and convert ContextualSubtable to it
+
+ src/hb-aat-layout-common-private.hh | 51 ++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 93
+ ++++++++++++++++++-------------------
+ 2 files changed, 95 insertions(+), 49 deletions(-)
+
+commit 0d39ac224c680b1f0134b58e78391497fbe47370
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 22:47:08 2018 +0100
+
+    [test/text-rendering-tests] Update README
+
+ test/shaping/data/text-rendering-tests/README | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 17a66f133c7e523403b6c90b011fcf0acb6356c6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 22:46:19 2018 +0100
+
+    [test] Disable MORX-12
+
+    Ouch. I need a better workflow for this.
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1f1c85a54aad8a25a67041cbb9c4277d28c1c761
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 22:43:57 2018 +0100
+
+    [aat] Remove 'mort' support
+
+    It's dead, Jim!
+
+ src/hb-aat-layout-common-private.hh |  55 +++++-----------
+ src/hb-aat-layout-morx-table.hh     | 122
+ ++++++++++--------------------------
+ 2 files changed, 46 insertions(+), 131 deletions(-)
+
+commit 7e2fed6d73f89986e5777028cdcd24e3baf2f86c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 19:25:21 2018 +0100
+
+    [aat] Allow DontAdvance
+
+    Apparently CoreText does allow these.  To be done: detect infinite
+    loops.
+
+    Fixes MORX-12 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1387fe8f9c474e88f86828733d4c01bd56f44432
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 19:22:37 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXTwelve.ttf   | Bin 0 ->
+ 2200 bytes
+ .../data/text-rendering-tests/tests/MORX-12.tests        |   3 +++
+ 4 files changed, 6 insertions(+)
+
+commit 17f01aff910b3871d0a6c45fd4305304b7f68ab5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 18:54:49 2018 +0100
+
+    [aat] Sanitize ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++----
+ src/hb-aat-layout-morx-table.hh     | 34
+ ++++++++++++++++++++++++----------
+ 2 files changed, 43 insertions(+), 14 deletions(-)
+
+commit 9b82aa19d812e70b7fade4b7669a9ce27855951e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 18:19:42 2018 +0100
+
+    More warning fixes
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 680cbc2eb325edc6b8562f39485b146aa56b3872
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 18:15:53 2018 +0100
+
+    [aat] Sanitize StateTable
+
+ src/hb-aat-layout-common-private.hh | 43
+ ++++++++++++++++++++++++++++++++++---
+ 1 file changed, 40 insertions(+), 3 deletions(-)
+
+commit 0e3b3379a04a67a22e44e17d6bf849359f4fca68
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 18:01:10 2018 +0100
+
+    [aat] Actually fix d887f931485b715775e922516a4b0de5bb92c34f
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1eb98c9916c6cb447f999170840b7f37de4b282d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 17:59:03 2018 +0100
+
+    [test/text-rendering-tests] Actually disable MORX-11
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f291ffd5a9480ac0f528eaedd43c7e9af738ee2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 17:57:46 2018 +0100
+
+    [buffer] Fix compiler warnings
+
+    line 323: Warning: info hides hb_buffer_t::info
+    ...
+
+ src/hb-buffer-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit d887f931485b715775e922516a4b0de5bb92c34f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 17:41:34 2018 +0100
+
+    [aat] Make bots happy
+
+    Don't know why this is not caught by my compiler.  Looks like clang
+    catches it
+    while gcc doesn't.
+
+    In file included from ../src/hb-aat-layout-morx-table.hh:31:
+    ../src/hb-aat-layout-common-private.hh:523:30: error: no member named
+    'static_size' in 'AAT::ContextualSubtable<AAT::MorxTypes>::EntryData'
+      DEFINE_SIZE_STATIC (4 + T::static_size);
+                                ~~~^
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f6be730994434e706cc27d68b796492d876e82b6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 15:23:24 2018 +0100
+
+    [aat] In NoncontextualSubtable, handle MarkLast with end-of-line
+    transition
+
+    Fixes MORX-11 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1d20d109a07bf9c775ab91dfbbb55f7bd80fd9d6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 15:18:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   3 ++-
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../data/text-rendering-tests/fonts/TestMORXEleven.ttf   | Bin 0 ->
+ 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-11.tests        |   1 +
+ 4 files changed, 5 insertions(+), 2 deletions(-)
+
+commit f9be673814aeb2c8abab52a672598576c6ed20c2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 15:15:07 2018 +0100
+
+    [aat] Implement ContextualSubtable
+
+    Tested with Zapfino and text "2nd". Sascha will create tests later.
+
+ src/hb-aat-layout-morx-table.hh | 70
+ ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 66 insertions(+), 4 deletions(-)
+
+commit 335a9c1fe489db53549801b4996dd0f6f5eded62
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 14:50:47 2018 +0100
+
+    [aat] Towards implementing ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 58 ++++++++++++++++++++++--
+ src/hb-aat-layout-morx-table.hh     | 88
+ ++++++++++++++++++++++++++-----------
+ 2 files changed, 117 insertions(+), 29 deletions(-)
+
+commit 62348f647f7b1604e008dbed46a54eff245fc106
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 12:00:28 2018 +0100
+
+    [aat] Implement end-of-text in state machine
+
+    Passes MORX-10 test now.
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit fc405b7ca77088135cb7de11cb32c254b85272fd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 11:55:29 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |  11
+ ++++++-----
+ .../data/text-rendering-tests/fonts/TestMORXTen.ttf      | Bin 0 ->
+ 1620 bytes
+ .../data/text-rendering-tests/tests/MORX-10.tests        |   1 +
+ 4 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 9adbd938fafe1de4e279489fc37ae33c900e22f0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 11:55:10 2018 +0100
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4177f646aa60180f094e064a53e54c5402fe53c6
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 11 15:43:23 2018 +0330
+
+    [cmake] Update and unbreak (#700)
+
+ test/shaping/CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 94644d7ea4cf217e4d6c6ff57d65e1e20866ea6d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 11:49:07 2018 +0100
+
+    [aat] Generate finegrained unsafe-to-break in state-machine!
+
+    Neato.
+
+ src/hb-aat-layout-morx-table.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 994eb7744c530bbaa5d6d8b8e07ca936e81aade8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 11:37:12 2018 +0100
+
+    [buffer] Fix crash
+
+ src/hb-buffer-serialize.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d6076747ac6706b4d8361714d46aced9683c44a8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:51:46 2018 +0100
+
+    [test/text-rendering-tests] Add DISABLED list
+
+ test/shaping/data/text-rendering-tests/DISABLED | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit de02b5093c42a527ae67084b30943369ed59efe6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:48:42 2018 +0100
+
+    [test/in-house] Add Makefile.sources
+
+ test/shaping/data/in-house/Makefile.am      | 46
+ ++---------------------------
+ test/shaping/data/in-house/Makefile.sources | 46
+ +++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+), 44 deletions(-)
+
+commit 7c32e01d04deaab511d41f5dec0dfd9fc0469f39
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:47:31 2018 +0100
+
+    Minor
+
+ src/Makefile.am                                  | 1 +
+ src/Makefile.sources                             | 2 --
+ test/shaping/data/text-rendering-tests/update.sh | 2 --
+ util/Makefile.am                                 | 1 +
+ util/Makefile.sources                            | 2 --
+ 5 files changed, 2 insertions(+), 6 deletions(-)
+
+commit a5adc5aa84c03184fd1c8a486be80ff0af1f448c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:30:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+    Also adds an update.sh script that does this automatically.
+
+ test/shaping/data/text-rendering-tests/Makefile.am |  52
+ +++------------------
+ .../data/text-rendering-tests/Makefile.sources     |  51
+ ++++++++++++++++++++
+ .../text-rendering-tests/fonts/TestMORXEight.ttf   | Bin 0 -> 2184 bytes
+ .../text-rendering-tests/fonts/TestMORXNine.ttf    | Bin 0 -> 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-5.tests   |  25 ++++++++++
+ .../data/text-rendering-tests/tests/MORX-6.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-7.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-8.tests   |   3 ++
+ .../data/text-rendering-tests/tests/MORX-9.tests   |   1 +
+ test/shaping/data/text-rendering-tests/update.sh   |  48
+ +++++++++++++++++++
+ 10 files changed, 136 insertions(+), 46 deletions(-)
+
+commit c861daacc4255d41d2358868b917277422949dc9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:11:01 2018 +0100
+
+    [test/text-rendering-tests] Add README and COPYING
+
+ test/shaping/data/text-rendering-tests/COPYING     | 13 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am |  2 ++
+ test/shaping/data/text-rendering-tests/README      |  4 ++++
+ 3 files changed, 19 insertions(+)
+
+commit 14b4d84eef18bd54287c10ce44eaef4f642f6238
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 10:08:25 2018 +0100
+
+    [aat] Fix RearrangementSubtable action
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ea3e86c6401d41cf54d82692eccbf44c87be2fd5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 09:58:42 2018 +0100
+
+    Minor
+
+ test/shaping/data/Makefile.am                      | 4 ++++
+ test/shaping/data/in-house/Makefile.am             | 4 ++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 4 ++++
+ 3 files changed, 12 insertions(+)
+
+commit 800e4ae80232f022404be155afd497b0421a6a64
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 09:57:55 2018 +0100
+
+    [aat] Mark state-machine-based lookup as completely unsafe-to-break
+
+    To be improved later.
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ca42d961293a9e4dfd0817c1a02d454008583282
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 11 09:15:34 2018 +0100
+
+    [aat] Implement RearrangementSubtable
+
+ src/hb-aat-layout-common-private.hh |  89 ++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     | 192
+ +++++++++++++++++++++++++++++++-----
+ src/hb-open-type-private.hh         |   2 -
+ src/hb-private.hh                   |   7 +-
+ 4 files changed, 254 insertions(+), 36 deletions(-)
+
+commit 5dbbd0fdb9a343554112a846b392803f11c13197
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 11 12:33:22 2018 +0330
+
+    Move the #define of _GNU_SOURCE to the top of hb-private.hh (#697)
+
+    This fixes the build on Cygwin.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 90e3c9e69e93e05d9fb534fd43b5c99cf58a7cb4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 11 12:31:05 2018 +0330
+
+    [cmake] Fix hb-blob test (#699)
+
+ CMakeLists.txt | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1461965c2220cd957c26b3fe5835200e426bc715
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 11 08:48:22 2018 +0330
+
+    [test] Better tests output by converting stderr to stdout (#696)
+
+    https://gitlab.kitware.com/cmake/cmake/issues/17630
+
+ test/shaping/run-tests.py | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ebb9b7d6335536804b50002fb83dd30da42a8ad5
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 11 08:15:06 2018 +0330
+
+    [test] Print shaping output on CI fails (#695)
+
+ .circleci/config.yml      | 4 ++--
+ test/shaping/run-tests.py | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e24bea8e91ba9f447f1f7f252bdefacef1f83593
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Jan 10 23:51:56 2018 +0330
+
+    [cmake] Another try on making sure feature testing is working (#691)
+
+ .circleci/config.yml | 131
+ ++++++++++++++++++++++++++++-----------------------
+ CMakeLists.txt       |  17 ++++---
+ 2 files changed, 79 insertions(+), 69 deletions(-)
+
+commit 746a37d5bdd2e965aa316e95ba5a7bad809d76a7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 16:47:47 2018 +0100
+
+    [util] Replace setlinebuf
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ff2083c53eecc67c011b96b0b9a58331043e53cf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 13:54:36 2018 +0100
+
+    [util] Set stdio files to line buffering
+
+    So we can stream lines to hb-shape and read output.
+
+ util/options.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 80fd5743200cbe221ae3adf057fe0e5ef54a894c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 11:09:53 2018 +0100
+
+    [aat] Add Class subtable thingy
+
+    From old 'mort' table.
+
+ src/hb-aat-layout-common-private.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 71e0ed9cbad8438239dcedf1bcfa8e19b9dfdc89
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Jan 10 15:45:12 2018 +0330
+
+    [cmake] Add header existence tests (#685)
+
+ .circleci/config.yml        |  4 ++--
+ CMakeLists.txt              | 53
+ ++++++++++++++++++++++++++++++---------------
+ test/shaping/CMakeLists.txt |  1 -
+ 3 files changed, 37 insertions(+), 21 deletions(-)
+
+commit a073621b5dc2865a014821307128a8fdd1d7d992
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Jan 10 12:13:28 2018 +0330
+
+    [cmake] Fix tests against latest changes (#690)
+
+ test/shaping/CMakeLists.txt | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 0b22da954142ad7a1e949a56448cee4e836fff75
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Jan 10 07:12:07 2018 +0200
+
+    Improve HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES docs
+
+    Add the note about absolute glyph positions from the commit message.
+
+ src/hb-buffer.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6db0b17c4ce56bd7477941e7a2fc85997c04588e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 05:40:43 2018 +0100
+
+    [test] Move test handling to sundirectories
+
+ configure.ac                                       |  3 +
+ test/shaping/Makefile.am                           | 98
+ +---------------------
+ test/shaping/data/Makefile.am                      |  9 ++
+ test/shaping/data/in-house/Makefile.am             | 58 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 60 +++++++++++++
+ 5 files changed, 131 insertions(+), 97 deletions(-)
+
+commit 4c982b4867707fcd2259b344b06e5bba8dd0c1e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 05:26:55 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 188ee6e5eeef3c63c332cfa30795d37da1bc1682
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 05:13:47 2018 +0100
+
+    Calculate anchor positions in float, then round
+
+    Hoping to reduce rounding error, to make tests happier...
+    No luck.
+
+ src/hb-font-private.hh         |  6 ++++++
+ src/hb-ot-layout-gpos-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 2 files changed, 28 insertions(+), 22 deletions(-)
+
+commit 0b28e1199d62765db4e855756b96022e423dcc17
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 05:02:42 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cdd6ab068500aa18de9a856bfbe730d0aac9a27
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 04:33:08 2018 +0100
+
+    Round, instead of floor, when applying variations
+
+    Hoping this would fix remaining text-rendering-tests failures,
+    but so far no luck.
+
+ src/hb-font-private.hh         | 2 +-
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-private.hh              | 1 +
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6dc6f0c9f844a006b4518ce789e319fcef6e9680
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 04:12:35 2018 +0100
+
+    [test] Whitelist one passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec939761e4d1b2f825db715290d70e18b1c9dd12
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:56:43 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c4eac531dfad55f691557a684b3a6bde83c4bcea
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:51:09 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 285a0bd799426c544d896f8fbcc27f4613a28e9a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:49:32 2018 +0100
+
+    [test] Another try
+
+    Making cmake happy this time.
+
+ test/shaping/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 95b32b00557d6afcfc469f8dcc51d8bfa8243a00
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:48:09 2018 +0100
+
+    [test] Fix text disabling
+
+    Ouch, make!
+
+ test/shaping/Makefile.am | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit a938d105b8d6e2d654079ea7d89e2e3ef5e0aed4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:41:55 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit ed95d5e374a10770eb305dfa43a9f5b39933aac7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:38:52 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b1e97f364e5ffdc08b52f889e3fea80a7e83e99
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:35:20 2018 +0100
+
+    Add HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+
+    New API:
+    HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+    hb-shape / hb-view --remove-default-ignorables
+
+    One more text-rendering-tests test passing.  Eleven failing.
+
+ src/hb-buffer.h                                    | 17 ++++--
+ src/hb-ot-shape.cc                                 |  6 +-
+ .../data/text-rendering-tests/extract-tests.py     |  2 +-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   | 34 +++++------
+ .../data/text-rendering-tests/tests/CFF-1.tests    | 26 ++++-----
+ .../data/text-rendering-tests/tests/CFF-2.tests    | 26 ++++-----
+ .../data/text-rendering-tests/tests/CFF2-1.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |  8 +--
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |  4 +-
+ .../data/text-rendering-tests/tests/CMAP-3.tests   | 40 ++++++-------
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |  6 +-
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |  6 +-
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/GPOS-1.tests   | 38 ++++++------
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |  6 +-
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 ++--
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/GSUB-2.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++---
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 +++----
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/KERN-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/KERN-2.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-2.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-3.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-4.tests   | 30 +++++-----
+ .../data/text-rendering-tests/tests/SHARAN-1.tests | 12 ++--
+ .../data/text-rendering-tests/tests/SHBALI-1.tests | 44 +++++++-------
+ .../data/text-rendering-tests/tests/SHBALI-2.tests | 24 ++++----
+ .../data/text-rendering-tests/tests/SHBALI-3.tests | 18 +++---
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests | 68
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests | 32 +++++-----
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests | 62
+ ++++++++++----------
+ util/options.cc                                    |  1 +
+ util/options.hh                                    | 14 +++--
+ 46 files changed, 435 insertions(+), 419 deletions(-)
+
+commit 46e4ed552fb1205eb6cbc16450bb231998fc7347
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:22:08 2018 +0100
+
+    [test/text-rendering-tests] Hook up font variations
+
+    Six more passing. Twelve failing now.
+
+ .../data/text-rendering-tests/extract-tests.py     |  6 +++-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   | 34
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/CFF2-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++++-----
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 ++++++-------
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++++----
+ 17 files changed, 137 insertions(+), 133 deletions(-)
+
+commit 2b3f62fc4de8f10c2168f212b1368478312e6dec
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:16:56 2018 +0100
+
+    [test] Add tests from text-rendering-tests repo
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ test/shaping/Makefile.am                           |  44 ++++++++++++++-
+ .../fonts/AdobeVFPrototype-Subset.otf              | Bin 0 -> 7096 bytes
+ .../text-rendering-tests/fonts/FDArrayTest257.otf  | Bin 0 -> 145212
+ bytes
+ .../fonts/FDArrayTest65535.otf                     | Bin 0 -> 492740
+ bytes
+ .../fonts/NotoSansBalinese-Regular.ttf             | Bin 0 -> 32304 bytes
+ .../fonts/NotoSansKannada-Regular.ttf              | Bin 0 -> 83868 bytes
+ .../fonts/NotoSerifKannada-Regular.ttf             | Bin 0 -> 96936 bytes
+ .../text-rendering-tests/fonts/Selawik-README.md   |  60
+ +++++++++++++++++++++
+ .../fonts/Selawik-variable.ttf                     | Bin 0 -> 481504
+ bytes
+ .../data/text-rendering-tests/fonts/TestAVAR.ttf   | Bin 0 -> 1608 bytes
+ .../data/text-rendering-tests/fonts/TestCMAP14.otf | Bin 0 -> 1628 bytes
+ .../fonts/TestCMAPMacTurkish.ttf                   | Bin 0 -> 19644 bytes
+ .../text-rendering-tests/fonts/TestCVARGVAROne.ttf | Bin 0 -> 12336 bytes
+ .../text-rendering-tests/fonts/TestCVARGVARTwo.ttf | Bin 0 -> 12256 bytes
+ .../text-rendering-tests/fonts/TestGLYFOne.ttf     | Bin 0 -> 1516 bytes
+ .../text-rendering-tests/fonts/TestGPOSFour.ttf    | Bin 0 -> 315020
+ bytes
+ .../text-rendering-tests/fonts/TestGPOSOne.ttf     | Bin 0 -> 10384 bytes
+ .../text-rendering-tests/fonts/TestGPOSThree.ttf   | Bin 0 -> 3500 bytes
+ .../text-rendering-tests/fonts/TestGPOSTwo.otf     | Bin 0 -> 1680 bytes
+ .../text-rendering-tests/fonts/TestGSUBOne.otf     | Bin 0 -> 1788 bytes
+ .../text-rendering-tests/fonts/TestGVAREight.ttf   | Bin 0 -> 4692 bytes
+ .../text-rendering-tests/fonts/TestGVARFour.ttf    | Bin 0 -> 3204 bytes
+ .../text-rendering-tests/fonts/TestGVARNine.ttf    | Bin 0 -> 2168 bytes
+ .../text-rendering-tests/fonts/TestGVAROne.ttf     | Bin 0 -> 14312 bytes
+ .../text-rendering-tests/fonts/TestGVARThree.ttf   | Bin 0 -> 14336 bytes
+ .../text-rendering-tests/fonts/TestGVARTwo.ttf     | Bin 0 -> 15668 bytes
+ .../text-rendering-tests/fonts/TestHVAROne.otf     | Bin 0 -> 3984 bytes
+ .../text-rendering-tests/fonts/TestHVARTwo.ttf     | Bin 0 -> 4004 bytes
+ .../text-rendering-tests/fonts/TestKERNOne.otf     | Bin 0 -> 1380 bytes
+ .../text-rendering-tests/fonts/TestMORXFour.ttf    | Bin 0 -> 4764 bytes
+ .../text-rendering-tests/fonts/TestMORXOne.ttf     | Bin 0 -> 2404 bytes
+ .../text-rendering-tests/fonts/TestMORXThree.ttf   | Bin 0 -> 4104 bytes
+ .../text-rendering-tests/fonts/TestMORXTwo.ttf     | Bin 0 -> 4960 bytes
+ .../text-rendering-tests/fonts/TestShapeAran.ttf   | Bin 0 -> 116044
+ bytes
+ .../text-rendering-tests/fonts/TestShapeEthi.ttf   | Bin 0 -> 5292 bytes
+ .../data/text-rendering-tests/fonts/Zycon.ttf      | Bin 0 -> 21036 bytes
+ .../data/text-rendering-tests/tests/AVAR-1.tests   |  17 ++++++
+ .../data/text-rendering-tests/tests/CFF-1.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF-2.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF2-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |   4 ++
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |   2 +
+ .../data/text-rendering-tests/tests/CMAP-3.tests   |  20 +++++++
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |   3 ++
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GPOS-1.tests   |  19 +++++++
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-5.tests   |   5 ++
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GSUB-2.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-2.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-3.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-4.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-5.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-6.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-7.tests   |   7 +++
+ .../data/text-rendering-tests/tests/GVAR-8.tests   |   6 +++
+ .../data/text-rendering-tests/tests/GVAR-9.tests   |  10 ++++
+ .../data/text-rendering-tests/tests/HVAR-1.tests   |   6 +++
+ .../data/text-rendering-tests/tests/HVAR-2.tests   |   6 +++
+ .../data/text-rendering-tests/tests/KERN-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/KERN-2.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-2.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-3.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-4.tests   |  15 ++++++
+ .../data/text-rendering-tests/tests/SHARAN-1.tests |   6 +++
+ .../data/text-rendering-tests/tests/SHBALI-1.tests |  22 ++++++++
+ .../data/text-rendering-tests/tests/SHBALI-2.tests |  12 +++++
+ .../data/text-rendering-tests/tests/SHBALI-3.tests |   9 ++++
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests |  34 ++++++++++++
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests |  16 ++++++
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests |  31 +++++++++++
+ 77 files changed, 510 insertions(+), 1 deletion(-)
+
+commit 6b19178ee35fec3b2115d6a06a86db36dc838b38
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 03:07:30 2018 +0100
+
+    Prefix int types with HB
+
+    Such a headache that Windows defines UINT8, ...; Just prefix it.
+
+ src/hb-aat-layout-common-private.hh  |  29 +++---
+ src/hb-aat-layout-morx-table.hh      |  65 +++++++------
+ src/hb-open-file-private.hh          |   6 +-
+ src/hb-open-type-private.hh          |  70 +++++++-------
+ src/hb-ot-cbdt-table.hh              |  78 ++++++++--------
+ src/hb-ot-cmap-table.hh              |  90 +++++++++---------
+ src/hb-ot-glyf-table.hh              |  10 +-
+ src/hb-ot-head-table.hh              |  28 +++---
+ src/hb-ot-hhea-table.hh              |  18 ++--
+ src/hb-ot-kern-table.hh              |  36 ++++----
+ src/hb-ot-layout-common-private.hh   | 120 ++++++++++++------------
+ src/hb-ot-layout-gdef-table.hh       |  22 ++---
+ src/hb-ot-layout-gpos-table.hh       |  94 +++++++++----------
+ src/hb-ot-layout-gsub-table.hh       |  30 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 172
+ +++++++++++++++++------------------
+ src/hb-ot-math-table.hh              |  26 +++---
+ src/hb-ot-maxp-table.hh              |   2 +-
+ src/hb-ot-name-table.hh              |  16 ++--
+ src/hb-ot-os2-table.hh               |  70 +++++++-------
+ src/hb-ot-post-table.hh              |  16 ++--
+ src/hb-ot-var-avar-table.hh          |   4 +-
+ src/hb-ot-var-fvar-table.hh          |  20 ++--
+ src/hb-ot-var-hvar-table.hh          |   8 +-
+ src/hb-ot-var-mvar-table.hh          |  10 +-
+ 24 files changed, 517 insertions(+), 523 deletions(-)
+
+commit 81e321c802afcc43186737e6900f8d7e2f9d4fd3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:56:29 2018 +0100
+
+    [aat] Try fixing VC bots
+
+    c:\projects\harfbuzz\src\hb-aat-layout-common-private.hh(51):
+    error C2872: 'UINT16': ambiguous symbol
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+    C:\Program Files (x86)\Windows
+    Kits\10\Include\10.0.14393.0\shared\basetsd.h(80): note: could be
+    'unsigned short UINT16'
+    c:\projects\harfbuzz\src\hb-open-type-private.hh(648): note: or
+    'OT::UINT16'
+
+ src/hb-aat-layout-common-private.hh | 3 +++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 0ed69c946247feb5bbb5be06d5314c5e0c0fec67
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:49:36 2018 +0100
+
+    Disable processing of morx table in ot shaper
+
+    So I can merge this to master...
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3f29ea91441b2e8c86cf379b4803f638a2e8dcfc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:48:04 2018 +0100
+
+    [util] Add hb-shape --ned
+
+    For not displaying extra data: no clusters, no advance. Just data
+    pertaining
+    to where glyphs end up on the screen.
+
+ test/shaping/data/text-rendering-tests/extract-tests.py |  2 +-
+ util/options.cc                                         | 13
+ +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 7020130665316365c288d0960fc288faa8f5bdf7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:37:39 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f94b4cc39f2f61b38c954ddac1aae6a052845bd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:35:59 2018 +0100
+
+    [kern] Mark unsafe-to-break
+
+ src/hb-ot-shape-fallback.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 71fd6325b6cba2586709022dd33530c61141bf8f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 02:20:14 2018 +0100
+
+    Add option to buffer serialization to not output glyph advances
+
+    When advances are not printed, glyph offsets reflect absolute glyph
+    positions.
+
+    New API:
+    HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES
+    hb-shape --no-advances
+
+ src/hb-buffer-serialize.cc | 38 ++++++++++++++++++++++++++++----------
+ src/hb-buffer.h            |  5 ++++-
+ util/hb-shape.cc           |  2 ++
+ util/options.cc            |  2 ++
+ util/options.hh            |  2 ++
+ 5 files changed, 38 insertions(+), 11 deletions(-)
+
+commit 316a28f8f8a9c459936ce9f2786d4d64a8f4e2c0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 01:54:12 2018 +0100
+
+    [test] Add script for extracting tests from text-rendering-tests
+
+    Work in progress...
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ .../data/text-rendering-tests/extract-tests.py     | 45
+ ++++++++++++++++++++++
+ 1 file changed, 45 insertions(+)
+
+commit 6b4d63f295f419f55983a8fc72f582802f55b09f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 10 01:13:36 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 504f913654d5904604e6abdbf7d0653f40db51fc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 23:15:54 2018 +0100
+
+    [test] Simplify test runner
+
+    Always pass hb-shape as first argument to run-tests.py.
+
+    Also require automake 1.13.
+
+ configure.ac              |  3 +--
+ test/shaping/Makefile.am  | 18 ++----------------
+ test/shaping/run-tests.py | 22 +++++-----------------
+ 3 files changed, 8 insertions(+), 35 deletions(-)
+
+commit 141db8b7a3abf2adbf0caa0659d9239396f6a2db
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 23:11:00 2018 +0100
+
+    [test] Minor
+
+ test/shaping/Makefile.am  | 4 ----
+ test/shaping/run-tests.py | 4 ++--
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+commit 44c65eee28e2de5c54028cb0ef144f56da16ef58
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 21:58:57 2018 +0100
+
+    [test] Reorganize test suite
+
+    In anticipation of importing more test suites.
+
+ test/fuzzing/run-fuzzer-tests.py                   |   2 +-
+ test/shaping/Makefile.am                           |  86
+ +++++++++---------
+ test/shaping/{fonts => data/in-house}/COPYING      |   7 +-
+ .../0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf   | Bin
+ .../051d92f8bc6ff724511b296c27623f824de256e9.ttf   | Bin
+ .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf   | Bin
+ .../07f054357ff8638bac3711b422a1e31180bba863.ttf   | Bin
+ .../15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf   | Bin
+ .../1735326da89f0818cd8c51a0600e9789812c0f94.ttf   | Bin
+ .../191826b9643e3f124d865d617ae609db6a2ce203.ttf   | Bin
+ .../1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf   | Bin
+ .../1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf   | Bin
+ .../1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf   | Bin
+ .../1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf   | Bin
+ .../1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf   | Bin
+ .../205edd09bd3d141cc9580f650109556cc28b22cb.ttf   | Bin
+ .../217a934cfe15c548b572c203dceb2befdf026462.ttf   | Bin
+ .../21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf   | Bin
+ .../226bc2deab3846f1a682085f70c67d0421014144.ttf   | Bin
+ .../243798dd281c1c77c065958e1ff467420faa9bde.ttf   | Bin
+ .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf   | Bin
+ .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin
+ .../298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf   | Bin
+ .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf   | Bin
+ .../341421e629668b1a1242245d39238ca48432d35d.ttf   | Bin
+ .../3493e92eaded2661cadde752a39f9d58b11f0326.ttf   | Bin
+ .../3511ff5c1647150595846ac414c595cccac34f18.ttf   | Bin
+ .../37033cc5cf37bb223d7355153016b6ccece93b28.ttf   | Bin
+ .../373e67bf41ca264e260a9716162b71a23549e885.ttf   | Bin
+ .../375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf   | Bin
+ .../3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf   | Bin
+ .../3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf   | Bin
+ .../43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf   | Bin
+ .../43ef465752be9af900745f72fe29cb853a1401a5.ttf   | Bin
+ .../45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf   | Bin
+ .../49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf   | Bin
+ .../4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf   | Bin
+ .../4fac3929fc3332834e93673780ec0fe94342d193.ttf   | Bin
+ .../5028afb650b1bb718ed2131e872fbcce57828fff.ttf   | Bin
+ .../53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf   | Bin
+ .../54674a3111d209fb6be0ed31745314b7a8d2c244.ttf   | Bin
+ .../558661aa659912f4d30ecd27bd09835171a8e2b0.ttf   | Bin
+ .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf   | Bin
+ .../56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf   | Bin
+ .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin
+ .../59a585a63b3df608fbeef00956c8c108deec7de6.ttf   | Bin
+ .../5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf   | Bin
+ .../5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf   | Bin
+ .../641bd9db850193064d17575053ae2bf8ec149ddc.ttf   | Bin
+ .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf   | Bin
+ .../6991b13ce889466be6de3f66e891de2bc0f117ee.ttf   | Bin
+ .../6ff0fbead4462d9f229167b4e6839eceb8465058.ttf   | Bin
+ .../706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf   | Bin
+ .../757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf   | Bin
+ .../7a37dc4d5bf018456aea291cee06daf004c0221c.ttf   | Bin
+ .../7e14e7883ed152baa158b80e207b66114c823a8b.ttf   | Bin
+ .../8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf   | Bin
+ .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin
+ .../81c368a33816fb20e9f647e8f24e2180f4720263.ttf   | Bin
+ .../8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf   | Bin
+ .../8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf   | Bin
+ .../82f4f3b57bb55344e72e70231380202a52af5805.ttf   | Bin
+ .../8454d22037f892e76614e1645d066689a0200e61.ttf   | Bin
+ .../85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf   | Bin
+ .../856ff9562451293cbeff6f396d4e3877c4f0a436.ttf   | Bin
+ .../85fe0be440c64ac77699e21c2f1bd933a919167e.ttf   | Bin
+ .../87f85d17d26f1fe9ad28d7365101958edaefb967.ttf   | Bin
+ .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin
+ .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf   | Bin
+ .../96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf   | Bin
+ .../98b7887cff91f722b92a8ff800120954606354f9.ttf   | Bin
+ .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf   | Bin
+ .../a014549f766436cf55b2ceb40e462038938ee899.ttf   | Bin
+ .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf   | Bin
+ .../a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf   | Bin
+ .../a34a9191d9376bda419836effeef7e75c1386016.ttf   | Bin
+ .../a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf   | Bin
+ .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf   | Bin
+ .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin
+ .../a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf   | Bin
+ .../b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf   | Bin
+ .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf   | Bin
+ .../b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf   | Bin
+ .../bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf   | Bin
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf   | Bin
+ .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf   | Bin
+ .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf   | Bin
+ .../bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf   | Bin
+ .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf   | Bin
+ .../c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf   | Bin
+ .../cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf   | Bin
+ .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf   | Bin
+ .../d629e7fedc0b350222d7987345fe61613fa3929a.ttf   | Bin
+ .../d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf   | Bin
+ .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf   | Bin
+ .../df768b9c257e0c9c35786c47cae15c46571d56be.ttf   | Bin
+ .../e207635780b42f898d58654b65098763e340f5c7.ttf   | Bin
+ .../e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf   | Bin
+ .../e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf   | Bin
+ .../ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf   | Bin
+ .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf   | Bin
+ .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin
+ .../f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf   | Bin
+ .../f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf   | Bin
+ .../f499fbc23865022234775c43503bba2e63978fe1.ttf   | Bin
+ .../f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf   | Bin
+ .../f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf   | Bin
+ .../fab39d60d758cb586db5a504f218442cd1395725.ttf   | Bin
+ .../fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf   | Bin
+ .../fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf   | Bin
+ .../ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf   | Bin
+ .../in-house/tests/arabic-fallback-shaping.tests   |   1 +
+ .../data/in-house/tests/arabic-feature-order.tests |   4 +
+ .../data/in-house/tests/arabic-like-joining.tests  |   1 +
+ .../data/in-house/tests/arabic-mark-order.tests    |   6 ++
+ test/shaping/data/in-house/tests/arabic-stch.tests |   1 +
+ .../data/in-house/tests/automatic-fractions.tests  |   3 +
+ test/shaping/data/in-house/tests/cluster.tests     |   2 +
+ test/shaping/data/in-house/tests/color-fonts.tests |   1 +
+ .../data/in-house/tests/context-matching.tests     |   3 +
+ .../data/in-house/tests/cursive-positioning.tests  |   4 +
+ .../data/in-house/tests/default-ignorables.tests   |   2 +
+ .../data/in-house/tests/emoji-flag-tags.tests      |   2 +
+ .../data/in-house/tests/fallback-positioning.tests |   2 +
+ test/shaping/data/in-house/tests/fuzzed.tests      |  22 +++++
+ test/shaping/data/in-house/tests/hangul-jamo.tests |   2 +
+ test/shaping/data/in-house/tests/hyphens.tests     |   2 +
+ .../tests/indic-consonant-with-stacker.tests       |   4 +
+ test/shaping/data/in-house/tests/indic-init.tests  |   1 +
+ .../in-house/tests/indic-joiner-candrabindu.tests  |   2 +
+ .../data/in-house/tests/indic-joiners.tests        |   2 +
+ .../data/in-house/tests/indic-old-spec.tests       |   2 +
+ .../data/in-house/tests/indic-pref-blocking.tests  |   2 +
+ .../in-house/tests/indic-script-extensions.tests   |   2 +
+ .../data/in-house/tests/indic-special-cases.tests  |   3 +
+ .../data/in-house/tests/indic-syllable.tests       |   8 ++
+ .../data/in-house/tests/language-tags.tests        |  12 +++
+ test/shaping/data/in-house/tests/ligature-id.tests |  36 ++++++++
+ .../data/in-house/tests/mark-attachment.tests      |   1 +
+ .../data/in-house/tests/mark-filtering-sets.tests  |   5 ++
+ .../tests/mongolian-variation-selector.tests       |   4 +
+ test/shaping/data/in-house/tests/simple.tests      |   2 +
+ test/shaping/data/in-house/tests/spaces.tests      |  17 ++++
+ .../in-house/tests/tibetan-contractions-1.tests    |  60 +++++++++++++
+ .../in-house/tests/tibetan-contractions-2.tests    |  53 +++++++++++
+ .../data/in-house/tests/tibetan-vowels.tests       |  11 +++
+ test/shaping/data/in-house/tests/use-marchen.tests |  35 ++++++++
+ .../shaping/data/in-house/tests/use-syllable.tests |   7 ++
+ test/shaping/data/in-house/tests/use.tests         |   4 +
+ .../data/in-house/tests/variations-rvrn.tests      | 100
+ +++++++++++++++++++++
+ test/shaping/data/in-house/tests/vertical.tests    |   3 +
+ .../data/in-house/tests/zero-width-marks.tests     |  11 +++
+ test/shaping/run-tests.py                          |  48 ++++------
+ .../tests/misc/arabic-fallback-shaping.tests       |   1 -
+ test/shaping/tests/misc/arabic-feature-order.tests |   4 -
+ test/shaping/tests/misc/arabic-like-joining.tests  |   1 -
+ test/shaping/tests/misc/arabic-mark-order.tests    |   6 --
+ test/shaping/tests/misc/arabic-stch.tests          |   1 -
+ test/shaping/tests/misc/automatic-fractions.tests  |   3 -
+ test/shaping/tests/misc/cluster.tests              |   2 -
+ test/shaping/tests/misc/color-fonts.tests          |   1 -
+ test/shaping/tests/misc/context-matching.tests     |   3 -
+ test/shaping/tests/misc/cursive-positioning.tests  |   4 -
+ test/shaping/tests/misc/default-ignorables.tests   |   2 -
+ test/shaping/tests/misc/emoji-flag-tags.tests      |   2 -
+ test/shaping/tests/misc/fallback-positioning.tests |   2 -
+ test/shaping/tests/misc/fuzzed.tests               |  22 -----
+ test/shaping/tests/misc/hangul-jamo.tests          |   2 -
+ test/shaping/tests/misc/hyphens.tests              |   2 -
+ .../tests/misc/indic-consonant-with-stacker.tests  |   4 -
+ test/shaping/tests/misc/indic-init.tests           |   1 -
+ .../tests/misc/indic-joiner-candrabindu.tests      |   2 -
+ test/shaping/tests/misc/indic-joiners.tests        |   2 -
+ test/shaping/tests/misc/indic-old-spec.tests       |   2 -
+ test/shaping/tests/misc/indic-pref-blocking.tests  |   2 -
+ .../tests/misc/indic-script-extensions.tests       |   2 -
+ test/shaping/tests/misc/indic-special-cases.tests  |   3 -
+ test/shaping/tests/misc/indic-syllable.tests       |   8 --
+ test/shaping/tests/misc/language-tags.tests        |  12 ---
+ test/shaping/tests/misc/ligature-id.tests          |  36 --------
+ test/shaping/tests/misc/mark-attachment.tests      |   1 -
+ test/shaping/tests/misc/mark-filtering-sets.tests  |   5 --
+ .../tests/misc/mongolian-variation-selector.tests  |   4 -
+ test/shaping/tests/misc/simple.tests               |   2 -
+ test/shaping/tests/misc/spaces.tests               |  17 ----
+ .../tests/misc/tibetan-contractions-1.tests        |  60 -------------
+ .../tests/misc/tibetan-contractions-2.tests        |  53 -----------
+ test/shaping/tests/misc/tibetan-vowels.tests       |  11 ---
+ test/shaping/tests/misc/use-marchen.tests          |  35 --------
+ test/shaping/tests/misc/use-syllable.tests         |   7 --
+ test/shaping/tests/misc/use.tests                  |   4 -
+ test/shaping/tests/misc/variations-rvrn.tests      | 100
+ ---------------------
+ test/shaping/tests/misc/vertical.tests             |   3 -
+ test/shaping/tests/misc/zero-width-marks.tests     |  11 ---
+ .../script-arabic/language-persian/mehran.txt      |  14 +--
+ .../language-urdu/crulp/ligatures/2grams.txt       |   0
+ .../language-urdu/crulp/ligatures/3grams.txt       |   0
+ .../language-urdu/crulp/ligatures/4grams.txt       |   0
+ .../language-urdu/crulp/ligatures/5grams.txt       |   0
+ .../language-urdu/crulp/ligatures/6grams.txt       |   0
+ .../language-urdu/crulp/ligatures/7grams.txt       |   0
+ .../language-urdu/crulp/ligatures/8grams.txt       |   0
+ .../language-urdu/crulp/ligatures/LICENSE          |   0
+ .../language-urdu/crulp/ligatures/README           |   0
+ .../language-urdu/crulp/ligatures/SOURCES          |   0
+ .../script-arabic/misc/diacritics/lam-alef.txt     |   0
+ .../misc/diacritics/language-arabic.txt            |   0
+ .../misc/diacritics/language-persian.txt           |   0
+ .../misc/diacritics/language-urdu.txt              |   0
+ .../misc/diacritics/ligature-components.txt        |   0
+ .../misc/diacritics/ligature-diacritics.txt        |   0
+ .../misc/diacritics/mark-skipping.txt              |   0
+ .../shaper-arabic/script-mongolian/misc/misc.txt   |   0
+ .../script-mongolian/misc/non-joining.txt          |   0
+ .../shaper-arabic/script-mongolian/misc/poem.txt   |   0
+ .../script-mongolian/misc/variation-selectors.txt  |   0
+ .../shaper-arabic/script-nko/misc/misc.txt         |   0
+ .../shaper-arabic/script-phags-pa/misc/misc.txt    |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 +++
+ .../shaper-arabic/script-syriac/misc/alaph.txt     |   0
+ .../shaper-default/script-ethiopic/misc/misc.txt   |   0
+ .../shaper-default/script-han/misc/cjk-compat.txt  |   0
+ .../script-hiragana/misc/kazuraki-liga-lines.txt   |   0
+ .../script-hiragana/misc/kazuraki-liga.txt         |   0
+ .../shaper-default/script-linear-b/misc/misc.txt   |   0
+ .../shaper-default/script-tifinagh/misc/misc.txt   |   1 -
+ .../shaper-hangul/script-hangul/misc/misc.txt      |   0
+ .../script-hebrew/misc/diacritics.txt              |   0
+ .../indic/script-assamese/utrrs/LICENSE            |   0
+ .../indic/script-assamese/utrrs/README             |   0
+ .../indic/script-assamese/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-bengali/misc/misc.txt             |   0
+ .../indic/script-bengali/misc/reph.txt             |   0
+ .../indic/script-bengali/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-bengali/utrrs/README |   0
+ .../indic/script-bengali/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-devanagari/misc/dottedcircle.txt  |   0
+ .../indic/script-devanagari/misc/eyelash.txt       |   0
+ .../indic/script-devanagari/misc/joiners.txt       |   0
+ .../indic/script-devanagari/misc/misc.txt          |   0
+ .../script-devanagari/misc/spec-deviations.txt     |   0
+ .../script-devanagari/misc/tricky-reordering.txt   |   0
+ .../indic/script-devanagari/utrrs/LICENSE          |   0
+ .../indic/script-devanagari/utrrs/README           |   0
+ .../indic/script-devanagari/utrrs/SOURCES          |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...tFeatureCodepoint-DevnagariSpecificAddition.txt |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...ndicFontFeatureCodepoint-GenericPunctuation.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gujarati/utrrs/LICENSE            |   0
+ .../indic/script-gujarati/utrrs/README             |   0
+ .../indic/script-gujarati/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gurmukhi/misc/misc.txt            |   0
+ .../indic/script-gurmukhi/utrrs/LICENSE            |   0
+ .../indic/script-gurmukhi/utrrs/README             |   0
+ .../indic/script-gurmukhi/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-kannada/misc/misc.txt             |   0
+ .../indic/script-kannada/misc/right-matras.txt     |   0
+ .../indic/script-kannada/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-kannada/utrrs/README |   0
+ .../indic/script-kannada/utrrs/SOURCES             |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-malayalam/misc/cibu.txt           |   0
+ .../indic/script-malayalam/misc/dot-reph.txt       |   0
+ .../indic/script-malayalam/misc/misc.txt           |   0
+ .../indic/script-malayalam/utrrs/LICENSE           |   0
+ .../indic/script-malayalam/utrrs/README            |   0
+ .../indic/script-malayalam/utrrs/SOURCES           |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-oriya/misc/bindu.txt |   0
+ .../shaper-indic/indic/script-oriya/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/README   |   0
+ .../shaper-indic/indic/script-oriya/utrrs/SOURCES  |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-OriyaSpecific.txt    |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-sinhala/misc/extensive.txt        |   0
+ .../indic/script-sinhala/misc/misc.txt             |   0
+ .../indic/script-sinhala/misc/reph.txt             |   0
+ .../indic/script-sinhala/misc/split-matras.txt     |   0
+ .../indic/script-sinhala/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-sinhala/utrrs/README |   0
+ .../indic/script-sinhala/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Punctuation.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS.txt            |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt   |   0
+ .../gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt     |   0
+ .../gsub/IndicFontFeatureGSUB-Special-Cases.txt    |   0
+ .../gsub/IndicFontFeatureGSUB-TouchingLetters.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-tamil/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/README   |   0
+ .../shaper-indic/indic/script-tamil/utrrs/SOURCES  |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-CurrencySymbols.txt  |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Numerics.txt         |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-Symbols.txt          |   0
+ .../IndicFontFeatureCodepoint-TamilSymbol.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-telugu/misc/misc.txt |   0
+ .../shaper-indic/indic/script-telugu/utrrs/LICENSE |   0
+ .../shaper-indic/indic/script-telugu/utrrs/README  |   0
+ .../shaper-indic/indic/script-telugu/utrrs/SOURCES |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../south-east-asian/script-javanese/misc.txt      |   0
+ .../south-east-asian/script-khmer/misc/misc.txt    |   0
+ .../script-khmer/misc/other-marks-invalid.txt      |   0
+ .../script-khmer/misc/other-marks.txt              |   0
+ .../shaper-myanmar/script-myanmar/misc/misc.txt    |   0
+ .../shaper-myanmar/script-myanmar/misc/otspec.txt  |   1 -
+ .../shaper-myanmar/script-myanmar/misc/utn11.txt   |   0
+ .../shaper-thai/script-lao/misc/sara-am.txt        |   0
+ .../shaper-thai/script-thai/misc/misc.txt          |   0
+ .../shaper-thai/script-thai/misc/phinthu.txt       |   0
+ .../shaper-thai/script-thai/misc/pua-shaping.txt   |   0
+ .../shaper-thai/script-thai/misc/sara-am.txt       |   0
+ .../script-tibetan/misc/contractions.txt           |   0
+ .../shaper-tibetan/script-tibetan/misc/misc.txt    |   0
+ .../shaper-use/script-batak/misc.txt               |   0
+ .../shaper-use/script-buginese/misc.txt            |  92
+ +++++++++----------
+ .../shaper-use/script-cham/misc.txt                |   0
+ .../shaper-use/script-kaithi/misc.txt              |   0
+ .../shaper-use/script-kharoshti/misc.txt           |   0
+ .../shaper-use/script-tai-tham/misc.txt            |   0
+ .../shaper-use/script-tai-tham/torture.txt         |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 ---
+ 420 files changed, 573 insertions(+), 590 deletions(-)
+
+commit 9a3ad307ea91794712531dfc688700c11a1ff263
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 21:35:21 2018 +0100
+
+    [test] Remove unused hb-diff-ngrams
+
+ test/shaping/Makefile.am      |  1 -
+ test/shaping/hb-diff-ngrams   |  5 -----
+ test/shaping/hb_test_tools.py | 26 --------------------------
+ 3 files changed, 32 deletions(-)
+
+commit b6b460024d29362914c72cc5f8fbaec215db5b16
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 21:33:38 2018 +0100
+
+    [test] Remove unused manifest stuff
+
+ test/shaping/Makefile.am        | 7 -------
+ test/shaping/hb-manifest-read   | 5 -----
+ test/shaping/hb-manifest-update | 5 -----
+ 3 files changed, 17 deletions(-)
+
+commit ebbee7c2475db789b622250addbf549695da2890
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 18:23:19 2018 +0100
+
+    [test] Move test files around
+
+ test/fuzzing/run-fuzzer-tests.py                   |  2 +-
+ test/shaping/Makefile.am                           | 82
+ +++++++++++-----------
+ .../tests/{ => misc}/arabic-fallback-shaping.tests |  0
+ .../tests/{ => misc}/arabic-feature-order.tests    |  0
+ .../tests/{ => misc}/arabic-like-joining.tests     |  0
+ .../tests/{ => misc}/arabic-mark-order.tests       |  0
+ test/shaping/tests/{ => misc}/arabic-stch.tests    |  0
+ .../tests/{ => misc}/automatic-fractions.tests     |  0
+ test/shaping/tests/{ => misc}/cluster.tests        |  0
+ test/shaping/tests/{ => misc}/color-fonts.tests    |  0
+ .../tests/{ => misc}/context-matching.tests        |  0
+ .../tests/{ => misc}/cursive-positioning.tests     |  0
+ .../tests/{ => misc}/default-ignorables.tests      |  0
+ .../shaping/tests/{ => misc}/emoji-flag-tags.tests |  0
+ .../tests/{ => misc}/fallback-positioning.tests    |  0
+ test/shaping/tests/{ => misc}/fuzzed.tests         |  0
+ test/shaping/tests/{ => misc}/hangul-jamo.tests    |  0
+ test/shaping/tests/{ => misc}/hyphens.tests        |  0
+ .../{ => misc}/indic-consonant-with-stacker.tests  |  0
+ test/shaping/tests/{ => misc}/indic-init.tests     |  0
+ .../{ => misc}/indic-joiner-candrabindu.tests      |  0
+ test/shaping/tests/{ => misc}/indic-joiners.tests  |  0
+ test/shaping/tests/{ => misc}/indic-old-spec.tests |  0
+ .../tests/{ => misc}/indic-pref-blocking.tests     |  0
+ .../tests/{ => misc}/indic-script-extensions.tests |  0
+ .../tests/{ => misc}/indic-special-cases.tests     |  0
+ test/shaping/tests/{ => misc}/indic-syllable.tests |  0
+ test/shaping/tests/{ => misc}/language-tags.tests  |  0
+ test/shaping/tests/{ => misc}/ligature-id.tests    |  0
+ .../shaping/tests/{ => misc}/mark-attachment.tests |  0
+ .../tests/{ => misc}/mark-filtering-sets.tests     |  0
+ .../{ => misc}/mongolian-variation-selector.tests  |  0
+ test/shaping/tests/{ => misc}/simple.tests         |  0
+ test/shaping/tests/{ => misc}/spaces.tests         |  0
+ .../tests/{ => misc}/tibetan-contractions-1.tests  |  0
+ .../tests/{ => misc}/tibetan-contractions-2.tests  |  0
+ test/shaping/tests/{ => misc}/tibetan-vowels.tests |  0
+ test/shaping/tests/{ => misc}/use-marchen.tests    |  0
+ test/shaping/tests/{ => misc}/use-syllable.tests   |  0
+ test/shaping/tests/{ => misc}/use.tests            |  0
+ .../shaping/tests/{ => misc}/variations-rvrn.tests |  0
+ test/shaping/tests/{ => misc}/vertical.tests       |  0
+ .../tests/{ => misc}/zero-width-marks.tests        |  0
+ 43 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 748b989a1fa931b011d6a4e3db39dfdc632946b2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 17:55:17 2018 +0100
+
+    [aat/morx] Implement NoncontextualSubtables
+
+    Also makes hb-ot-shape call morx for now instead of GSUB... Just
+    for testing.
+
+ src/hb-aat-layout-common-private.hh | 34 +++++++--------
+ src/hb-aat-layout-morx-table.hh     | 82
+ ++++++++++++++++++++++++++++++++++---
+ src/hb-aat-layout-private.hh        |  3 ++
+ src/hb-aat-layout.cc                | 13 +++++-
+ src/hb-ot-shape.cc                  |  6 +++
+ 5 files changed, 111 insertions(+), 27 deletions(-)
+
+commit 4cf3ab1d8192862f8d3c52fdcaec567735916116
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 16:32:58 2018 +0100
+
+    Minor
+
+ src/hb-ot-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 470fe5b603b409bef136fdd4e9b33d2704dc77b7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 15:48:51 2018 +0100
+
+    [aat] Implement Lookup table
+
+    Untested, but compiles.
+
+ src/hb-aat-layout-common-private.hh | 308
+ +++++++++++++++++++++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     |   9 +-
+ src/hb-aat-layout.cc                |  14 ++
+ src/hb-face.cc                      |   6 +-
+ src/hb-open-type-private.hh         |  16 +-
+ src/hb-ot-cbdt-table.hh             |   4 +-
+ src/hb-ot-cmap-table.hh             |   2 +-
+ src/hb-ot-glyf-table.hh             |   6 +-
+ src/hb-ot-hmtx-table.hh             |   8 +-
+ src/hb-ot-kern-table.hh             |   2 +-
+ src/hb-ot-layout.cc                 |   6 +-
+ src/hb-ot-post-table.hh             |   2 +-
+ src/hb-uniscribe.cc                 |   2 +-
+ 13 files changed, 355 insertions(+), 30 deletions(-)
+
+commit 4646a80a873fa164b9cf09128bc6b6fe2fc5cce2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Jan 9 12:06:38 2018 +0100
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 7c7cb42d8125d7e598bfa70f93053cafe38b325a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 8 14:32:55 2018 +0000
+
+    [aat] Update previous commits for rebase on master
+
+ src/hb-aat-layout-common-private.hh | 14 +++++++-------
+ src/hb-aat-layout-morx-table.hh     | 28 ++++++++++++++--------------
+ src/hb-open-type-private.hh         |  5 -----
+ 3 files changed, 21 insertions(+), 26 deletions(-)
+
+commit a0175e75bc40b5496d7fd37afd434cb2000e5b9b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Aug 17 16:55:54 2017 -0700
+
+    [aat] Start implementing common table formats
+
+ src/Makefile.sources                |   2 +
+ src/hb-aat-layout-common-private.hh | 134
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     |   1 +
+ src/hb-aat-layout-private.hh        |  37 ++++++++++
+ src/hb-aat-layout.cc                |   1 +
+ 5 files changed, 175 insertions(+)
+
+commit c71b55a223d14f8bb7fa355efc586e824b7d4d8f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Aug 14 17:24:36 2017 -0700
+
+    [aat] Start implementing Apple AAT morx table
+
+ src/Makefile.sources            |   2 +
+ src/hb-aat-layout-morx-table.hh | 275
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |  42 ++++++
+ src/hb-open-type-private.hh     |   5 +
+ src/hb-ot-layout-private.hh     |   5 +
+ src/hb-ot-layout.cc             |   2 +
+ 6 files changed, 331 insertions(+)
+
+commit 3c7aeb5c6437b26ad638ab993b724e28376d3ff8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Jan 9 01:39:42 2018 +0330
+
+    [cmake] Add autotools like feature testing (#683)
+
+ CMakeLists.txt | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+commit 0473d95e276ae5df722bc7d371733d8202bdbc3c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 8 10:07:46 2018 +0000
+
+    [ft] Use FT_Done_MM_Var() if available
+
+ configure.ac | 1 +
+ src/hb-ft.cc | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit 66d7beff96d622599e1ee8895f2aa84fe2299f1a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 18:09:29 2018 +0000
+
+    [khmer] Relax!
+
+    Apparently we don't use OT_A either.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit db0207baff358b20fbe9c3498275ba33f69caf87
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 18:06:00 2018 +0000
+
+    [khmer] Drop another joiner
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90affe831f08fabcb2dd5ac837c7b0cfbd14e554
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 18:04:56 2018 +0000
+
+    [khmer] Shuffle
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 65795e3ca246bf65b3cb53e3fe65eca312774e3e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 18:03:00 2018 +0000
+
+    [khmer] Simplify grammar some more
+
+    Numbers down (from 38):
+
+    KHMER: 299090 out of 299124 tests passed. 34 failed (0.0113665%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e13ee937310a7aadd83fd266dae382da40dce4f8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 18:01:01 2018 +0000
+
+    [khmer] Clean
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a71c7eb2ca9f8ba90117e1a0c4ce890f0a1640f4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:59:43 2018 +0000
+
+    [khmer] Limit number of joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 574e42e1cf6679c8df065d6bb3e8d21bc82395c1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:57:39 2018 +0000
+
+    [khmer] Relax number of consonants / matras allowed
+
+    New numbers (down from 39):
+
+    KHMER: 299086 out of 299124 tests passed. 38 failed (0.0127038%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 80c870bcda2f421e80f5579e71fe17fe8db991b8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:52:24 2018 +0000
+
+    [khmer] Allow Independent Vowels where stacked consonants are allowed
+
+    New numbers (down from 44):
+
+    KHMER: 299085 out of 299124 tests passed. 39 failed (0.0130381%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 9bd486c480b8fd3125ef6b6cc0442a566f669cb8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:47:35 2018 +0000
+
+    [khmer] Drop some more joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5278265853c36400ffc284fd517cc7b7c42ed0e7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:46:49 2018 +0000
+
+    [khmer] Drop some more
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efefd87f3354d0ae6f599ea30672cb0b74dfcd80
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:45:48 2018 +0000
+
+    [khmer] Drop some more grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82e6bf8e0c27d2fd16a908eed0c73e95b1a2c0f5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:44:18 2018 +0000
+
+    [khmer] Drop some more from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 957e8ea8a9f981775ecde7dd1e2bf4023cf79dba
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:43:31 2018 +0000
+
+    [khmer] Drop final_halant_group
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit bbfdbbdc5eca96e8c527147e5a78cd185b9f243d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:34:26 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit f6df2515210e9d828fc40173696b185efa5083e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:27:48 2018 +0000
+
+    [indic] Remove unused OT_VD category
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 +--
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit e6618f3bdf79a51f6fb270b468b653dc9cea5b57
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:21:55 2018 +0000
+
+    [khmer] Shave off some more from the grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl |  9 ++-------
+ src/hb-ot-shape-complex-khmer.cc         | 34
+ ++------------------------------
+ 2 files changed, 4 insertions(+), 39 deletions(-)
+
+commit 014494d5c0469fe6b3112db3fdb3f2f262673ba1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:17:02 2018 +0000
+
+    [khmer] Remove unused symbol clusters
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit bbac984b9390a66c6ae5ee931b278b607f2f2a50
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:15:31 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 185b68946ad67443e8725e77d724128802de5572
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:14:27 2018 +0000
+
+    [khmer] Remove medials from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit c265dffdf6c4930e271292226d38a8e515b6b0f8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:06:29 2018 +0000
+
+    [khmer] Better fix for dangling final Coeng
+
+    This is how 1471cfee3bb2734dc44c58471362851ad27e8bd8 should have
+    been done.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e3fdf1fc2f399e6b79ea022501526a422d372e64
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:05:53 2018 +0000
+
+    [khmer] Remove reph/repha support from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit 0d3a274de1ff8e6a21c7c9857730e2eda402e310
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 17:01:37 2018 +0000
+
+    [khmer] Remove forced_rakar from grammar
+
+    Used by Sinhala only.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 1471cfee3bb2734dc44c58471362851ad27e8bd8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:34:20 2018 +0000
+
+    [khmer] Allow a dangling final Coeng after matras
+
+    Uniscribe seems to allow that.  New numbers:
+
+    KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9eaf077ded0306d492de96b223133431f1a6d42b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:28:00 2018 +0000
+
+    [khmer] Remove some more unused code
+
+ src/hb-ot-shape-complex-khmer.cc | 49
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 47 deletions(-)
+
+commit bfad6ab897a38aedc82de694ee1a17132f90b25e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:13:09 2018 +0000
+
+    [khmer] Remove features not used by Khmer
+
+ src/hb-ot-shape-complex-khmer.cc | 60
+ ++++------------------------------------
+ 1 file changed, 5 insertions(+), 55 deletions(-)
+
+commit 92a99ce084b19dff32d434de446144f0c4796803
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:08:44 2018 +0000
+
+    [khmer] Remove rphf feature
+
+ src/hb-ot-shape-complex-khmer.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 238b90e77c12674edfd2e03160b8ba2a0298b79d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:06:53 2018 +0000
+
+    [khmer] Remove non-Khmer matra positioning code
+
+ src/hb-ot-shape-complex-khmer.cc | 76
+ +++++++---------------------------------
+ 1 file changed, 12 insertions(+), 64 deletions(-)
+
+commit f8553c898a414298403c335f8d2ed6c588a1189f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:04:02 2018 +0000
+
+    [khmer] Remove indic_config_t
+
+ src/hb-ot-shape-complex-khmer.cc | 28 ----------------------------
+ 1 file changed, 28 deletions(-)
+
+commit a119a8bce57abc440ae4c8b9a1342d428a7c9b6a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:02:27 2018 +0000
+
+    [khmer] Remove indic_config->reph_mode
+
+ src/hb-ot-shape-complex-khmer.cc | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit c135324af107d3e33420cd0dca4d5bb12fd3f4a1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 16:01:17 2018 +0000
+
+    [khmer] Remove indic_config->reph_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 333
+ ++-------------------------------------
+ 1 file changed, 10 insertions(+), 323 deletions(-)
+
+commit ffcd6c7efd21bf89b41ddbf148b05672a42ecadd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:50:05 2018 +0000
+
+    [khmer] Remove indic_config->base_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 229
+ ++-------------------------------------
+ 1 file changed, 7 insertions(+), 222 deletions(-)
+
+commit 0c91638d48d6fb86d1e30fb94c15785707395b42
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:45:30 2018 +0000
+
+    [khmer] Remove other scripts
+
+ src/hb-ot-shape-complex-khmer.cc | 131
+ ++++++++++-----------------------------
+ 1 file changed, 34 insertions(+), 97 deletions(-)
+
+commit 4c0199c573f79be5f40e7d4f8433ef6a1c9c24b2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:43:48 2018 +0000
+
+    [khmer] Remove indic_config->script
+
+ src/hb-ot-shape-complex-khmer.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9b135d9524e51cc1e1f35479e015c746ccd8ca5f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:43:11 2018 +0000
+
+    [khmer] Remove indic_config->virama
+
+ src/hb-ot-shape-complex-khmer.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 7eb3ac29d388432c311981b20b1aa75f47249bfc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:41:31 2018 +0000
+
+    [khmer] Remove indic_config->has_old_spec
+
+ src/hb-ot-shape-complex-khmer.cc | 157
+ ++++++---------------------------------
+ 1 file changed, 21 insertions(+), 136 deletions(-)
+
+commit 961ebf85f1e7d417e056c3927ee73857f6f4cde6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:36:53 2018 +0000
+
+    [khmer] Remove Halant from Khmer shaper
+
+ src/hb-ot-shape-complex-indic-private.hh |  1 -
+ src/hb-ot-shape-complex-khmer-machine.rl |  7 +++----
+ src/hb-ot-shape-complex-khmer.cc         | 32
+ ++++++++++++++++----------------
+ 3 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 9761f9d78214323b9ad58dd0b8ba41851c9e2d54
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:33:11 2018 +0000
+
+    [indic] Remove more Khmer-specific stuff from Indic shaper
+
+    No numbers changed.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  8 ++---
+ src/hb-ot-shape-complex-indic.cc         | 57
+ ++++++++++++--------------------
+ 2 files changed, 25 insertions(+), 40 deletions(-)
+
+commit 075895364435ee88936696bcb5457283c4bb1a29
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 15:08:28 2018 +0000
+
+    [indic] Remove main Khmer stuff
+
+ src/hb-ot-shape-complex-indic.cc | 73
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 71 deletions(-)
+
+commit dcf4d95fea45e19fbb3b39f0211b2aa96a907473
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 14:54:31 2018 +0000
+
+    [khmer] Split off Khmer shaper from Indic
+
+    Towards fixing https://github.com/harfbuzz/harfbuzz/issues/667
+    The Khmer spec is different enough from other Indic ones to require
+    its own grammar.
+
+    No change in functionality.  Test numbers are:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/Makefile.sources                     |    3 +
+ src/hb-ot-shape-complex-khmer-machine.rl |  130 +++
+ src/hb-ot-shape-complex-khmer.cc         | 1867
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh       |    5 +-
+ 4 files changed, 2003 insertions(+), 2 deletions(-)
+
+commit 1e05ea79d057fbae5f680589d4ee7d3c6a971689
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 14:01:37 2018 +0000
+
+    [ot] Short-circuit base instance advance variation
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 54b2b93722c9f067199cd7145dfd065d5b6b2f0c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 13:20:21 2018 +0000
+
+    [ot] Fix VariationStore evaluation algorithm
+
+    Ouch!  Missing coords should still be evaluated as coord=0, which
+    most of the time results in a factor of 0.  We were skipping these,
+    which was equivalent to a factor of 1.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/652
+
+ src/hb-ot-layout-common-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a3afdd1e080bb181ddec126b6233d52438882a13
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 13:17:02 2018 +0000
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb43bdbc2f3a16061c33596b15b29eb7f9713871
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 13:06:25 2018 +0000
+
+    [ft] If there's no variations set, don't set them on hb-font
+
+ src/hb-ft.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit ed2f458b143327d07e67fdb976ead9d7ff2863f8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 12:55:39 2018 +0000
+
+    Add test font for previous commit
+
+ .../sha1sum/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf | Bin 0 ->
+ 4816 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300
+Merge: 72bec1cd 8c0d1916
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 12:50:22 2018 +0000
+
+    Merge remote-tracking branch 'fdo/master'
+
+commit 8c0d1916a41f0fb32340ce5257de780acf598353
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 5 12:46:12 2018 +0000
+
+    Improve CGJ skipping logic
+
+    Previously we made CGJ unskippable.  Now, if CGJ did NOT prevent
+    any reordering, allow skipping over it.  To make this work we
+    had to make changes to the Arabic mark reordering algorithm
+    implementation to renumber moved MCM marks.  See comments.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/554
+
+ src/hb-buffer-private.hh                   |  1 +
+ src/hb-ot-layout-private.hh                | 11 ++++++++-
+ src/hb-ot-shape-complex-arabic.cc          | 37
+ ++++++++++++++++++++++--------
+ src/hb-ot-shape-normalize.cc               | 30 +++++++++++++-----------
+ test/shaping/tests/arabic-mark-order.tests |  4 ++++
+ 5 files changed, 58 insertions(+), 25 deletions(-)
+
+commit 72bec1cd09f919f3826345db4832752ec96ff5c5
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Jan 5 12:42:20 2018 +0330
+
+    Improve tests (#679)
+
+ .circleci/config.yml        |  2 +-
+ CMakeLists.txt              | 52
+ +++++++++++++++++++++++++++++++++++----------
+ autogen.sh                  |  6 ++++--
+ src/Makefile.am             |  3 +--
+ src/check-defs.sh           |  2 +-
+ src/check-header-guards.sh  |  2 +-
+ src/check-libstdc++.sh      |  2 +-
+ src/check-static-inits.sh   |  2 +-
+ src/check-symbols.sh        |  2 +-
+ test/fuzzing/CMakeLists.txt | 11 +++++++++-
+ 10 files changed, 62 insertions(+), 22 deletions(-)
+
+commit 293e443529d0621b9f94ea15d1425104394f6b9e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 4 16:06:25 2018 +0000
+
+    Minor
+
+ src/check-c-linkage-decls.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8a0952db7e521320cd4d8b67b287f7d33c21b6e0
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Thu Jan 4 18:40:10 2018 +0700
+
+    atomics: Favor compiler primitives over macOS APIs. (#676)
+
+    In macOS 10.12, the `OSMemoryBarrier` and related APIs were deprecated
+    in favor of using `std::atomic`. On the way to supporting
+    `std::atomic`,
+    we can favor using the "Intel primitives" which are also available on
+    macOS.
+
+ src/hb-atomic-private.hh | 46
+ +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit 4f80078eb035054db0f6e33cf4f7345c6c85cb12
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Thu Jan 4 18:37:35 2018 +0700
+
+    [cmake] Colorize output when using cmake + ninja. (#674)
+
+    Due to how ninja runs clang and gcc, it doesn't colorize the output
+    like make does. This forces color output in this situation.
+
+ CMakeLists.txt | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5ed26fc5bdfdab0ff41a8861b54395c0bbbad248
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Jan 4 10:11:34 2018 +0330
+
+    [cmake] Run src/ tests (#675)
+
+ .circleci/config.yml      |  9 ++++-----
+ CMakeLists.txt            | 35 ++++++++++++++++++++++++++++++++---
+ src/Makefile.am           |  1 +
+ src/check-defs.sh         |  3 ++-
+ src/check-libstdc++.sh    |  3 ++-
+ src/check-static-inits.sh |  3 ++-
+ src/check-symbols.sh      |  3 ++-
+ 7 files changed, 45 insertions(+), 12 deletions(-)
+
+commit f8daeef4c4451084a781db3a8a04807c0f0051ef
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 3 14:27:34 2018 +0000
+
+    [use] Simplify more
+
+ src/gen-use-table.py                 | 11 +------
+ src/hb-ot-shape-complex-use-table.cc | 62
+ +++++++++++++++++++++---------------
+ 2 files changed, 38 insertions(+), 35 deletions(-)
+
+commit 877d15e73c24159b26bb7cc6d2f62045d445d0fc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 3 14:24:44 2018 +0000
+
+    [use] Simplify
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/661
+
+ src/gen-use-table.py                 | 2 +-
+ src/hb-ot-shape-complex-use-table.cc | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 308f419215716460479fbde482d66d1687176102
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 3 14:22:07 2018 +0000
+
+    [use] Fix Brahmi Number Joiner 1107F
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/660
+
+ src/gen-indic-table.py                 | 6 +++---
+ src/gen-use-table.py                   | 6 +++---
+ src/hb-ot-shape-complex-indic-table.cc | 4 ++--
+ src/hb-ot-shape-complex-use-table.cc   | 6 +++---
+ 4 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 7b837e20d2b4b6cd7be0b181ac5cdfeb467bd146
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Jan 3 12:46:29 2018 +0000
+
+    [util] Add TODO item
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 70807ad274be39d58a5b43e12d4585325cb314c4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Jan 2 23:52:12 2018 +0330
+
+    Fix make check issue on out-of-tree builds and test it (#672)
+
+ .circleci/config.yml             |  8 ++++----
+ test/fuzzing/Makefile.am         | 18 +-----------------
+ test/fuzzing/run-fuzzer-tests.py |  8 +++++---
+ test/shaping/run-tests.py        |  5 +++++
+ 4 files changed, 15 insertions(+), 24 deletions(-)
+
+commit 85ec6d34439194a88c7dfdd8303369311e08e031
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 3 01:23:23 2018 +0700
+
+    Fix typos.
+
+ docs/usermanual-clusters.xml         | 4 ++--
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ src/hb-font.h                        | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4f6754ac0190f04b5f27306b087827b8f2e13046
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 3 00:15:18 2018 +0700
+
+    Improve Markdown usage in BUILD.md.
+
+ BUILD.md | 36 +++++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 13 deletions(-)
+
+commit 3db1d34264d9405c7356668aa3c8ed3ab103da3c
+Author: Romain Ouabdelkader <rouabdelkader at gopro.com>
+Date:   Thu Dec 21 14:39:34 2017 +0100
+
+    link with CoreFoundation when using CoreText
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e3cf91af29ff654eca91e43c0af1c1a7171b9fa
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Jan 1 11:17:51 2018 +0330
+
+    [cmake] Run rest of the tests on Windows (#668)
+
+ appveyor.yml                     |  6 +++---
+ test/CMakeLists.txt              |  5 +----
+ test/fuzzing/CMakeLists.txt      | 12 ++++++------
+ test/fuzzing/Makefile.am         |  5 +----
+ test/fuzzing/run-fuzzer-tests.py | 12 +++++++++---
+ test/shaping/CMakeLists.txt      |  9 ++++-----
+ test/shaping/run-tests.py        | 10 +++++++++-
+ 7 files changed, 33 insertions(+), 26 deletions(-)
+
+commit 2dbdeb14214487acd0ff011386c49263ce800813
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Dec 29 23:13:29 2017 +0330
+
+    [cmake] Run fuzzing and shaping tests (#666)
+
+ .circleci/config.yml             |  2 +-
+ CMakeLists.txt                   | 59
+ ++++++++++++++++++++++++----------------
+ appveyor.yml                     |  4 +--
+ test/CMakeLists.txt              |  5 ++++
+ test/api/CMakeLists.txt          | 48 +++++++++++++-------------------
+ test/fuzzing/CMakeLists.txt      |  9 ++++++
+ test/fuzzing/Makefile.am         | 18 ++++++++++++
+ test/fuzzing/run-fuzzer-tests.py | 28 +++++++++++++++++++
+ test/shaping/CMakeLists.txt      | 11 ++++++++
+ test/shaping/Makefile.am         |  3 +-
+ test/shaping/run-tests.py        |  3 +-
+ 11 files changed, 132 insertions(+), 58 deletions(-)
+
+commit 24b30faa2a285c6e4e46a18c346def2183fc2793
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Dec 25 22:01:28 2017 +0330
+
+    [cmake] Use GNUInstallDirs values (#665)
+
+ CMakeLists.txt | 170
+ ++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 85 insertions(+), 85 deletions(-)
+
+commit 7d397c5d5ca684fae824a61dabf5bc422d0a516b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Dec 24 17:53:32 2017 -0500
+
+    Add Coverity badge
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 50163976d2a5fb34e0b4c011408d581b33aaa255
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Dec 25 01:55:48 2017 +0330
+
+    [cmake] Enable cmake tests on distribution and test it (#664)
+
+ .circleci/config.yml | 3 ++-
+ test/Makefile.am     | 6 ++++++
+ test/api/Makefile.am | 1 +
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 7bfdf1a94192dd83ab55202d259703f36ed060e5
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Wed Nov 22 16:32:52 2017 -0500
+
+    Forbid Batak killers after vowel signs
+
+ src/gen-use-table.py                                     |   3 +++
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../sha1sum/59a585a63b3df608fbeef00956c8c108deec7de6.ttf | Bin 0 ->
+ 1164 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 9890782736b9ce708c1fedd1cbb3db45cfef4c69
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Dec 25 01:32:46 2017 +0330
+
+    [ci] Add -Wno-attributes to djgpp, add alpine, format (#663)
+
+ .circleci/config.yml | 40 ++++++++++++++++++++++++++++++----------
+ 1 file changed, 30 insertions(+), 10 deletions(-)
+
+commit 72ecaae0ad4c9f1685f7d524990e92a26fcd5611
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Dec 24 16:05:07 2017 -0500
+
+    [use] Allow ZWJ before/after Halant
+
+    https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+
+ src/hb-ot-shape-complex-use-machine.rl | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bc92245b681098f0bfa712217851a5ba3dabeaf3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Dec 20 13:19:33 2017 -0500
+
+    Minor
+
+ src/main.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 81dfc29d2dbc755301e702ea5427829d02abc693
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Dec 21 20:15:37 2017 +0330
+
+    [ci] Add a DOS/djgpp compiler (#659)
+
+ .circleci/config.yml | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 007a2a4317227b8fb4c764c590203c85fc3da5fd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Dec 20 12:09:00 2017 -0500
+
+    1.7.4
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
 commit a9432bde7e61894056a42ea24d56fd7fd908a1ce
 Author: Volker H. Simonis <volker.simonis at gmail.com>
 Date:   Tue Dec 19 11:33:25 2017 +0100

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,3 +1,12 @@
+Overview of changes leading to 1.7.5
+Tuesday, January 30, 2018
+====================================
+
+- Separate Khmer shaper from Indic.
+- First stab at AAT morx. Not hooked up.
+- Misc bug fixes.
+
+
 Overview of changes leading to 1.7.4
 Wednesday, December 20, 2017
 ====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/README
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/README	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/README	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,6 +1,7 @@
 [![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
 [![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
 [![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
+[![Coverity](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
 [![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
 [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -42,5 +42,7 @@
 autoreconf --force --install --verbose || exit $?
 
 cd $olddir
-echo "running configure $@"
-test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
+test -n "$NOCONFIGURE" || {
+	echo "running configure $@"
+	"$srcdir/configure" "$@"
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2018-01-31 01:11:59 UTC (rev 46498)
@@ -15,9 +15,6 @@
 /* Have Core Text backend */
 #undef HAVE_CORETEXT
 
-/* define if the compiler supports basic C++11 syntax */
-#undef HAVE_CXX11
-
 /* Have DirectWrite library */
 #undef HAVE_DIRECTWRITE
 
@@ -36,6 +33,9 @@
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
+/* Define to 1 if you have the `FT_Done_MM_Var' function. */
+#undef HAVE_FT_DONE_MM_VAR
+
 /* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */
 #undef HAVE_FT_GET_VAR_BLEND_COORDINATES
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [1.7.4],
+        [1.7.5],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -9,8 +9,7 @@
 AC_CONFIG_SRCDIR([src/harfbuzz.pc.in])
 AC_CONFIG_HEADERS([config.h])
 
-AM_INIT_AUTOMAKE([1.11.1 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
-AM_CONDITIONAL(AUTOMAKE_OLDER_THAN_1_13, test $am__api_version = 1.11 -o $am__api_version = 1.12)
+AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
 AM_SILENT_RULES([yes])
 
 # Initialize libtool
@@ -23,7 +22,7 @@
 AC_PROG_CC
 AM_PROG_CC_C_O
 AC_PROG_CXX
-AX_CXX_COMPILE_STDCXX(11, noext, optional)
+dnl AX_CXX_COMPILE_STDCXX(11, noext, optional)
 AC_SYS_LARGEFILE
 PKG_PROG_PKG_CONFIG([0.20])
 AM_MISSING_PROG([RAGEL], [ragel])
@@ -84,6 +83,9 @@
 	# Make sure we don't link to libstdc++
 	CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions"
 
+	# No threadsafe statics and C++ as we do it ourselves
+	CXXFLAGS="$CXXFLAGS -fno-threadsafe-statics"
+
 	# Assorted warnings
 	CXXFLAGS="$CXXFLAGS -Wcast-align"
 
@@ -355,6 +357,7 @@
 	LIBS="$LIBS $FREETYPE_LIBS"
 	AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates)
 	AC_CHECK_FUNCS(FT_Set_Var_Blend_Coordinates)
+	AC_CHECK_FUNCS(FT_Done_MM_Var)
 	LIBS=$save_libs
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
@@ -429,7 +432,7 @@
 
 		if $have_coretext; then
 			CORETEXT_CFLAGS=
-			CORETEXT_LIBS="-framework CoreText -framework CoreGraphics"
+			CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation"
 			AC_SUBST(CORETEXT_CFLAGS)
 			AC_SUBST(CORETEXT_LIBS)
 		fi
@@ -494,6 +497,9 @@
 test/api/Makefile
 test/fuzzing/Makefile
 test/shaping/Makefile
+test/shaping/data/Makefile
+test/shaping/data/in-house/Makefile
+test/shaping/data/text-rendering-tests/Makefile
 docs/Makefile
 docs/version.xml
 ])

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,5 +1,6 @@
 # Process this file with automake to produce Makefile.in
 
+NULL =
 SUBDIRS =
 DIST_SUBDIRS =
 BUILT_SOURCES =
@@ -134,7 +135,7 @@
 pkgconfig_DATA = harfbuzz.pc
 EXTRA_DIST += harfbuzz.pc.in
 
-FUZZING_CPPFLAGS= \
+FUZZING_CPPFLAGS = \
 	-DHB_NDEBUG \
 	-DHB_MAX_NESTING_LEVEL=3 \
 	-DHB_SANITIZE_MAX_EDITS=3 \
@@ -222,15 +223,7 @@
 
 CLEANFILES += harfbuzz.def
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
-	$(AM_V_GEN) (echo EXPORTS; \
-	(cat $^ || echo 'hb_ERROR ()' ) | \
-	$(EGREP) '^hb_.* \(' | \
-	sed -e 's/ (.*//' | \
-	LC_ALL=C sort; \
-	echo LIBRARY libharfbuzz-0.dll; \
-	) >"$@"
-	@ ! grep -q hb_ERROR "$@" \
-	|| ($(RM) "$@"; false)
+	$(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
 
 
 GENERATORS = \
@@ -237,6 +230,7 @@
 	gen-arabic-table.py \
 	gen-indic-table.py \
 	gen-use-table.py \
+	gen-def.py \
 	$(NULL)
 EXTRA_DIST += $(GENERATORS)
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-01-31 01:11:59 UTC (rev 46498)
@@ -1,5 +1,3 @@
-NULL =
-
 # Base and default-included sources and headers
 
 HB_BASE_sources = \
@@ -82,6 +80,10 @@
 	$(NULL)
 
 HB_OT_sources = \
+	hb-aat-layout.cc \
+	hb-aat-layout-common-private.hh \
+	hb-aat-layout-morx-table.hh \
+	hb-aat-layout-private.hh \
 	hb-ot-font.cc \
 	hb-ot-layout.cc \
 	hb-ot-layout-common-private.hh \
@@ -107,6 +109,7 @@
 	hb-ot-shape-complex-indic.cc \
 	hb-ot-shape-complex-indic-private.hh \
 	hb-ot-shape-complex-indic-table.cc \
+	hb-ot-shape-complex-khmer.cc \
 	hb-ot-shape-complex-myanmar.cc \
 	hb-ot-shape-complex-thai.cc \
 	hb-ot-shape-complex-tibetan.cc \
@@ -128,11 +131,13 @@
 
 HB_OT_RAGEL_GENERATED_sources = \
 	hb-ot-shape-complex-indic-machine.hh \
+	hb-ot-shape-complex-khmer-machine.hh \
 	hb-ot-shape-complex-myanmar-machine.hh \
 	hb-ot-shape-complex-use-machine.hh \
 	$(NULL)
 HB_OT_RAGEL_sources = \
 	hb-ot-shape-complex-indic-machine.rl \
+	hb-ot-shape-complex-khmer-machine.rl \
 	hb-ot-shape-complex-myanmar-machine.rl \
 	hb-ot-shape-complex-use-machine.rl \
 	$(NULL)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -7,9 +7,8 @@
 stat=0
 
 test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
-test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.cc'`
 
-
 for x in $HBHEADERS; do
 	test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
 	if ! grep -q HB_BEGIN_DECLS "$x" || ! grep -q HB_END_DECLS "$x"; then

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -4,7 +4,7 @@
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
-test -z "$MAKE" && MAKE=make
+test -z "$libs" && libs=.libs
 stat=0
 
 if which nm 2>/dev/null >/dev/null; then
@@ -15,26 +15,36 @@
 fi
 
 defs="harfbuzz.def"
-$MAKE $defs > /dev/null
+if ! test -f "$defs"; then
+	echo "check-defs.sh: '$defs' not found; skipping test"
+	exit 77
+fi
+
 tested=false
 for def in $defs; do
 	lib=`echo "$def" | sed 's/[.]def$//;s at .*/@@'`
-	so=.libs/lib${lib}.so
+	for suffix in so dylib; do
+		so=$libs/lib${lib}.$suffix
+		if ! test -f "$so"; then continue; fi
 
-	EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| llvm_' | cut -d' ' -f3`"
+		# On mac, C symbols are prefixed with _
+		if test $suffix = dylib; then prefix="_"; fi
 
-	if test -f "$so"; then
+		EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $prefix"'\(_fini\>\|_init\>\|_fdata\>\|_ftext\>\|_fbss\>\|__bss_start\>\|__bss_start__\>\|__bss_end__\>\|_edata\>\|_end\>\|_bss_end__\>\|__end__\>\|__gcov_flush\>\|llvm_\)' | cut -d' ' -f3`"
 
-		echo "Checking that $so has the same symbol list as $def"
-		{
-			echo EXPORTS
-			echo "$EXPORTED_SYMBOLS"
-			# cheat: copy the last line from the def file!
-			tail -n1 "$def"
-		} | diff "$def" - >&2 || stat=1
+		if test -f "$so"; then
 
-		tested=true
-	fi
+			echo "Checking that $so has the same symbol list as $def"
+			{
+				echo EXPORTS
+				echo "$EXPORTED_SYMBOLS" | sed -e "s/^${prefix}hb/hb/g"
+				# cheat: copy the last line from the def file!
+				tail -n1 "$def"
+			} | diff "$def" - >&2 || stat=1
+
+			tested=true
+		fi
+	done
 done
 if ! $tested; then
 	echo "check-defs.sh: libharfbuzz shared library not found; skipping test"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -6,7 +6,7 @@
 test -z "$srcdir" && srcdir=.
 stat=0
 
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h' ! -name 'hb-gobject-structs.h'`
 test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
 
 for x in $HBHEADERS $HBSOURCES; do

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -4,23 +4,29 @@
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 
 if which ldd 2>/dev/null >/dev/null; then
-	:
+	LDD=ldd
 else
-	echo "check-libstdc++.sh: 'ldd' not found; skipping test"
-	exit 77
+	# macOS specific tool
+	if which otool 2>/dev/null >/dev/null; then
+		LDD="otool -L"
+	else
+		echo "check-libstdc++.sh: 'ldd' not found; skipping test"
+		exit 77
+	fi
 fi
 
 tested=false
 for suffix in so dylib; do
-	so=.libs/libharfbuzz.$suffix
+	so=$libs/libharfbuzz.$suffix
 	if ! test -f "$so"; then continue; fi
 
 	echo "Checking that we are not linking to libstdc++ or libc++"
-	if ldd $so | grep 'libstdc[+][+]\|libc[+][+]'; then
+	if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then
 		echo "Ouch, linked to libstdc++ or libc++"
 		stat=1
 	fi

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -4,6 +4,7 @@
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 
@@ -14,7 +15,7 @@
 	exit 77
 fi
 
-OBJS=.libs/*.o
+OBJS=$libs/*.o
 if test "x`echo $OBJS`" = "x$OBJS" 2>/dev/null >/dev/null; then
 	echo "check-static-inits.sh: object files not found; skipping test"
 	exit 77

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -4,6 +4,7 @@
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 
@@ -17,7 +18,7 @@
 echo "Checking that we are not exposing internal symbols"
 tested=false
 for suffix in so dylib; do
-	so=.libs/libharfbuzz.$suffix
+	so=$libs/libharfbuzz.$suffix
 	if ! test -f "$so"; then continue; fi
 
 	EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| ___gcov_flush\>\| llvm_\| _llvm_' | cut -d' ' -f3`"

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+
+import io, os, re, sys
+
+headers_content = []
+for h in os.environ["headers"].split (' '):
+	if h.endswith (".h"):
+		with io.open(h, encoding='utf8') as f: headers_content.append (f.read ())
+
+result = ("EXPORTS\n" +
+	"\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))) +
+	"\nLIBRARY libharfbuzz-0.dll")
+
+with open (sys.argv[1], "w") as f: f.write (result)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py	2018-01-31 01:11:59 UTC (rev 46498)
@@ -229,13 +229,13 @@
 pages = set([u>>page_bits for u in starts+ends+singles.keys()])
 for p in sorted(pages):
 	print "    case 0x%0Xu:" % p
+	for u,d in singles.items ():
+		if p != u>>page_bits: continue
+		print "      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
 	for (start,end) in zip (starts, ends):
 		if p not in [start>>page_bits, end>>page_bits]: continue
 		offset = "indic_offset_0x%04xu" % start
 		print "      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
-	for u,d in singles.items ():
-		if p != u>>page_bits: continue
-		print "      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
 	print "      break;"
 	print ""
 print "    default:"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2018-01-31 01:11:59 UTC (rev 46498)
@@ -297,6 +297,9 @@
 		if U == 0x17DD: UISC = Vowel_Dependent
 		if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
 
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/627
+		if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom
+
 		# TODO: U+1CED should only be allowed after some of
 		# the nasalization marks, maybe only for U+1CE9..U+1CF1.
 		if U == 0x1CED: UISC = Tone_Mark
@@ -349,12 +352,6 @@
 defaults = ('O', 'No_Block')
 data = map_to_use(data)
 
-# Remove the outliers
-singles = {}
-for u in [0x034F, 0x25CC, 0x1107F]:
-	singles[u] = data[u]
-	del data[u]
-
 print "/* == Start of generated table == */"
 print "/*"
 print " * The following table is generated by running:"
@@ -456,7 +453,7 @@
 print "{"
 print "  switch (u >> %d)" % page_bits
 print "  {"
-pages = set([u>>page_bits for u in starts+ends+singles.keys()])
+pages = set([u>>page_bits for u in starts+ends])
 for p in sorted(pages):
 	print "    case 0x%0Xu:" % p
 	for (start,end) in zip (starts, ends):
@@ -463,9 +460,6 @@
 		if p not in [start>>page_bits, end>>page_bits]: continue
 		offset = "use_offset_0x%04xu" % start
 		print "      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
-	for u,d in singles.items ():
-		if p != u>>page_bits: continue
-		print "      if (unlikely (u == 0x%04Xu)) return %s;" % (u, d[0])
 	print "      break;"
 	print ""
 print "    default:"

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,708 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_COMMON_PRIVATE_HH
+#define HB_AAT_LAYOUT_COMMON_PRIVATE_HH
+
+#include "hb-aat-layout-private.hh"
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+/*
+ * Binary Searching Tables
+ */
+
+struct BinSearchHeader
+{
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16	unitSize;	/* Size of a lookup unit for this search in bytes. */
+  HBUINT16	nUnits;		/* Number of units of the preceding size to be searched. */
+  HBUINT16	searchRange;	/* The value of unitSize times the largest power of 2
+				 * that is less than or equal to the value of nUnits. */
+  HBUINT16	entrySelector;	/* The log base 2 of the largest power of 2 less than
+				 * or equal to the value of nUnits. */
+  HBUINT16	rangeShift;	/* The value of unitSize times the difference of the
+				 * value of nUnits minus the largest power of 2 less
+				 * than or equal to the value of nUnits. */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+template <typename Type>
+struct BinSearchArrayOf
+{
+  inline const Type& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= header.nUnits)) return Null(Type);
+    return StructAtOffset<Type> (bytes, i * header.unitSize);
+  }
+  inline Type& operator [] (unsigned int i)
+  {
+    return StructAtOffset<Type> (bytes, i * header.unitSize);
+  }
+  inline unsigned int get_size (void) const
+  { return header.static_size + header.nUnits * header.unitSize; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    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(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && StructAtOffset<Type> (bytes, 0).sanitize (c));
+
+    return_trace (true);
+  }
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = header.nUnits;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(*this)[i].sanitize (c, base)))
+        return_trace (false);
+    return_trace (true);
+  }
+
+  template <typename T>
+  inline const Type *bsearch (const T &key) const
+  {
+    unsigned int size = header.unitSize;
+    int min = 0, max = (int) header.nUnits - 1;
+    while (min <= max)
+    {
+      int mid = (min + max) / 2;
+      const Type *p = (const Type *) (((const char *) bytes) + (mid * size));
+      int c = p->cmp (key);
+      if (c < 0)
+	max = mid - 1;
+      else if (c > 0)
+	min = mid + 1;
+      else
+	return p;
+    }
+    return NULL;
+  }
+
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (header.sanitize (c) &&
+		  Type::static_size >= header.unitSize &&
+		  c->check_array (bytes, header.unitSize, header.nUnits));
+  }
+
+  protected:
+  BinSearchHeader	header;
+  HBUINT8			bytes[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (10, bytes);
+};
+
+
+/* TODO Move this to hb-open-type-private.hh and use it in ArrayOf, HeadlessArrayOf,
+ * and other places around the code base?? */
+template <typename Type>
+struct UnsizedArrayOf
+{
+  inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; }
+  inline Type& operator [] (unsigned int i) { return arrayZ[i]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    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(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && arrayZ[0].sanitize (c));
+
+    return_trace (true);
+  }
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const
+  {
+    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, base)))
+        return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const
+  {
+    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, base, user_data)))
+        return_trace (false);
+    return_trace (true);
+  }
+
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count));
+  }
+
+  public:
+  Type	arrayZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (0, arrayZ);
+};
+
+/* Unsized array of offset's */
+template <typename Type, typename OffsetType>
+struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType> > {};
+
+/* Unsized array of offsets relative to the beginning of the array itself. */
+template <typename Type, typename OffsetType>
+struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType>
+{
+  inline const Type& operator [] (unsigned int i) const
+  {
+    return this+this->arrayZ[i];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this)));
+  }
+  template <typename T>
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this, user_data)));
+  }
+};
+
+
+/*
+ * Lookup Table
+ */
+
+template <typename T> struct Lookup;
+
+template <typename T>
+struct LookupFormat0
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    if (unlikely (glyph_id >= num_glyphs)) return nullptr;
+    return &arrayZ[glyph_id];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (arrayZ.sanitize (c, c->num_glyphs));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 0 */
+  UnsizedArrayOf<T>
+		arrayZ;		/* Array of lookup values, indexed by glyph index. */
+  public:
+  DEFINE_SIZE_ARRAY (2, arrayZ);
+};
+
+
+template <typename T>
+struct LookupSegmentSingle
+{
+  inline int cmp (hb_codepoint_t g) const {
+    return g < first ? -1 : g <= last ? 0 : +1 ;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  GlyphID	last;		/* Last GlyphID in this segment */
+  GlyphID	first;		/* First GlyphID in this segment */
+  T		value;		/* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat2
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 2 */
+  BinSearchArrayOf<LookupSegmentSingle<T> >
+		segments;	/* The actual segments. These must already be sorted,
+				 * according to the first word in each one (the last
+				 * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSegmentArray
+{
+  inline const T* get_value (hb_codepoint_t glyph_id, const void *base) const
+  {
+    return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
+  }
+
+  inline int cmp (hb_codepoint_t g) const {
+    return g < first ? -1 : g <= last ? 0 : +1 ;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  first <= last &&
+		  valuesZ.sanitize (c, base, last - first + 1));
+  }
+
+  GlyphID	last;		/* Last GlyphID in this segment */
+  GlyphID	first;		/* First GlyphID in this segment */
+  OffsetTo<UnsizedArrayOf<T> >
+		valuesZ;	/* A 16-bit offset from the start of
+				 * the table to the data. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename T>
+struct LookupFormat4
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
+    return v ? v->get_value (glyph_id, this) : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 2 */
+  BinSearchArrayOf<LookupSegmentArray<T> >
+		segments;	/* The actual segments. These must already be sorted,
+				 * according to the first word in each one (the last
+				 * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSingle
+{
+  inline int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  GlyphID	glyph;		/* Last GlyphID */
+  T		value;		/* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat6
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSingle<T> *v = entries.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (entries.sanitize (c));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 6 */
+  BinSearchArrayOf<LookupSingle<T> >
+		entries;	/* The actual entries, sorted by glyph index. */
+  public:
+  DEFINE_SIZE_ARRAY (8, entries);
+};
+
+template <typename T>
+struct LookupFormat8
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? &valueArrayZ[glyph_id - firstGlyph] : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 6 */
+  GlyphID	firstGlyph;	/* First glyph index included in the trimmed array. */
+  HBUINT16	glyphCount;	/* Total number of glyphs (equivalent to the last
+				 * glyph minus the value of firstGlyph plus 1). */
+  UnsizedArrayOf<T>
+		valueArrayZ;	/* The lookup values (indexed by the glyph index
+				 * minus the value of firstGlyph). */
+  public:
+  DEFINE_SIZE_ARRAY (6, valueArrayZ);
+};
+
+template <typename T>
+struct Lookup
+{
+  inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_value (glyph_id, num_glyphs);
+    case 2: return u.format2.get_value (glyph_id);
+    case 4: return u.format4.get_value (glyph_id);
+    case 6: return u.format6.get_value (glyph_id);
+    case 8: return u.format8.get_value (glyph_id);
+    default:return nullptr;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 0: return_trace (u.format0.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 4: return_trace (u.format4.sanitize (c));
+    case 6: return_trace (u.format6.sanitize (c));
+    case 8: return_trace (u.format8.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16		format;		/* Format identifier */
+  LookupFormat0<T>	format0;
+  LookupFormat2<T>	format2;
+  LookupFormat4<T>	format4;
+  LookupFormat6<T>	format6;
+  LookupFormat8<T>	format8;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+/*
+ * Extended State Table
+ */
+
+template <typename T>
+struct Entry
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    /* Note, we don't recurse-sanitize data because we don't access it.
+     * That said, in our DEFINE_SIZE_STATIC we access T::static_size,
+     * which ensures that data has a simple sanitize(). To be determined
+     * if I need to remove that as well. */
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table
+				 * to the new state. Really?!?! Or just state
+				 * number?  The latter in morx for sure. */
+  HBUINT16	flags;		/* Table specific. */
+  T		data;		/* Optional offsets to per-glyph tables. */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <>
+struct Entry<void>
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table to the new state. */
+  HBUINT16	flags;		/* Table specific. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename Extra>
+struct StateTable
+{
+  inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    const HBUINT16 *v = (this+classTable).get_value (glyph_id, num_glyphs);
+    return v ? *v : 1;
+  }
+
+  inline const Entry<Extra> *get_entries () const
+  {
+    return (this+entryTable).arrayZ;
+  }
+
+  inline const Entry<Extra> *get_entryZ (unsigned int state, unsigned int klass) const
+  {
+    if (unlikely (klass >= nClasses)) return nullptr;
+
+    const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int entry = states[state * nClasses + klass];
+
+    return &entries[entry];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c,
+			unsigned int *num_entries_out = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this) &&
+		    classTable.sanitize (c, this)))) return_trace (false);
+
+    const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int num_states = 1;
+    unsigned int num_entries = 0;
+
+    unsigned int state = 0;
+    unsigned int entry = 0;
+    while (state < num_states)
+    {
+      if (unlikely (!c->check_array (states + state * nClasses,
+				     states[0].static_size,
+				     nClasses * (num_states - state))))
+	return_trace (false);
+      { /* Sweep new states. */
+	const HBUINT16 *stop = &states[num_states * nClasses];
+	for (const HBUINT16 *p = &states[state * nClasses]; p < stop; p++)
+	  num_entries = MAX<unsigned int> (num_entries, *p + 1);
+	state = num_states;
+      }
+
+      if (unlikely (!c->check_array (entries + entry,
+				     entries[0].static_size,
+				     num_entries - entry)))
+	return_trace (false);
+      { /* Sweep new entries. */
+	const Entry<Extra> *stop = &entries[num_entries];
+	for (const Entry<Extra> *p = &entries[entry]; p < stop; p++)
+	  num_states = MAX<unsigned int> (num_states, p->newState + 1);
+	entry = num_entries;
+      }
+    }
+
+    if (num_entries_out)
+      *num_entries_out = num_entries;
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32	nClasses;	/* Number of classes, which is the number of indices
+				 * in a single line in the state array. */
+  OffsetTo<Lookup<HBUINT16>, HBUINT32>
+		classTable;	/* Offset to the class table. */
+  OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32>
+		stateArrayTable;/* Offset to the state array. */
+  OffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT32>
+		entryTable;	/* Offset to the entry array. */
+
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+template <typename EntryData>
+struct StateTableDriver
+{
+  inline StateTableDriver (const StateTable<EntryData> &machine_,
+			   hb_buffer_t *buffer_,
+			   hb_face_t *face_) :
+	      machine (machine_),
+	      buffer (buffer_),
+	      num_glyphs (face_->get_num_glyphs ()),
+	      last_zero (0) {}
+
+  template <typename context_t>
+  inline void drive (context_t *c)
+  {
+    hb_glyph_info_t *info = buffer->info;
+
+    if (!c->in_place)
+      buffer->clear_output ();
+
+    unsigned int state = 0;
+    bool last_was_dont_advance = false;
+    for (buffer->idx = 0;;)
+    {
+      if (!state)
+	last_zero = buffer->idx;
+
+      unsigned int klass = buffer->idx < buffer->len ?
+			   machine.get_class (info[buffer->idx].codepoint, num_glyphs) :
+			   0 /* End of text */;
+      const Entry<EntryData> *entry = machine.get_entryZ (state, klass);
+      if (unlikely (!entry))
+	break;
+
+      if (unlikely (!c->transition (this, entry)))
+        break;
+
+      last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops--;
+
+      state = entry->newState;
+
+      if (buffer->idx == buffer->len)
+        break;
+
+      if (!last_was_dont_advance)
+        buffer->next_glyph ();
+    }
+
+    if (!c->in_place)
+    {
+      for (; buffer->idx < buffer->len;)
+        buffer->next_glyph ();
+      buffer->swap_buffers ();
+    }
+  }
+
+  public:
+  const StateTable<EntryData> &machine;
+  hb_buffer_t *buffer;
+  unsigned int num_glyphs;
+  unsigned int last_zero;
+};
+
+
+
+struct hb_aat_apply_context_t :
+       hb_dispatch_context_t<hb_aat_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+  inline const char *get_name (void) { return "APPLY"; }
+  template <typename T>
+  inline return_t dispatch (const T &obj) { return obj.apply (this); }
+  static return_t default_return_value (void) { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  hb_font_t *font;
+  hb_face_t *face;
+  hb_buffer_t *buffer;
+  hb_sanitize_context_t sanitizer;
+
+  inline hb_aat_apply_context_t (hb_font_t *font_,
+				 hb_buffer_t *buffer_,
+				 hb_blob_t *table) :
+		font (font_), face (font->face), buffer (buffer_),
+		sanitizer ()
+  {
+    sanitizer.init (table);
+    sanitizer.num_glyphs = face->get_num_glyphs ();
+    sanitizer.start_processing ();
+  }
+
+  inline ~hb_aat_apply_context_t (void)
+  {
+    sanitizer.end_processing ();
+  }
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_COMMON_PRIVATE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,694 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_MORX_TABLE_HH
+#define HB_AAT_LAYOUT_MORX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct RearrangementSubtable
+{
+  struct driver_context_t
+  {
+    static const bool in_place = true;
+    enum Flags {
+      MarkFirst		= 0x8000,	/* If set, make the current glyph the first
+					 * glyph to be rearranged. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph
+					 * before going to the new state. This means
+					 * that the glyph index doesn't change, even
+					 * if the glyph at that index has changed. */
+      MarkLast		= 0x2000,	/* If set, make the current glyph the last
+					 * glyph to be rearranged. */
+      Reserved		= 0x1FF0,	/* These bits are reserved and should be set to 0. */
+      Verb		= 0x000F,	/* The type of rearrangement specified. */
+    };
+
+    inline driver_context_t (const RearrangementSubtable *table) :
+	ret (false),
+	start (0), end (0),
+	last_zero_before_start (0) {}
+
+    inline bool transition (StateTableDriver<void> *driver,
+			    const Entry<void> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry->flags;
+
+      if (flags & MarkFirst)
+      {
+	start = buffer->idx;
+	last_zero_before_start = driver->last_zero;
+      }
+
+      if (flags & MarkLast)
+	end = MIN (buffer->idx + 1, buffer->len);
+
+      if ((flags & Verb) && start < end)
+      {
+	/* The following map has two nibbles, for start-side
+	 * and end-side. Values of 0,1,2 mean move that many
+	 * to the other side. Value of 3 means move 2 and
+	 * flip them. */
+	const unsigned char map[16] =
+	{
+	  0x00,	/* 0	no change */
+	  0x10,	/* 1	Ax => xA */
+	  0x01,	/* 2	xD => Dx */
+	  0x11,	/* 3	AxD => DxA */
+	  0x20,	/* 4	ABx => xAB */
+	  0x30,	/* 5	ABx => xBA */
+	  0x02,	/* 6	xCD => CDx */
+	  0x03,	/* 7	xCD => DCx */
+	  0x12,	/* 8	AxCD => CDxA */
+	  0x13,	/* 9	AxCD => DCxA */
+	  0x21,	/* 10	ABxD => DxAB */
+	  0x31,	/* 11	ABxD => DxBA */
+	  0x22,	/* 12	ABxCD => CDxAB */
+	  0x32,	/* 13	ABxCD => CDxBA */
+	  0x23,	/* 14	ABxCD => DCxAB */
+	  0x33,	/* 15	ABxCD => DCxBA */
+	};
+
+	unsigned int m = map[flags & Verb];
+	unsigned int l = MIN<unsigned int> (2, m >> 4);
+	unsigned int r = MIN<unsigned int> (2, m & 0x0F);
+	bool reverse_l = 3 == (m >> 4);
+	bool reverse_r = 3 == (m & 0x0F);
+
+	if (end - start >= l + r)
+	{
+	  buffer->unsafe_to_break (last_zero_before_start, MIN (buffer->idx + 1, buffer->len));
+	  buffer->merge_clusters (start, end);
+
+	  hb_glyph_info_t *info = buffer->info;
+	  hb_glyph_info_t buf[4];
+
+	  memcpy (buf, info + start, l * sizeof (buf[0]));
+	  memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+
+	  if (l != r)
+	    memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+
+	  memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+	  memcpy (info + end - l, buf, l * sizeof (buf[0]));
+	  if (reverse_l)
+	  {
+	    buf[0] = info[end - 1];
+	    info[end - 1] = info[end - 2];
+	    info[end - 2] = buf[0];
+	  }
+	  if (reverse_r)
+	  {
+	    buf[0] = info[start];
+	    info[start] = info[start + 1];
+	    info[start + 1] = buf[0];
+	  }
+	}
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    unsigned int start;
+    unsigned int end;
+    unsigned int last_zero_before_start;
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this);
+
+    StateTableDriver<void> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (machine.sanitize (c));
+  }
+
+  protected:
+  StateTable<void>	machine;
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct ContextualSubtable
+{
+  struct EntryData
+  {
+    HBUINT16	markIndex;	/* Index of the substitution table for the
+				 * marked glyph (use 0xFFFF for none). */
+    HBUINT16	currentIndex;	/* Index of the substitution table for the
+				 * current glyph (use 0xFFFF for none). */
+    public:
+    DEFINE_SIZE_STATIC (4);
+  };
+
+  struct driver_context_t
+  {
+    static const bool in_place = true;
+    enum Flags {
+      SetMark		= 0x8000,	/* If set, make the current glyph the marked glyph. */
+      DontAdvance	= 0x4000,	/* If set, don't advance to the next glyph before
+					 * going to the new state. */
+      Reserved		= 0x3FFF,	/* These bits are reserved and should be set to 0. */
+    };
+
+    inline driver_context_t (const ContextualSubtable *table) :
+	ret (false),
+	mark (0),
+	last_zero_before_mark (0),
+	subs (table+table->substitutionTables) {}
+
+    inline bool transition (StateTableDriver<EntryData> *driver,
+			    const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      if (entry->flags & SetMark)
+      {
+	mark = buffer->idx;
+	last_zero_before_mark = driver->last_zero;
+      }
+
+      if (entry->data.markIndex != 0xFFFF)
+      {
+	const Lookup<GlyphID> &lookup = subs[entry->data.markIndex];
+	hb_glyph_info_t *info = buffer->info;
+	const GlyphID *replacement = lookup.get_value (info[mark].codepoint, driver->num_glyphs);
+	if (replacement)
+	{
+	  buffer->unsafe_to_break (last_zero_before_mark, MIN (buffer->idx + 1, buffer->len));
+	  info[mark].codepoint = *replacement;
+	  ret = true;
+	}
+      }
+      if (entry->data.currentIndex != 0xFFFF)
+      {
+	const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex];
+	hb_glyph_info_t *info = buffer->info;
+	const GlyphID *replacement = lookup.get_value (info[buffer->idx].codepoint, driver->num_glyphs);
+	if (replacement)
+	{
+	  buffer->unsafe_to_break (driver->last_zero, MIN (buffer->idx + 1, buffer->len));
+	  info[buffer->idx].codepoint = *replacement;
+	  ret = true;
+	}
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    unsigned int mark;
+    unsigned int last_zero_before_mark;
+    const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32> &subs;
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this);
+
+    StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    unsigned int num_entries;
+    if (unlikely (!machine.sanitize (c, &num_entries))) return false;
+
+    unsigned int num_lookups = 0;
+
+    const Entry<EntryData> *entries = machine.get_entries ();
+    for (unsigned int i = 0; i < num_entries; i++)
+    {
+      const EntryData &data = entries[i].data;
+
+      num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex);
+      num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex);
+    }
+
+    return_trace (substitutionTables.sanitize (c, this, num_lookups));
+  }
+
+  protected:
+  StateTable<EntryData>	machine;
+  OffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32>, HBUINT32>
+			substitutionTables;
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct LigatureSubtable
+{
+  struct EntryData
+  {
+    HBUINT16	ligActionIndex;	/* Index to the first ligActionTable entry
+				 * for processing this group, if indicated
+				 * by the flags. */
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  struct driver_context_t
+  {
+    static const bool in_place = false;
+    enum Flags {
+      SetComponent	= 0x8000,	/* Push this glyph onto the component stack for
+					 * eventual processing. */
+      DontAdvance	= 0x4000,	/* Leave the glyph pointer at this glyph for the
+					   next iteration. */
+      PerformAction	= 0x2000,	/* Use the ligActionIndex to process a ligature
+					 * group. */
+      Reserved		= 0x1FFF,	/* These bits are reserved and should be set to 0. */
+    };
+    enum LigActionFlags {
+      LigActionLast	= 0x80000000,	/* This is the last action in the list. This also
+					 * implies storage. */
+      LigActionStore	= 0x40000000,	/* Store the ligature at the current cumulated index
+					 * in the ligature table in place of the marked
+					 * (i.e. currently-popped) glyph. */
+      LigActionOffset	= 0x3FFFFFFF,	/* A 30-bit value which is sign-extended to 32-bits
+					 * and added to the glyph ID, resulting in an index
+					 * into the component table. */
+    };
+
+    inline driver_context_t (const LigatureSubtable *table,
+			     hb_aat_apply_context_t *c_) :
+	ret (false),
+	c (c_),
+	ligAction (table+table->ligAction),
+	component (table+table->component),
+	ligature (table+table->ligature),
+	match_length (0) {}
+
+    inline bool transition (StateTableDriver<EntryData> *driver,
+			    const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry->flags;
+
+      if (flags & SetComponent)
+      {
+        if (unlikely (match_length >= ARRAY_LENGTH (match_positions)))
+	  return false;
+
+	/* Never mark same index twice, in case DontAdvance was used... */
+	if (match_length && match_positions[match_length - 1] == buffer->out_len)
+	  match_length--;
+
+	match_positions[match_length++] = buffer->out_len;
+      }
+
+      if (flags & PerformAction)
+      {
+	unsigned int end = buffer->out_len;
+	unsigned int action_idx = entry->data.ligActionIndex;
+	unsigned int action;
+	unsigned int ligature_idx = 0;
+        do
+	{
+	  if (unlikely (!match_length))
+	    return false;
+
+	  buffer->move_to (match_positions[--match_length]);
+
+	  const HBUINT32 &actionData = ligAction[action_idx];
+	  if (unlikely (!actionData.sanitize (&c->sanitizer))) return false;
+	  action = actionData;
+
+	  uint32_t uoffset = action & LigActionOffset;
+	  if (uoffset & 0x20000000)
+	    uoffset += 0xC0000000;
+	  int32_t offset = (int32_t) uoffset;
+	  unsigned int component_idx = buffer->cur().codepoint + offset;
+
+	  const HBUINT16 &componentData = component[component_idx];
+	  if (unlikely (!componentData.sanitize (&c->sanitizer))) return false;
+	  ligature_idx += componentData;
+
+	  if (action & (LigActionStore | LigActionLast))
+	  {
+	    const GlyphID &ligatureData = ligature[ligature_idx];
+	    if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false;
+	    hb_codepoint_t lig = ligatureData;
+
+	    match_positions[match_length++] = buffer->out_len;
+	    buffer->replace_glyph (lig);
+
+	    //ligature_idx = 0; // XXX Yes or no?
+	  }
+	  else
+	  {
+	    buffer->skip_glyph ();
+	    end--;
+	  }
+	  /* TODO merge_clusters / unsafe_to_break */
+
+	  action_idx++;
+	}
+	while (!(action & LigActionLast));
+	buffer->move_to (end);
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    hb_aat_apply_context_t *c;
+    const UnsizedArrayOf<HBUINT32> &ligAction;
+    const UnsizedArrayOf<HBUINT16> &component;
+    const UnsizedArrayOf<GlyphID> &ligature;
+    unsigned int match_length;
+    unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return c->check_struct (this) && machine.sanitize (c) &&
+	   ligAction && component && ligature;
+    return_trace (true);
+  }
+
+  protected:
+  StateTable<EntryData>	machine;
+  OffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT32>
+		ligAction;	/* Offset to the ligature action table. */
+  OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32>
+		component;	/* Offset to the component table. */
+  OffsetTo<UnsizedArrayOf<GlyphID>, HBUINT32>
+		ligature;	/* Offset to the actual ligature lists. */
+  public:
+  DEFINE_SIZE_STATIC (28);
+};
+
+struct NoncontextualSubtable
+{
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    bool ret = false;
+    unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+    hb_glyph_info_t *info = c->buffer->info;
+    unsigned int count = c->buffer->len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
+      if (replacement)
+      {
+	info[i].codepoint = *replacement;
+	ret = true;
+      }
+    }
+
+    return_trace (ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (substitute.sanitize (c));
+  }
+
+  protected:
+  Lookup<GlyphID>	substitute;
+  public:
+  DEFINE_SIZE_MIN (2);
+};
+
+struct InsertionSubtable
+{
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    /* TODO */
+    return_trace (false);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* TODO */
+    return_trace (true);
+  }
+};
+
+
+struct Feature
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	featureType;	/* The type of feature. */
+  HBUINT16	featureSetting;	/* The feature's setting (aka selector). */
+  HBUINT32	enableFlags;	/* Flags for the settings that this feature
+				 * and setting enables. */
+  HBUINT32	disableFlags;	/* Complement of flags for the settings that this
+				 * feature and setting disable. */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+
+struct ChainSubtable
+{
+  friend struct Chain;
+
+  inline unsigned int get_size (void) const { return length; }
+  inline unsigned int get_type (void) const { return coverage & 0xFF; }
+
+  enum Type {
+    Rearrangement	= 0,
+    Contextual		= 1,
+    Ligature		= 2,
+    Noncontextual	= 4,
+    Insertion		= 5
+  };
+
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    dispatch (c);
+  }
+
+  template <typename context_t>
+  inline typename context_t::return_t dispatch (context_t *c) 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));
+    default:			return_trace (c->default_return_value ());
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+	length < min_size ||
+	!c->check_range (this, length))
+      return_trace (false);
+
+    return_trace (dispatch (c));
+  }
+
+  protected:
+  HBUINT32	length;		/* Total subtable length, including this header. */
+  HBUINT32	coverage;	/* Coverage flags and subtable type. */
+  HBUINT32	subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
+  union {
+  RearrangementSubtable		rearrangement;
+  ContextualSubtable		contextual;
+  LigatureSubtable		ligature;
+  NoncontextualSubtable		noncontextual;
+  InsertionSubtable		insertion;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+struct Chain
+{
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount);
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      subtable->apply (c);
+      subtable = &StructAfter<ChainSubtable> (*subtable);
+    }
+  }
+
+  inline unsigned int get_size (void) const { return length; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int major) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+	length < min_size ||
+	!c->check_range (this, length))
+      return_trace (false);
+
+    if (!c->check_array (featureZ, featureZ[0].static_size, featureCount))
+      return_trace (false);
+
+    const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount);
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!subtable->sanitize (c))
+	return_trace (false);
+      subtable = &StructAfter<ChainSubtable> (*subtable);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32	defaultFlags;	/* The default specification for subtables. */
+  HBUINT32	length;		/* Total byte count, including this header. */
+  HBUINT32	featureCount;	/* Number of feature subtable entries. */
+  HBUINT32	subtableCount;	/* The number of subtables in the chain. */
+
+  Feature	featureZ[VAR];	/* Features. */
+  ChainSubtable	subtableX[VAR];	/* Subtables. */
+  // subtableGlyphCoverageArray if major == 3
+
+  public:
+  DEFINE_SIZE_MIN (16);
+};
+
+
+/*
+ * The 'mort'/'morx' Tables
+ */
+
+struct morx
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_MORX;
+
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    const Chain *chain = chains;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      chain->apply (c);
+      chain = &StructAfter<Chain> (*chain);
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!version.sanitize (c) ||
+	(version.major >> (sizeof (HBUINT32) == 4 ? 1 : 0)) != 1 ||
+	!chainCount.sanitize (c))
+      return_trace (false);
+
+    const Chain *chain = chains;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!chain->sanitize (c, version.major))
+	return_trace (false);
+      chain = &StructAfter<Chain> (*chain);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  FixedVersion<>version;	/* Version number of the glyph metamorphosis table.
+				 * 1 for mort, 2 or 3 for morx. */
+  HBUINT32	chainCount;	/* Number of metamorphosis chains contained in this
+				 * table. */
+  Chain		chains[VAR];	/* Chains. */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_MORX_TABLE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2017  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_AAT_LAYOUT_PRIVATE_HH
+#define HB_AAT_LAYOUT_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-font-private.hh"
+#include "hb-buffer-private.hh"
+#include "hb-open-type-private.hh"
+
+
+HB_INTERNAL void
+hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer);
+
+#endif /* HB_AAT_LAYOUT_PRIVATE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,78 @@
+/*
+ * Copyright © 2017  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
+ */
+
+#include "hb-open-type-private.hh"
+
+#include "hb-ot-layout-private.hh"
+#include "hb-ot-layout-gsubgpos-private.hh"
+
+#include "hb-aat-layout-private.hh"
+#include "hb-aat-layout-morx-table.hh"
+
+/*
+ * mort/morx
+ */
+
+static inline const AAT::morx&
+_get_morx (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::morx);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  /* XXX this doesn't call set_num_glyphs on sanitizer. */
+  const AAT::morx& morx = *(layout->morx.get ());
+  if (blob)
+    *blob = layout->morx.blob;
+  return morx;
+}
+
+static inline void
+_hb_aat_layout_create (hb_face_t *face)
+{
+  OT::Sanitizer<AAT::morx> sanitizer;
+  sanitizer.set_num_glyphs (face->get_num_glyphs ());
+  hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX));
+  OT::Sanitizer<AAT::morx>::lock_instance (morx_blob);
+
+  if (0)
+  {
+    OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
+  }
+}
+
+void
+hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer)
+{
+  hb_blob_t *blob;
+  const AAT::morx& morx = _get_morx (font->face, &blob);
+
+  AAT::hb_aat_apply_context_t c (font, buffer, blob);
+  morx.apply (&c);
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -70,6 +70,29 @@
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)	(InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O))
 
 
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+typedef int hb_atomic_int_impl_t;
+#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
+#define hb_atomic_int_impl_add(AI, V)		__sync_fetch_and_add (&(AI), (V))
+
+#define hb_atomic_ptr_impl_get(P)		(void *) (__sync_synchronize (), *(P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	__sync_bool_compare_and_swap ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
+
+#include <atomic.h>
+#include <mbarrier.h>
+
+typedef unsigned int hb_atomic_int_impl_t;
+#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
+#define hb_atomic_int_impl_add(AI, V)		( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V))
+
+#define hb_atomic_ptr_impl_get(P)		( ({__machine_rw_barrier ();}), (void *) *(P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)	( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false)
+
+
 #elif !defined(HB_NO_MT) && defined(__APPLE__)
 
 #include <libkern/OSAtomic.h>
@@ -96,29 +119,6 @@
 #endif
 
 
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-typedef int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V)		__sync_fetch_and_add (&(AI), (V))
-
-#define hb_atomic_ptr_impl_get(P)		(void *) (__sync_synchronize (), *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	__sync_bool_compare_and_swap ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
-
-#include <atomic.h>
-#include <mbarrier.h>
-
-typedef unsigned int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V)		( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V))
-
-#define hb_atomic_ptr_impl_get(P)		( ({__machine_rw_barrier ();}), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false)
-
-
 #elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__)
 
 #include <builtins.h>

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -26,7 +26,7 @@
 
 /* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */
 #ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199309L
+#define _POSIX_C_SOURCE 200809L
 #endif
 
 #include "hb-private.hh"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2018-01-31 01:11:59 UTC (rev 46498)
@@ -44,7 +44,7 @@
  *   any such possibility, MODE_DUPLICATE should be used
  *   such that HarfBuzz makes a copy immediately,
  *
- * - Use MODE_READONLY otherse, unless you really really
+ * - Use MODE_READONLY otherwise, unless you really really
  *   really know what you are doing,
  *
  * - MODE_WRITABLE is appropriate if you really made a

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -69,6 +69,7 @@
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK		= 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT		= 0x00000008u,
   HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK		= 0x00000010u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CGJ			= 0x00000020u,
 
   /* Reserved for complex shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_COMPLEX0			= 0x01000000u,
@@ -306,37 +307,37 @@
   HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
 
   static inline void
-  set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0)
+  set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
   {
-    if (info.cluster != cluster)
+    if (inf.cluster != cluster)
     {
       if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
-	info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+	inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       else
-	info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+	inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
     }
-    info.cluster = cluster;
+    inf.cluster = cluster;
   }
 
   inline int
-  _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *info,
+  _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
 				     unsigned int start, unsigned int end,
 				     unsigned int cluster) const
   {
     for (unsigned int i = start; i < end; i++)
-      cluster = MIN<unsigned int> (cluster, info[i].cluster);
+      cluster = MIN<unsigned int> (cluster, infos[i].cluster);
     return cluster;
   }
   inline void
-  _unsafe_to_break_set_mask (hb_glyph_info_t *info,
+  _unsafe_to_break_set_mask (hb_glyph_info_t *infos,
 			     unsigned int start, unsigned int end,
 			     unsigned int cluster)
   {
     for (unsigned int i = start; i < end; i++)
-      if (cluster != info[i].cluster)
+      if (cluster != infos[i].cluster)
       {
 	scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
-	info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+	infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       }
   }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -109,6 +109,7 @@
 			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
@@ -146,9 +147,10 @@
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
-			     pos[i].x_offset, pos[i].y_offset));
-      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
-			     pos[i].x_advance, pos[i].y_advance));
+			     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",
+			       pos[i].x_advance, pos[i].y_advance));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
@@ -179,6 +181,12 @@
       *buf = '\0';
     } else
       return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
   }
 
   return end - start;
@@ -199,6 +207,7 @@
 			     nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
@@ -223,13 +232,16 @@
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
-      if (pos[i].x_offset || pos[i].y_offset)
-	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset));
+      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++ = '+';
-      p += 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));
+      if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+      {
+	*p++ = '+';
+	p += 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));
+      }
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
@@ -255,6 +267,12 @@
       *buf = '\0';
     } else
       return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
   }
 
   return end - start;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-01-31 01:11:59 UTC (rev 46498)
@@ -247,13 +247,21 @@
  *                      of the text without the full context.
  * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
  *                      paragraph can be applied to this buffer, similar to
- *                      @HB_BUFFER_FLAG_EOT.
+ *                      @HB_BUFFER_FLAG_BOT.
  * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
  *                      flag indication that character with Default_Ignorable
  *                      Unicode property should use the corresponding glyph
- *                      from the font, instead of hiding them (currently done
- *                      by replacing them with the space glyph and zeroing the
- *                      advance width.)
+ *                      from the font, instead of hiding them (done by
+ *                      replacing them with the space glyph and zeroing the
+ *                      advance width.)  This flag takes precedence over
+ *                      @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
+ * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
+ *                      flag indication that character with Default_Ignorable
+ *                      Unicode property should be removed from glyph string
+ *                      instead of hiding them (done by replacing them with the
+ *                      space glyph and zeroing the advance width.)
+ *                      @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
+ *                      precedence over this flag. Since: 1.8.0
  *
  * Since: 0.9.20
  */
@@ -261,7 +269,8 @@
   HB_BUFFER_FLAG_DEFAULT			= 0x00000000u,
   HB_BUFFER_FLAG_BOT				= 0x00000001u, /* Beginning-of-text */
   HB_BUFFER_FLAG_EOT				= 0x00000002u, /* End-of-text */
-  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES	= 0x00000004u
+  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES	= 0x00000004u,
+  HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES	= 0x00000008u
 } hb_buffer_flags_t;
 
 HB_EXTERN void
@@ -412,6 +421,9 @@
  * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
  * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
  * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
+ *  glyph offsets will reflect absolute glyph positions. Since: 1.8.0
  *
  * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
  *
@@ -423,7 +435,8 @@
   HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS		= 0x00000002u,
   HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES	= 0x00000004u,
   HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS	= 0x00000008u,
-  HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS		= 0x00000010u
+  HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS		= 0x00000010u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES		= 0x00000020u
 } hb_buffer_serialize_flags_t;
 
 /**

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -524,6 +524,7 @@
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
     /* Unicode-8.0 additions */
+    case HB_SCRIPT_HATRAN:
     case HB_SCRIPT_OLD_HUNGARIAN:
 
     /* Unicode-9.0 additions */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -164,7 +164,7 @@
   if (unlikely (!blob))
     blob = hb_blob_get_empty ();
 
-  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (hb_blob_reference (blob)), index);
+  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (hb_blob_reference (blob)), index);
 
   if (unlikely (!closure))
     return hb_face_get_empty ();
@@ -424,7 +424,7 @@
 void
 hb_face_t::load_upem (void) const
 {
-  hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (reference_table (HB_OT_TAG_head));
+  hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (reference_table (HB_OT_TAG_head));
   const OT::head *head_table = OT::Sanitizer<OT::head>::lock_instance (head_blob);
   upem = head_table->get_upem ();
   hb_blob_destroy (head_blob);
@@ -468,7 +468,7 @@
 void
 hb_face_t::load_num_glyphs (void) const
 {
-  hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>::sanitize (reference_table (HB_OT_TAG_maxp));
+  hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (reference_table (HB_OT_TAG_maxp));
   const OT::maxp *maxp_table = OT::Sanitizer<OT::maxp>::lock_instance (maxp_blob);
   num_glyphs = maxp_table->get_num_glyphs ();
   hb_blob_destroy (maxp_blob);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -128,6 +128,8 @@
   inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
   inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
   inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
+  inline float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); }
+  inline float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); }
   inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
   { return em_scale (v, dir_scale (direction)); }
 
@@ -541,8 +543,12 @@
   }
   inline hb_position_t em_scalef (float v, int scale)
   {
-    return (hb_position_t) (v * scale / face->get_upem ());
+    return (hb_position_t) round (v * scale / face->get_upem ());
   }
+  inline float em_fscale (int16_t v, int scale)
+  {
+    return (float) v * scale / face->get_upem ();
+  }
 };
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h	2018-01-31 01:11:59 UTC (rev 46498)
@@ -456,7 +456,7 @@
 /* high-level funcs, with fallback */
 
 /* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
- * otherwise callse hb_font_get_variation_glyph(). */
+ * otherwise calls hb_font_get_variation_glyph(). */
 HB_EXTERN hb_bool_t
 hb_font_get_glyph (hb_font_t *font,
 		   hb_codepoint_t unicode, hb_codepoint_t variation_selector,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -635,15 +635,27 @@
     {
       if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
       {
+	bool nonzero = false;
+
 	for (unsigned int i = 0; i < mm_var->num_axis; ++i)
+	 {
 	  coords[i] = ft_coords[i] >>= 2;
+	  nonzero = nonzero || coords[i];
+	 }
 
-	hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+	if (nonzero)
+	  hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+	else
+	  hb_font_set_var_coords_normalized (font, nullptr, 0);
       }
     }
     free (coords);
     free (ft_coords);
+#ifdef HAVE_FT_DONE_MM_VAR
+    FT_Done_MM_Var (ft_face->glyph->library, mm_var);
+#else
     free (mm_var);
+#endif
   }
 #endif
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -64,9 +64,9 @@
 
   Tag		tag;		/* 4-byte identifier. */
   CheckSum	checkSum;	/* CheckSum for this table. */
-  UINT32		offset;		/* Offset from beginning of TrueType font
+  HBUINT32		offset;		/* Offset from beginning of TrueType font
 				 * file. */
-  UINT32		length;		/* Length of this table. */
+  HBUINT32		length;		/* Length of this table. */
   public:
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
@@ -154,7 +154,7 @@
   Tag		ttcTag;		/* TrueType Collection ID string: 'ttcf' */
   FixedVersion<>version;	/* Version of the TTC Header (1.0),
 				 * 0x00010000u */
-  ArrayOf<LOffsetTo<OffsetTable>, UINT32>
+  ArrayOf<LOffsetTo<OffsetTable>, HBUINT32>
 		table;		/* Array of offsets to the OffsetTable for each font
 				 * from the beginning of the file */
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -187,7 +187,8 @@
 	debug_depth (0),
 	start (nullptr), end (nullptr),
 	writable (false), edit_count (0),
-	blob (nullptr) {}
+	blob (nullptr),
+	num_glyphs (0) {}
 
   inline const char *get_name (void) { return "SANITIZE"; }
   template <typename T, typename F>
@@ -298,6 +299,7 @@
   bool writable;
   unsigned int edit_count;
   hb_blob_t *blob;
+  unsigned int num_glyphs;
 };
 
 
@@ -306,8 +308,9 @@
 template <typename Type>
 struct Sanitizer
 {
-  static hb_blob_t *sanitize (hb_blob_t *blob) {
-    hb_sanitize_context_t c[1];
+  inline Sanitizer (void) {}
+
+  inline hb_blob_t *sanitize (hb_blob_t *blob) {
     bool sane;
 
     /* TODO is_sane() stuff */
@@ -370,6 +373,11 @@
     const char *base = hb_blob_get_data (blob, nullptr);
     return unlikely (!base) ? &Null(Type) : CastP<Type> (base);
   }
+
+  inline void set_num_glyphs (unsigned int num_glyphs) { c->num_glyphs = num_glyphs; }
+
+  private:
+  hb_sanitize_context_t c[1];
 };
 
 
@@ -519,8 +527,6 @@
 };
 
 
-
-
 /*
  *
  * The OpenType Font File: Data Types
@@ -635,22 +641,22 @@
   DEFINE_SIZE_STATIC (Size);
 };
 
-typedef IntType<uint8_t,  1> UINT8;	/* 8-bit unsigned integer. */
-typedef IntType<int8_t,   1> INT8;	/* 8-bit signed integer. */
-typedef IntType<uint16_t, 2> UINT16;	/* 16-bit unsigned integer. */
-typedef IntType<int16_t,  2> INT16;	/* 16-bit signed integer. */
-typedef IntType<uint32_t, 4> UINT32;	/* 32-bit unsigned integer. */
-typedef IntType<int32_t,  4> INT32;	/* 32-bit signed integer. */
+typedef IntType<uint8_t,  1> HBUINT8;	/* 8-bit unsigned integer. */
+typedef IntType<int8_t,   1> HBINT8;	/* 8-bit signed integer. */
+typedef IntType<uint16_t, 2> HBUINT16;	/* 16-bit unsigned integer. */
+typedef IntType<int16_t,  2> HBINT16;	/* 16-bit signed integer. */
+typedef IntType<uint32_t, 4> HBUINT32;	/* 32-bit unsigned integer. */
+typedef IntType<int32_t,  4> HBINT32;	/* 32-bit signed integer. */
 typedef IntType<uint32_t, 3> UINT24;	/* 24-bit unsigned integer. */
 
-/* 16-bit signed integer (INT16) that describes a quantity in FUnits. */
-typedef INT16 FWORD;
+/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */
+typedef HBINT16 FWORD;
 
-/* 16-bit unsigned integer (UINT16) that describes a quantity in FUnits. */
-typedef UINT16 UFWORD;
+/* 16-bit unsigned integer (HBUINT16) that describes a quantity in FUnits. */
+typedef HBUINT16 UFWORD;
 
 /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
-struct F2DOT14 : INT16
+struct F2DOT14 : HBINT16
 {
   //inline float to_float (void) const { return ???; }
   //inline void set_float (float f) { v.set (f * ???); }
@@ -659,7 +665,7 @@
 };
 
 /* 32-bit signed fixed-point number (16.16). */
-struct Fixed: INT32
+struct Fixed: HBINT32
 {
   //inline float to_float (void) const { return ???; }
   //inline void set_float (float f) { v.set (f * ???); }
@@ -677,8 +683,8 @@
     return_trace (likely (c->check_struct (this)));
   }
   protected:
-  INT32 major;
-  UINT32 minor;
+  HBINT32 major;
+  HBUINT32 minor;
   public:
   DEFINE_SIZE_STATIC (8);
 };
@@ -685,7 +691,7 @@
 
 /* Array of four uint8s (length = 32 bits) used to identify a script, language
  * system, feature, or baseline */
-struct Tag : UINT32
+struct Tag : HBUINT32
 {
   /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
   inline operator const char* (void) const { return reinterpret_cast<const char *> (&this->v); }
@@ -696,10 +702,10 @@
 DEFINE_NULL_DATA (Tag, "    ");
 
 /* Glyph index number, same as uint16 (length = 16 bits) */
-typedef UINT16 GlyphID;
+typedef HBUINT16 GlyphID;
 
 /* Script/language-system/feature index */
-struct Index : UINT16 {
+struct Index : HBUINT16 {
   static const unsigned int NOT_FOUND_INDEX = 0xFFFFu;
 };
 DEFINE_NULL_DATA (Index, "\xff\xff");
@@ -713,18 +719,18 @@
   DEFINE_SIZE_STATIC (sizeof(Type));
 };
 
-typedef Offset<UINT16> Offset16;
-typedef Offset<UINT32> Offset32;
+typedef Offset<HBUINT16> Offset16;
+typedef Offset<HBUINT32> Offset32;
 
 
 /* CheckSum */
-struct CheckSum : UINT32
+struct CheckSum : HBUINT32
 {
   /* This is reference implementation from the spec. */
-  static inline uint32_t CalcTableChecksum (const UINT32 *Table, uint32_t Length)
+  static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length)
   {
     uint32_t Sum = 0L;
-    const UINT32 *EndPtr = Table+((Length+3) & ~3) / UINT32::static_size;
+    const HBUINT32 *EndPtr = Table+((Length+3) & ~3) / HBUINT32::static_size;
 
     while (Table < EndPtr)
       Sum += *Table++;
@@ -733,7 +739,7 @@
 
   /* Note: data should be 4byte aligned and have 4byte padding at the end. */
   inline void set_for_data (const void *data, unsigned int length)
-  { set (CalcTableChecksum ((const UINT32 *) data, length)); }
+  { set (CalcTableChecksum ((const HBUINT32 *) data, length)); }
 
   public:
   DEFINE_SIZE_STATIC (4);
@@ -744,7 +750,7 @@
  * Version Numbers
  */
 
-template <typename FixedType=UINT16>
+template <typename FixedType=HBUINT16>
 struct FixedVersion
 {
   inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
@@ -768,7 +774,7 @@
  * Use: (base+offset)
  */
 
-template <typename Type, typename OffsetType=UINT16>
+template <typename Type, typename OffsetType=HBUINT16>
 struct OffsetTo : Offset<OffsetType>
 {
   inline const Type& operator () (const void *base) const
@@ -813,7 +819,7 @@
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
 };
-template <typename Type> struct LOffsetTo : OffsetTo<Type, UINT32> {};
+template <typename Type> struct LOffsetTo : OffsetTo<Type, HBUINT32> {};
 template <typename Base, typename OffsetType, typename Type>
 static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
 template <typename Base, typename OffsetType, typename Type>
@@ -825,7 +831,7 @@
  */
 
 /* An array with a number of elements. */
-template <typename Type, typename LenType=UINT16>
+template <typename Type, typename LenType=HBUINT16>
 struct ArrayOf
 {
   const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
@@ -935,10 +941,10 @@
   public:
   DEFINE_SIZE_ARRAY (sizeof (LenType), array);
 };
-template <typename Type> struct LArrayOf : ArrayOf<Type, UINT32> {};
+template <typename Type> struct LArrayOf : ArrayOf<Type, HBUINT32> {};
 
 /* Array of Offset's */
-template <typename Type, typename OffsetType=UINT16>
+template <typename Type, typename OffsetType=HBUINT16>
 struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
 
 /* Array of offsets relative to the beginning of the array itself. */
@@ -966,7 +972,7 @@
 
 
 /* An array starting at second element. */
-template <typename Type, typename LenType=UINT16>
+template <typename Type, typename LenType=HBUINT16>
 struct HeadlessArrayOf
 {
   inline const Type& operator [] (unsigned int i) const
@@ -1028,7 +1034,7 @@
 /*
  * An array with sorted elements.  Supports binary searching.
  */
-template <typename Type, typename LenType=UINT16>
+template <typename Type, typename LenType=HBUINT16>
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
   template <typename SearchType>
@@ -1035,12 +1041,12 @@
   inline int bsearch (const SearchType &x) const
   {
     /* Hand-coded bsearch here since this is in the hot inner loop. */
-    const Type *array = this->array;
+    const Type *arr = this->array;
     int min = 0, max = (int) this->len - 1;
     while (min <= max)
     {
       int mid = (min + max) / 2;
-      int c = array[mid].cmp (x);
+      int c = arr[mid].cmp (x);
       if (c < 0)
         max = mid - 1;
       else if (c > 0)
@@ -1067,10 +1073,10 @@
   }
 
   protected:
-  UINT16	len;
-  UINT16	searchRangeZ;
-  UINT16	entrySelectorZ;
-  UINT16	rangeShiftZ;
+  HBUINT16	len;
+  HBUINT16	searchRangeZ;
+  HBUINT16	entrySelectorZ;
+  HBUINT16	rangeShiftZ;
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -1139,8 +1145,8 @@
   inline void init (hb_face_t *face_)
   {
     face = face_;
+    blob = nullptr;
     instance = nullptr;
-    blob = nullptr;
   }
 
   inline void fini (void)
@@ -1154,7 +1160,7 @@
     T *p = (T *) hb_atomic_ptr_get (&instance);
     if (unlikely (!p))
     {
-      hb_blob_t *blob_ = OT::Sanitizer<T>::sanitize (face->reference_table (T::tableTag));
+      hb_blob_t *blob_ = OT::Sanitizer<T>().sanitize (face->reference_table (T::tableTag));
       p = const_cast<T *>(OT::Sanitizer<T>::lock_instance (blob_));
       if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p))
       {
@@ -1171,10 +1177,10 @@
     return get();
   }
 
-  private:
   hb_face_t *face;
-  T *instance;
   mutable hb_blob_t *blob;
+  private:
+  mutable T *instance;
 };
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -47,11 +47,11 @@
     extents->height = -height;
   }
 
-  UINT8 height;
-  UINT8 width;
-  INT8 bearingX;
-  INT8 bearingY;
-  UINT8 advance;
+  HBUINT8 height;
+  HBUINT8 width;
+  HBINT8 bearingX;
+  HBINT8 bearingY;
+  HBUINT8 advance;
 
   DEFINE_SIZE_STATIC(5);
 };
@@ -58,9 +58,9 @@
 
 struct BigGlyphMetrics : SmallGlyphMetrics
 {
-  INT8 vertBearingX;
-  INT8 vertBearingY;
-  UINT8 vertAdvance;
+  HBINT8 vertBearingX;
+  HBINT8 vertBearingY;
+  HBUINT8 vertAdvance;
 
   DEFINE_SIZE_STATIC(8);
 };
@@ -73,18 +73,18 @@
     return_trace (c->check_struct (this));
   }
 
-  INT8 ascender;
-  INT8 decender;
-  UINT8 widthMax;
-  INT8 caretSlopeNumerator;
-  INT8 caretSlopeDenominator;
-  INT8 caretOffset;
-  INT8 minOriginSB;
-  INT8 minAdvanceSB;
-  INT8 maxBeforeBL;
-  INT8 minAfterBL;
-  INT8 padding1;
-  INT8 padding2;
+  HBINT8 ascender;
+  HBINT8 decender;
+  HBUINT8 widthMax;
+  HBINT8 caretSlopeNumerator;
+  HBINT8 caretSlopeDenominator;
+  HBINT8 caretOffset;
+  HBINT8 minOriginSB;
+  HBINT8 minAdvanceSB;
+  HBINT8 maxBeforeBL;
+  HBINT8 minAfterBL;
+  HBINT8 padding1;
+  HBINT8 padding2;
 
   DEFINE_SIZE_STATIC(12);
 };
@@ -102,9 +102,9 @@
     return_trace (c->check_struct (this));
   }
 
-  UINT16 indexFormat;
-  UINT16 imageFormat;
-  UINT32 imageDataOffset;
+  HBUINT16 indexFormat;
+  HBUINT16 imageFormat;
+  HBUINT32 imageDataOffset;
 
   DEFINE_SIZE_STATIC(8);
 };
@@ -137,8 +137,8 @@
   DEFINE_SIZE_ARRAY(8, offsetArrayZ);
 };
 
-struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<UINT32> {};
-struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<UINT16> {};
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
 
 struct IndexSubtable
 {
@@ -214,8 +214,8 @@
 						   offset, length, format);
   }
 
-  UINT16 firstGlyphIndex;
-  UINT16 lastGlyphIndex;
+  HBUINT16 firstGlyphIndex;
+  HBUINT16 lastGlyphIndex;
   LOffsetTo<IndexSubtable> offsetToSubtable;
 
   DEFINE_SIZE_STATIC(8);
@@ -276,17 +276,17 @@
 
   protected:
   LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
-  UINT32 indexTablesSize;
-  UINT32 numberOfIndexSubtables;
-  UINT32 colorRef;
+  HBUINT32 indexTablesSize;
+  HBUINT32 numberOfIndexSubtables;
+  HBUINT32 colorRef;
   SBitLineMetrics horizontal;
   SBitLineMetrics vertical;
-  UINT16 startGlyphIndex;
-  UINT16 endGlyphIndex;
-  UINT8 ppemX;
-  UINT8 ppemY;
-  UINT8 bitDepth;
-  INT8 flags;
+  HBUINT16 startGlyphIndex;
+  HBUINT16 endGlyphIndex;
+  HBUINT8 ppemX;
+  HBUINT8 ppemY;
+  HBUINT8 bitDepth;
+  HBINT8 flags;
 
   public:
   DEFINE_SIZE_STATIC(48);
@@ -300,8 +300,8 @@
 struct GlyphBitmapDataFormat17
 {
   SmallGlyphMetrics glyphMetrics;
-  UINT32 dataLen;
-  UINT8 dataZ[VAR];
+  HBUINT32 dataLen;
+  HBUINT8 dataZ[VAR];
 
   DEFINE_SIZE_ARRAY(9, dataZ);
 };
@@ -379,8 +379,8 @@
     {
       upem = face->get_upem();
 
-      cblc_blob = Sanitizer<CBLC>::sanitize (face->reference_table (HB_OT_TAG_CBLC));
-      cbdt_blob = Sanitizer<CBDT>::sanitize (face->reference_table (HB_OT_TAG_CBDT));
+      cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC));
+      cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT));
       cbdt_len = hb_blob_get_length (cbdt_blob);
 
       if (hb_blob_get_length (cblc_blob) == 0) {
@@ -460,7 +460,7 @@
 
   protected:
   FixedVersion<>version;
-  UINT8 dataZ[VAR];
+  HBUINT8 dataZ[VAR];
 
   public:
   DEFINE_SIZE_ARRAY(4, dataZ);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -58,10 +58,10 @@
   }
 
   protected:
-  UINT16	format;		/* Format number is set to 0. */
-  UINT16	lengthZ;	/* Byte length of this subtable. */
-  UINT16	languageZ;	/* Ignore. */
-  UINT8		glyphIdArray[256];/* An array that maps character
+  HBUINT16	format;		/* Format number is set to 0. */
+  HBUINT16	lengthZ;	/* Byte length of this subtable. */
+  HBUINT16	languageZ;	/* Ignore. */
+  HBUINT8		glyphIdArray[256];/* An array that maps character
 				 * code to glyph index values. */
   public:
   DEFINE_SIZE_STATIC (6 + 256);
@@ -88,8 +88,8 @@
 
       /* Custom two-array bsearch. */
       int min = 0, max = (int) thiz->segCount - 1;
-      const UINT16 *startCount = thiz->startCount;
-      const UINT16 *endCount = thiz->endCount;
+      const HBUINT16 *startCount = thiz->startCount;
+      const HBUINT16 *endCount = thiz->endCount;
       unsigned int i;
       while (min <= max)
       {
@@ -127,11 +127,11 @@
       return true;
     }
 
-    const UINT16 *endCount;
-    const UINT16 *startCount;
-    const UINT16 *idDelta;
-    const UINT16 *idRangeOffset;
-    const UINT16 *glyphIdArray;
+    const HBUINT16 *endCount;
+    const HBUINT16 *startCount;
+    const HBUINT16 *idDelta;
+    const HBUINT16 *idRangeOffset;
+    const HBUINT16 *glyphIdArray;
     unsigned int segCount;
     unsigned int glyphIdArrayLength;
   };
@@ -165,24 +165,24 @@
   }
 
   protected:
-  UINT16	format;		/* Format number is set to 4. */
-  UINT16	length;		/* This is the length in bytes of the
+  HBUINT16	format;		/* Format number is set to 4. */
+  HBUINT16	length;		/* This is the length in bytes of the
 				 * subtable. */
-  UINT16	languageZ;	/* Ignore. */
-  UINT16	segCountX2;	/* 2 x segCount. */
-  UINT16	searchRangeZ;	/* 2 * (2**floor(log2(segCount))) */
-  UINT16	entrySelectorZ;	/* log2(searchRange/2) */
-  UINT16	rangeShiftZ;	/* 2 x segCount - searchRange */
+  HBUINT16	languageZ;	/* Ignore. */
+  HBUINT16	segCountX2;	/* 2 x segCount. */
+  HBUINT16	searchRangeZ;	/* 2 * (2**floor(log2(segCount))) */
+  HBUINT16	entrySelectorZ;	/* log2(searchRange/2) */
+  HBUINT16	rangeShiftZ;	/* 2 x segCount - searchRange */
 
-  UINT16	values[VAR];
+  HBUINT16	values[VAR];
 #if 0
-  UINT16	endCount[segCount];	/* End characterCode for each segment,
+  HBUINT16	endCount[segCount];	/* End characterCode for each segment,
 					 * last=0xFFFFu. */
-  UINT16	reservedPad;		/* Set to 0. */
-  UINT16	startCount[segCount];	/* Start character code for each segment. */
-  INT16		idDelta[segCount];	/* Delta for all character codes in segment. */
-  UINT16	idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
-  UINT16	glyphIdArray[VAR];	/* Glyph index array (arbitrary length) */
+  HBUINT16	reservedPad;		/* Set to 0. */
+  HBUINT16	startCount[segCount];	/* Start character code for each segment. */
+  HBINT16		idDelta[segCount];	/* Delta for all character codes in segment. */
+  HBUINT16	idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
+  HBUINT16	glyphIdArray[VAR];	/* Glyph index array (arbitrary length) */
 #endif
 
   public:
@@ -208,9 +208,9 @@
   }
 
   private:
-  UINT32		startCharCode;	/* First character code in this group. */
-  UINT32		endCharCode;	/* Last character code in this group. */
-  UINT32		glyphID;	/* Glyph index; interpretation depends on
+  HBUINT32		startCharCode;	/* First character code in this group. */
+  HBUINT32		endCharCode;	/* Last character code in this group. */
+  HBUINT32		glyphID;	/* Glyph index; interpretation depends on
 				 * subtable format. */
   public:
   DEFINE_SIZE_STATIC (12);
@@ -247,8 +247,8 @@
   DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray);
 };
 
-struct CmapSubtableFormat6  : CmapSubtableTrimmed<UINT16> {};
-struct CmapSubtableFormat10 : CmapSubtableTrimmed<UINT32 > {};
+struct CmapSubtableFormat6  : CmapSubtableTrimmed<HBUINT16> {};
+struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {};
 
 template <typename T>
 struct CmapSubtableLongSegmented
@@ -269,11 +269,11 @@
   }
 
   protected:
-  UINT16	format;		/* Subtable format; set to 12. */
-  UINT16	reservedZ;	/* Reserved; set to 0. */
-  UINT32		lengthZ;	/* Byte length of this subtable. */
-  UINT32		languageZ;	/* Ignore. */
-  SortedArrayOf<CmapSubtableLongGroup, UINT32>
+  HBUINT16	format;		/* Subtable format; set to 12. */
+  HBUINT16	reservedZ;	/* Reserved; set to 0. */
+  HBUINT32		lengthZ;	/* Byte length of this subtable. */
+  HBUINT32		languageZ;	/* Ignore. */
+  SortedArrayOf<CmapSubtableLongGroup, HBUINT32>
 		groups;		/* Groupings. */
   public:
   DEFINE_SIZE_ARRAY (16, groups);
@@ -316,13 +316,13 @@
   }
 
   UINT24	startUnicodeValue;	/* First value in this range. */
-  UINT8		additionalCount;	/* Number of additional values in this
+  HBUINT8		additionalCount;	/* Number of additional values in this
 					 * range. */
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
-typedef SortedArrayOf<UnicodeValueRange, UINT32> DefaultUVS;
+typedef SortedArrayOf<UnicodeValueRange, HBUINT32> DefaultUVS;
 
 struct UVSMapping
 {
@@ -343,7 +343,7 @@
   DEFINE_SIZE_STATIC (5);
 };
 
-typedef SortedArrayOf<UVSMapping, UINT32> NonDefaultUVS;
+typedef SortedArrayOf<UVSMapping, HBUINT32> NonDefaultUVS;
 
 struct VariationSelectorRecord
 {
@@ -405,9 +405,9 @@
   }
 
   protected:
-  UINT16	format;		/* Format number is set to 14. */
-  UINT32		lengthZ;	/* Byte length of this subtable. */
-  SortedArrayOf<VariationSelectorRecord, UINT32>
+  HBUINT16	format;		/* Format number is set to 14. */
+  HBUINT32		lengthZ;	/* Byte length of this subtable. */
+  SortedArrayOf<VariationSelectorRecord, HBUINT32>
 		record;		/* Variation selector records; sorted
 				 * in increasing order of `varSelector'. */
   public:
@@ -451,7 +451,7 @@
 
   public:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   CmapSubtableFormat0	format0;
   CmapSubtableFormat4	format4;
   CmapSubtableFormat6	format6;
@@ -484,8 +484,8 @@
 		  subtable.sanitize (c, base));
   }
 
-  UINT16	platformID;	/* Platform ID. */
-  UINT16	encodingID;	/* Platform-specific encoding ID. */
+  HBUINT16	platformID;	/* Platform ID. */
+  HBUINT16	encodingID;	/* Platform-specific encoding ID. */
   LOffsetTo<CmapSubtable>
 		subtable;	/* Byte offset from beginning of table to the subtable for this encoding. */
   public:
@@ -508,7 +508,7 @@
   {
     inline void init (hb_face_t *face)
     {
-      this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
+      this->blob = OT::Sanitizer<OT::cmap>().sanitize (face->reference_table (HB_OT_TAG_cmap));
       const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
       const OT::CmapSubtable *subtable = nullptr;
       const OT::CmapSubtableFormat14 *subtable_uvs = nullptr;
@@ -654,7 +654,7 @@
   }
 
   protected:
-  UINT16		version;	/* Table version number (0). */
+  HBUINT16		version;	/* Table version number (0). */
   SortedArrayOf<EncodingRecord>
 			encodingRecord;	/* Encoding tables. */
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -54,7 +54,7 @@
   }
 
   protected:
-  UINT8		dataX[VAR];		/* Location data. */
+  HBUINT8		dataX[VAR];		/* Location data. */
   DEFINE_SIZE_ARRAY (0, dataX);
 };
 
@@ -80,7 +80,7 @@
 
   struct GlyphHeader
   {
-    INT16		numberOfContours;	/* If the number of contours is
+    HBINT16		numberOfContours;	/* If the number of contours is
 					   * greater than or equal to zero,
 					   * this is a simple glyph; if negative,
 					   * this is a composite glyph. */
@@ -96,7 +96,7 @@
   {
     inline void init (hb_face_t *face)
     {
-      hb_blob_t *head_blob = Sanitizer<head>::sanitize (face->reference_table (HB_OT_TAG_head));
+      hb_blob_t *head_blob = Sanitizer<head>().sanitize (face->reference_table (HB_OT_TAG_head));
       const head *head_table = Sanitizer<head>::lock_instance (head_blob);
       if ((unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0)
       {
@@ -107,9 +107,9 @@
       short_offset = 0 == head_table->indexToLocFormat;
       hb_blob_destroy (head_blob);
 
-      loca_blob = Sanitizer<loca>::sanitize (face->reference_table (HB_OT_TAG_loca));
+      loca_blob = Sanitizer<loca>().sanitize (face->reference_table (HB_OT_TAG_loca));
       loca_table = Sanitizer<loca>::lock_instance (loca_blob);
-      glyf_blob = Sanitizer<glyf>::sanitize (face->reference_table (HB_OT_TAG_glyf));
+      glyf_blob = Sanitizer<glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf));
       glyf_table = Sanitizer<glyf>::lock_instance (glyf_blob);
 
       num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1;
@@ -131,13 +131,13 @@
       unsigned int start_offset, end_offset;
       if (short_offset)
       {
-        const UINT16 *offsets = (const UINT16 *) loca_table->dataX;
+        const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataX;
 	start_offset = 2 * offsets[glyph];
 	end_offset   = 2 * offsets[glyph + 1];
       }
       else
       {
-        const UINT32 *offsets = (const UINT32 *) loca_table->dataX;
+        const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataX;
 	start_offset = offsets[glyph];
 	end_offset   = offsets[glyph + 1];
       }
@@ -169,7 +169,7 @@
   };
 
   protected:
-  UINT8		dataX[VAR];		/* Glyphs data. */
+  HBUINT8		dataX[VAR];		/* Glyphs data. */
 
   DEFINE_SIZE_ARRAY (0, dataX);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -64,11 +64,11 @@
   FixedVersion<>version;		/* Version of the head table--currently
 					 * 0x00010000u for version 1.0. */
   FixedVersion<>fontRevision;		/* Set by font manufacturer. */
-  UINT32		checkSumAdjustment;	/* To compute: set it to 0, sum the
-					 * entire font as UINT32, then store
+  HBUINT32	checkSumAdjustment;	/* To compute: set it to 0, sum the
+					 * entire font as HBUINT32, then store
 					 * 0xB1B0AFBAu - sum. */
-  UINT32		magicNumber;		/* Set to 0x5F0F3CF5u. */
-  UINT16	flags;			/* Bit 0: Baseline for font at y=0;
+  HBUINT32	magicNumber;		/* Set to 0x5F0F3CF5u. */
+  HBUINT16	flags;			/* Bit 0: Baseline for font at y=0;
 					 * Bit 1: Left sidebearing point at x=0;
 					 * Bit 2: Instructions may depend on point size;
 					 * Bit 3: Force ppem to integer values for all
@@ -76,7 +76,6 @@
 					 *   ppem sizes if this bit is clear;
 					 * Bit 4: Instructions may alter advance width
 					 *   (the advance widths might not scale linearly);
-
 					 * Bits 5-10: These should be set according to
 					 *   Apple's specification. However, they are not
 					 *   implemented in OpenType.
@@ -96,7 +95,6 @@
 					 *   contains any strong right-to-left glyphs.
 					 * Bit 10: This bit should be set if the font
 					 *   contains Indic-style rearrangement effects.
-
 					 * Bit 11: Font data is 'lossless,' as a result
 					 *   of having been compressed and decompressed
 					 *   with the Agfa MicroType Express engine.
@@ -114,7 +112,7 @@
 					 * encoded in the cmap subtables represent proper
 					 * support for those code points.
 					 * Bit 15: Reserved, set to 0. */
-  UINT16	unitsPerEm;		/* Valid range is from 16 to 16384. This value
+  HBUINT16	unitsPerEm;		/* Valid range is from 16 to 16384. This value
 					 * should be a power of 2 for fonts that have
 					 * TrueType outlines. */
   LONGDATETIME	created;		/* Number of seconds since 12:00 midnight,
@@ -121,11 +119,11 @@
 					   January 1, 1904. 64-bit integer */
   LONGDATETIME	modified;		/* Number of seconds since 12:00 midnight,
 					   January 1, 1904. 64-bit integer */
-  INT16		xMin;			/* For all glyph bounding boxes. */
-  INT16		yMin;			/* For all glyph bounding boxes. */
-  INT16		xMax;			/* For all glyph bounding boxes. */
-  INT16		yMax;			/* For all glyph bounding boxes. */
-  UINT16	macStyle;		/* Bit 0: Bold (if set to 1);
+  HBINT16	xMin;			/* For all glyph bounding boxes. */
+  HBINT16	yMin;			/* For all glyph bounding boxes. */
+  HBINT16	xMax;			/* For all glyph bounding boxes. */
+  HBINT16	yMax;			/* For all glyph bounding boxes. */
+  HBUINT16	macStyle;		/* Bit 0: Bold (if set to 1);
 					 * Bit 1: Italic (if set to 1)
 					 * Bit 2: Underline (if set to 1)
 					 * Bit 3: Outline (if set to 1)
@@ -133,8 +131,8 @@
 					 * Bit 5: Condensed (if set to 1)
 					 * Bit 6: Extended (if set to 1)
 					 * Bits 7-15: Reserved (set to 0). */
-  UINT16	lowestRecPPEM;		/* Smallest readable size in pixels. */
-  INT16		fontDirectionHint;	/* Deprecated (Set to 2).
+  HBUINT16	lowestRecPPEM;		/* Smallest readable size in pixels. */
+  HBINT16	fontDirectionHint;	/* Deprecated (Set to 2).
 					 * 0: Fully mixed directional glyphs;
 					 * 1: Only strongly left to right;
 					 * 2: Like 1 but also contains neutrals;
@@ -141,8 +139,8 @@
 					 * -1: Only strongly right to left;
 					 * -2: Like -1 but also contains neutrals. */
   public:
-  INT16		indexToLocFormat;	/* 0 for short offsets, 1 for long. */
-  INT16		glyphDataFormat;	/* 0 for current format. */
+  HBINT16	indexToLocFormat;	/* 0 for short offsets, 1 for long. */
+  HBINT16	glyphDataFormat;	/* 0 for current format. */
 
   DEFINE_SIZE_STATIC (54);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -64,21 +64,21 @@
 					 * (xMax - xMin)) for horizontal. */
   FWORD		maxExtent;		/* horizontal: Max(lsb + (xMax - xMin)),
 					 * vertical: minLeadingBearing+(yMax-yMin). */
-  INT16		caretSlopeRise;		/* Used to calculate the slope of the
+  HBINT16		caretSlopeRise;		/* Used to calculate the slope of the
 					 * cursor (rise/run); 1 for vertical caret,
 					 * 0 for horizontal.*/
-  INT16		caretSlopeRun;		/* 0 for vertical caret, 1 for horizontal. */
-  INT16		caretOffset;		/* The amount by which a slanted
+  HBINT16		caretSlopeRun;		/* 0 for vertical caret, 1 for horizontal. */
+  HBINT16		caretOffset;		/* The amount by which a slanted
 					 * highlight on a glyph needs
 					 * to be shifted to produce the
 					 * best appearance. Set to 0 for
 					 * non-slanted fonts. */
-  INT16		reserved1;		/* Set to 0. */
-  INT16		reserved2;		/* Set to 0. */
-  INT16		reserved3;		/* Set to 0. */
-  INT16		reserved4;		/* Set to 0. */
-  INT16		metricDataFormat;	/* 0 for current format. */
-  UINT16	numberOfLongMetrics;	/* Number of LongMetric entries in metric
+  HBINT16		reserved1;		/* Set to 0. */
+  HBINT16		reserved2;		/* Set to 0. */
+  HBINT16		reserved3;		/* Set to 0. */
+  HBINT16		reserved4;		/* Set to 0. */
+  HBINT16		metricDataFormat;	/* 0 for current format. */
+  HBUINT16	numberOfLongMetrics;	/* Number of LongMetric entries in metric
 					 * table. */
   public:
   DEFINE_SIZE_STATIC (36);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -74,7 +74,7 @@
       bool got_font_extents = false;
       if (T::os2Tag)
       {
-	hb_blob_t *os2_blob = Sanitizer<os2>::sanitize (face->reference_table (T::os2Tag));
+	hb_blob_t *os2_blob = Sanitizer<os2>().sanitize (face->reference_table (T::os2Tag));
 	const os2 *os2_table = Sanitizer<os2>::lock_instance (os2_blob);
 #define USE_TYPO_METRICS (1u<<7)
 	if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
@@ -87,7 +87,7 @@
 	hb_blob_destroy (os2_blob);
       }
 
-      hb_blob_t *_hea_blob = Sanitizer<_hea>::sanitize (face->reference_table (T::headerTag));
+      hb_blob_t *_hea_blob = Sanitizer<_hea>().sanitize (face->reference_table (T::headerTag));
       const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob);
       num_advances = _hea_table->numberOfLongMetrics;
       if (!got_font_extents)
@@ -101,7 +101,7 @@
 
       has_font_extents = got_font_extents;
 
-      blob = Sanitizer<hmtxvmtx>::sanitize (face->reference_table (T::tableTag));
+      blob = Sanitizer<hmtxvmtx>().sanitize (face->reference_table (T::tableTag));
 
       /* Cap num_metrics() and num_advances() based on table length. */
       unsigned int len = hb_blob_get_length (blob);
@@ -119,7 +119,7 @@
       }
       table = Sanitizer<hmtxvmtx>::lock_instance (blob);
 
-      var_blob = Sanitizer<HVARVVAR>::sanitize (face->reference_table (T::variationsTag));
+      var_blob = Sanitizer<HVARVVAR>().sanitize (face->reference_table (T::variationsTag));
       var_table = Sanitizer<HVARVVAR>::lock_instance (var_blob);
     }
 
@@ -144,7 +144,7 @@
       }
 
       return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance
-	   + var_table->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
+	   + (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?!
     }
 
     public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -104,8 +104,8 @@
   }
 
   protected:
-  UINT16		firstGlyph;	/* First glyph in class range. */
-  ArrayOf<UINT16>	classes;	/* Glyph classes. */
+  HBUINT16		firstGlyph;	/* First glyph in class range. */
+  ArrayOf<HBUINT16>	classes;	/* Glyph classes. */
   public:
   DEFINE_SIZE_ARRAY (4, classes);
 };
@@ -115,7 +115,7 @@
   inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
   {
     unsigned int l = (this+leftClassTable).get_class (left);
-    unsigned int r = (this+leftClassTable).get_class (left);
+    unsigned int r = (this+rightClassTable).get_class (right);
     unsigned int offset = l * rowWidth + r * sizeof (FWORD);
     const FWORD *arr = &(this+array);
     if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
@@ -136,7 +136,7 @@
   }
 
   protected:
-  UINT16	rowWidth;	/* The width, in bytes, of a row in the table. */
+  HBUINT16	rowWidth;	/* The width, in bytes, of a row in the table. */
   OffsetTo<KernClassTable>
 		leftClassTable;	/* Offset from beginning of this subtable to
 				 * left-hand class table. */
@@ -275,10 +275,10 @@
     };
 
     protected:
-    UINT16	versionZ;	/* Unused. */
-    UINT16	length;		/* Length of the subtable (including this header). */
-    UINT8	format;		/* Subtable format. */
-    UINT8	coverage;	/* Coverage bits. */
+    HBUINT16	versionZ;	/* Unused. */
+    HBUINT16	length;		/* Length of the subtable (including this header). */
+    HBUINT8	format;		/* Subtable format. */
+    HBUINT8	coverage;	/* Coverage bits. */
     KernSubTable subtable;	/* Subtable data. */
     public:
     DEFINE_SIZE_MIN (6);
@@ -285,9 +285,9 @@
   };
 
   protected:
-  UINT16	version;	/* Version--0x0000u */
-  UINT16	nTables;	/* Number of subtables in the kerning table. */
-  UINT8		data[VAR];
+  HBUINT16	version;	/* Version--0x0000u */
+  HBUINT16	nTables;	/* Number of subtables in the kerning table. */
+  HBUINT8		data[VAR];
   public:
   DEFINE_SIZE_ARRAY (4, data);
 };
@@ -314,10 +314,10 @@
     };
 
     protected:
-    UINT32	length;		/* Length of the subtable (including this header). */
-    UINT8	coverage;	/* Coverage bits. */
-    UINT8	format;		/* Subtable format. */
-    UINT16	tupleIndex;	/* The tuple index (used for variations fonts).
+    HBUINT32	length;		/* Length of the subtable (including this header). */
+    HBUINT8	coverage;	/* Coverage bits. */
+    HBUINT8	format;		/* Subtable format. */
+    HBUINT16	tupleIndex;	/* The tuple index (used for variations fonts).
 				 * This value specifies which tuple this subtable covers. */
     KernSubTable subtable;	/* Subtable data. */
     public:
@@ -325,9 +325,9 @@
   };
 
   protected:
-  UINT32		version;	/* Version--0x00010000u */
-  UINT32		nTables;	/* Number of subtables in the kerning table. */
-  UINT8		data[VAR];
+  HBUINT32		version;	/* Version--0x00010000u */
+  HBUINT32		nTables;	/* Number of subtables in the kerning table. */
+  HBUINT8		data[VAR];
   public:
   DEFINE_SIZE_ARRAY (8, data);
 };
@@ -360,7 +360,7 @@
   {
     inline void init (hb_face_t *face)
     {
-      blob = Sanitizer<kern>::sanitize (face->reference_table (HB_OT_TAG_kern));
+      blob = Sanitizer<kern>().sanitize (face->reference_table (HB_OT_TAG_kern));
       table = Sanitizer<kern>::lock_instance (blob);
       table_length = hb_blob_get_length (blob);
     }
@@ -380,7 +380,7 @@
 
   protected:
   union {
-  UINT16		major;
+  HBUINT16		major;
   KernOT		ot;
   KernAAT		aat;
   } u;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -161,7 +161,7 @@
 
   GlyphID	start;		/* First GlyphID in the range */
   GlyphID	end;		/* Last GlyphID in the range */
-  UINT16	value;		/* Value */
+  HBUINT16	value;		/* Value */
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -175,7 +175,7 @@
 				   unsigned int *_indexes /* OUT */) const
   {
     if (_count) {
-      const UINT16 *arr = this->sub_array (start_offset, _count);
+      const HBUINT16 *arr = this->sub_array (start_offset, _count);
       unsigned int count = *_count;
       for (unsigned int i = 0; i < count; i++)
 	_indexes[i] = arr[i];
@@ -218,7 +218,7 @@
 
   Offset16	lookupOrderZ;	/* = Null (reserved for an offset to a
 				 * reordering table) */
-  UINT16	reqFeatureIndex;/* Index of a feature required for this
+  HBUINT16	reqFeatureIndex;/* Index of a feature required for this
 				 * language system--if no required features
 				 * = 0xFFFFu */
   IndexArray	featureIndex;	/* Array of indices into the FeatureList */
@@ -343,12 +343,12 @@
       return_trace (true);
   }
 
-  UINT16	designSize;	/* Represents the design size in 720/inch
+  HBUINT16	designSize;	/* Represents the design size in 720/inch
 				 * units (decipoints).  The design size entry
 				 * must be non-zero.  When there is a design
 				 * size but no recommended size range, the
 				 * rest of the array will consist of zeros. */
-  UINT16	subfamilyID;	/* Has no independent meaning, but serves
+  HBUINT16	subfamilyID;	/* Has no independent meaning, but serves
 				 * as an identifier that associates fonts
 				 * in a subfamily. All fonts which share a
 				 * Preferred or Font Family name and which
@@ -358,7 +358,7 @@
 				 * same subfamily value. If this value is
 				 * zero, the remaining fields in the array
 				 * will be ignored. */
-  UINT16	subfamilyNameID;/* If the preceding value is non-zero, this
+  HBUINT16	subfamilyNameID;/* If the preceding value is non-zero, this
 				 * value must be set in the range 256 - 32767
 				 * (inclusive). It records the value of a
 				 * field in the name table, which must
@@ -372,10 +372,10 @@
 				 * subfamily in a menu.  Applications will
 				 * choose the appropriate version based on
 				 * their selection criteria. */
-  UINT16	rangeStart;	/* Large end of the recommended usage range
+  HBUINT16	rangeStart;	/* Large end of the recommended usage range
 				 * (inclusive), stored in 720/inch units
 				 * (decipoints). */
-  UINT16	rangeEnd;	/* Small end of the recommended usage range
+  HBUINT16	rangeEnd;	/* Small end of the recommended usage range
 				   (exclusive), stored in 720/inch units
 				 * (decipoints). */
   public:
@@ -393,12 +393,12 @@
     return_trace (c->check_struct (this));
   }
 
-  UINT16	version;	/* (set to 0): This corresponds to a “minor”
+  HBUINT16	version;	/* (set to 0): This corresponds to a “minor”
 				 * version number. Additional data may be
 				 * added to the end of this Feature Parameters
 				 * table in the future. */
 
-  UINT16	uiNameID;	/* The 'name' table name ID that specifies a
+  HBUINT16	uiNameID;	/* The 'name' table name ID that specifies a
 				 * string (or strings, for multiple languages)
 				 * for a user-interface label for this
 				 * feature.  The values of uiLabelNameId and
@@ -426,25 +426,25 @@
 		  characters.sanitize (c));
   }
 
-  UINT16	format;			/* Format number is set to 0. */
-  UINT16	featUILableNameID;	/* The ‘name’ table name ID that
+  HBUINT16	format;			/* Format number is set to 0. */
+  HBUINT16	featUILableNameID;	/* The ‘name’ table name ID that
 					 * specifies a string (or strings,
 					 * for multiple languages) for a
 					 * user-interface label for this
 					 * feature. (May be nullptr.) */
-  UINT16	featUITooltipTextNameID;/* The ‘name’ table name ID that
+  HBUINT16	featUITooltipTextNameID;/* The ‘name’ table name ID that
 					 * specifies a string (or strings,
 					 * for multiple languages) that an
 					 * application can use for tooltip
 					 * text for this feature. (May be
 					 * nullptr.) */
-  UINT16	sampleTextNameID;	/* The ‘name’ table name ID that
+  HBUINT16	sampleTextNameID;	/* The ‘name’ table name ID that
 					 * specifies sample text that
 					 * illustrates the effect of this
 					 * feature. (May be nullptr.) */
-  UINT16	numNamedParameters;	/* Number of named parameters. (May
+  HBUINT16	numNamedParameters;	/* Number of named parameters. (May
 					 * be zero.) */
-  UINT16	firstParamUILabelNameID;/* The first ‘name’ table name ID
+  HBUINT16	firstParamUILabelNameID;/* The first ‘name’ table name ID
 					 * used to specify strings for
 					 * user-interface labels for the
 					 * feature parameters. (Must be zero
@@ -562,7 +562,7 @@
 typedef RecordListOf<Feature> FeatureList;
 
 
-struct LookupFlag : UINT16
+struct LookupFlag : HBUINT16
 {
   enum Flags {
     RightToLeft		= 0x0001u,
@@ -608,7 +608,7 @@
     unsigned int flag = lookupFlag;
     if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
     {
-      const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       flag += (markFilteringSet << 16);
     }
     return flag;
@@ -640,7 +640,7 @@
     if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
+      HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       markFilteringSet.set (lookup_props >> 16);
     }
     return_trace (true);
@@ -653,7 +653,7 @@
     if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       if (!markFilteringSet.sanitize (c)) return_trace (false);
     }
     return_trace (true);
@@ -660,11 +660,11 @@
   }
 
   private:
-  UINT16	lookupType;		/* Different enumerations for GSUB and GPOS */
-  UINT16	lookupFlag;		/* Lookup qualifiers */
+  HBUINT16	lookupType;		/* Different enumerations for GSUB and GPOS */
+  HBUINT16	lookupFlag;		/* Lookup qualifiers */
   ArrayOf<Offset16>
 		subTable;		/* Array of SubTables */
-  UINT16	markFilteringSetX[VAR];	/* Index (base 0) into GDEF mark glyph sets
+  HBUINT16	markFilteringSetX[VAR];	/* Index (base 0) into GDEF mark glyph sets
 					 * structure. This field is only present if bit
 					 * UseMarkFilteringSet of lookup flags is set. */
   public:
@@ -735,7 +735,7 @@
   private:
 
   protected:
-  UINT16	coverageFormat;	/* Format identifier--format = 1 */
+  HBUINT16	coverageFormat;	/* Format identifier--format = 1 */
   SortedArrayOf<GlyphID>
 		glyphArray;	/* Array of GlyphIDs--in numerical order */
   public:
@@ -860,7 +860,7 @@
   private:
 
   protected:
-  UINT16	coverageFormat;	/* Format identifier--format = 2 */
+  HBUINT16	coverageFormat;	/* Format identifier--format = 2 */
   SortedArrayOf<RangeRecord>
 		rangeRecord;	/* Array of glyph ranges--ordered by
 				 * Start GlyphID. rangeCount entries
@@ -874,8 +874,8 @@
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
-    case 1: return u.format1.get_coverage(glyph_id);
-    case 2: return u.format2.get_coverage(glyph_id);
+    case 1: return u.format1.get_coverage (glyph_id);
+    case 2: return u.format2.get_coverage (glyph_id);
     default:return NOT_COVERED;
     }
   }
@@ -987,7 +987,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   CoverageFormat1	format1;
   CoverageFormat2	format2;
   } u;
@@ -1074,9 +1074,9 @@
   }
 
   protected:
-  UINT16	classFormat;		/* Format identifier--format = 1 */
+  HBUINT16	classFormat;		/* Format identifier--format = 1 */
   GlyphID	startGlyph;		/* First GlyphID of the classValueArray */
-  ArrayOf<UINT16>
+  ArrayOf<HBUINT16>
 		classValue;		/* Array of Class Values--one per GlyphID */
   public:
   DEFINE_SIZE_ARRAY (6, classValue);
@@ -1148,7 +1148,7 @@
   }
 
   protected:
-  UINT16	classFormat;	/* Format identifier--format = 2 */
+  HBUINT16	classFormat;	/* Format identifier--format = 2 */
   SortedArrayOf<RangeRecord>
 		rangeRecord;	/* Array of glyph ranges--ordered by
 				 * Start GlyphID */
@@ -1161,8 +1161,8 @@
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
-    case 1: return u.format1.get_class(glyph_id);
-    case 2: return u.format2.get_class(glyph_id);
+    case 1: return u.format1.get_class (glyph_id);
+    case 2: return u.format2.get_class (glyph_id);
     default:return 0;
     }
   }
@@ -1210,7 +1210,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   ClassDefFormat1	format1;
   ClassDefFormat2	format2;
   } u;
@@ -1275,10 +1275,11 @@
     const VarRegionAxis *axes = axesZ + (region_index * axisCount);
 
     float v = 1.;
-    unsigned int count = MIN (coord_len, (unsigned int) axisCount);
+    unsigned int count = axisCount;
     for (unsigned int i = 0; i < count; i++)
     {
-      float factor = axes[i].evaluate (coords[i]);
+      int coord = i < coord_len ? coords[i] : 0;
+      float factor = axes[i].evaluate (coord);
       if (factor == 0.)
         return 0.;
       v *= factor;
@@ -1295,8 +1296,8 @@
   }
 
   protected:
-  UINT16	axisCount;
-  UINT16	regionCount;
+  HBUINT16	axisCount;
+  HBUINT16	regionCount;
   VarRegionAxis	axesZ[VAR];
   public:
   DEFINE_SIZE_ARRAY (4, axesZ);
@@ -1320,19 +1321,19 @@
    unsigned int count = regionIndices.len;
    unsigned int scount = shortCount;
 
-   const UINT8 *bytes = &StructAfter<UINT8> (regionIndices);
-   const UINT8 *row = bytes + inner * (scount + count);
+   const HBUINT8 *bytes = &StructAfter<HBUINT8> (regionIndices);
+   const HBUINT8 *row = bytes + inner * (scount + count);
 
    float delta = 0.;
    unsigned int i = 0;
 
-   const INT16 *scursor = reinterpret_cast<const INT16 *> (row);
+   const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (row);
    for (; i < scount; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
      delta += scalar * *scursor++;
    }
-   const INT8 *bcursor = reinterpret_cast<const INT8 *> (scursor);
+   const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
    for (; i < count; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
@@ -1348,15 +1349,15 @@
     return_trace (c->check_struct (this) &&
 		  regionIndices.sanitize(c) &&
 		  shortCount <= regionIndices.len &&
-		  c->check_array (&StructAfter<UINT8> (regionIndices),
+		  c->check_array (&StructAfter<HBUINT8> (regionIndices),
 				  get_row_size (), itemCount));
   }
 
   protected:
-  UINT16		itemCount;
-  UINT16		shortCount;
-  ArrayOf<UINT16>	regionIndices;
-  UINT8			bytesX[VAR];
+  HBUINT16		itemCount;
+  HBUINT16		shortCount;
+  ArrayOf<HBUINT16>	regionIndices;
+  HBUINT8			bytesX[VAR];
   public:
   DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
 };
@@ -1392,9 +1393,9 @@
   }
 
   protected:
-  UINT16				format;
+  HBUINT16				format;
   LOffsetTo<VarRegionList>		regions;
-  OffsetArrayOf<VarData, UINT32>		dataSets;
+  OffsetArrayOf<VarData, HBUINT32>	dataSets;
   public:
   DEFINE_SIZE_ARRAY (8, dataSets);
 };
@@ -1421,8 +1422,8 @@
   }
 
   protected:
-  UINT16	format;		/* Format identifier--format = 1 */
-  UINT16	axisIndex;
+  HBUINT16	format;		/* Format identifier--format = 1 */
+  HBUINT16	axisIndex;
   F2DOT14	filterRangeMinValue;
   F2DOT14	filterRangeMaxValue;
   public:
@@ -1451,7 +1452,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   ConditionFormat1	format1;
   } u;
   public:
@@ -1476,7 +1477,7 @@
   }
 
   protected:
-  OffsetArrayOf<Condition, UINT32> conditions;
+  OffsetArrayOf<Condition, HBUINT32> conditions;
   public:
   DEFINE_SIZE_ARRAY (2, conditions);
 };
@@ -1492,7 +1493,7 @@
   }
 
   protected:
-  UINT16		featureIndex;
+  HBUINT16		featureIndex;
   LOffsetTo<Feature>	feature;
   public:
   DEFINE_SIZE_STATIC (6);
@@ -1612,8 +1613,8 @@
   inline unsigned int get_size (void) const
   {
     unsigned int f = deltaFormat;
-    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * UINT16::static_size;
-    return UINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
+    return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1658,14 +1659,14 @@
   }
 
   protected:
-  UINT16	startSize;		/* Smallest size to correct--in ppem */
-  UINT16	endSize;		/* Largest size to correct--in ppem */
-  UINT16	deltaFormat;		/* Format of DeltaValue array data: 1, 2, or 3
+  HBUINT16	startSize;		/* Smallest size to correct--in ppem */
+  HBUINT16	endSize;		/* Largest size to correct--in ppem */
+  HBUINT16	deltaFormat;		/* Format of DeltaValue array data: 1, 2, or 3
 					 * 1	Signed 2-bit value, 8 values per uint16
 					 * 2	Signed 4-bit value, 4 values per uint16
 					 * 3	Signed 8-bit value, 2 values per uint16
 					 */
-  UINT16	deltaValue[VAR];	/* Array of compressed data */
+  HBUINT16	deltaValue[VAR];	/* Array of compressed data */
   public:
   DEFINE_SIZE_ARRAY (6, deltaValue);
 };
@@ -1696,9 +1697,9 @@
   }
 
   protected:
-  UINT16	outerIndex;
-  UINT16	innerIndex;
-  UINT16	deltaFormat;	/* Format identifier for this table: 0x0x8000 */
+  HBUINT16	outerIndex;
+  HBUINT16	innerIndex;
+  HBUINT16	deltaFormat;	/* Format identifier for this table: 0x0x8000 */
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -1706,10 +1707,10 @@
 struct DeviceHeader
 {
   protected:
-  UINT16		reserved1;
-  UINT16		reserved2;
+  HBUINT16		reserved1;
+  HBUINT16		reserved2;
   public:
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   public:
   DEFINE_SIZE_STATIC (6);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -41,7 +41,7 @@
  * Attachment List Table
  */
 
-typedef ArrayOf<UINT16> AttachPoint;	/* Array of contour point indices--in
+typedef ArrayOf<HBUINT16> AttachPoint;	/* Array of contour point indices--in
 					 * increasing numerical order */
 
 struct AttachList
@@ -62,7 +62,7 @@
     const AttachPoint &points = this+attachPoint[index];
 
     if (point_count) {
-      const UINT16 *array = points.sub_array (start_offset, point_count);
+      const HBUINT16 *array = points.sub_array (start_offset, point_count);
       unsigned int count = *point_count;
       for (unsigned int i = 0; i < count; i++)
 	point_array[i] = array[i];
@@ -109,8 +109,8 @@
   }
 
   protected:
-  UINT16	caretValueFormat;	/* Format identifier--format = 1 */
-  INT16		coordinate;		/* X or Y value, in design units */
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 1 */
+  HBINT16		coordinate;		/* X or Y value, in design units */
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -136,8 +136,8 @@
   }
 
   protected:
-  UINT16	caretValueFormat;	/* Format identifier--format = 2 */
-  UINT16	caretValuePoint;	/* Contour point index on glyph */
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 2 */
+  HBUINT16	caretValuePoint;	/* Contour point index on glyph */
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -160,8 +160,8 @@
   }
 
   protected:
-  UINT16	caretValueFormat;	/* Format identifier--format = 3 */
-  INT16		coordinate;		/* X or Y value, in design units */
+  HBUINT16	caretValueFormat;	/* Format identifier--format = 3 */
+  HBINT16		coordinate;		/* X or Y value, in design units */
   OffsetTo<Device>
 		deviceTable;		/* Offset to Device table for X or Y
 					 * value--from beginning of CaretValue
@@ -199,7 +199,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   CaretValueFormat1	format1;
   CaretValueFormat2	format2;
   CaretValueFormat3	format3;
@@ -294,7 +294,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   ArrayOf<LOffsetTo<Coverage> >
 		coverage;		/* Array of long offsets to mark set
 					 * coverage tables */
@@ -324,7 +324,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   MarkGlyphSetsFormat1	format1;
   } u;
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -51,11 +51,11 @@
 
 /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
 
-typedef UINT16 Value;
+typedef HBUINT16 Value;
 
 typedef Value ValueRecord[VAR];
 
-struct ValueFormat : UINT16
+struct ValueFormat : HBUINT16
 {
   enum Flags {
     xPlacement	= 0x0001u,	/* Includes horizontal adjustment for placement */
@@ -74,14 +74,14 @@
 
 /* All fields are options.  Only those available advance the value pointer. */
 #if 0
-  INT16		xPlacement;		/* Horizontal adjustment for
+  HBINT16		xPlacement;		/* Horizontal adjustment for
 					 * placement--in design units */
-  INT16		yPlacement;		/* Vertical adjustment for
+  HBINT16		yPlacement;		/* Vertical adjustment for
 					 * placement--in design units */
-  INT16		xAdvance;		/* Horizontal adjustment for
+  HBINT16		xAdvance;		/* Horizontal adjustment for
 					 * advance--in design units (only used
 					 * for horizontal writing) */
-  INT16		yAdvance;		/* Vertical adjustment for advance--in
+  HBINT16		yAdvance;		/* Vertical adjustment for advance--in
 					 * design units (only used for vertical
 					 * writing) */
   Offset	xPlaDevice;		/* Offset to Device table for
@@ -103,7 +103,7 @@
   inline unsigned int get_size (void) const
   { return get_len () * Value::static_size; }
 
-  void apply_value (hb_apply_context_t   *c,
+  void apply_value (hb_ot_apply_context_t   *c,
 		    const void           *base,
 		    const Value          *values,
 		    hb_glyph_position_t  &glyph_pos) const
@@ -178,8 +178,8 @@
   static inline const OffsetTo<Device>& get_device (const Value* value)
   { return *CastP<OffsetTo<Device> > (value); }
 
-  static inline const INT16& get_short (const Value* value)
-  { return *CastP<INT16> (value); }
+  static inline const HBINT16& get_short (const Value* value)
+  { return *CastP<HBINT16> (value); }
 
   public:
 
@@ -232,12 +232,12 @@
 
 struct AnchorFormat1
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
-			  hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+			  float *x, float *y) const
   {
     hb_font_t *font = c->font;
-    *x = font->em_scale_x (xCoordinate);
-    *y = font->em_scale_y (yCoordinate);
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -247,9 +247,9 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
-  INT16		xCoordinate;		/* Horizontal value--in design units */
-  INT16		yCoordinate;		/* Vertical value--in design units */
+  HBUINT16	format;			/* Format identifier--format = 1 */
+  HBINT16		xCoordinate;		/* Horizontal value--in design units */
+  HBINT16		yCoordinate;		/* Vertical value--in design units */
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -256,8 +256,8 @@
 
 struct AnchorFormat2
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
-			  hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+			  float *x, float *y) const
   {
     hb_font_t *font = c->font;
     unsigned int x_ppem = font->x_ppem;
@@ -267,8 +267,8 @@
 
     ret = (x_ppem || y_ppem) &&
 	   font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
-    *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate);
-    *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
+    *x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate);
+    *y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -278,10 +278,10 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
-  INT16		xCoordinate;		/* Horizontal value--in design units */
-  INT16		yCoordinate;		/* Vertical value--in design units */
-  UINT16	anchorPoint;		/* Index to glyph contour point */
+  HBUINT16	format;			/* Format identifier--format = 2 */
+  HBINT16		xCoordinate;		/* Horizontal value--in design units */
+  HBINT16		yCoordinate;		/* Vertical value--in design units */
+  HBUINT16	anchorPoint;		/* Index to glyph contour point */
   public:
   DEFINE_SIZE_STATIC (8);
 };
@@ -288,12 +288,12 @@
 
 struct AnchorFormat3
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
-			  hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+			  float *x, float *y) const
   {
     hb_font_t *font = c->font;
-    *x = font->em_scale_x (xCoordinate);
-    *y = font->em_scale_y (yCoordinate);
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
 
     if (font->x_ppem || font->num_coords)
       *x += (this+xDeviceTable).get_x_delta (font, c->var_store);
@@ -308,9 +308,9 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 3 */
-  INT16		xCoordinate;		/* Horizontal value--in design units */
-  INT16		yCoordinate;		/* Vertical value--in design units */
+  HBUINT16	format;			/* Format identifier--format = 3 */
+  HBINT16		xCoordinate;		/* Horizontal value--in design units */
+  HBINT16		yCoordinate;		/* Vertical value--in design units */
   OffsetTo<Device>
 		xDeviceTable;		/* Offset to Device table for X
 					 * coordinate-- from beginning of
@@ -325,8 +325,8 @@
 
 struct Anchor
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
-			  hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+			  float *x, float *y) const
   {
     *x = *y = 0;
     switch (u.format) {
@@ -333,7 +333,7 @@
     case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
     case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
     case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
-    default:						 return;
+    default:					      return;
     }
   }
 
@@ -351,7 +351,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   AnchorFormat1		format1;
   AnchorFormat2		format2;
   AnchorFormat3		format3;
@@ -382,7 +382,7 @@
     return_trace (true);
   }
 
-  UINT16	rows;			/* Number of rows */
+  HBUINT16	rows;			/* Number of rows */
   protected:
   OffsetTo<Anchor>
 		matrixZ[VAR];		/* Matrix of offsets to Anchor tables--
@@ -403,7 +403,7 @@
   }
 
   protected:
-  UINT16	klass;			/* Class defined for this mark */
+  HBUINT16	klass;			/* Class defined for this mark */
   OffsetTo<Anchor>
 		markAnchor;		/* Offset to Anchor table--from
 					 * beginning of MarkArray table */
@@ -413,7 +413,7 @@
 
 struct MarkArray : ArrayOf<MarkRecord>	/* Array of MarkRecords--in Coverage order */
 {
-  inline bool apply (hb_apply_context_t *c,
+  inline bool apply (hb_ot_apply_context_t *c,
 		     unsigned int mark_index, unsigned int glyph_index,
 		     const AnchorMatrix &anchors, unsigned int class_count,
 		     unsigned int glyph_pos) const
@@ -430,7 +430,7 @@
      * return false such that the subsequent subtables have a chance at it. */
     if (unlikely (!found)) return_trace (false);
 
-    hb_position_t mark_x, mark_y, base_x, base_y;
+    float mark_x, mark_y, base_x, base_y;
 
     buffer->unsafe_to_break (glyph_pos, buffer->idx);
     mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
@@ -437,8 +437,8 @@
     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 = base_x - mark_x;
-    o.y_offset = base_y - mark_y;
+    o.x_offset = round (base_x - mark_x);
+    o.y_offset = round (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;
@@ -470,7 +470,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -492,7 +492,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
@@ -518,7 +518,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -544,13 +544,13 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
+  HBUINT16	format;			/* Format identifier--format = 2 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
   ValueFormat	valueFormat;		/* Defines the types of data in the
 					 * ValueRecord */
-  UINT16	valueCount;		/* Number of ValueRecords */
+  HBUINT16	valueCount;		/* Number of ValueRecords */
   ValueRecord	values;			/* Array of ValueRecords--positioning
 					 * values applied to glyphs */
   public:
@@ -573,7 +573,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   SinglePosFormat1	format1;
   SinglePosFormat2	format2;
   } u;
@@ -604,13 +604,13 @@
     TRACE_COLLECT_GLYPHS (this);
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
-    unsigned int record_size = UINT16::static_size * (1 + len1 + len2);
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
 
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
     c->input->add_array (&record->secondGlyph, len, record_size);
   }
 
-  inline bool apply (hb_apply_context_t *c,
+  inline bool apply (hb_ot_apply_context_t *c,
 		     const ValueFormat *valueFormats,
 		     unsigned int pos) const
   {
@@ -618,7 +618,7 @@
     hb_buffer_t *buffer = c->buffer;
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
-    unsigned int record_size = UINT16::static_size * (1 + len1 + len2);
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
 
     const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ);
     unsigned int count = len;
@@ -663,7 +663,7 @@
   {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
-       && c->check_array (arrayZ, UINT16::static_size * closure->stride, len))) return_trace (false);
+       && c->check_array (arrayZ, HBUINT16::static_size * closure->stride, len))) return_trace (false);
 
     unsigned int count = len;
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
@@ -672,8 +672,8 @@
   }
 
   protected:
-  UINT16	len;			/* Number of PairValueRecords */
-  UINT16	arrayZ[VAR];		/* Array of PairValueRecords--ordered
+  HBUINT16	len;			/* Number of PairValueRecords */
+  HBUINT16	arrayZ[VAR];		/* Array of PairValueRecords--ordered
 					 * by GlyphID of the second glyph */
   public:
   DEFINE_SIZE_ARRAY (2, arrayZ);
@@ -695,7 +695,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -702,7 +702,7 @@
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -728,7 +728,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
@@ -759,7 +759,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -766,7 +766,7 @@
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -809,7 +809,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
+  HBUINT16	format;			/* Format identifier--format = 2 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
@@ -827,9 +827,9 @@
 		classDef2;		/* Offset to ClassDef table--from
 					 * beginning of PairPos subtable--for
 					 * the second glyph of the pair */
-  UINT16	class1Count;		/* Number of classes in ClassDef1
+  HBUINT16	class1Count;		/* Number of classes in ClassDef1
 					 * table--includes Class0 */
-  UINT16	class2Count;		/* Number of classes in ClassDef2
+  HBUINT16	class2Count;		/* Number of classes in ClassDef2
 					 * table--includes Class0 */
   ValueRecord	values;			/* Matrix of value pairs:
 					 * class1-major, class2-minor,
@@ -854,7 +854,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   PairPosFormat1	format1;
   PairPosFormat2	format2;
   } u;
@@ -900,7 +900,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -908,7 +908,7 @@
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -919,7 +919,7 @@
     unsigned int j = skippy_iter.idx;
 
     buffer->unsafe_to_break (i, j);
-    hb_position_t entry_x, entry_y, exit_x, exit_y;
+    float entry_x, entry_y, exit_x, exit_y;
     (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
     (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
 
@@ -929,32 +929,32 @@
     /* Main-direction adjustment */
     switch (c->direction) {
       case HB_DIRECTION_LTR:
-	pos[i].x_advance  =  exit_x + pos[i].x_offset;
+	pos[i].x_advance  = round (exit_x) + pos[i].x_offset;
 
-	d = entry_x + pos[j].x_offset;
+	d = round (entry_x) + pos[j].x_offset;
 	pos[j].x_advance -= d;
 	pos[j].x_offset  -= d;
 	break;
       case HB_DIRECTION_RTL:
-	d = exit_x + pos[i].x_offset;
+	d = round (exit_x) + pos[i].x_offset;
 	pos[i].x_advance -= d;
 	pos[i].x_offset  -= d;
 
-	pos[j].x_advance  =  entry_x + pos[j].x_offset;
+	pos[j].x_advance  = round (entry_x) + pos[j].x_offset;
 	break;
       case HB_DIRECTION_TTB:
-	pos[i].y_advance  =  exit_y + pos[i].y_offset;
+	pos[i].y_advance  = round (exit_y) + pos[i].y_offset;
 
-	d = entry_y + pos[j].y_offset;
+	d = round (entry_y) + pos[j].y_offset;
 	pos[j].y_advance -= d;
 	pos[j].y_offset  -= d;
 	break;
       case HB_DIRECTION_BTT:
-	d = exit_y + pos[i].y_offset;
+	d = round (exit_y) + pos[i].y_offset;
 	pos[i].y_advance -= d;
 	pos[i].y_offset  -= d;
 
-	pos[j].y_advance  =  entry_y;
+	pos[j].y_advance  = round (entry_y);
 	break;
       case HB_DIRECTION_INVALID:
       default:
@@ -1008,7 +1008,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
@@ -1034,7 +1034,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   CursivePosFormat1	format1;
   } u;
 };
@@ -1059,7 +1059,7 @@
     return this+markCoverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1067,7 +1067,7 @@
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
@@ -1099,7 +1099,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		markCoverage;		/* Offset to MarkCoverage table--from
 					 * beginning of MarkBasePos subtable */
@@ -1106,7 +1106,7 @@
   OffsetTo<Coverage>
 		baseCoverage;		/* Offset to BaseCoverage table--from
 					 * beginning of MarkBasePos subtable */
-  UINT16	classCount;		/* Number of classes defined for marks */
+  HBUINT16	classCount;		/* Number of classes defined for marks */
   OffsetTo<MarkArray>
 		markArray;		/* Offset to MarkArray table--from
 					 * beginning of MarkBasePos subtable */
@@ -1132,7 +1132,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   MarkBasePosFormat1	format1;
   } u;
 };
@@ -1162,7 +1162,7 @@
     return this+markCoverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1170,7 +1170,7 @@
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     if (!skippy_iter.prev ()) return_trace (false);
@@ -1216,7 +1216,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		markCoverage;		/* Offset to Mark Coverage table--from
 					 * beginning of MarkLigPos subtable */
@@ -1224,7 +1224,7 @@
 		ligatureCoverage;	/* Offset to Ligature Coverage
 					 * table--from beginning of MarkLigPos
 					 * subtable */
-  UINT16	classCount;		/* Number of defined mark classes */
+  HBUINT16	classCount;		/* Number of defined mark classes */
   OffsetTo<MarkArray>
 		markArray;		/* Offset to MarkArray table--from
 					 * beginning of MarkLigPos subtable */
@@ -1250,7 +1250,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   MarkLigPosFormat1	format1;
   } u;
 };
@@ -1275,7 +1275,7 @@
     return this+mark1Coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1283,7 +1283,7 @@
     if (likely (mark1_index == NOT_COVERED)) return_trace (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
     if (!skippy_iter.prev ()) return_trace (false);
@@ -1330,7 +1330,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		mark1Coverage;		/* Offset to Combining Mark1 Coverage
 					 * table--from beginning of MarkMarkPos
@@ -1339,7 +1339,7 @@
 		mark2Coverage;		/* Offset to Combining Mark2 Coverage
 					 * table--from beginning of MarkMarkPos
 					 * subtable */
-  UINT16	classCount;		/* Number of defined mark classes */
+  HBUINT16	classCount;		/* Number of defined mark classes */
   OffsetTo<MarkArray>
 		mark1Array;		/* Offset to Mark1Array table--from
 					 * beginning of MarkMarkPos subtable */
@@ -1365,7 +1365,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   MarkMarkPosFormat1	format1;
   } u;
 };
@@ -1424,7 +1424,7 @@
 
   protected:
   union {
-  UINT16		sub_format;
+  HBUINT16		sub_format;
   SinglePos		single;
   PairPos		pair;
   CursivePos		cursive;
@@ -1450,7 +1450,7 @@
     return false;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
@@ -1469,7 +1469,7 @@
     dispatch (&c);
   }
 
-  static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
   template <typename context_t>
   static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
@@ -1621,7 +1621,7 @@
   return l.dispatch (c);
 }
 
-/*static*/ inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
   const PosLookup &l = gpos.get_lookup (lookup_index);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -76,7 +76,7 @@
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -110,11 +110,11 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
-  INT16		deltaGlyphID;		/* Add to original GlyphID to get
+  HBINT16		deltaGlyphID;		/* Add to original GlyphID to get
 					 * substitute GlyphID */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -161,7 +161,7 @@
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -195,7 +195,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
+  HBUINT16	format;			/* Format identifier--format = 2 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
@@ -249,7 +249,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   SingleSubstFormat1	format1;
   SingleSubstFormat2	format2;
   } u;
@@ -272,7 +272,7 @@
     c->output->add_array (substitute.array, substitute.len);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int count = substitute.len;
@@ -363,7 +363,7 @@
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
 
@@ -398,7 +398,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
@@ -440,7 +440,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   MultipleSubstFormat1	format1;
   } u;
 };
@@ -495,7 +495,7 @@
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -548,7 +548,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
@@ -590,7 +590,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   AlternateSubstFormat1	format1;
   } u;
 };
@@ -628,7 +628,7 @@
     return_trace (true);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int count = component.len;
@@ -730,7 +730,7 @@
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int num_ligs = ligature.len;
@@ -821,7 +821,7 @@
     return_trace (lig_set.would_apply (c));
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -862,7 +862,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
@@ -912,7 +912,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   LigatureSubstFormat1	format1;
   } u;
 };
@@ -993,7 +993,7 @@
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
@@ -1007,11 +1007,11 @@
 
   unsigned int start_index = 0, end_index = 0;
     if (match_backtrack (c,
-			 backtrack.len, (UINT16 *) backtrack.array,
+			 backtrack.len, (HBUINT16 *) backtrack.array,
 			 match_coverage, this,
 			 &start_index) &&
         match_lookahead (c,
-			 lookahead.len, (UINT16 *) lookahead.array,
+			 lookahead.len, (HBUINT16 *) lookahead.array,
 			 match_coverage, this,
 			 1, &end_index))
     {
@@ -1039,7 +1039,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of table */
@@ -1073,7 +1073,7 @@
 
   protected:
   union {
-  UINT16				format;		/* Format identifier */
+  HBUINT16				format;		/* Format identifier */
   ReverseChainSingleSubstFormat1	format1;
   } u;
 };
@@ -1119,7 +1119,7 @@
 
   protected:
   union {
-  UINT16			sub_format;
+  HBUINT16			sub_format;
   SingleSubst			single;
   MultipleSubst			multiple;
   AlternateSubst		alternate;
@@ -1150,7 +1150,7 @@
     return lookup_type_is_reverse (type);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
@@ -1186,7 +1186,7 @@
       return_trace (dispatch (c));
   }
 
-  static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
 						  unsigned int i)
@@ -1272,10 +1272,9 @@
     {
       /* The spec says all subtables of an Extension lookup should
        * have the same type, which shall not be the Extension type
-       * itself. This is specially important if one has a reverse type! */
+       * itself (but we already checked for that).
+       * This is specially important if one has a reverse type! */
       unsigned int type = get_subtable (0).u.extension.get_type ();
-      if (unlikely (type == SubstLookupSubTable::Extension))
-	return_trace (false);
       unsigned int count = get_subtable_count ();
       for (unsigned int i = 1; i < count; i++)
         if (get_subtable (i).u.extension.get_type () != type)
@@ -1344,7 +1343,7 @@
   return l.dispatch (c);
 }
 
-/*static*/ inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
   const SubstLookup &l = gsub.get_lookup (lookup_index);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -218,8 +218,8 @@
 };
 
 
-struct hb_apply_context_t :
-       hb_dispatch_context_t<hb_apply_context_t, bool, HB_DEBUG_APPLY>
+struct hb_ot_apply_context_t :
+       hb_dispatch_context_t<hb_ot_apply_context_t, bool, HB_DEBUG_APPLY>
 {
   struct matcher_t
   {
@@ -234,7 +234,7 @@
 	     match_func (nullptr),
 	     match_data (nullptr) {};
 
-    typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data);
+    typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
     inline void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
     inline void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
@@ -252,7 +252,7 @@
     };
 
     inline may_match_t may_match (const hb_glyph_info_t &info,
-				  const UINT16          *glyph_data) const
+				  const HBUINT16          *glyph_data) const
     {
       if (!(info.mask & mask) ||
 	  (syllable && syllable != info.syllable ()))
@@ -271,7 +271,7 @@
     };
 
     inline may_skip_t
-    may_skip (const hb_apply_context_t *c,
+    may_skip (const hb_ot_apply_context_t *c,
 	      const hb_glyph_info_t    &info) const
     {
       if (!c->check_glyph_property (&info, lookup_props))
@@ -297,7 +297,7 @@
 
   struct skipping_iterator_t
   {
-    inline void init (hb_apply_context_t *c_, bool context_match = false)
+    inline void init (hb_ot_apply_context_t *c_, bool context_match = false)
     {
       c = c_;
       match_glyph_data = nullptr;
@@ -315,7 +315,7 @@
     }
     inline void set_match_func (matcher_t::match_func_t match_func_,
 				const void *match_data_,
-				const UINT16 glyph_data[])
+				const HBUINT16 glyph_data[])
     {
       matcher.set_match_func (match_func_, match_data_);
       match_glyph_data = glyph_data;
@@ -333,8 +333,7 @@
     inline void reject (void) { num_items++; match_glyph_data--; }
 
     inline matcher_t::may_skip_t
-    may_skip (const hb_apply_context_t *c,
-	      const hb_glyph_info_t    &info) const
+    may_skip (const hb_glyph_info_t    &info) const
     {
       return matcher.may_skip (c, info);
     }
@@ -396,9 +395,9 @@
 
     unsigned int idx;
     protected:
-    hb_apply_context_t *c;
+    hb_ot_apply_context_t *c;
     matcher_t matcher;
-    const UINT16 *match_glyph_data;
+    const HBUINT16 *match_glyph_data;
 
     unsigned int num_items;
     unsigned int end;
@@ -406,18 +405,18 @@
 
 
   inline const char *get_name (void) { return "APPLY"; }
-  typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
+  typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.apply (this); }
   static return_t default_return_value (void) { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
-  return_t recurse (unsigned int lookup_index)
+  return_t recurse (unsigned int sub_lookup_index)
   {
     if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
       return default_return_value ();
 
     nesting_level_left--;
-    bool ret = recurse_func (this, lookup_index);
+    bool ret = recurse_func (this, sub_lookup_index);
     nesting_level_left++;
     return ret;
   }
@@ -444,7 +443,7 @@
   bool has_glyph_classes;
 
 
-  hb_apply_context_t (unsigned int table_index_,
+  hb_ot_apply_context_t (unsigned int table_index_,
 		      hb_font_t *font_,
 		      hb_buffer_t *buffer_) :
 			iter_input (), iter_context (),
@@ -568,9 +567,9 @@
 
 
 
-typedef bool (*intersects_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data);
-typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data);
-typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data);
+typedef bool (*intersects_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
 struct ContextClosureFuncs
 {
@@ -586,16 +585,16 @@
 };
 
 
-static inline bool intersects_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED)
+static inline bool intersects_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   return glyphs->has (value);
 }
-static inline bool intersects_class (hb_set_t *glyphs, const UINT16 &value, const void *data)
+static inline bool intersects_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.intersects_class (glyphs, value);
 }
-static inline bool intersects_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data)
+static inline bool intersects_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).intersects (glyphs);
@@ -603,7 +602,7 @@
 
 static inline bool intersects_array (hb_closure_context_t *c,
 				     unsigned int count,
-				     const UINT16 values[],
+				     const HBUINT16 values[],
 				     intersects_func_t intersects_func,
 				     const void *intersects_data)
 {
@@ -614,16 +613,16 @@
 }
 
 
-static inline void collect_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED)
+static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   glyphs->add (value);
 }
-static inline void collect_class (hb_set_t *glyphs, const UINT16 &value, const void *data)
+static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   class_def.add_class (glyphs, value);
 }
-static inline void collect_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data)
+static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   (data+coverage).add_coverage (glyphs);
@@ -631,7 +630,7 @@
 static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
 				  hb_set_t *glyphs,
 				  unsigned int count,
-				  const UINT16 values[],
+				  const HBUINT16 values[],
 				  collect_glyphs_func_t collect_func,
 				  const void *collect_data)
 {
@@ -640,16 +639,16 @@
 }
 
 
-static inline bool match_glyph (hb_codepoint_t glyph_id, const UINT16 &value, const void *data HB_UNUSED)
+static inline bool match_glyph (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   return glyph_id == value;
 }
-static inline bool match_class (hb_codepoint_t glyph_id, const UINT16 &value, const void *data)
+static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.get_class (glyph_id) == value;
 }
-static inline bool match_coverage (hb_codepoint_t glyph_id, const UINT16 &value, const void *data)
+static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
@@ -657,7 +656,7 @@
 
 static inline bool would_match_input (hb_would_apply_context_t *c,
 				      unsigned int count, /* Including the first glyph (not matched) */
-				      const UINT16 input[], /* Array of input values--start with second glyph */
+				      const HBUINT16 input[], /* Array of input values--start with second glyph */
 				      match_func_t match_func,
 				      const void *match_data)
 {
@@ -670,9 +669,9 @@
 
   return true;
 }
-static inline bool match_input (hb_apply_context_t *c,
+static inline bool match_input (hb_ot_apply_context_t *c,
 				unsigned int count, /* Including the first glyph (not matched) */
-				const UINT16 input[], /* Array of input values--start with second glyph */
+				const HBUINT16 input[], /* Array of input values--start with second glyph */
 				match_func_t match_func,
 				const void *match_data,
 				unsigned int *end_offset,
@@ -686,7 +685,7 @@
 
   hb_buffer_t *buffer = c->buffer;
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
   skippy_iter.reset (buffer->idx, count - 1);
   skippy_iter.set_match_func (match_func, match_data, input);
 
@@ -763,7 +762,7 @@
 	    j--;
 	  }
 
-	  if (found && skippy_iter.may_skip (c, out[j]) == hb_apply_context_t::matcher_t::SKIP_YES)
+	  if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES)
 	    ligbase = LIGBASE_MAY_SKIP;
 	  else
 	    ligbase = LIGBASE_MAY_NOT_SKIP;
@@ -796,7 +795,7 @@
 
   return_trace (true);
 }
-static inline bool ligate_input (hb_apply_context_t *c,
+static inline bool ligate_input (hb_ot_apply_context_t *c,
 				 unsigned int count, /* Including the first glyph */
 				 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
 				 unsigned int match_length,
@@ -894,9 +893,9 @@
   return_trace (true);
 }
 
-static inline bool match_backtrack (hb_apply_context_t *c,
+static inline bool match_backtrack (hb_ot_apply_context_t *c,
 				    unsigned int count,
-				    const UINT16 backtrack[],
+				    const HBUINT16 backtrack[],
 				    match_func_t match_func,
 				    const void *match_data,
 				    unsigned int *match_start)
@@ -903,7 +902,7 @@
 {
   TRACE_APPLY (nullptr);
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
   skippy_iter.reset (c->buffer->backtrack_len (), count);
   skippy_iter.set_match_func (match_func, match_data, backtrack);
 
@@ -916,9 +915,9 @@
   return_trace (true);
 }
 
-static inline bool match_lookahead (hb_apply_context_t *c,
+static inline bool match_lookahead (hb_ot_apply_context_t *c,
 				    unsigned int count,
-				    const UINT16 lookahead[],
+				    const HBUINT16 lookahead[],
 				    match_func_t match_func,
 				    const void *match_data,
 				    unsigned int offset,
@@ -926,7 +925,7 @@
 {
   TRACE_APPLY (nullptr);
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
   skippy_iter.reset (c->buffer->idx + offset - 1, count);
   skippy_iter.set_match_func (match_func, match_data, lookahead);
 
@@ -949,9 +948,9 @@
     return_trace (c->check_struct (this));
   }
 
-  UINT16	sequenceIndex;		/* Index into current glyph
+  HBUINT16	sequenceIndex;		/* Index into current glyph
 					 * sequence--first glyph = 0 */
-  UINT16	lookupListIndex;	/* Lookup to apply to that
+  HBUINT16	lookupListIndex;	/* Lookup to apply to that
 					 * position--zero--based */
   public:
   DEFINE_SIZE_STATIC (4);
@@ -967,7 +966,7 @@
     c->recurse (lookupRecord[i].lookupListIndex);
 }
 
-static inline bool apply_lookup (hb_apply_context_t *c,
+static inline bool apply_lookup (hb_ot_apply_context_t *c,
 				 unsigned int count, /* Including the first glyph */
 				 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
 				 unsigned int lookupCount,
@@ -1112,7 +1111,7 @@
 
 static inline void context_closure_lookup (hb_closure_context_t *c,
 					   unsigned int inputCount, /* Including the first glyph (not matched) */
-					   const UINT16 input[], /* Array of input values--start with second glyph */
+					   const HBUINT16 input[], /* Array of input values--start with second glyph */
 					   unsigned int lookupCount,
 					   const LookupRecord lookupRecord[],
 					   ContextClosureLookupContext &lookup_context)
@@ -1126,7 +1125,7 @@
 
 static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
 						  unsigned int inputCount, /* Including the first glyph (not matched) */
-						  const UINT16 input[], /* Array of input values--start with second glyph */
+						  const HBUINT16 input[], /* Array of input values--start with second glyph */
 						  unsigned int lookupCount,
 						  const LookupRecord lookupRecord[],
 						  ContextCollectGlyphsLookupContext &lookup_context)
@@ -1140,7 +1139,7 @@
 
 static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
 					       unsigned int inputCount, /* Including the first glyph (not matched) */
-					       const UINT16 input[], /* Array of input values--start with second glyph */
+					       const HBUINT16 input[], /* Array of input values--start with second glyph */
 					       unsigned int lookupCount HB_UNUSED,
 					       const LookupRecord lookupRecord[] HB_UNUSED,
 					       ContextApplyLookupContext &lookup_context)
@@ -1149,9 +1148,9 @@
 			    inputCount, input,
 			    lookup_context.funcs.match, lookup_context.match_data);
 }
-static inline bool context_apply_lookup (hb_apply_context_t *c,
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
 					 unsigned int inputCount, /* Including the first glyph (not matched) */
-					 const UINT16 input[], /* Array of input values--start with second glyph */
+					 const HBUINT16 input[], /* Array of input values--start with second glyph */
 					 unsigned int lookupCount,
 					 const LookupRecord lookupRecord[],
 					 ContextApplyLookupContext &lookup_context)
@@ -1198,7 +1197,7 @@
     return_trace (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
   }
 
-  inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
@@ -1217,11 +1216,11 @@
   }
 
   protected:
-  UINT16	inputCount;		/* Total number of glyphs in input
+  HBUINT16	inputCount;		/* Total number of glyphs in input
 					 * glyph sequence--includes the first
 					 * glyph */
-  UINT16	lookupCount;		/* Number of LookupRecords */
-  UINT16	inputZ[VAR];		/* Array of match inputs--start with
+  HBUINT16	lookupCount;		/* Number of LookupRecords */
+  HBUINT16	inputZ[VAR];		/* Array of match inputs--start with
 					 * second glyph */
   LookupRecord	lookupRecordX[VAR];	/* Array of LookupRecords--in
 					 * design order */
@@ -1259,7 +1258,7 @@
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
@@ -1339,7 +1338,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1361,7 +1360,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of table */
@@ -1431,7 +1430,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1454,7 +1453,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
+  HBUINT16	format;			/* Format identifier--format = 2 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of table */
@@ -1483,7 +1482,7 @@
       this
     };
     context_closure_lookup (c,
-			    glyphCount, (const UINT16 *) (coverageZ + 1),
+			    glyphCount, (const HBUINT16 *) (coverageZ + 1),
 			    lookupCount, lookupRecord,
 			    lookup_context);
   }
@@ -1500,7 +1499,7 @@
     };
 
     context_collect_glyphs_lookup (c,
-				   glyphCount, (const UINT16 *) (coverageZ + 1),
+				   glyphCount, (const HBUINT16 *) (coverageZ + 1),
 				   lookupCount, lookupRecord,
 				   lookup_context);
   }
@@ -1514,7 +1513,7 @@
       {match_coverage},
       this
     };
-    return_trace (context_would_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
+    return_trace (context_would_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1522,7 +1521,7 @@
     return this+coverageZ[0];
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
@@ -1533,7 +1532,7 @@
       {match_coverage},
       this
     };
-    return_trace (context_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
+    return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1550,10 +1549,10 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 3 */
-  UINT16	glyphCount;		/* Number of glyphs in the input glyph
+  HBUINT16	format;			/* Format identifier--format = 3 */
+  HBUINT16	glyphCount;		/* Number of glyphs in the input glyph
 					 * sequence */
-  UINT16	lookupCount;		/* Number of LookupRecords */
+  HBUINT16	lookupCount;		/* Number of LookupRecords */
   OffsetTo<Coverage>
 		coverageZ[VAR];		/* Array of offsets to Coverage
 					 * table in glyph sequence order */
@@ -1580,7 +1579,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   ContextFormat1	format1;
   ContextFormat2	format2;
   ContextFormat3	format3;
@@ -1610,11 +1609,11 @@
 
 static inline void chain_context_closure_lookup (hb_closure_context_t *c,
 						 unsigned int backtrackCount,
-						 const UINT16 backtrack[],
+						 const HBUINT16 backtrack[],
 						 unsigned int inputCount, /* Including the first glyph (not matched) */
-						 const UINT16 input[], /* Array of input values--start with second glyph */
+						 const HBUINT16 input[], /* Array of input values--start with second glyph */
 						 unsigned int lookaheadCount,
-						 const UINT16 lookahead[],
+						 const HBUINT16 lookahead[],
 						 unsigned int lookupCount,
 						 const LookupRecord lookupRecord[],
 						 ChainContextClosureLookupContext &lookup_context)
@@ -1634,11 +1633,11 @@
 
 static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
 						        unsigned int backtrackCount,
-						        const UINT16 backtrack[],
+						        const HBUINT16 backtrack[],
 						        unsigned int inputCount, /* Including the first glyph (not matched) */
-						        const UINT16 input[], /* Array of input values--start with second glyph */
+						        const HBUINT16 input[], /* Array of input values--start with second glyph */
 						        unsigned int lookaheadCount,
-						        const UINT16 lookahead[],
+						        const HBUINT16 lookahead[],
 						        unsigned int lookupCount,
 						        const LookupRecord lookupRecord[],
 						        ChainContextCollectGlyphsLookupContext &lookup_context)
@@ -1658,11 +1657,11 @@
 
 static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
 						     unsigned int backtrackCount,
-						     const UINT16 backtrack[] HB_UNUSED,
+						     const HBUINT16 backtrack[] HB_UNUSED,
 						     unsigned int inputCount, /* Including the first glyph (not matched) */
-						     const UINT16 input[], /* Array of input values--start with second glyph */
+						     const HBUINT16 input[], /* Array of input values--start with second glyph */
 						     unsigned int lookaheadCount,
-						     const UINT16 lookahead[] HB_UNUSED,
+						     const HBUINT16 lookahead[] HB_UNUSED,
 						     unsigned int lookupCount HB_UNUSED,
 						     const LookupRecord lookupRecord[] HB_UNUSED,
 						     ChainContextApplyLookupContext &lookup_context)
@@ -1673,13 +1672,13 @@
 			    lookup_context.funcs.match, lookup_context.match_data[1]);
 }
 
-static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
 					       unsigned int backtrackCount,
-					       const UINT16 backtrack[],
+					       const HBUINT16 backtrack[],
 					       unsigned int inputCount, /* Including the first glyph (not matched) */
-					       const UINT16 input[], /* Array of input values--start with second glyph */
+					       const HBUINT16 input[], /* Array of input values--start with second glyph */
 					       unsigned int lookaheadCount,
-					       const UINT16 lookahead[],
+					       const HBUINT16 lookahead[],
 					       unsigned int lookupCount,
 					       const LookupRecord lookupRecord[],
 					       ChainContextApplyLookupContext &lookup_context)
@@ -1710,8 +1709,8 @@
   inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE (this);
-    const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
-    const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_closure_lookup (c,
 				  backtrack.len, backtrack.array,
@@ -1724,8 +1723,8 @@
   inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
-    const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_collect_glyphs_lookup (c,
 					 backtrack.len, backtrack.array,
@@ -1738,8 +1737,8 @@
   inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_WOULD_APPLY (this);
-    const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
-    const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_would_apply_lookup (c,
 						    backtrack.len, backtrack.array,
@@ -1748,11 +1747,11 @@
 						    lookup.array, lookup_context));
   }
 
-  inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
-    const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
-    const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_apply_lookup (c,
 					      backtrack.len, backtrack.array,
@@ -1765,9 +1764,9 @@
   {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c)) return_trace (false);
-    const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
     if (!input.sanitize (c)) return_trace (false);
-    const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     if (!lookahead.sanitize (c)) return_trace (false);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (lookup.sanitize (c));
@@ -1774,14 +1773,14 @@
   }
 
   protected:
-  ArrayOf<UINT16>
+  ArrayOf<HBUINT16>
 		backtrack;		/* Array of backtracking values
 					 * (to be matched before the input
 					 * sequence) */
-  HeadlessArrayOf<UINT16>
+  HeadlessArrayOf<HBUINT16>
 		inputX;			/* Array of input values (start with
 					 * second glyph) */
-  ArrayOf<UINT16>
+  ArrayOf<HBUINT16>
 		lookaheadX;		/* Array of lookahead values's (to be
 					 * matched after the input sequence) */
   ArrayOf<LookupRecord>
@@ -1820,7 +1819,7 @@
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
@@ -1897,7 +1896,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1918,7 +1917,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 1 */
+  HBUINT16	format;			/* Format identifier--format = 1 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of table */
@@ -2001,7 +2000,7 @@
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -2033,7 +2032,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 2 */
+  HBUINT16	format;			/* Format identifier--format = 2 */
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of table */
@@ -2073,9 +2072,9 @@
       {this, this, this}
     };
     chain_context_closure_lookup (c,
-				  backtrack.len, (const UINT16 *) backtrack.array,
-				  input.len, (const UINT16 *) input.array + 1,
-				  lookahead.len, (const UINT16 *) lookahead.array,
+				  backtrack.len, (const HBUINT16 *) backtrack.array,
+				  input.len, (const HBUINT16 *) input.array + 1,
+				  lookahead.len, (const HBUINT16 *) lookahead.array,
 				  lookup.len, lookup.array,
 				  lookup_context);
   }
@@ -2094,9 +2093,9 @@
       {this, this, this}
     };
     chain_context_collect_glyphs_lookup (c,
-					 backtrack.len, (const UINT16 *) backtrack.array,
-					 input.len, (const UINT16 *) input.array + 1,
-					 lookahead.len, (const UINT16 *) lookahead.array,
+					 backtrack.len, (const HBUINT16 *) backtrack.array,
+					 input.len, (const HBUINT16 *) input.array + 1,
+					 lookahead.len, (const HBUINT16 *) lookahead.array,
 					 lookup.len, lookup.array,
 					 lookup_context);
   }
@@ -2113,9 +2112,9 @@
       {this, this, this}
     };
     return_trace (chain_context_would_apply_lookup (c,
-						    backtrack.len, (const UINT16 *) backtrack.array,
-						    input.len, (const UINT16 *) input.array + 1,
-						    lookahead.len, (const UINT16 *) lookahead.array,
+						    backtrack.len, (const HBUINT16 *) backtrack.array,
+						    input.len, (const HBUINT16 *) input.array + 1,
+						    lookahead.len, (const HBUINT16 *) lookahead.array,
 						    lookup.len, lookup.array, lookup_context));
   }
 
@@ -2125,7 +2124,7 @@
     return this+input[0];
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
@@ -2140,9 +2139,9 @@
       {this, this, this}
     };
     return_trace (chain_context_apply_lookup (c,
-					      backtrack.len, (const UINT16 *) backtrack.array,
-					      input.len, (const UINT16 *) input.array + 1,
-					      lookahead.len, (const UINT16 *) lookahead.array,
+					      backtrack.len, (const HBUINT16 *) backtrack.array,
+					      input.len, (const HBUINT16 *) input.array + 1,
+					      lookahead.len, (const HBUINT16 *) lookahead.array,
 					      lookup.len, lookup.array, lookup_context));
   }
 
@@ -2160,7 +2159,7 @@
   }
 
   protected:
-  UINT16	format;			/* Format identifier--format = 3 */
+  HBUINT16	format;			/* Format identifier--format = 3 */
   OffsetArrayOf<Coverage>
 		backtrack;		/* Array of coverage tables
 					 * in backtracking sequence, in  glyph
@@ -2197,7 +2196,7 @@
 
   protected:
   union {
-  UINT16		format;	/* Format identifier */
+  HBUINT16		format;	/* Format identifier */
   ChainContextFormat1	format1;
   ChainContextFormat2	format2;
   ChainContextFormat3	format3;
@@ -2230,15 +2229,17 @@
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && extensionOffset != 0);
+    return_trace (c->check_struct (this) &&
+		  extensionOffset != 0 &&
+		  extensionLookupType != T::LookupSubTable::Extension);
   }
 
   protected:
-  UINT16	format;			/* Format identifier. Set to 1. */
-  UINT16	extensionLookupType;	/* Lookup type of subtable referenced
+  HBUINT16	format;			/* Format identifier. Set to 1. */
+  HBUINT16	extensionLookupType;	/* Lookup type of subtable referenced
 					 * by ExtensionOffset (i.e. the
 					 * extension subtable). */
-  UINT32		extensionOffset;	/* Offset to the extension subtable,
+  HBUINT32	extensionOffset;	/* Offset to the extension subtable,
 					 * of lookup type subtable. */
   public:
   DEFINE_SIZE_STATIC (8);
@@ -2276,7 +2277,7 @@
 
   protected:
   union {
-  UINT16		format;		/* Format identifier */
+  HBUINT16		format;		/* Format identifier */
   ExtensionFormat1<T>	format1;
   } u;
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -90,12 +90,12 @@
 struct hb_ot_layout_lookup_accelerator_t;
 
 namespace OT {
-  struct hb_apply_context_t;
+  struct hb_ot_apply_context_t;
   struct SubstLookup;
 }
 
 HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
 				const OT::SubstLookup &lookup,
 				const hb_ot_layout_lookup_accelerator_t &accel);
 
@@ -130,6 +130,10 @@
   struct avar;
 }
 
+namespace AAT {
+  struct morx;
+}
+
 struct hb_ot_layout_lookup_accelerator_t
 {
   template <typename TLookup>
@@ -165,6 +169,7 @@
   OT::hb_lazy_table_loader_t<struct OT::MATH> math;
   OT::hb_lazy_table_loader_t<struct OT::fvar> fvar;
   OT::hb_lazy_table_loader_t<struct OT::avar> avar;
+  OT::hb_lazy_table_loader_t<struct AAT::morx> morx;
 
   unsigned int gsub_lookup_count;
   unsigned int gpos_lookup_count;
@@ -280,7 +285,11 @@
       else if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
       /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
        * https://github.com/harfbuzz/harfbuzz/issues/554 */
-      else if (unlikely (u == 0x034Fu)) props |= UPROPS_MASK_HIDDEN;
+      else if (unlikely (u == 0x034Fu))
+      {
+	buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
+	props |= UPROPS_MASK_HIDDEN;
+      }
     }
     else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
@@ -388,6 +397,11 @@
 	  == UPROPS_MASK_IGNORABLE) &&
 	 !_hb_glyph_info_ligated (info);
 }
+static inline void
+_hb_glyph_info_unhide (hb_glyph_info_t *info)
+{
+  info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
+}
 
 static inline bool
 _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -50,18 +50,19 @@
   if (unlikely (!layout))
     return nullptr;
 
-  layout->gdef_blob = OT::Sanitizer<OT::GDEF>::sanitize (face->reference_table (HB_OT_TAG_GDEF));
+  layout->gdef_blob = OT::Sanitizer<OT::GDEF>().sanitize (face->reference_table (HB_OT_TAG_GDEF));
   layout->gdef = OT::Sanitizer<OT::GDEF>::lock_instance (layout->gdef_blob);
 
-  layout->gsub_blob = OT::Sanitizer<OT::GSUB>::sanitize (face->reference_table (HB_OT_TAG_GSUB));
+  layout->gsub_blob = OT::Sanitizer<OT::GSUB>().sanitize (face->reference_table (HB_OT_TAG_GSUB));
   layout->gsub = OT::Sanitizer<OT::GSUB>::lock_instance (layout->gsub_blob);
 
-  layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS));
+  layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS));
   layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
 
   layout->math.init (face);
   layout->fvar.init (face);
   layout->avar.init (face);
+  layout->morx.init (face);
 
   {
     /*
@@ -209,6 +210,7 @@
   layout->math.fini ();
   layout->fvar.fini ();
   layout->avar.fini ();
+  layout->morx.fini ();
 
   free (layout);
 }
@@ -1055,13 +1057,13 @@
        OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
 {
   template <typename Type>
-  static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c)
+  static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
   {
     const Type *typed_obj = (const Type *) obj;
     return typed_obj->apply (c);
   }
 
-  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
+  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c);
 
   struct hb_applicable_t
   {
@@ -1071,7 +1073,7 @@
       apply_func = apply_func_;
     }
 
-    inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
+    inline bool apply (OT::hb_ot_apply_context_t *c) const { return apply_func (obj, c); }
 
     private:
     const void *obj;
@@ -1102,7 +1104,7 @@
 };
 
 static inline bool
-apply_forward (OT::hb_apply_context_t *c,
+apply_forward (OT::hb_ot_apply_context_t *c,
 	       const hb_ot_layout_lookup_accelerator_t &accel,
 	       const hb_get_subtables_context_t::array_t &subtables)
 {
@@ -1132,7 +1134,7 @@
 }
 
 static inline bool
-apply_backward (OT::hb_apply_context_t *c,
+apply_backward (OT::hb_ot_apply_context_t *c,
 	       const hb_ot_layout_lookup_accelerator_t &accel,
 	       const hb_get_subtables_context_t::array_t &subtables)
 {
@@ -1161,7 +1163,7 @@
 
 template <typename Proxy>
 static inline void
-apply_string (OT::hb_apply_context_t *c,
+apply_string (OT::hb_ot_apply_context_t *c,
 	      const typename Proxy::Lookup &lookup,
 	      const hb_ot_layout_lookup_accelerator_t &accel)
 {
@@ -1212,7 +1214,7 @@
 {
   const unsigned int table_index = proxy.table_index;
   unsigned int i = 0;
-  OT::hb_apply_context_t c (table_index, font, buffer);
+  OT::hb_ot_apply_context_t c (table_index, font, buffer);
   c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
 
   for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) {
@@ -1252,7 +1254,7 @@
 }
 
 HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
 				const OT::SubstLookup &lookup,
 				const hb_ot_layout_lookup_accelerator_t &accel)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -198,7 +198,6 @@
   private:
 
   HB_INTERNAL void add_lookups (hb_ot_map_t  &m,
-				hb_face_t    *face,
 				unsigned int  table_index,
 				unsigned int  feature_index,
 				unsigned int  variations_index,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -80,7 +80,6 @@
 
 void
 hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
-				  hb_face_t    *face,
 				  unsigned int  table_index,
 				  unsigned int  feature_index,
 				  unsigned int  variations_index,
@@ -289,7 +288,7 @@
     {
       if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
 	  required_feature_stage[table_index] == stage)
-	add_lookups (m, face, table_index,
+	add_lookups (m, table_index,
 		     required_feature_index[table_index],
 		     variations_index,
 		     global_bit_mask);
@@ -296,7 +295,7 @@
 
       for (unsigned i = 0; i < m.features.len; i++)
         if (m.features[i].stage[table_index] == stage)
-	  add_lookups (m, face, table_index,
+	  add_lookups (m, table_index,
 		       m.features[i].index[table_index],
 		       variations_index,
 		       m.features[i].mask,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -48,7 +48,7 @@
   }
 
   protected:
-  INT16			value;		/* The X or Y value in design units */
+  HBINT16			value;		/* The X or Y value in design units */
   OffsetTo<Device>	deviceTable;	/* Offset to the device table - from the
 					 * beginning of parent table. May be nullptr.
 					 * Suggested format for device table is 1. */
@@ -154,10 +154,10 @@
   }
 
   protected:
-  INT16 percentScaleDown[2];
-  UINT16 minHeight[2];
+  HBINT16 percentScaleDown[2];
+  HBUINT16 minHeight[2];
   MathValueRecord mathValueRecords[51];
-  INT16 radicalDegreeBottomRaisePercent;
+  HBINT16 radicalDegreeBottomRaisePercent;
 
   public:
   DEFINE_SIZE_STATIC (214);
@@ -279,7 +279,7 @@
   }
 
   protected:
-  UINT16	  heightCount;
+  HBUINT16	  heightCount;
   MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
 					  * which the kern value changes.
 					  * Sorted by the height value in
@@ -425,7 +425,7 @@
 
   protected:
   GlyphID variantGlyph;       /* Glyph ID for the variant. */
-  UINT16  advanceMeasurement; /* Advance width/height, in design units, of the
+  HBUINT16  advanceMeasurement; /* Advance width/height, in design units, of the
 			       * variant, in the direction of requested
 			       * glyph extension. */
 
@@ -433,7 +433,7 @@
   DEFINE_SIZE_STATIC (4);
 };
 
-struct PartFlags : UINT16
+struct PartFlags : HBUINT16
 {
   enum Flags {
     Extender	= 0x0001u, /* If set, the part can be skipped or repeated. */
@@ -473,15 +473,15 @@
 
   protected:
   GlyphID   glyph;		  /* Glyph ID for the part. */
-  UINT16    startConnectorLength; /* Advance width/ height of the straight bar
+  HBUINT16    startConnectorLength; /* Advance width/ height of the straight bar
 				   * connector material, in design units, is at
 				   * the beginning of the glyph, in the
 				   * direction of the extension. */
-  UINT16    endConnectorLength;   /* Advance width/ height of the straight bar
+  HBUINT16    endConnectorLength;   /* Advance width/ height of the straight bar
 				   * connector material, in design units, is at
 				   * the end of the glyph, in the direction of
 				   * the extension. */
-  UINT16    fullAdvance;	  /* Full advance width/height for this part,
+  HBUINT16    fullAdvance;	  /* Full advance width/height for this part,
 				   * in the direction of the extension.
 				   * In design units. */
   PartFlags partFlags;		  /* Part qualifiers. */
@@ -651,7 +651,7 @@
   }
 
   protected:
-  UINT16	     minConnectorOverlap; /* Minimum overlap of connecting
+  HBUINT16	     minConnectorOverlap; /* Minimum overlap of connecting
 					   * glyphs during glyph construction,
 					   * in design units. */
   OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
@@ -660,10 +660,10 @@
   OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
 					   * from the beginning of MathVariants
 					   * table. */
-  UINT16	     vertGlyphCount;      /* Number of glyphs for which
+  HBUINT16	     vertGlyphCount;      /* Number of glyphs for which
 					   * information is provided for
 					   * vertically growing variants. */
-  UINT16	     horizGlyphCount;     /* Number of glyphs for which
+  HBUINT16	     horizGlyphCount;     /* Number of glyphs for which
 					   * information is provided for
 					   * horizontally growing variants. */
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -60,7 +60,7 @@
   protected:
   FixedVersion<>version;		/* Version of the maxp table (0.5 or 1.0),
 					 * 0x00005000u or 0x00010000u. */
-  UINT16	numGlyphs;		/* The number of glyphs in the font. */
+  HBUINT16	numGlyphs;		/* The number of glyphs in the font. */
   public:
   DEFINE_SIZE_STATIC (6);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -65,12 +65,12 @@
     return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
   }
 
-  UINT16	platformID;	/* Platform ID. */
-  UINT16	encodingID;	/* Platform-specific encoding ID. */
-  UINT16	languageID;	/* Language ID. */
-  UINT16	nameID;		/* Name ID. */
-  UINT16	length;		/* String length (in bytes). */
-  UINT16	offset;		/* String offset from start of storage area (in bytes). */
+  HBUINT16	platformID;	/* Platform ID. */
+  HBUINT16	encodingID;	/* Platform-specific encoding ID. */
+  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). */
   public:
   DEFINE_SIZE_STATIC (12);
 };
@@ -123,8 +123,8 @@
   }
 
   /* We only implement format 0 for now. */
-  UINT16	format;			/* Format selector (=0/1). */
-  UINT16	count;			/* Number of name records. */
+  HBUINT16	format;			/* Format selector (=0/1). */
+  HBUINT16	count;			/* Number of name records. */
   Offset16	stringOffset;		/* Offset to start of string storage (from start of table). */
   NameRecord	nameRecord[VAR];	/* The name records where count is the number of records. */
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -50,50 +50,50 @@
   }
 
   public:
-  UINT16	version;
+  HBUINT16	version;
 
   /* Version 0 */
-  INT16		xAvgCharWidth;
-  UINT16	usWeightClass;
-  UINT16	usWidthClass;
-  UINT16	fsType;
-  INT16		ySubscriptXSize;
-  INT16		ySubscriptYSize;
-  INT16		ySubscriptXOffset;
-  INT16		ySubscriptYOffset;
-  INT16		ySuperscriptXSize;
-  INT16		ySuperscriptYSize;
-  INT16		ySuperscriptXOffset;
-  INT16		ySuperscriptYOffset;
-  INT16		yStrikeoutSize;
-  INT16		yStrikeoutPosition;
-  INT16		sFamilyClass;
-  UINT8		panose[10];
-  UINT32		ulUnicodeRange[4];
+  HBINT16		xAvgCharWidth;
+  HBUINT16	usWeightClass;
+  HBUINT16	usWidthClass;
+  HBUINT16	fsType;
+  HBINT16		ySubscriptXSize;
+  HBINT16		ySubscriptYSize;
+  HBINT16		ySubscriptXOffset;
+  HBINT16		ySubscriptYOffset;
+  HBINT16		ySuperscriptXSize;
+  HBINT16		ySuperscriptYSize;
+  HBINT16		ySuperscriptXOffset;
+  HBINT16		ySuperscriptYOffset;
+  HBINT16		yStrikeoutSize;
+  HBINT16		yStrikeoutPosition;
+  HBINT16		sFamilyClass;
+  HBUINT8		panose[10];
+  HBUINT32		ulUnicodeRange[4];
   Tag		achVendID;
-  UINT16	fsSelection;
-  UINT16	usFirstCharIndex;
-  UINT16	usLastCharIndex;
-  INT16		sTypoAscender;
-  INT16		sTypoDescender;
-  INT16		sTypoLineGap;
-  UINT16	usWinAscent;
-  UINT16	usWinDescent;
+  HBUINT16	fsSelection;
+  HBUINT16	usFirstCharIndex;
+  HBUINT16	usLastCharIndex;
+  HBINT16		sTypoAscender;
+  HBINT16		sTypoDescender;
+  HBINT16		sTypoLineGap;
+  HBUINT16	usWinAscent;
+  HBUINT16	usWinDescent;
 
   /* Version 1 */
-  //UINT32 ulCodePageRange1;
-  //UINT32 ulCodePageRange2;
+  //HBUINT32 ulCodePageRange1;
+  //HBUINT32 ulCodePageRange2;
 
   /* Version 2 */
-  //INT16 sxHeight;
-  //INT16 sCapHeight;
-  //UINT16  usDefaultChar;
-  //UINT16  usBreakChar;
-  //UINT16  usMaxContext;
+  //HBINT16 sxHeight;
+  //HBINT16 sCapHeight;
+  //HBUINT16  usDefaultChar;
+  //HBUINT16  usBreakChar;
+  //HBUINT16  usMaxContext;
 
   /* Version 5 */
-  //UINT16  usLowerOpticalPointSize;
-  //UINT16  usUpperOpticalPointSize;
+  //HBUINT16  usLowerOpticalPointSize;
+  //HBUINT16  usUpperOpticalPointSize;
 
   public:
   DEFINE_SIZE_STATIC (78);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -56,10 +56,10 @@
     return_trace (glyphNameIndex.sanitize (c));
   }
 
-  ArrayOf<UINT16>glyphNameIndex;	/* This is not an offset, but is the
+  ArrayOf<HBUINT16>glyphNameIndex;	/* This is not an offset, but is the
 					 * ordinal number of the glyph in 'post'
 					 * string tables. */
-  UINT8		namesX[VAR];		/* Glyph names with length bytes [variable]
+  HBUINT8		namesX[VAR];		/* Glyph names with length bytes [variable]
 					 * (a Pascal string). */
 
   DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
@@ -86,7 +86,7 @@
   {
     inline void init (hb_face_t *face)
     {
-      blob = Sanitizer<post>::sanitize (face->reference_table (HB_OT_TAG_post));
+      blob = Sanitizer<post>().sanitize (face->reference_table (HB_OT_TAG_post));
       const post *table = Sanitizer<post>::lock_instance (blob);
       unsigned int table_length = hb_blob_get_length (blob);
 
@@ -234,7 +234,7 @@
     private:
     hb_blob_t *blob;
     uint32_t version;
-    const ArrayOf<UINT16> *glyphNameIndex;
+    const ArrayOf<HBUINT16> *glyphNameIndex;
     hb_prealloced_array_t<uint32_t, 1> index_to_offset;
     const uint8_t *pool;
     mutable uint16_t *gids_sorted_by_name;
@@ -261,16 +261,16 @@
 					 * from the value of this field. */
   FWORD		underlineThickness;	/* Suggested values for the underline
 					   thickness. */
-  UINT32		isFixedPitch;		/* Set to 0 if the font is proportionally
+  HBUINT32	isFixedPitch;		/* Set to 0 if the font is proportionally
 					 * spaced, non-zero if the font is not
 					 * proportionally spaced (i.e. monospaced). */
-  UINT32		minMemType42;		/* Minimum memory usage when an OpenType font
+  HBUINT32	minMemType42;		/* Minimum memory usage when an OpenType font
 					 * is downloaded. */
-  UINT32		maxMemType42;		/* Maximum memory usage when an OpenType font
+  HBUINT32	maxMemType42;		/* Maximum memory usage when an OpenType font
 					 * is downloaded. */
-  UINT32		minMemType1;		/* Minimum memory usage when an OpenType font
+  HBUINT32	minMemType1;		/* Minimum memory usage when an OpenType font
 					 * is downloaded as a Type 1 font. */
-  UINT32		maxMemType1;		/* Maximum memory usage when an OpenType font
+  HBUINT32	maxMemType1;		/* Maximum memory usage when an OpenType font
 					 * is downloaded as a Type 1 font. */
 /*postV2Tail	v2[VAR];*/
   DEFINE_SIZE_STATIC (32);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -340,7 +340,7 @@
 			    hb_font_t *font,
 			    hb_buffer_t *buffer)
 {
-  OT::hb_apply_context_t c (0, font, buffer);
+  OT::hb_ot_apply_context_t c (0, font, buffer);
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i]) {
       c.set_lookup_mask (fallback_plan->mask_array[i]);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -644,13 +644,15 @@
 {
   hb_glyph_info_t *info = buffer->info;
 
+  DEBUG_MSG (ARABIC, buffer, "Reordering marks from %d to %d", start, end);
+
   unsigned int i = start;
   for (unsigned int cc = 220; cc <= 230; cc += 10)
   {
-    DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d\n", cc, i);
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d", cc, i);
     while (i < end && info_cc(info[i]) < cc)
       i++;
-    DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d\n", cc, i);
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d", cc, i);
 
     if (i == end)
       break;
@@ -658,20 +660,17 @@
     if (info_cc(info[i]) > cc)
       continue;
 
-    /* Technically we should also check "info_cc(info[j]) == cc"
-     * in the following loop.  But not doing it is safe; we might
-     * end up moving all the 220 MCMs and 230 MCMs together in one
-     * move and be done. */
     unsigned int j = i;
-    while (j < end && info_is_mcm (info[j]))
+    while (j < end && info_cc(info[j]) == cc && info_is_mcm (info[j]))
       j++;
-    DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d\n", cc, i, j);
 
     if (i == j)
       continue;
 
+    DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d", cc, i, j);
+
     /* Shift it! */
-    DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d\n", cc, i, j);
+    DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d", cc, i, j);
     hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS];
     assert (j - i <= ARRAY_LENGTH (temp));
     buffer->merge_clusters (start, j);
@@ -679,7 +678,25 @@
     memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t));
     memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t));
 
-    start += j - i;
+    /* Renumber CC such that the reordered sequence is still sorted.
+     * 22 and 26 are chosen because they are smaller than all Arabic categories,
+     * and are folded back to 220/230 respectively during fallback mark positioning.
+     *
+     * We do this because the CGJ-handling logic in the normalizer relies on
+     * mark sequences having an increasing order even after this reordering.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     * This, however, does break some obscure sequences, where the normalizer
+     * might compose a sequence that it should not.  For example, in the seequence
+     * ALEF, HAMZAH, MADDAH, we should NOT try to compose ALEF+MADDAH, but with this
+     * renumbering, we will.
+     */
+    unsigned int new_start = start + j - i;
+    unsigned int new_cc = cc == 220 ? HB_MODIFIED_COMBINING_CLASS_CCC22 : HB_MODIFIED_COMBINING_CLASS_CCC26;
+    while (start < new_start)
+    {
+      _hb_glyph_info_set_modified_combining_class (&info[start], new_cc);
+      start++;
+    }
 
     i = j;
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -34,1106 +34,889 @@
 
 #line 36 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
-	8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-	7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 
-	6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 
-	4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 
-	5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-	7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
-	6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 
-	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-	4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 
-	5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-	7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
-	6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 
-	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 
-	8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+	8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
 	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
 	4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
-	16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u, 
-	5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
-	5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, 
+	16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+	4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
 	4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
-	16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
+	16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 
+	4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, 
+	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
+	5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
+	16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
+	4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+	8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
+	4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
+	16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+	4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, 5u, 8u, 5u, 8u, 5u, 7u, 5u, 8u, 
+	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
+	8u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
+	6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 8u, 8u, 1u, 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, 5u, 14u, 5u, 14u, 
-	5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-	3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-	5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	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, 3u, 10u, 4u, 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, 
+	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 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, 14u, 5u, 14u, 5u, 10u, 
-	9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 
-	5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
-	4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 
+	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, 3u, 10u, 4u, 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, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 
+	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, 3u, 10u, 
+	4u, 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, 3u, 17u, 3u, 17u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 1u, 16u, 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, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
-	9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-	3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
-	4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
-	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u, 
 	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, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
-	9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-	3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
-	4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
-	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 
-	1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 
-	5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-	5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-	3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 
-	9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 0
+	3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 
+	10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 4u, 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, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 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, 4u, 10u, 5u, 10u, 3u, 10u, 
+	4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+	3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 
+	0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
-	1, 16, 6, 4, 3, 1, 4, 3, 
-	1, 4, 3, 1, 4, 3, 1, 5, 
-	1, 1, 5, 1, 1, 5, 1, 1, 
-	5, 1, 1, 11, 11, 11, 11, 11, 
-	11, 11, 11, 11, 11, 1, 16, 6, 
-	4, 3, 1, 4, 3, 1, 4, 3, 
-	1, 4, 3, 1, 5, 1, 1, 5, 
-	1, 1, 5, 1, 1, 5, 1, 1, 
-	11, 11, 11, 11, 11, 11, 11, 11, 
-	11, 11, 1, 16, 6, 4, 3, 1, 
-	4, 3, 1, 4, 3, 1, 4, 3, 
+	1, 4, 3, 1, 4, 3, 1, 4, 
+	3, 1, 4, 3, 1, 5, 1, 1, 
+	5, 1, 1, 5, 1, 1, 5, 1, 
+	1, 5, 10, 5, 10, 5, 10, 5, 
+	10, 5, 10, 1, 4, 3, 1, 4, 
+	3, 1, 4, 3, 1, 4, 3, 1, 
+	5, 1, 1, 5, 1, 1, 5, 1, 
+	1, 5, 1, 1, 5, 10, 5, 10, 
+	5, 10, 5, 10, 5, 10, 1, 4, 
+	3, 1, 4, 3, 1, 4, 3, 1, 
+	4, 3, 1, 5, 1, 1, 5, 1, 
 	1, 5, 1, 1, 5, 1, 1, 5, 
-	1, 1, 5, 1, 1, 11, 11, 11, 
-	11, 11, 11, 11, 11, 11, 1, 16, 
-	6, 4, 3, 1, 4, 3, 1, 4, 
+	10, 5, 10, 5, 10, 5, 10, 5, 
+	1, 4, 3, 1, 4, 3, 1, 4, 
 	3, 1, 4, 3, 1, 5, 1, 1, 
 	5, 1, 1, 5, 1, 1, 5, 1, 
-	1, 11, 11, 11, 11, 11, 11, 11, 
-	11, 11, 11, 11, 4, 11, 11, 4, 
-	3, 4, 3, 1, 4, 3, 1, 4, 
-	3, 1, 1, 16, 6, 5, 1, 1, 
-	5, 1, 1, 5, 1, 1, 5, 1, 
-	1, 1, 19, 15, 15, 14, 16, 15, 
+	1, 5, 10, 5, 10, 5, 10, 5, 
+	10, 5, 10, 10, 4, 4, 3, 4, 
+	3, 1, 4, 3, 1, 4, 3, 1, 
+	1, 5, 1, 1, 5, 1, 1, 5, 
+	1, 1, 5, 1, 1, 1, 19, 15, 
 	15, 14, 16, 15, 15, 14, 16, 15, 
-	15, 14, 16, 15, 15, 14, 10, 10, 
-	6, 2, 1, 2, 2, 1, 6, 11, 
-	8, 6, 8, 11, 12, 12, 11, 10, 
-	12, 11, 10, 12, 11, 10, 12, 11, 
-	10, 12, 16, 11, 15, 15, 16, 16, 
-	16, 16, 16, 15, 15, 16, 16, 16, 
+	15, 14, 16, 15, 15, 14, 16, 15, 
+	15, 14, 6, 6, 6, 1, 1, 1, 
+	6, 8, 8, 7, 6, 8, 7, 6, 
+	8, 7, 6, 8, 7, 6, 8, 7, 
+	15, 15, 16, 16, 16, 16, 15, 15, 
+	16, 16, 16, 16, 15, 15, 16, 16, 
 	16, 16, 15, 15, 16, 16, 16, 16, 
-	16, 15, 15, 16, 16, 16, 16, 16, 
 	15, 15, 15, 15, 14, 16, 15, 15, 
 	14, 16, 15, 15, 14, 16, 15, 15, 
-	14, 16, 15, 15, 14, 10, 10, 6, 
-	2, 1, 2, 2, 1, 6, 11, 8, 
-	6, 8, 11, 12, 12, 11, 10, 12, 
-	11, 10, 12, 11, 10, 12, 11, 10, 
-	12, 16, 11, 15, 15, 16, 16, 16, 
-	16, 16, 15, 15, 16, 16, 16, 16, 
-	16, 15, 15, 16, 16, 16, 16, 16, 
-	15, 15, 16, 16, 16, 16, 11, 16, 
+	14, 16, 15, 15, 14, 6, 6, 6, 
+	1, 1, 1, 6, 8, 8, 7, 6, 
+	8, 7, 6, 8, 7, 6, 8, 7, 
+	6, 8, 7, 15, 15, 16, 16, 16, 
+	16, 15, 15, 16, 16, 16, 16, 15, 
+	15, 16, 16, 16, 16, 15, 15, 16, 
+	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, 8, 
+	7, 6, 8, 7, 6, 8, 7, 6, 
+	8, 7, 6, 8, 7, 15, 15, 16, 
+	16, 16, 16, 15, 15, 16, 16, 16, 
+	16, 15, 15, 16, 16, 16, 16, 15, 
+	15, 16, 16, 16, 16, 10, 15, 5, 
 	15, 15, 14, 16, 15, 15, 14, 16, 
-	15, 15, 14, 10, 10, 6, 2, 1, 
-	2, 2, 1, 6, 11, 8, 6, 8, 
-	11, 12, 12, 11, 10, 12, 11, 10, 
-	12, 11, 10, 12, 11, 10, 12, 16, 
-	11, 15, 15, 16, 16, 16, 16, 16, 
-	15, 15, 16, 16, 16, 16, 16, 15, 
-	15, 16, 16, 16, 16, 16, 15, 15, 
-	16, 16, 16, 16, 16, 11, 15, 11, 
 	15, 15, 14, 16, 15, 15, 14, 16, 
-	15, 15, 14, 16, 15, 15, 14, 16, 
-	15, 15, 14, 10, 10, 6, 2, 1, 
-	2, 2, 1, 6, 11, 8, 6, 8, 
-	11, 12, 12, 11, 10, 12, 11, 10, 
-	12, 11, 10, 12, 11, 10, 12, 16, 
-	11, 15, 15, 16, 16, 16, 16, 16, 
-	15, 15, 16, 16, 16, 16, 16, 15, 
-	15, 16, 16, 16, 16, 16, 15, 15, 
-	16, 16, 16, 16, 16, 15, 17, 15, 
-	17, 11, 6, 2, 1, 2, 2, 1, 
-	6, 16, 15, 15, 14, 15, 15, 16, 
-	12, 11, 10, 12, 11, 10, 12, 11, 
-	10, 12, 11, 10, 11, 8, 6, 8, 
-	11, 16, 8, 6, 6, 2, 1, 2, 
-	2, 1, 6, 16
+	15, 15, 14, 6, 6, 6, 1, 1, 
+	1, 6, 8, 8, 7, 6, 8, 7, 
+	6, 8, 7, 6, 8, 7, 6, 8, 
+	7, 15, 15, 16, 16, 16, 16, 15, 
+	15, 16, 16, 16, 16, 15, 15, 16, 
+	16, 16, 16, 15, 15, 16, 16, 16, 
+	16, 15, 17, 15, 17, 10, 6, 1, 
+	1, 1, 6, 16, 8, 7, 6, 8, 
+	7, 6, 8, 7, 6, 8, 7, 6, 
+	8, 6, 6, 1, 1, 1, 6, 16
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
-	0, 2, 19, 26, 31, 35, 37, 42, 
-	46, 48, 53, 57, 59, 64, 68, 70, 
-	76, 78, 80, 86, 88, 90, 96, 98, 
-	100, 106, 108, 110, 122, 134, 146, 158, 
-	170, 182, 194, 206, 218, 230, 232, 249, 
-	256, 261, 265, 267, 272, 276, 278, 283, 
-	287, 289, 294, 298, 300, 306, 308, 310, 
-	316, 318, 320, 326, 328, 330, 336, 338, 
-	340, 352, 364, 376, 388, 400, 412, 424, 
-	436, 448, 460, 462, 479, 486, 491, 495, 
-	497, 502, 506, 508, 513, 517, 519, 524, 
-	528, 530, 536, 538, 540, 546, 548, 550, 
-	556, 558, 560, 566, 568, 570, 582, 594, 
-	606, 618, 630, 642, 654, 666, 678, 680, 
-	697, 704, 709, 713, 715, 720, 724, 726, 
-	731, 735, 737, 742, 746, 748, 754, 756, 
-	758, 764, 766, 768, 774, 776, 778, 784, 
-	786, 788, 800, 812, 824, 836, 848, 860, 
-	872, 884, 896, 908, 920, 925, 937, 949, 
-	954, 958, 963, 967, 969, 974, 978, 980, 
-	985, 989, 991, 993, 1010, 1017, 1023, 1025, 
-	1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, 
-	1055, 1057, 1059, 1079, 1095, 1111, 1126, 1143, 
-	1159, 1175, 1190, 1207, 1223, 1239, 1254, 1271, 
-	1287, 1303, 1318, 1335, 1351, 1367, 1382, 1393, 
-	1404, 1411, 1414, 1416, 1419, 1422, 1424, 1431, 
-	1443, 1452, 1459, 1468, 1480, 1493, 1506, 1518, 
-	1529, 1542, 1554, 1565, 1578, 1590, 1601, 1614, 
-	1626, 1637, 1650, 1667, 1679, 1695, 1711, 1728, 
-	1745, 1762, 1779, 1796, 1812, 1828, 1845, 1862, 
-	1879, 1896, 1913, 1929, 1945, 1962, 1979, 1996, 
-	2013, 2030, 2046, 2062, 2079, 2096, 2113, 2130, 
-	2147, 2163, 2179, 2195, 2211, 2226, 2243, 2259, 
-	2275, 2290, 2307, 2323, 2339, 2354, 2371, 2387, 
-	2403, 2418, 2435, 2451, 2467, 2482, 2493, 2504, 
-	2511, 2514, 2516, 2519, 2522, 2524, 2531, 2543, 
-	2552, 2559, 2568, 2580, 2593, 2606, 2618, 2629, 
-	2642, 2654, 2665, 2678, 2690, 2701, 2714, 2726, 
-	2737, 2750, 2767, 2779, 2795, 2811, 2828, 2845, 
-	2862, 2879, 2896, 2912, 2928, 2945, 2962, 2979, 
-	2996, 3013, 3029, 3045, 3062, 3079, 3096, 3113, 
-	3130, 3146, 3162, 3179, 3196, 3213, 3230, 3242, 
-	3259, 3275, 3291, 3306, 3323, 3339, 3355, 3370, 
-	3387, 3403, 3419, 3434, 3451, 3467, 3483, 3498, 
-	3515, 3531, 3547, 3562, 3573, 3584, 3591, 3594, 
-	3596, 3599, 3602, 3604, 3611, 3623, 3632, 3639, 
-	3648, 3660, 3673, 3686, 3698, 3709, 3722, 3734, 
-	3745, 3758, 3770, 3781, 3794, 3806, 3817, 3830, 
-	3847, 3859, 3875, 3891, 3908, 3925, 3942, 3959, 
-	3976, 3992, 4008, 4025, 4042, 4059, 4076, 4093, 
-	4109, 4125, 4142, 4159, 4176, 4193, 4210, 4226, 
-	4242, 4259, 4276, 4293, 4310, 4327, 4339, 4355, 
-	4367, 4383, 4399, 4414, 4431, 4447, 4463, 4478, 
-	4495, 4511, 4527, 4542, 4559, 4575, 4591, 4606, 
-	4623, 4639, 4655, 4670, 4681, 4692, 4699, 4702, 
-	4704, 4707, 4710, 4712, 4719, 4731, 4740, 4747, 
-	4756, 4768, 4781, 4794, 4806, 4817, 4830, 4842, 
-	4853, 4866, 4878, 4889, 4902, 4914, 4925, 4938, 
-	4955, 4967, 4983, 4999, 5016, 5033, 5050, 5067, 
-	5084, 5100, 5116, 5133, 5150, 5167, 5184, 5201, 
-	5217, 5233, 5250, 5267, 5284, 5301, 5318, 5334, 
-	5350, 5367, 5384, 5401, 5418, 5435, 5451, 5469, 
-	5485, 5503, 5515, 5522, 5525, 5527, 5530, 5533, 
-	5535, 5542, 5559, 5575, 5591, 5606, 5622, 5638, 
-	5655, 5668, 5680, 5691, 5704, 5716, 5727, 5740, 
-	5752, 5763, 5776, 5788, 5799, 5811, 5820, 5827, 
-	5836, 5848, 5865, 5874, 5881, 5888, 5891, 5893, 
-	5896, 5899, 5901, 5908
+	0, 2, 7, 11, 13, 18, 22, 24, 
+	29, 33, 35, 40, 44, 46, 52, 54, 
+	56, 62, 64, 66, 72, 74, 76, 82, 
+	84, 86, 92, 103, 109, 120, 126, 137, 
+	143, 154, 160, 171, 173, 178, 182, 184, 
+	189, 193, 195, 200, 204, 206, 211, 215, 
+	217, 223, 225, 227, 233, 235, 237, 243, 
+	245, 247, 253, 255, 257, 263, 274, 280, 
+	291, 297, 308, 314, 325, 331, 342, 344, 
+	349, 353, 355, 360, 364, 366, 371, 375, 
+	377, 382, 386, 388, 394, 396, 398, 404, 
+	406, 408, 414, 416, 418, 424, 426, 428, 
+	434, 445, 451, 462, 468, 479, 485, 496, 
+	502, 504, 509, 513, 515, 520, 524, 526, 
+	531, 535, 537, 542, 546, 548, 554, 556, 
+	558, 564, 566, 568, 574, 576, 578, 584, 
+	586, 588, 594, 605, 611, 622, 628, 639, 
+	645, 656, 662, 673, 684, 689, 694, 698, 
+	703, 707, 709, 714, 718, 720, 725, 729, 
+	731, 733, 739, 741, 743, 749, 751, 753, 
+	759, 761, 763, 769, 771, 773, 775, 795, 
+	811, 827, 842, 859, 875, 891, 906, 923, 
+	939, 955, 970, 987, 1003, 1019, 1034, 1051, 
+	1067, 1083, 1098, 1105, 1112, 1119, 1121, 1123, 
+	1125, 1132, 1141, 1150, 1158, 1165, 1174, 1182, 
+	1189, 1198, 1206, 1213, 1222, 1230, 1237, 1246, 
+	1254, 1270, 1286, 1303, 1320, 1337, 1354, 1370, 
+	1386, 1403, 1420, 1437, 1454, 1470, 1486, 1503, 
+	1520, 1537, 1554, 1570, 1586, 1603, 1620, 1637, 
+	1654, 1670, 1686, 1702, 1718, 1733, 1750, 1766, 
+	1782, 1797, 1814, 1830, 1846, 1861, 1878, 1894, 
+	1910, 1925, 1942, 1958, 1974, 1989, 1996, 2003, 
+	2010, 2012, 2014, 2016, 2023, 2032, 2041, 2049, 
+	2056, 2065, 2073, 2080, 2089, 2097, 2104, 2113, 
+	2121, 2128, 2137, 2145, 2161, 2177, 2194, 2211, 
+	2228, 2245, 2261, 2277, 2294, 2311, 2328, 2345, 
+	2361, 2377, 2394, 2411, 2428, 2445, 2461, 2477, 
+	2494, 2511, 2528, 2545, 2551, 2567, 2583, 2598, 
+	2615, 2631, 2647, 2662, 2679, 2695, 2711, 2726, 
+	2743, 2759, 2775, 2790, 2807, 2823, 2839, 2854, 
+	2861, 2868, 2875, 2877, 2879, 2881, 2888, 2897, 
+	2906, 2914, 2921, 2930, 2938, 2945, 2954, 2962, 
+	2969, 2978, 2986, 2993, 3002, 3010, 3026, 3042, 
+	3059, 3076, 3093, 3110, 3126, 3142, 3159, 3176, 
+	3193, 3210, 3226, 3242, 3259, 3276, 3293, 3310, 
+	3326, 3342, 3359, 3376, 3393, 3410, 3421, 3437, 
+	3443, 3459, 3475, 3490, 3507, 3523, 3539, 3554, 
+	3571, 3587, 3603, 3618, 3635, 3651, 3667, 3682, 
+	3699, 3715, 3731, 3746, 3753, 3760, 3767, 3769, 
+	3771, 3773, 3780, 3789, 3798, 3806, 3813, 3822, 
+	3830, 3837, 3846, 3854, 3861, 3870, 3878, 3885, 
+	3894, 3902, 3918, 3934, 3951, 3968, 3985, 4002, 
+	4018, 4034, 4051, 4068, 4085, 4102, 4118, 4134, 
+	4151, 4168, 4185, 4202, 4218, 4234, 4251, 4268, 
+	4285, 4302, 4318, 4336, 4352, 4370, 4381, 4388, 
+	4390, 4392, 4394, 4401, 4418, 4427, 4435, 4442, 
+	4451, 4459, 4466, 4475, 4483, 4490, 4499, 4507, 
+	4514, 4523, 4530, 4537, 4539, 4541, 4543, 4550
 };
 
 static const short _indic_syllable_machine_indicies[] = {
-	1, 0, 2, 3, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 2, 0, 1, 0, 0, 0, 0, 
-	4, 0, 5, 5, 6, 1, 0, 7, 
-	7, 6, 0, 6, 0, 8, 8, 9, 
-	1, 0, 10, 10, 9, 0, 9, 0, 
-	11, 11, 12, 1, 0, 13, 13, 12, 
-	0, 12, 0, 14, 14, 15, 1, 0, 
-	16, 16, 15, 0, 15, 0, 17, 0, 
-	0, 0, 1, 0, 18, 0, 19, 0, 
-	20, 14, 14, 15, 1, 0, 21, 0, 
-	22, 0, 23, 11, 11, 12, 1, 0, 
-	24, 0, 25, 0, 26, 8, 8, 9, 
-	1, 0, 27, 0, 28, 0, 29, 5, 
-	5, 6, 1, 0, 0, 0, 0, 0, 
-	29, 0, 29, 5, 5, 6, 1, 0, 
-	0, 0, 0, 30, 29, 0, 31, 5, 
-	5, 6, 1, 0, 0, 0, 0, 0, 
-	31, 0, 31, 5, 5, 6, 1, 0, 
-	0, 0, 0, 32, 31, 0, 33, 5, 
-	5, 6, 1, 0, 0, 0, 0, 0, 
-	33, 0, 33, 5, 5, 6, 1, 0, 
-	0, 0, 0, 34, 33, 0, 35, 5, 
-	5, 6, 1, 0, 0, 0, 0, 0, 
-	35, 0, 35, 5, 5, 6, 1, 0, 
-	0, 0, 0, 36, 35, 0, 37, 5, 
-	5, 6, 1, 0, 0, 0, 0, 0, 
-	37, 0, 37, 5, 5, 6, 1, 0, 
-	0, 0, 0, 38, 37, 0, 40, 39, 
-	41, 42, 39, 39, 39, 39, 39, 39, 
-	39, 39, 39, 39, 39, 39, 39, 41, 
-	39, 40, 39, 39, 39, 39, 43, 39, 
-	44, 44, 45, 40, 39, 46, 46, 45, 
-	39, 45, 39, 47, 47, 48, 40, 39, 
-	49, 49, 48, 39, 48, 39, 50, 50, 
-	51, 40, 39, 52, 52, 51, 39, 51, 
-	39, 53, 53, 54, 40, 39, 55, 55, 
-	54, 39, 54, 39, 56, 39, 39, 39, 
-	40, 39, 57, 39, 58, 39, 59, 53, 
-	53, 54, 40, 39, 60, 39, 61, 39, 
-	62, 50, 50, 51, 40, 39, 63, 39, 
-	64, 39, 65, 47, 47, 48, 40, 39, 
-	66, 39, 67, 39, 68, 44, 44, 45, 
-	40, 39, 39, 39, 39, 39, 68, 39, 
-	68, 44, 44, 45, 40, 39, 39, 39, 
-	39, 69, 68, 39, 70, 44, 44, 45, 
-	40, 39, 39, 39, 39, 39, 70, 39, 
-	70, 44, 44, 45, 40, 39, 39, 39, 
-	39, 71, 70, 39, 72, 44, 44, 45, 
-	40, 39, 39, 39, 39, 39, 72, 39, 
-	72, 44, 44, 45, 40, 39, 39, 39, 
-	39, 73, 72, 39, 74, 44, 44, 45, 
-	40, 39, 39, 39, 39, 39, 74, 39, 
-	74, 44, 44, 45, 40, 39, 39, 39, 
-	39, 75, 74, 39, 76, 44, 44, 45, 
-	40, 39, 39, 39, 39, 39, 76, 39, 
-	76, 44, 44, 45, 40, 39, 39, 39, 
-	39, 77, 76, 39, 79, 78, 80, 81, 
-	78, 78, 78, 78, 78, 78, 78, 78, 
-	78, 78, 78, 78, 78, 80, 78, 79, 
-	78, 78, 78, 78, 82, 78, 83, 83, 
-	84, 79, 78, 86, 86, 84, 85, 84, 
-	85, 87, 87, 88, 79, 78, 89, 89, 
-	88, 78, 88, 78, 90, 90, 91, 79, 
-	78, 92, 92, 91, 78, 91, 78, 93, 
-	93, 94, 79, 78, 95, 95, 94, 78, 
-	94, 78, 96, 78, 78, 78, 79, 78, 
-	97, 78, 98, 78, 99, 93, 93, 94, 
-	79, 78, 100, 78, 101, 78, 102, 90, 
-	90, 91, 79, 78, 103, 78, 104, 78, 
-	105, 87, 87, 88, 79, 78, 106, 78, 
-	107, 78, 108, 83, 83, 84, 79, 78, 
-	78, 78, 78, 78, 108, 78, 108, 83, 
-	83, 84, 79, 78, 78, 78, 78, 109, 
-	108, 78, 110, 83, 83, 84, 79, 78, 
-	78, 78, 78, 78, 110, 78, 110, 83, 
-	83, 84, 79, 78, 78, 78, 78, 111, 
-	110, 78, 112, 83, 83, 84, 79, 78, 
-	78, 78, 78, 78, 112, 78, 112, 83, 
-	83, 84, 79, 78, 78, 78, 78, 113, 
-	112, 78, 114, 83, 83, 84, 79, 78, 
-	78, 78, 78, 78, 114, 78, 114, 83, 
-	83, 84, 79, 78, 78, 78, 78, 115, 
-	114, 78, 116, 83, 83, 84, 79, 78, 
-	78, 78, 78, 78, 116, 78, 118, 117, 
-	119, 120, 117, 117, 117, 117, 117, 117, 
-	117, 117, 117, 117, 117, 117, 117, 119, 
-	117, 118, 117, 117, 117, 117, 121, 117, 
-	122, 122, 123, 118, 117, 124, 124, 123, 
-	117, 123, 117, 125, 125, 126, 118, 117, 
-	127, 127, 126, 117, 126, 117, 128, 128, 
-	129, 118, 117, 130, 130, 129, 117, 129, 
-	117, 131, 131, 132, 118, 117, 133, 133, 
-	132, 117, 132, 117, 134, 117, 117, 117, 
-	118, 117, 135, 117, 136, 117, 137, 131, 
-	131, 132, 118, 117, 138, 117, 139, 117, 
-	140, 128, 128, 129, 118, 117, 141, 117, 
-	142, 117, 143, 125, 125, 126, 118, 117, 
-	144, 117, 145, 117, 146, 122, 122, 123, 
-	118, 117, 117, 117, 117, 117, 146, 117, 
-	146, 122, 122, 123, 118, 117, 117, 117, 
-	117, 147, 146, 117, 148, 122, 122, 123, 
-	118, 117, 117, 117, 117, 117, 148, 117, 
-	148, 122, 122, 123, 118, 117, 117, 117, 
-	117, 149, 148, 117, 150, 122, 122, 123, 
-	118, 117, 117, 117, 117, 117, 150, 117, 
-	150, 122, 122, 123, 118, 117, 117, 117, 
-	117, 151, 150, 117, 152, 122, 122, 123, 
-	118, 117, 117, 117, 117, 117, 152, 117, 
-	152, 122, 122, 123, 118, 117, 117, 117, 
-	117, 153, 152, 117, 154, 122, 122, 123, 
-	118, 117, 117, 117, 117, 117, 154, 117, 
-	154, 122, 122, 123, 118, 117, 117, 117, 
-	117, 155, 154, 117, 116, 83, 83, 84, 
-	79, 78, 78, 78, 78, 156, 116, 78, 
-	86, 86, 84, 1, 0, 114, 83, 83, 
-	84, 157, 0, 0, 0, 0, 0, 114, 
-	0, 114, 83, 83, 84, 157, 0, 0, 
-	0, 0, 158, 114, 0, 159, 159, 160, 
-	1, 0, 7, 7, 160, 0, 161, 161, 
-	162, 157, 0, 163, 163, 162, 0, 162, 
-	0, 164, 164, 165, 157, 0, 166, 166, 
-	165, 0, 165, 0, 167, 167, 168, 157, 
-	0, 169, 169, 168, 0, 168, 0, 157, 
-	0, 170, 171, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	170, 0, 157, 0, 0, 0, 0, 172, 
-	0, 173, 0, 0, 0, 157, 0, 174, 
-	0, 175, 0, 176, 167, 167, 168, 157, 
-	0, 177, 0, 178, 0, 179, 164, 164, 
-	165, 157, 0, 180, 0, 181, 0, 182, 
-	161, 161, 162, 157, 0, 183, 0, 184, 
-	0, 186, 185, 188, 189, 190, 191, 192, 
-	193, 84, 79, 194, 195, 196, 196, 156, 
-	197, 198, 199, 200, 201, 202, 187, 204, 
-	205, 206, 207, 6, 1, 208, 209, 203, 
-	203, 38, 210, 203, 203, 211, 203, 212, 
-	205, 213, 213, 6, 1, 208, 209, 203, 
-	203, 203, 210, 203, 203, 211, 203, 205, 
-	213, 213, 6, 1, 208, 209, 203, 203, 
-	203, 210, 203, 203, 211, 203, 214, 203, 
-	203, 203, 19, 215, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 214, 203, 217, 
-	218, 219, 220, 6, 1, 208, 209, 203, 
-	203, 36, 221, 203, 203, 211, 203, 222, 
-	218, 223, 223, 6, 1, 208, 209, 203, 
-	203, 203, 221, 203, 203, 211, 203, 218, 
-	223, 223, 6, 1, 208, 209, 203, 203, 
-	203, 221, 203, 203, 211, 203, 224, 203, 
-	203, 203, 19, 225, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 224, 203, 226, 
-	227, 228, 229, 6, 1, 208, 209, 203, 
-	203, 34, 230, 203, 203, 211, 203, 231, 
-	227, 232, 232, 6, 1, 208, 209, 203, 
-	203, 203, 230, 203, 203, 211, 203, 227, 
-	232, 232, 6, 1, 208, 209, 203, 203, 
-	203, 230, 203, 203, 211, 203, 233, 203, 
-	203, 203, 19, 234, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 233, 203, 235, 
-	236, 237, 238, 6, 1, 208, 209, 203, 
-	203, 32, 239, 203, 203, 211, 203, 240, 
-	236, 241, 241, 6, 1, 208, 209, 203, 
-	203, 203, 239, 203, 203, 211, 203, 236, 
-	241, 241, 6, 1, 208, 209, 203, 203, 
-	203, 239, 203, 203, 211, 203, 242, 203, 
-	203, 203, 19, 243, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 242, 203, 244, 
-	245, 246, 247, 6, 1, 208, 209, 203, 
-	203, 30, 248, 203, 203, 211, 203, 249, 
-	245, 250, 250, 6, 1, 208, 209, 203, 
-	203, 203, 248, 203, 203, 211, 203, 245, 
-	250, 250, 6, 1, 208, 209, 203, 203, 
-	203, 248, 203, 203, 211, 203, 19, 251, 
-	203, 1, 208, 209, 203, 203, 203, 216, 
-	203, 252, 252, 203, 1, 208, 209, 203, 
-	203, 203, 216, 203, 253, 203, 203, 254, 
-	208, 209, 203, 208, 209, 203, 255, 203, 
-	208, 256, 203, 208, 257, 203, 208, 203, 
-	253, 203, 203, 203, 208, 209, 203, 258, 
-	203, 259, 260, 203, 1, 208, 209, 203, 
-	203, 4, 203, 3, 203, 252, 252, 203, 
-	1, 208, 209, 203, 252, 252, 203, 1, 
-	208, 209, 203, 258, 203, 252, 252, 203, 
-	1, 208, 209, 203, 258, 203, 259, 252, 
-	203, 1, 208, 209, 203, 203, 4, 203, 
-	19, 203, 261, 261, 6, 1, 208, 209, 
-	203, 203, 203, 216, 203, 262, 28, 263, 
-	264, 9, 1, 208, 209, 203, 203, 203, 
-	216, 203, 28, 263, 264, 9, 1, 208, 
-	209, 203, 203, 203, 216, 203, 263, 263, 
-	9, 1, 208, 209, 203, 203, 203, 216, 
-	203, 265, 25, 266, 267, 12, 1, 208, 
-	209, 203, 203, 203, 216, 203, 25, 266, 
-	267, 12, 1, 208, 209, 203, 203, 203, 
-	216, 203, 266, 266, 12, 1, 208, 209, 
-	203, 203, 203, 216, 203, 268, 22, 269, 
-	270, 15, 1, 208, 209, 203, 203, 203, 
-	216, 203, 22, 269, 270, 15, 1, 208, 
-	209, 203, 203, 203, 216, 203, 269, 269, 
-	15, 1, 208, 209, 203, 203, 203, 216, 
-	203, 271, 19, 252, 272, 203, 1, 208, 
-	209, 203, 203, 203, 216, 203, 19, 252, 
-	272, 203, 1, 208, 209, 203, 203, 203, 
-	216, 203, 252, 273, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 19, 203, 252, 
-	252, 203, 1, 208, 209, 203, 203, 203, 
-	216, 203, 2, 3, 203, 203, 19, 251, 
-	203, 1, 208, 209, 203, 203, 203, 216, 
-	203, 2, 203, 245, 250, 250, 6, 1, 
-	208, 209, 203, 203, 203, 248, 203, 244, 
-	245, 250, 250, 6, 1, 208, 209, 203, 
-	203, 203, 248, 203, 203, 211, 203, 244, 
-	245, 246, 250, 6, 1, 208, 209, 203, 
-	203, 30, 248, 203, 203, 211, 203, 242, 
-	203, 274, 203, 261, 261, 6, 1, 208, 
-	209, 203, 203, 203, 216, 203, 242, 203, 
-	242, 203, 203, 203, 252, 252, 203, 1, 
-	208, 209, 203, 203, 203, 216, 203, 242, 
-	203, 242, 203, 203, 203, 252, 275, 203, 
-	1, 208, 209, 203, 203, 203, 216, 203, 
-	242, 203, 242, 203, 274, 203, 252, 252, 
-	203, 1, 208, 209, 203, 203, 203, 216, 
-	203, 242, 203, 242, 3, 203, 203, 19, 
-	243, 203, 1, 208, 209, 203, 203, 203, 
-	216, 203, 242, 203, 235, 236, 241, 241, 
-	6, 1, 208, 209, 203, 203, 203, 239, 
-	203, 203, 211, 203, 235, 236, 237, 241, 
-	6, 1, 208, 209, 203, 203, 32, 239, 
-	203, 203, 211, 203, 233, 203, 276, 203, 
-	261, 261, 6, 1, 208, 209, 203, 203, 
-	203, 216, 203, 233, 203, 233, 203, 203, 
-	203, 252, 252, 203, 1, 208, 209, 203, 
-	203, 203, 216, 203, 233, 203, 233, 203, 
-	203, 203, 252, 277, 203, 1, 208, 209, 
-	203, 203, 203, 216, 203, 233, 203, 233, 
-	203, 276, 203, 252, 252, 203, 1, 208, 
-	209, 203, 203, 203, 216, 203, 233, 203, 
-	233, 3, 203, 203, 19, 234, 203, 1, 
-	208, 209, 203, 203, 203, 216, 203, 233, 
-	203, 226, 227, 232, 232, 6, 1, 208, 
-	209, 203, 203, 203, 230, 203, 203, 211, 
-	203, 226, 227, 228, 232, 6, 1, 208, 
-	209, 203, 203, 34, 230, 203, 203, 211, 
-	203, 224, 203, 278, 203, 261, 261, 6, 
-	1, 208, 209, 203, 203, 203, 216, 203, 
-	224, 203, 224, 203, 203, 203, 252, 252, 
-	203, 1, 208, 209, 203, 203, 203, 216, 
-	203, 224, 203, 224, 203, 203, 203, 252, 
-	279, 203, 1, 208, 209, 203, 203, 203, 
-	216, 203, 224, 203, 224, 203, 278, 203, 
-	252, 252, 203, 1, 208, 209, 203, 203, 
-	203, 216, 203, 224, 203, 224, 3, 203, 
-	203, 19, 225, 203, 1, 208, 209, 203, 
-	203, 203, 216, 203, 224, 203, 217, 218, 
-	223, 223, 6, 1, 208, 209, 203, 203, 
-	203, 221, 203, 203, 211, 203, 217, 218, 
-	219, 223, 6, 1, 208, 209, 203, 203, 
-	36, 221, 203, 203, 211, 203, 214, 203, 
-	280, 203, 261, 261, 6, 1, 208, 209, 
-	203, 203, 203, 216, 203, 214, 203, 214, 
-	203, 203, 203, 252, 252, 203, 1, 208, 
-	209, 203, 203, 203, 216, 203, 214, 203, 
-	214, 203, 203, 203, 252, 281, 203, 1, 
-	208, 209, 203, 203, 203, 216, 203, 214, 
-	203, 214, 203, 280, 203, 252, 252, 203, 
-	1, 208, 209, 203, 203, 203, 216, 203, 
-	214, 203, 214, 3, 203, 203, 19, 215, 
-	203, 1, 208, 209, 203, 203, 203, 216, 
-	203, 214, 203, 204, 205, 213, 213, 6, 
-	1, 208, 209, 203, 203, 203, 210, 203, 
-	203, 211, 203, 204, 205, 206, 213, 6, 
-	1, 208, 209, 203, 203, 38, 210, 203, 
-	203, 211, 203, 283, 284, 285, 286, 45, 
-	40, 287, 288, 282, 282, 77, 289, 282, 
-	282, 290, 282, 291, 284, 292, 286, 45, 
-	40, 287, 288, 282, 282, 282, 289, 282, 
-	282, 290, 282, 284, 292, 286, 45, 40, 
-	287, 288, 282, 282, 282, 289, 282, 282, 
-	290, 282, 293, 282, 282, 282, 58, 294, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 293, 282, 296, 297, 298, 299, 45, 
-	40, 287, 288, 282, 282, 75, 300, 282, 
-	282, 290, 282, 301, 297, 302, 302, 45, 
-	40, 287, 288, 282, 282, 282, 300, 282, 
-	282, 290, 282, 297, 302, 302, 45, 40, 
-	287, 288, 282, 282, 282, 300, 282, 282, 
-	290, 282, 303, 282, 282, 282, 58, 304, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 303, 282, 305, 306, 307, 308, 45, 
-	40, 287, 288, 282, 282, 73, 309, 282, 
-	282, 290, 282, 310, 306, 311, 311, 45, 
-	40, 287, 288, 282, 282, 282, 309, 282, 
-	282, 290, 282, 306, 311, 311, 45, 40, 
-	287, 288, 282, 282, 282, 309, 282, 282, 
-	290, 282, 312, 282, 282, 282, 58, 313, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 312, 282, 314, 315, 316, 317, 45, 
-	40, 287, 288, 282, 282, 71, 318, 282, 
-	282, 290, 282, 319, 315, 320, 320, 45, 
-	40, 287, 288, 282, 282, 282, 318, 282, 
-	282, 290, 282, 315, 320, 320, 45, 40, 
-	287, 288, 282, 282, 282, 318, 282, 282, 
-	290, 282, 321, 282, 282, 282, 58, 322, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 321, 282, 323, 324, 325, 326, 45, 
-	40, 287, 288, 282, 282, 69, 327, 282, 
-	282, 290, 282, 328, 324, 329, 329, 45, 
-	40, 287, 288, 282, 282, 282, 327, 282, 
-	282, 290, 282, 324, 329, 329, 45, 40, 
-	287, 288, 282, 282, 282, 327, 282, 282, 
-	290, 282, 58, 330, 282, 40, 287, 288, 
-	282, 282, 282, 295, 282, 331, 331, 282, 
-	40, 287, 288, 282, 282, 282, 295, 282, 
-	332, 282, 282, 333, 287, 288, 282, 287, 
-	288, 282, 334, 282, 287, 335, 282, 287, 
-	336, 282, 287, 282, 332, 282, 282, 282, 
-	287, 288, 282, 337, 282, 338, 339, 282, 
-	40, 287, 288, 282, 282, 43, 282, 42, 
-	282, 331, 331, 282, 40, 287, 288, 282, 
-	331, 331, 282, 40, 287, 288, 282, 337, 
-	282, 331, 331, 282, 40, 287, 288, 282, 
-	337, 282, 338, 331, 282, 40, 287, 288, 
-	282, 282, 43, 282, 58, 282, 340, 340, 
-	45, 40, 287, 288, 282, 282, 282, 295, 
-	282, 341, 67, 342, 343, 48, 40, 287, 
-	288, 282, 282, 282, 295, 282, 67, 342, 
-	343, 48, 40, 287, 288, 282, 282, 282, 
-	295, 282, 342, 342, 48, 40, 287, 288, 
-	282, 282, 282, 295, 282, 344, 64, 345, 
-	346, 51, 40, 287, 288, 282, 282, 282, 
-	295, 282, 64, 345, 346, 51, 40, 287, 
-	288, 282, 282, 282, 295, 282, 345, 345, 
-	51, 40, 287, 288, 282, 282, 282, 295, 
-	282, 347, 61, 348, 349, 54, 40, 287, 
-	288, 282, 282, 282, 295, 282, 61, 348, 
-	349, 54, 40, 287, 288, 282, 282, 282, 
-	295, 282, 348, 348, 54, 40, 287, 288, 
-	282, 282, 282, 295, 282, 350, 58, 331, 
-	351, 282, 40, 287, 288, 282, 282, 282, 
-	295, 282, 58, 331, 351, 282, 40, 287, 
-	288, 282, 282, 282, 295, 282, 331, 352, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 58, 282, 331, 331, 282, 40, 287, 
-	288, 282, 282, 282, 295, 282, 41, 42, 
-	282, 282, 58, 330, 282, 40, 287, 288, 
-	282, 282, 282, 295, 282, 41, 282, 324, 
-	329, 329, 45, 40, 287, 288, 282, 282, 
-	282, 327, 282, 323, 324, 329, 329, 45, 
-	40, 287, 288, 282, 282, 282, 327, 282, 
-	282, 290, 282, 323, 324, 325, 329, 45, 
-	40, 287, 288, 282, 282, 69, 327, 282, 
-	282, 290, 282, 321, 282, 353, 282, 340, 
-	340, 45, 40, 287, 288, 282, 282, 282, 
-	295, 282, 321, 282, 321, 282, 282, 282, 
-	331, 331, 282, 40, 287, 288, 282, 282, 
-	282, 295, 282, 321, 282, 321, 282, 282, 
-	282, 331, 354, 282, 40, 287, 288, 282, 
-	282, 282, 295, 282, 321, 282, 321, 282, 
-	353, 282, 331, 331, 282, 40, 287, 288, 
-	282, 282, 282, 295, 282, 321, 282, 321, 
-	42, 282, 282, 58, 322, 282, 40, 287, 
-	288, 282, 282, 282, 295, 282, 321, 282, 
-	314, 315, 320, 320, 45, 40, 287, 288, 
-	282, 282, 282, 318, 282, 282, 290, 282, 
-	314, 315, 316, 320, 45, 40, 287, 288, 
-	282, 282, 71, 318, 282, 282, 290, 282, 
-	312, 282, 355, 282, 340, 340, 45, 40, 
-	287, 288, 282, 282, 282, 295, 282, 312, 
-	282, 312, 282, 282, 282, 331, 331, 282, 
-	40, 287, 288, 282, 282, 282, 295, 282, 
-	312, 282, 312, 282, 282, 282, 331, 356, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 312, 282, 312, 282, 355, 282, 331, 
-	331, 282, 40, 287, 288, 282, 282, 282, 
-	295, 282, 312, 282, 312, 42, 282, 282, 
-	58, 313, 282, 40, 287, 288, 282, 282, 
-	282, 295, 282, 312, 282, 305, 306, 311, 
-	311, 45, 40, 287, 288, 282, 282, 282, 
-	309, 282, 282, 290, 282, 305, 306, 307, 
-	311, 45, 40, 287, 288, 282, 282, 73, 
-	309, 282, 282, 290, 282, 303, 282, 357, 
-	282, 340, 340, 45, 40, 287, 288, 282, 
-	282, 282, 295, 282, 303, 282, 303, 282, 
-	282, 282, 331, 331, 282, 40, 287, 288, 
-	282, 282, 282, 295, 282, 303, 282, 303, 
-	282, 282, 282, 331, 358, 282, 40, 287, 
-	288, 282, 282, 282, 295, 282, 303, 282, 
-	303, 282, 357, 282, 331, 331, 282, 40, 
-	287, 288, 282, 282, 282, 295, 282, 303, 
-	282, 303, 42, 282, 282, 58, 304, 282, 
-	40, 287, 288, 282, 282, 282, 295, 282, 
-	303, 282, 296, 297, 302, 302, 45, 40, 
-	287, 288, 282, 282, 282, 300, 282, 282, 
-	290, 282, 296, 297, 298, 302, 45, 40, 
-	287, 288, 282, 282, 75, 300, 282, 282, 
-	290, 282, 293, 282, 359, 282, 340, 340, 
-	45, 40, 287, 288, 282, 282, 282, 295, 
-	282, 293, 282, 293, 282, 282, 282, 331, 
-	331, 282, 40, 287, 288, 282, 282, 282, 
-	295, 282, 293, 282, 293, 282, 282, 282, 
-	331, 360, 282, 40, 287, 288, 282, 282, 
-	282, 295, 282, 293, 282, 293, 282, 359, 
-	282, 331, 331, 282, 40, 287, 288, 282, 
-	282, 282, 295, 282, 293, 282, 76, 44, 
-	44, 45, 40, 282, 282, 282, 282, 282, 
-	76, 282, 293, 42, 282, 282, 58, 294, 
-	282, 40, 287, 288, 282, 282, 282, 295, 
-	282, 293, 282, 283, 284, 292, 286, 45, 
-	40, 287, 288, 282, 282, 282, 289, 282, 
-	282, 290, 282, 362, 191, 363, 363, 84, 
-	79, 194, 195, 361, 361, 361, 197, 361, 
-	361, 200, 361, 191, 363, 363, 84, 79, 
-	194, 195, 361, 361, 361, 197, 361, 361, 
-	200, 361, 364, 361, 361, 361, 98, 365, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 364, 361, 367, 368, 369, 370, 84, 
-	79, 194, 195, 361, 361, 115, 371, 361, 
-	361, 200, 361, 372, 368, 373, 373, 84, 
-	79, 194, 195, 361, 361, 361, 371, 361, 
-	361, 200, 361, 368, 373, 373, 84, 79, 
-	194, 195, 361, 361, 361, 371, 361, 361, 
-	200, 361, 374, 361, 361, 361, 98, 375, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 374, 361, 376, 377, 378, 379, 84, 
-	79, 194, 195, 361, 361, 113, 380, 361, 
-	361, 200, 361, 381, 377, 382, 382, 84, 
-	79, 194, 195, 361, 361, 361, 380, 361, 
-	361, 200, 361, 377, 382, 382, 84, 79, 
-	194, 195, 361, 361, 361, 380, 361, 361, 
-	200, 361, 383, 361, 361, 361, 98, 384, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 383, 361, 385, 386, 387, 388, 84, 
-	79, 194, 195, 361, 361, 111, 389, 361, 
-	361, 200, 361, 390, 386, 391, 391, 84, 
-	79, 194, 195, 361, 361, 361, 389, 361, 
-	361, 200, 361, 386, 391, 391, 84, 79, 
-	194, 195, 361, 361, 361, 389, 361, 361, 
-	200, 361, 392, 361, 361, 361, 98, 393, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 392, 361, 394, 395, 396, 397, 84, 
-	79, 194, 195, 361, 361, 109, 398, 361, 
-	361, 200, 361, 399, 395, 400, 400, 84, 
-	79, 194, 195, 361, 361, 361, 398, 361, 
-	361, 200, 361, 395, 400, 400, 84, 79, 
-	194, 195, 361, 361, 361, 398, 361, 361, 
-	200, 361, 98, 401, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 402, 402, 361, 
-	79, 194, 195, 361, 361, 361, 366, 361, 
-	403, 361, 361, 404, 194, 195, 361, 194, 
-	195, 361, 405, 361, 194, 406, 361, 194, 
-	407, 361, 194, 361, 403, 361, 361, 361, 
-	194, 195, 361, 408, 361, 409, 410, 361, 
-	79, 194, 195, 361, 361, 82, 361, 81, 
-	361, 402, 402, 361, 79, 194, 195, 361, 
-	402, 402, 361, 79, 194, 195, 361, 408, 
-	361, 402, 402, 361, 79, 194, 195, 361, 
-	408, 361, 409, 402, 361, 79, 194, 195, 
-	361, 361, 82, 361, 98, 361, 411, 411, 
-	84, 79, 194, 195, 361, 361, 361, 366, 
-	361, 412, 107, 413, 414, 88, 79, 194, 
-	195, 361, 361, 361, 366, 361, 107, 413, 
-	414, 88, 79, 194, 195, 361, 361, 361, 
-	366, 361, 413, 413, 88, 79, 194, 195, 
-	361, 361, 361, 366, 361, 415, 104, 416, 
-	417, 91, 79, 194, 195, 361, 361, 361, 
-	366, 361, 104, 416, 417, 91, 79, 194, 
-	195, 361, 361, 361, 366, 361, 416, 416, 
-	91, 79, 194, 195, 361, 361, 361, 366, 
-	361, 418, 101, 419, 420, 94, 79, 194, 
-	195, 361, 361, 361, 366, 361, 101, 419, 
-	420, 94, 79, 194, 195, 361, 361, 361, 
-	366, 361, 419, 419, 94, 79, 194, 195, 
-	361, 361, 361, 366, 361, 421, 98, 402, 
-	422, 361, 79, 194, 195, 361, 361, 361, 
-	366, 361, 98, 402, 422, 361, 79, 194, 
-	195, 361, 361, 361, 366, 361, 402, 423, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 98, 361, 402, 402, 361, 79, 194, 
-	195, 361, 361, 361, 366, 361, 80, 81, 
-	361, 361, 98, 401, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 80, 361, 395, 
-	400, 400, 84, 79, 194, 195, 361, 361, 
-	361, 398, 361, 394, 395, 400, 400, 84, 
-	79, 194, 195, 361, 361, 361, 398, 361, 
-	361, 200, 361, 394, 395, 396, 400, 84, 
-	79, 194, 195, 361, 361, 109, 398, 361, 
-	361, 200, 361, 392, 361, 424, 361, 411, 
-	411, 84, 79, 194, 195, 361, 361, 361, 
-	366, 361, 392, 361, 392, 361, 361, 361, 
-	402, 402, 361, 79, 194, 195, 361, 361, 
-	361, 366, 361, 392, 361, 392, 361, 361, 
-	361, 402, 425, 361, 79, 194, 195, 361, 
-	361, 361, 366, 361, 392, 361, 392, 361, 
-	424, 361, 402, 402, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 392, 361, 392, 
-	81, 361, 361, 98, 393, 361, 79, 194, 
-	195, 361, 361, 361, 366, 361, 392, 361, 
-	385, 386, 391, 391, 84, 79, 194, 195, 
-	361, 361, 361, 389, 361, 361, 200, 361, 
-	385, 386, 387, 391, 84, 79, 194, 195, 
-	361, 361, 111, 389, 361, 361, 200, 361, 
-	383, 361, 426, 361, 411, 411, 84, 79, 
-	194, 195, 361, 361, 361, 366, 361, 383, 
-	361, 383, 361, 361, 361, 402, 402, 361, 
-	79, 194, 195, 361, 361, 361, 366, 361, 
-	383, 361, 383, 361, 361, 361, 402, 427, 
-	361, 79, 194, 195, 361, 361, 361, 366, 
-	361, 383, 361, 383, 361, 426, 361, 402, 
-	402, 361, 79, 194, 195, 361, 361, 361, 
-	366, 361, 383, 361, 383, 81, 361, 361, 
-	98, 384, 361, 79, 194, 195, 361, 361, 
-	361, 366, 361, 383, 361, 376, 377, 382, 
-	382, 84, 79, 194, 195, 361, 361, 361, 
-	380, 361, 361, 200, 361, 376, 377, 378, 
-	382, 84, 79, 194, 195, 361, 361, 113, 
-	380, 361, 361, 200, 361, 374, 361, 428, 
-	361, 411, 411, 84, 79, 194, 195, 361, 
-	361, 361, 366, 361, 374, 361, 374, 361, 
-	361, 361, 402, 402, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 374, 361, 374, 
-	361, 361, 361, 402, 429, 361, 79, 194, 
-	195, 361, 361, 361, 366, 361, 374, 361, 
-	374, 361, 428, 361, 402, 402, 361, 79, 
-	194, 195, 361, 361, 361, 366, 361, 374, 
-	361, 374, 81, 361, 361, 98, 375, 361, 
-	79, 194, 195, 361, 361, 361, 366, 361, 
-	374, 361, 367, 368, 373, 373, 84, 79, 
-	194, 195, 361, 361, 361, 371, 361, 361, 
-	200, 361, 367, 368, 369, 373, 84, 79, 
-	194, 195, 361, 361, 115, 371, 361, 361, 
-	200, 361, 364, 361, 430, 361, 411, 411, 
-	84, 79, 194, 195, 361, 361, 361, 366, 
-	361, 364, 361, 364, 361, 361, 361, 402, 
-	402, 361, 79, 194, 195, 361, 361, 361, 
-	366, 361, 364, 361, 364, 361, 361, 361, 
-	402, 431, 361, 79, 194, 195, 361, 361, 
-	361, 366, 361, 364, 361, 364, 361, 430, 
-	361, 402, 402, 361, 79, 194, 195, 361, 
-	361, 361, 366, 361, 364, 361, 364, 81, 
-	361, 361, 98, 365, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 364, 361, 116, 
-	83, 83, 84, 79, 432, 432, 432, 432, 
-	156, 116, 432, 190, 191, 363, 363, 84, 
-	79, 194, 195, 361, 361, 361, 197, 361, 
-	361, 200, 361, 116, 83, 83, 84, 79, 
-	432, 432, 432, 432, 432, 116, 432, 434, 
-	435, 436, 437, 123, 118, 438, 439, 433, 
-	433, 155, 440, 433, 433, 441, 433, 442, 
-	435, 437, 437, 123, 118, 438, 439, 433, 
-	433, 433, 440, 433, 433, 441, 433, 435, 
-	437, 437, 123, 118, 438, 439, 433, 433, 
-	433, 440, 433, 433, 441, 433, 443, 433, 
-	433, 433, 136, 444, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 443, 433, 446, 
-	447, 448, 449, 123, 118, 438, 439, 433, 
-	433, 153, 450, 433, 433, 441, 433, 451, 
-	447, 452, 452, 123, 118, 438, 439, 433, 
-	433, 433, 450, 433, 433, 441, 433, 447, 
-	452, 452, 123, 118, 438, 439, 433, 433, 
-	433, 450, 433, 433, 441, 433, 453, 433, 
-	433, 433, 136, 454, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 453, 433, 455, 
-	456, 457, 458, 123, 118, 438, 439, 433, 
-	433, 151, 459, 433, 433, 441, 433, 460, 
-	456, 461, 461, 123, 118, 438, 439, 433, 
-	433, 433, 459, 433, 433, 441, 433, 456, 
-	461, 461, 123, 118, 438, 439, 433, 433, 
-	433, 459, 433, 433, 441, 433, 462, 433, 
-	433, 433, 136, 463, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 462, 433, 464, 
-	465, 466, 467, 123, 118, 438, 439, 433, 
-	433, 149, 468, 433, 433, 441, 433, 469, 
-	465, 470, 470, 123, 118, 438, 439, 433, 
-	433, 433, 468, 433, 433, 441, 433, 465, 
-	470, 470, 123, 118, 438, 439, 433, 433, 
-	433, 468, 433, 433, 441, 433, 471, 433, 
-	433, 433, 136, 472, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 471, 433, 473, 
-	474, 475, 476, 123, 118, 438, 439, 433, 
-	433, 147, 477, 433, 433, 441, 433, 478, 
-	474, 479, 479, 123, 118, 438, 439, 433, 
-	433, 433, 477, 433, 433, 441, 433, 474, 
-	479, 479, 123, 118, 438, 439, 433, 433, 
-	433, 477, 433, 433, 441, 433, 136, 480, 
-	433, 118, 438, 439, 433, 433, 433, 445, 
-	433, 481, 481, 433, 118, 438, 439, 433, 
-	433, 433, 445, 433, 482, 433, 433, 483, 
-	438, 439, 433, 438, 439, 433, 484, 433, 
-	438, 485, 433, 438, 486, 433, 438, 433, 
-	482, 433, 433, 433, 438, 439, 433, 487, 
-	433, 488, 489, 433, 118, 438, 439, 433, 
-	433, 121, 433, 120, 433, 481, 481, 433, 
-	118, 438, 439, 433, 481, 481, 433, 118, 
-	438, 439, 433, 487, 433, 481, 481, 433, 
-	118, 438, 439, 433, 487, 433, 488, 481, 
-	433, 118, 438, 439, 433, 433, 121, 433, 
-	136, 433, 490, 490, 123, 118, 438, 439, 
-	433, 433, 433, 445, 433, 491, 145, 492, 
-	493, 126, 118, 438, 439, 433, 433, 433, 
-	445, 433, 145, 492, 493, 126, 118, 438, 
-	439, 433, 433, 433, 445, 433, 492, 492, 
-	126, 118, 438, 439, 433, 433, 433, 445, 
-	433, 494, 142, 495, 496, 129, 118, 438, 
-	439, 433, 433, 433, 445, 433, 142, 495, 
-	496, 129, 118, 438, 439, 433, 433, 433, 
-	445, 433, 495, 495, 129, 118, 438, 439, 
-	433, 433, 433, 445, 433, 497, 139, 498, 
-	499, 132, 118, 438, 439, 433, 433, 433, 
-	445, 433, 139, 498, 499, 132, 118, 438, 
-	439, 433, 433, 433, 445, 433, 498, 498, 
-	132, 118, 438, 439, 433, 433, 433, 445, 
-	433, 500, 136, 481, 501, 433, 118, 438, 
-	439, 433, 433, 433, 445, 433, 136, 481, 
-	501, 433, 118, 438, 439, 433, 433, 433, 
-	445, 433, 481, 502, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 136, 433, 481, 
-	481, 433, 118, 438, 439, 433, 433, 433, 
-	445, 433, 119, 120, 433, 433, 136, 480, 
-	433, 118, 438, 439, 433, 433, 433, 445, 
-	433, 119, 433, 474, 479, 479, 123, 118, 
-	438, 439, 433, 433, 433, 477, 433, 473, 
-	474, 479, 479, 123, 118, 438, 439, 433, 
-	433, 433, 477, 433, 433, 441, 433, 473, 
-	474, 475, 479, 123, 118, 438, 439, 433, 
-	433, 147, 477, 433, 433, 441, 433, 471, 
-	433, 503, 433, 490, 490, 123, 118, 438, 
-	439, 433, 433, 433, 445, 433, 471, 433, 
-	471, 433, 433, 433, 481, 481, 433, 118, 
-	438, 439, 433, 433, 433, 445, 433, 471, 
-	433, 471, 433, 433, 433, 481, 504, 433, 
-	118, 438, 439, 433, 433, 433, 445, 433, 
-	471, 433, 471, 433, 503, 433, 481, 481, 
-	433, 118, 438, 439, 433, 433, 433, 445, 
-	433, 471, 433, 471, 120, 433, 433, 136, 
-	472, 433, 118, 438, 439, 433, 433, 433, 
-	445, 433, 471, 433, 464, 465, 470, 470, 
-	123, 118, 438, 439, 433, 433, 433, 468, 
-	433, 433, 441, 433, 464, 465, 466, 470, 
-	123, 118, 438, 439, 433, 433, 149, 468, 
-	433, 433, 441, 433, 462, 433, 505, 433, 
-	490, 490, 123, 118, 438, 439, 433, 433, 
-	433, 445, 433, 462, 433, 462, 433, 433, 
-	433, 481, 481, 433, 118, 438, 439, 433, 
-	433, 433, 445, 433, 462, 433, 462, 433, 
-	433, 433, 481, 506, 433, 118, 438, 439, 
-	433, 433, 433, 445, 433, 462, 433, 462, 
-	433, 505, 433, 481, 481, 433, 118, 438, 
-	439, 433, 433, 433, 445, 433, 462, 433, 
-	462, 120, 433, 433, 136, 463, 433, 118, 
-	438, 439, 433, 433, 433, 445, 433, 462, 
-	433, 455, 456, 461, 461, 123, 118, 438, 
-	439, 433, 433, 433, 459, 433, 433, 441, 
-	433, 455, 456, 457, 461, 123, 118, 438, 
-	439, 433, 433, 151, 459, 433, 433, 441, 
-	433, 453, 433, 507, 433, 490, 490, 123, 
-	118, 438, 439, 433, 433, 433, 445, 433, 
-	453, 433, 453, 433, 433, 433, 481, 481, 
-	433, 118, 438, 439, 433, 433, 433, 445, 
-	433, 453, 433, 453, 433, 433, 433, 481, 
-	508, 433, 118, 438, 439, 433, 433, 433, 
-	445, 433, 453, 433, 453, 433, 507, 433, 
-	481, 481, 433, 118, 438, 439, 433, 433, 
-	433, 445, 433, 453, 433, 453, 120, 433, 
-	433, 136, 454, 433, 118, 438, 439, 433, 
-	433, 433, 445, 433, 453, 433, 446, 447, 
-	452, 452, 123, 118, 438, 439, 433, 433, 
-	433, 450, 433, 433, 441, 433, 446, 447, 
-	448, 452, 123, 118, 438, 439, 433, 433, 
-	153, 450, 433, 433, 441, 433, 443, 433, 
-	509, 433, 490, 490, 123, 118, 438, 439, 
-	433, 433, 433, 445, 433, 443, 433, 443, 
-	433, 433, 433, 481, 481, 433, 118, 438, 
-	439, 433, 433, 433, 445, 433, 443, 433, 
-	443, 433, 433, 433, 481, 510, 433, 118, 
-	438, 439, 433, 433, 433, 445, 433, 443, 
-	433, 443, 433, 509, 433, 481, 481, 433, 
-	118, 438, 439, 433, 433, 433, 445, 433, 
-	443, 433, 443, 120, 433, 433, 136, 444, 
-	433, 118, 438, 439, 433, 433, 433, 445, 
-	433, 443, 433, 434, 435, 437, 437, 123, 
-	118, 438, 439, 433, 433, 433, 440, 433, 
-	433, 441, 433, 188, 189, 190, 191, 511, 
-	363, 84, 79, 194, 195, 196, 196, 156, 
-	197, 361, 188, 200, 361, 204, 512, 206, 
-	207, 6, 1, 208, 209, 203, 203, 38, 
-	210, 203, 203, 211, 203, 214, 189, 190, 
-	191, 513, 514, 84, 157, 515, 516, 203, 
-	196, 156, 517, 203, 214, 200, 203, 116, 
-	518, 518, 84, 157, 208, 209, 203, 203, 
-	156, 519, 203, 520, 203, 203, 521, 515, 
-	516, 203, 515, 516, 203, 255, 203, 515, 
-	522, 203, 515, 523, 203, 515, 203, 520, 
-	203, 203, 203, 515, 516, 203, 524, 3, 
-	361, 361, 402, 431, 361, 79, 194, 195, 
-	361, 361, 361, 366, 361, 524, 361, 525, 
-	368, 526, 527, 84, 157, 515, 516, 203, 
-	203, 158, 371, 203, 203, 200, 203, 528, 
-	368, 529, 529, 84, 157, 515, 516, 203, 
-	203, 203, 371, 203, 203, 200, 203, 368, 
-	529, 529, 84, 157, 515, 516, 203, 203, 
-	203, 371, 203, 203, 200, 203, 525, 368, 
-	529, 529, 84, 157, 515, 516, 203, 203, 
-	203, 371, 203, 203, 200, 203, 525, 368, 
-	526, 529, 84, 157, 515, 516, 203, 203, 
-	158, 371, 203, 203, 200, 203, 214, 203, 
-	280, 116, 530, 530, 160, 157, 208, 209, 
-	203, 203, 203, 519, 203, 214, 203, 531, 
-	184, 532, 533, 162, 157, 515, 516, 203, 
-	203, 203, 534, 203, 184, 532, 533, 162, 
-	157, 515, 516, 203, 203, 203, 534, 203, 
-	532, 532, 162, 157, 515, 516, 203, 203, 
-	203, 534, 203, 535, 181, 536, 537, 165, 
-	157, 515, 516, 203, 203, 203, 534, 203, 
-	181, 536, 537, 165, 157, 515, 516, 203, 
-	203, 203, 534, 203, 536, 536, 165, 157, 
-	515, 516, 203, 203, 203, 534, 203, 538, 
-	178, 539, 540, 168, 157, 515, 516, 203, 
-	203, 203, 534, 203, 178, 539, 540, 168, 
-	157, 515, 516, 203, 203, 203, 534, 203, 
-	539, 539, 168, 157, 515, 516, 203, 203, 
-	203, 534, 203, 541, 175, 542, 543, 203, 
-	157, 515, 516, 203, 203, 203, 534, 203, 
-	175, 542, 543, 203, 157, 515, 516, 203, 
-	203, 203, 534, 203, 542, 542, 203, 157, 
-	515, 516, 203, 203, 203, 534, 203, 544, 
-	203, 545, 546, 203, 157, 515, 516, 203, 
-	203, 172, 203, 171, 203, 542, 542, 203, 
-	157, 515, 516, 203, 542, 542, 203, 157, 
-	515, 516, 203, 544, 203, 542, 542, 203, 
-	157, 515, 516, 203, 544, 203, 545, 542, 
-	203, 157, 515, 516, 203, 203, 172, 203, 
-	524, 171, 361, 361, 98, 365, 361, 79, 
-	194, 195, 361, 361, 361, 366, 361, 524, 
-	361, 548, 547, 549, 549, 547, 186, 550, 
-	551, 547, 549, 549, 547, 186, 550, 551, 
-	547, 552, 547, 547, 553, 550, 551, 547, 
-	550, 551, 547, 554, 547, 550, 555, 547, 
-	550, 556, 547, 550, 547, 552, 547, 547, 
-	547, 550, 551, 547, 188, 432, 432, 432, 
-	432, 432, 432, 432, 432, 432, 196, 432, 
-	432, 432, 432, 188, 432, 0
+	1, 0, 2, 2, 3, 1, 0, 4, 
+	4, 3, 0, 3, 0, 5, 5, 6, 
+	1, 0, 7, 7, 6, 0, 6, 0, 
+	8, 8, 9, 1, 0, 10, 10, 9, 
+	0, 9, 0, 11, 11, 12, 1, 0, 
+	13, 13, 12, 0, 12, 0, 14, 0, 
+	0, 0, 1, 0, 15, 0, 16, 0, 
+	17, 11, 11, 12, 1, 0, 18, 0, 
+	19, 0, 20, 8, 8, 9, 1, 0, 
+	21, 0, 22, 0, 23, 5, 5, 6, 
+	1, 0, 24, 0, 25, 0, 26, 2, 
+	2, 3, 1, 0, 26, 2, 2, 3, 
+	1, 0, 0, 0, 0, 27, 0, 28, 
+	2, 2, 3, 1, 0, 28, 2, 2, 
+	3, 1, 0, 0, 0, 0, 29, 0, 
+	30, 2, 2, 3, 1, 0, 30, 2, 
+	2, 3, 1, 0, 0, 0, 0, 31, 
+	0, 32, 2, 2, 3, 1, 0, 32, 
+	2, 2, 3, 1, 0, 0, 0, 0, 
+	33, 0, 34, 2, 2, 3, 1, 0, 
+	34, 2, 2, 3, 1, 0, 0, 0, 
+	0, 35, 0, 37, 36, 38, 38, 39, 
+	37, 36, 40, 40, 39, 36, 39, 36, 
+	41, 41, 42, 37, 36, 43, 43, 42, 
+	36, 42, 36, 44, 44, 45, 37, 36, 
+	46, 46, 45, 36, 45, 36, 47, 47, 
+	48, 37, 36, 49, 49, 48, 36, 48, 
+	36, 50, 36, 36, 36, 37, 36, 51, 
+	36, 52, 36, 53, 47, 47, 48, 37, 
+	36, 54, 36, 55, 36, 56, 44, 44, 
+	45, 37, 36, 57, 36, 58, 36, 59, 
+	41, 41, 42, 37, 36, 60, 36, 61, 
+	36, 62, 38, 38, 39, 37, 36, 62, 
+	38, 38, 39, 37, 36, 36, 36, 36, 
+	63, 36, 64, 38, 38, 39, 37, 36, 
+	64, 38, 38, 39, 37, 36, 36, 36, 
+	36, 65, 36, 66, 38, 38, 39, 37, 
+	36, 66, 38, 38, 39, 37, 36, 36, 
+	36, 36, 67, 36, 68, 38, 38, 39, 
+	37, 36, 68, 38, 38, 39, 37, 36, 
+	36, 36, 36, 69, 36, 70, 38, 38, 
+	39, 37, 36, 70, 38, 38, 39, 37, 
+	36, 36, 36, 36, 71, 36, 73, 72, 
+	74, 74, 75, 73, 72, 77, 77, 75, 
+	76, 75, 76, 78, 78, 79, 73, 72, 
+	80, 80, 79, 72, 79, 72, 81, 81, 
+	82, 73, 72, 83, 83, 82, 72, 82, 
+	72, 84, 84, 85, 73, 72, 86, 86, 
+	85, 72, 85, 72, 87, 72, 72, 72, 
+	73, 72, 88, 72, 89, 72, 90, 84, 
+	84, 85, 73, 72, 91, 72, 92, 72, 
+	93, 81, 81, 82, 73, 72, 94, 72, 
+	95, 72, 96, 78, 78, 79, 73, 72, 
+	97, 72, 98, 72, 99, 74, 74, 75, 
+	73, 72, 99, 74, 74, 75, 73, 72, 
+	72, 72, 72, 100, 72, 101, 74, 74, 
+	75, 73, 72, 101, 74, 74, 75, 73, 
+	72, 72, 72, 72, 102, 72, 103, 74, 
+	74, 75, 73, 72, 103, 74, 74, 75, 
+	73, 72, 72, 72, 72, 104, 72, 105, 
+	74, 74, 75, 73, 72, 105, 74, 74, 
+	75, 73, 72, 72, 72, 72, 106, 72, 
+	107, 74, 74, 75, 73, 72, 109, 108, 
+	110, 110, 111, 109, 108, 112, 112, 111, 
+	108, 111, 108, 113, 113, 114, 109, 108, 
+	115, 115, 114, 108, 114, 108, 116, 116, 
+	117, 109, 108, 118, 118, 117, 108, 117, 
+	108, 119, 119, 120, 109, 108, 121, 121, 
+	120, 108, 120, 108, 122, 108, 108, 108, 
+	109, 108, 123, 108, 124, 108, 125, 119, 
+	119, 120, 109, 108, 126, 108, 127, 108, 
+	128, 116, 116, 117, 109, 108, 129, 108, 
+	130, 108, 131, 113, 113, 114, 109, 108, 
+	132, 108, 133, 108, 134, 110, 110, 111, 
+	109, 108, 134, 110, 110, 111, 109, 108, 
+	108, 108, 108, 135, 108, 136, 110, 110, 
+	111, 109, 108, 136, 110, 110, 111, 109, 
+	108, 108, 108, 108, 137, 108, 138, 110, 
+	110, 111, 109, 108, 138, 110, 110, 111, 
+	109, 108, 108, 108, 108, 139, 108, 140, 
+	110, 110, 111, 109, 108, 140, 110, 110, 
+	111, 109, 108, 108, 108, 108, 141, 108, 
+	142, 110, 110, 111, 109, 108, 142, 110, 
+	110, 111, 109, 108, 108, 108, 108, 143, 
+	108, 107, 74, 74, 75, 73, 72, 72, 
+	72, 72, 144, 72, 77, 77, 75, 1, 
+	0, 145, 145, 146, 1, 0, 4, 4, 
+	146, 0, 147, 147, 148, 149, 0, 150, 
+	150, 148, 0, 148, 0, 151, 151, 152, 
+	149, 0, 153, 153, 152, 0, 152, 0, 
+	154, 154, 155, 149, 0, 156, 156, 155, 
+	0, 155, 0, 149, 0, 157, 0, 0, 
+	0, 149, 0, 158, 0, 159, 0, 160, 
+	154, 154, 155, 149, 0, 161, 0, 162, 
+	0, 163, 151, 151, 152, 149, 0, 164, 
+	0, 165, 0, 166, 147, 147, 148, 149, 
+	0, 167, 0, 168, 0, 170, 169, 172, 
+	173, 174, 175, 176, 177, 75, 73, 171, 
+	178, 179, 179, 144, 171, 180, 181, 182, 
+	183, 184, 171, 186, 187, 188, 189, 3, 
+	1, 185, 190, 185, 185, 35, 185, 185, 
+	185, 191, 185, 192, 187, 193, 193, 3, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	185, 191, 185, 187, 193, 193, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 194, 185, 185, 185, 16, 195, 
+	185, 1, 185, 190, 185, 185, 185, 185, 
+	185, 194, 185, 196, 197, 198, 199, 3, 
+	1, 185, 190, 185, 185, 33, 185, 185, 
+	185, 191, 185, 200, 197, 201, 201, 3, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	185, 191, 185, 197, 201, 201, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 202, 185, 185, 185, 16, 203, 
+	185, 1, 185, 190, 185, 185, 185, 185, 
+	185, 202, 185, 204, 205, 206, 207, 3, 
+	1, 185, 190, 185, 185, 31, 185, 185, 
+	185, 191, 185, 208, 205, 209, 209, 3, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	185, 191, 185, 205, 209, 209, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 210, 185, 185, 185, 16, 211, 
+	185, 1, 185, 190, 185, 185, 185, 185, 
+	185, 210, 185, 212, 213, 214, 215, 3, 
+	1, 185, 190, 185, 185, 29, 185, 185, 
+	185, 191, 185, 216, 213, 217, 217, 3, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	185, 191, 185, 213, 217, 217, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 218, 185, 185, 185, 16, 219, 
+	185, 1, 185, 190, 185, 185, 185, 185, 
+	185, 218, 185, 220, 221, 222, 223, 3, 
+	1, 185, 190, 185, 185, 27, 185, 185, 
+	185, 191, 185, 224, 221, 225, 225, 3, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	185, 191, 185, 221, 225, 225, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 16, 226, 185, 1, 185, 190, 
+	185, 227, 227, 185, 1, 185, 190, 185, 
+	228, 185, 185, 229, 185, 190, 185, 190, 
+	185, 230, 185, 231, 185, 228, 185, 185, 
+	185, 185, 190, 185, 16, 185, 232, 232, 
+	3, 1, 185, 190, 185, 233, 25, 234, 
+	235, 6, 1, 185, 190, 185, 25, 234, 
+	235, 6, 1, 185, 190, 185, 234, 234, 
+	6, 1, 185, 190, 185, 236, 22, 237, 
+	238, 9, 1, 185, 190, 185, 22, 237, 
+	238, 9, 1, 185, 190, 185, 237, 237, 
+	9, 1, 185, 190, 185, 239, 19, 240, 
+	241, 12, 1, 185, 190, 185, 19, 240, 
+	241, 12, 1, 185, 190, 185, 240, 240, 
+	12, 1, 185, 190, 185, 242, 16, 227, 
+	243, 185, 1, 185, 190, 185, 16, 227, 
+	243, 185, 1, 185, 190, 185, 227, 244, 
+	185, 1, 185, 190, 185, 16, 185, 227, 
+	227, 185, 1, 185, 190, 185, 221, 225, 
+	225, 3, 1, 185, 190, 185, 220, 221, 
+	225, 225, 3, 1, 185, 190, 185, 185, 
+	185, 185, 185, 185, 191, 185, 220, 221, 
+	222, 225, 3, 1, 185, 190, 185, 185, 
+	27, 185, 185, 185, 191, 185, 218, 185, 
+	245, 185, 232, 232, 3, 1, 185, 190, 
+	185, 185, 185, 185, 185, 218, 185, 218, 
+	185, 185, 185, 227, 227, 185, 1, 185, 
+	190, 185, 185, 185, 185, 185, 218, 185, 
+	218, 185, 185, 185, 227, 246, 185, 1, 
+	185, 190, 185, 185, 185, 185, 185, 218, 
+	185, 218, 185, 245, 185, 227, 227, 185, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	218, 185, 212, 213, 217, 217, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 212, 213, 214, 217, 3, 1, 
+	185, 190, 185, 185, 29, 185, 185, 185, 
+	191, 185, 210, 185, 247, 185, 232, 232, 
+	3, 1, 185, 190, 185, 185, 185, 185, 
+	185, 210, 185, 210, 185, 185, 185, 227, 
+	227, 185, 1, 185, 190, 185, 185, 185, 
+	185, 185, 210, 185, 210, 185, 185, 185, 
+	227, 248, 185, 1, 185, 190, 185, 185, 
+	185, 185, 185, 210, 185, 210, 185, 247, 
+	185, 227, 227, 185, 1, 185, 190, 185, 
+	185, 185, 185, 185, 210, 185, 204, 205, 
+	209, 209, 3, 1, 185, 190, 185, 185, 
+	185, 185, 185, 185, 191, 185, 204, 205, 
+	206, 209, 3, 1, 185, 190, 185, 185, 
+	31, 185, 185, 185, 191, 185, 202, 185, 
+	249, 185, 232, 232, 3, 1, 185, 190, 
+	185, 185, 185, 185, 185, 202, 185, 202, 
+	185, 185, 185, 227, 227, 185, 1, 185, 
+	190, 185, 185, 185, 185, 185, 202, 185, 
+	202, 185, 185, 185, 227, 250, 185, 1, 
+	185, 190, 185, 185, 185, 185, 185, 202, 
+	185, 202, 185, 249, 185, 227, 227, 185, 
+	1, 185, 190, 185, 185, 185, 185, 185, 
+	202, 185, 196, 197, 201, 201, 3, 1, 
+	185, 190, 185, 185, 185, 185, 185, 185, 
+	191, 185, 196, 197, 198, 201, 3, 1, 
+	185, 190, 185, 185, 33, 185, 185, 185, 
+	191, 185, 194, 185, 251, 185, 232, 232, 
+	3, 1, 185, 190, 185, 185, 185, 185, 
+	185, 194, 185, 194, 185, 185, 185, 227, 
+	227, 185, 1, 185, 190, 185, 185, 185, 
+	185, 185, 194, 185, 194, 185, 185, 185, 
+	227, 252, 185, 1, 185, 190, 185, 185, 
+	185, 185, 185, 194, 185, 194, 185, 251, 
+	185, 227, 227, 185, 1, 185, 190, 185, 
+	185, 185, 185, 185, 194, 185, 186, 187, 
+	193, 193, 3, 1, 185, 190, 185, 185, 
+	185, 185, 185, 185, 191, 185, 186, 187, 
+	188, 193, 3, 1, 185, 190, 185, 185, 
+	35, 185, 185, 185, 191, 185, 254, 255, 
+	256, 257, 39, 37, 253, 258, 253, 253, 
+	71, 253, 253, 253, 259, 253, 260, 255, 
+	261, 257, 39, 37, 253, 258, 253, 253, 
+	253, 253, 253, 253, 259, 253, 255, 261, 
+	257, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 262, 253, 253, 
+	253, 52, 263, 253, 37, 253, 258, 253, 
+	253, 253, 253, 253, 262, 253, 264, 265, 
+	266, 267, 39, 37, 253, 258, 253, 253, 
+	69, 253, 253, 253, 259, 253, 268, 265, 
+	269, 269, 39, 37, 253, 258, 253, 253, 
+	253, 253, 253, 253, 259, 253, 265, 269, 
+	269, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 270, 253, 253, 
+	253, 52, 271, 253, 37, 253, 258, 253, 
+	253, 253, 253, 253, 270, 253, 272, 273, 
+	274, 275, 39, 37, 253, 258, 253, 253, 
+	67, 253, 253, 253, 259, 253, 276, 273, 
+	277, 277, 39, 37, 253, 258, 253, 253, 
+	253, 253, 253, 253, 259, 253, 273, 277, 
+	277, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 278, 253, 253, 
+	253, 52, 279, 253, 37, 253, 258, 253, 
+	253, 253, 253, 253, 278, 253, 280, 281, 
+	282, 283, 39, 37, 253, 258, 253, 253, 
+	65, 253, 253, 253, 259, 253, 284, 281, 
+	285, 285, 39, 37, 253, 258, 253, 253, 
+	253, 253, 253, 253, 259, 253, 281, 285, 
+	285, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 286, 253, 253, 
+	253, 52, 287, 253, 37, 253, 258, 253, 
+	253, 253, 253, 253, 286, 253, 288, 289, 
+	290, 291, 39, 37, 253, 258, 253, 253, 
+	63, 253, 253, 253, 259, 253, 292, 289, 
+	293, 293, 39, 37, 253, 258, 253, 253, 
+	253, 253, 253, 253, 259, 253, 289, 293, 
+	293, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 52, 294, 253, 
+	37, 253, 258, 253, 295, 295, 253, 37, 
+	253, 258, 253, 296, 253, 253, 297, 253, 
+	258, 253, 258, 253, 298, 253, 299, 253, 
+	296, 253, 253, 253, 253, 258, 253, 52, 
+	253, 300, 300, 39, 37, 253, 258, 253, 
+	301, 61, 302, 303, 42, 37, 253, 258, 
+	253, 61, 302, 303, 42, 37, 253, 258, 
+	253, 302, 302, 42, 37, 253, 258, 253, 
+	304, 58, 305, 306, 45, 37, 253, 258, 
+	253, 58, 305, 306, 45, 37, 253, 258, 
+	253, 305, 305, 45, 37, 253, 258, 253, 
+	307, 55, 308, 309, 48, 37, 253, 258, 
+	253, 55, 308, 309, 48, 37, 253, 258, 
+	253, 308, 308, 48, 37, 253, 258, 253, 
+	310, 52, 295, 311, 253, 37, 253, 258, 
+	253, 52, 295, 311, 253, 37, 253, 258, 
+	253, 295, 312, 253, 37, 253, 258, 253, 
+	52, 253, 295, 295, 253, 37, 253, 258, 
+	253, 289, 293, 293, 39, 37, 253, 258, 
+	253, 288, 289, 293, 293, 39, 37, 253, 
+	258, 253, 253, 253, 253, 253, 253, 259, 
+	253, 288, 289, 290, 293, 39, 37, 253, 
+	258, 253, 253, 63, 253, 253, 253, 259, 
+	253, 286, 253, 313, 253, 300, 300, 39, 
+	37, 253, 258, 253, 253, 253, 253, 253, 
+	286, 253, 286, 253, 253, 253, 295, 295, 
+	253, 37, 253, 258, 253, 253, 253, 253, 
+	253, 286, 253, 286, 253, 253, 253, 295, 
+	314, 253, 37, 253, 258, 253, 253, 253, 
+	253, 253, 286, 253, 286, 253, 313, 253, 
+	295, 295, 253, 37, 253, 258, 253, 253, 
+	253, 253, 253, 286, 253, 280, 281, 285, 
+	285, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 280, 281, 282, 
+	285, 39, 37, 253, 258, 253, 253, 65, 
+	253, 253, 253, 259, 253, 278, 253, 315, 
+	253, 300, 300, 39, 37, 253, 258, 253, 
+	253, 253, 253, 253, 278, 253, 278, 253, 
+	253, 253, 295, 295, 253, 37, 253, 258, 
+	253, 253, 253, 253, 253, 278, 253, 278, 
+	253, 253, 253, 295, 316, 253, 37, 253, 
+	258, 253, 253, 253, 253, 253, 278, 253, 
+	278, 253, 315, 253, 295, 295, 253, 37, 
+	253, 258, 253, 253, 253, 253, 253, 278, 
+	253, 272, 273, 277, 277, 39, 37, 253, 
+	258, 253, 253, 253, 253, 253, 253, 259, 
+	253, 272, 273, 274, 277, 39, 37, 253, 
+	258, 253, 253, 67, 253, 253, 253, 259, 
+	253, 270, 253, 317, 253, 300, 300, 39, 
+	37, 253, 258, 253, 253, 253, 253, 253, 
+	270, 253, 270, 253, 253, 253, 295, 295, 
+	253, 37, 253, 258, 253, 253, 253, 253, 
+	253, 270, 253, 270, 253, 253, 253, 295, 
+	318, 253, 37, 253, 258, 253, 253, 253, 
+	253, 253, 270, 253, 270, 253, 317, 253, 
+	295, 295, 253, 37, 253, 258, 253, 253, 
+	253, 253, 253, 270, 253, 264, 265, 269, 
+	269, 39, 37, 253, 258, 253, 253, 253, 
+	253, 253, 253, 259, 253, 264, 265, 266, 
+	269, 39, 37, 253, 258, 253, 253, 69, 
+	253, 253, 253, 259, 253, 262, 253, 319, 
+	253, 300, 300, 39, 37, 253, 258, 253, 
+	253, 253, 253, 253, 262, 253, 262, 253, 
+	253, 253, 295, 295, 253, 37, 253, 258, 
+	253, 253, 253, 253, 253, 262, 253, 262, 
+	253, 253, 253, 295, 320, 253, 37, 253, 
+	258, 253, 253, 253, 253, 253, 262, 253, 
+	262, 253, 319, 253, 295, 295, 253, 37, 
+	253, 258, 253, 253, 253, 253, 253, 262, 
+	253, 70, 38, 38, 39, 37, 253, 254, 
+	255, 261, 257, 39, 37, 253, 258, 253, 
+	253, 253, 253, 253, 253, 259, 253, 322, 
+	175, 323, 323, 75, 73, 321, 178, 321, 
+	321, 321, 321, 321, 321, 182, 321, 175, 
+	323, 323, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 324, 321, 
+	321, 321, 89, 325, 321, 73, 321, 178, 
+	321, 321, 321, 321, 321, 324, 321, 326, 
+	327, 328, 329, 75, 73, 321, 178, 321, 
+	321, 106, 321, 321, 321, 182, 321, 330, 
+	327, 331, 331, 75, 73, 321, 178, 321, 
+	321, 321, 321, 321, 321, 182, 321, 327, 
+	331, 331, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 332, 321, 
+	321, 321, 89, 333, 321, 73, 321, 178, 
+	321, 321, 321, 321, 321, 332, 321, 334, 
+	335, 336, 337, 75, 73, 321, 178, 321, 
+	321, 104, 321, 321, 321, 182, 321, 338, 
+	335, 339, 339, 75, 73, 321, 178, 321, 
+	321, 321, 321, 321, 321, 182, 321, 335, 
+	339, 339, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 340, 321, 
+	321, 321, 89, 341, 321, 73, 321, 178, 
+	321, 321, 321, 321, 321, 340, 321, 342, 
+	343, 344, 345, 75, 73, 321, 178, 321, 
+	321, 102, 321, 321, 321, 182, 321, 346, 
+	343, 347, 347, 75, 73, 321, 178, 321, 
+	321, 321, 321, 321, 321, 182, 321, 343, 
+	347, 347, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 348, 321, 
+	321, 321, 89, 349, 321, 73, 321, 178, 
+	321, 321, 321, 321, 321, 348, 321, 350, 
+	351, 352, 353, 75, 73, 321, 178, 321, 
+	321, 100, 321, 321, 321, 182, 321, 354, 
+	351, 355, 355, 75, 73, 321, 178, 321, 
+	321, 321, 321, 321, 321, 182, 321, 351, 
+	355, 355, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 89, 356, 
+	321, 73, 321, 178, 321, 357, 357, 321, 
+	73, 321, 178, 321, 358, 321, 321, 359, 
+	321, 178, 321, 178, 321, 360, 321, 361, 
+	321, 358, 321, 321, 321, 321, 178, 321, 
+	89, 321, 362, 362, 75, 73, 321, 178, 
+	321, 363, 98, 364, 365, 79, 73, 321, 
+	178, 321, 98, 364, 365, 79, 73, 321, 
+	178, 321, 364, 364, 79, 73, 321, 178, 
+	321, 366, 95, 367, 368, 82, 73, 321, 
+	178, 321, 95, 367, 368, 82, 73, 321, 
+	178, 321, 367, 367, 82, 73, 321, 178, 
+	321, 369, 92, 370, 371, 85, 73, 321, 
+	178, 321, 92, 370, 371, 85, 73, 321, 
+	178, 321, 370, 370, 85, 73, 321, 178, 
+	321, 372, 89, 357, 373, 321, 73, 321, 
+	178, 321, 89, 357, 373, 321, 73, 321, 
+	178, 321, 357, 374, 321, 73, 321, 178, 
+	321, 89, 321, 357, 357, 321, 73, 321, 
+	178, 321, 351, 355, 355, 75, 73, 321, 
+	178, 321, 350, 351, 355, 355, 75, 73, 
+	321, 178, 321, 321, 321, 321, 321, 321, 
+	182, 321, 350, 351, 352, 355, 75, 73, 
+	321, 178, 321, 321, 100, 321, 321, 321, 
+	182, 321, 348, 321, 375, 321, 362, 362, 
+	75, 73, 321, 178, 321, 321, 321, 321, 
+	321, 348, 321, 348, 321, 321, 321, 357, 
+	357, 321, 73, 321, 178, 321, 321, 321, 
+	321, 321, 348, 321, 348, 321, 321, 321, 
+	357, 376, 321, 73, 321, 178, 321, 321, 
+	321, 321, 321, 348, 321, 348, 321, 375, 
+	321, 357, 357, 321, 73, 321, 178, 321, 
+	321, 321, 321, 321, 348, 321, 342, 343, 
+	347, 347, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 342, 343, 
+	344, 347, 75, 73, 321, 178, 321, 321, 
+	102, 321, 321, 321, 182, 321, 340, 321, 
+	377, 321, 362, 362, 75, 73, 321, 178, 
+	321, 321, 321, 321, 321, 340, 321, 340, 
+	321, 321, 321, 357, 357, 321, 73, 321, 
+	178, 321, 321, 321, 321, 321, 340, 321, 
+	340, 321, 321, 321, 357, 378, 321, 73, 
+	321, 178, 321, 321, 321, 321, 321, 340, 
+	321, 340, 321, 377, 321, 357, 357, 321, 
+	73, 321, 178, 321, 321, 321, 321, 321, 
+	340, 321, 334, 335, 339, 339, 75, 73, 
+	321, 178, 321, 321, 321, 321, 321, 321, 
+	182, 321, 334, 335, 336, 339, 75, 73, 
+	321, 178, 321, 321, 104, 321, 321, 321, 
+	182, 321, 332, 321, 379, 321, 362, 362, 
+	75, 73, 321, 178, 321, 321, 321, 321, 
+	321, 332, 321, 332, 321, 321, 321, 357, 
+	357, 321, 73, 321, 178, 321, 321, 321, 
+	321, 321, 332, 321, 332, 321, 321, 321, 
+	357, 380, 321, 73, 321, 178, 321, 321, 
+	321, 321, 321, 332, 321, 332, 321, 379, 
+	321, 357, 357, 321, 73, 321, 178, 321, 
+	321, 321, 321, 321, 332, 321, 326, 327, 
+	331, 331, 75, 73, 321, 178, 321, 321, 
+	321, 321, 321, 321, 182, 321, 326, 327, 
+	328, 331, 75, 73, 321, 178, 321, 321, 
+	106, 321, 321, 321, 182, 321, 324, 321, 
+	381, 321, 362, 362, 75, 73, 321, 178, 
+	321, 321, 321, 321, 321, 324, 321, 324, 
+	321, 321, 321, 357, 357, 321, 73, 321, 
+	178, 321, 321, 321, 321, 321, 324, 321, 
+	324, 321, 321, 321, 357, 382, 321, 73, 
+	321, 178, 321, 321, 321, 321, 321, 324, 
+	321, 324, 321, 381, 321, 357, 357, 321, 
+	73, 321, 178, 321, 321, 321, 321, 321, 
+	324, 321, 107, 74, 74, 75, 73, 383, 
+	383, 383, 383, 144, 383, 174, 175, 323, 
+	323, 75, 73, 321, 178, 321, 321, 321, 
+	321, 321, 321, 182, 321, 107, 74, 74, 
+	75, 73, 383, 385, 386, 387, 388, 111, 
+	109, 384, 389, 384, 384, 143, 384, 384, 
+	384, 390, 384, 391, 386, 388, 388, 111, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	384, 390, 384, 386, 388, 388, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 392, 384, 384, 384, 124, 393, 
+	384, 109, 384, 389, 384, 384, 384, 384, 
+	384, 392, 384, 394, 395, 396, 397, 111, 
+	109, 384, 389, 384, 384, 141, 384, 384, 
+	384, 390, 384, 398, 395, 399, 399, 111, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	384, 390, 384, 395, 399, 399, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 400, 384, 384, 384, 124, 401, 
+	384, 109, 384, 389, 384, 384, 384, 384, 
+	384, 400, 384, 402, 403, 404, 405, 111, 
+	109, 384, 389, 384, 384, 139, 384, 384, 
+	384, 390, 384, 406, 403, 407, 407, 111, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	384, 390, 384, 403, 407, 407, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 408, 384, 384, 384, 124, 409, 
+	384, 109, 384, 389, 384, 384, 384, 384, 
+	384, 408, 384, 410, 411, 412, 413, 111, 
+	109, 384, 389, 384, 384, 137, 384, 384, 
+	384, 390, 384, 414, 411, 415, 415, 111, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	384, 390, 384, 411, 415, 415, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 416, 384, 384, 384, 124, 417, 
+	384, 109, 384, 389, 384, 384, 384, 384, 
+	384, 416, 384, 418, 419, 420, 421, 111, 
+	109, 384, 389, 384, 384, 135, 384, 384, 
+	384, 390, 384, 422, 419, 423, 423, 111, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	384, 390, 384, 419, 423, 423, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 124, 424, 384, 109, 384, 389, 
+	384, 425, 425, 384, 109, 384, 389, 384, 
+	426, 384, 384, 427, 384, 389, 384, 389, 
+	384, 428, 384, 429, 384, 426, 384, 384, 
+	384, 384, 389, 384, 124, 384, 430, 430, 
+	111, 109, 384, 389, 384, 431, 133, 432, 
+	433, 114, 109, 384, 389, 384, 133, 432, 
+	433, 114, 109, 384, 389, 384, 432, 432, 
+	114, 109, 384, 389, 384, 434, 130, 435, 
+	436, 117, 109, 384, 389, 384, 130, 435, 
+	436, 117, 109, 384, 389, 384, 435, 435, 
+	117, 109, 384, 389, 384, 437, 127, 438, 
+	439, 120, 109, 384, 389, 384, 127, 438, 
+	439, 120, 109, 384, 389, 384, 438, 438, 
+	120, 109, 384, 389, 384, 440, 124, 425, 
+	441, 384, 109, 384, 389, 384, 124, 425, 
+	441, 384, 109, 384, 389, 384, 425, 442, 
+	384, 109, 384, 389, 384, 124, 384, 425, 
+	425, 384, 109, 384, 389, 384, 419, 423, 
+	423, 111, 109, 384, 389, 384, 418, 419, 
+	423, 423, 111, 109, 384, 389, 384, 384, 
+	384, 384, 384, 384, 390, 384, 418, 419, 
+	420, 423, 111, 109, 384, 389, 384, 384, 
+	135, 384, 384, 384, 390, 384, 416, 384, 
+	443, 384, 430, 430, 111, 109, 384, 389, 
+	384, 384, 384, 384, 384, 416, 384, 416, 
+	384, 384, 384, 425, 425, 384, 109, 384, 
+	389, 384, 384, 384, 384, 384, 416, 384, 
+	416, 384, 384, 384, 425, 444, 384, 109, 
+	384, 389, 384, 384, 384, 384, 384, 416, 
+	384, 416, 384, 443, 384, 425, 425, 384, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	416, 384, 410, 411, 415, 415, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 410, 411, 412, 415, 111, 109, 
+	384, 389, 384, 384, 137, 384, 384, 384, 
+	390, 384, 408, 384, 445, 384, 430, 430, 
+	111, 109, 384, 389, 384, 384, 384, 384, 
+	384, 408, 384, 408, 384, 384, 384, 425, 
+	425, 384, 109, 384, 389, 384, 384, 384, 
+	384, 384, 408, 384, 408, 384, 384, 384, 
+	425, 446, 384, 109, 384, 389, 384, 384, 
+	384, 384, 384, 408, 384, 408, 384, 445, 
+	384, 425, 425, 384, 109, 384, 389, 384, 
+	384, 384, 384, 384, 408, 384, 402, 403, 
+	407, 407, 111, 109, 384, 389, 384, 384, 
+	384, 384, 384, 384, 390, 384, 402, 403, 
+	404, 407, 111, 109, 384, 389, 384, 384, 
+	139, 384, 384, 384, 390, 384, 400, 384, 
+	447, 384, 430, 430, 111, 109, 384, 389, 
+	384, 384, 384, 384, 384, 400, 384, 400, 
+	384, 384, 384, 425, 425, 384, 109, 384, 
+	389, 384, 384, 384, 384, 384, 400, 384, 
+	400, 384, 384, 384, 425, 448, 384, 109, 
+	384, 389, 384, 384, 384, 384, 384, 400, 
+	384, 400, 384, 447, 384, 425, 425, 384, 
+	109, 384, 389, 384, 384, 384, 384, 384, 
+	400, 384, 394, 395, 399, 399, 111, 109, 
+	384, 389, 384, 384, 384, 384, 384, 384, 
+	390, 384, 394, 395, 396, 399, 111, 109, 
+	384, 389, 384, 384, 141, 384, 384, 384, 
+	390, 384, 392, 384, 449, 384, 430, 430, 
+	111, 109, 384, 389, 384, 384, 384, 384, 
+	384, 392, 384, 392, 384, 384, 384, 425, 
+	425, 384, 109, 384, 389, 384, 384, 384, 
+	384, 384, 392, 384, 392, 384, 384, 384, 
+	425, 450, 384, 109, 384, 389, 384, 384, 
+	384, 384, 384, 392, 384, 392, 384, 449, 
+	384, 425, 425, 384, 109, 384, 389, 384, 
+	384, 384, 384, 384, 392, 384, 385, 386, 
+	388, 388, 111, 109, 384, 389, 384, 384, 
+	384, 384, 384, 384, 390, 384, 172, 173, 
+	174, 175, 451, 323, 75, 73, 321, 178, 
+	179, 179, 144, 321, 321, 172, 182, 321, 
+	186, 452, 188, 189, 3, 1, 185, 190, 
+	185, 185, 35, 185, 185, 185, 191, 185, 
+	194, 173, 174, 175, 453, 454, 75, 149, 
+	185, 455, 185, 179, 144, 185, 185, 194, 
+	182, 185, 107, 456, 456, 75, 149, 185, 
+	190, 185, 185, 144, 185, 457, 185, 185, 
+	458, 185, 455, 185, 455, 185, 459, 185, 
+	231, 185, 457, 185, 185, 185, 185, 455, 
+	185, 194, 185, 251, 107, 460, 460, 146, 
+	149, 185, 190, 185, 185, 185, 185, 185, 
+	194, 185, 461, 168, 462, 463, 148, 149, 
+	185, 455, 185, 168, 462, 463, 148, 149, 
+	185, 455, 185, 462, 462, 148, 149, 185, 
+	455, 185, 464, 165, 465, 466, 152, 149, 
+	185, 455, 185, 165, 465, 466, 152, 149, 
+	185, 455, 185, 465, 465, 152, 149, 185, 
+	455, 185, 467, 162, 468, 469, 155, 149, 
+	185, 455, 185, 162, 468, 469, 155, 149, 
+	185, 455, 185, 468, 468, 155, 149, 185, 
+	455, 185, 470, 159, 471, 472, 185, 149, 
+	185, 455, 185, 159, 471, 472, 185, 149, 
+	185, 455, 185, 471, 471, 185, 149, 185, 
+	455, 185, 474, 473, 475, 475, 473, 170, 
+	473, 476, 473, 475, 475, 473, 170, 473, 
+	476, 473, 477, 473, 473, 478, 473, 476, 
+	473, 476, 473, 479, 473, 480, 473, 477, 
+	473, 473, 473, 473, 476, 473, 172, 383, 
+	383, 383, 383, 383, 383, 383, 383, 383, 
+	179, 383, 383, 383, 383, 172, 383, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
-	178, 200, 207, 209, 210, 4, 213, 5, 
-	7, 216, 8, 10, 219, 11, 13, 222, 
-	14, 16, 17, 199, 19, 20, 221, 22, 
-	23, 218, 25, 26, 215, 224, 228, 232, 
-	235, 239, 242, 246, 249, 253, 256, 178, 
-	279, 286, 288, 289, 41, 292, 42, 44, 
-	295, 45, 47, 298, 48, 50, 301, 51, 
-	53, 54, 278, 56, 57, 300, 59, 60, 
-	297, 62, 63, 294, 303, 307, 311, 314, 
-	318, 321, 325, 328, 332, 336, 178, 357, 
-	364, 366, 367, 78, 370, 178, 79, 81, 
-	373, 82, 84, 376, 85, 87, 379, 88, 
-	90, 91, 356, 93, 94, 378, 96, 97, 
-	375, 99, 100, 372, 381, 385, 389, 392, 
-	396, 399, 403, 406, 410, 178, 437, 444, 
-	446, 447, 114, 450, 115, 117, 453, 118, 
-	120, 456, 121, 123, 459, 124, 126, 127, 
-	436, 129, 130, 458, 132, 133, 455, 135, 
-	136, 452, 461, 465, 469, 472, 476, 479, 
-	483, 486, 490, 493, 414, 498, 509, 152, 
-	512, 154, 515, 155, 157, 518, 158, 160, 
-	521, 161, 524, 526, 527, 166, 167, 523, 
-	169, 170, 520, 172, 173, 517, 175, 176, 
-	514, 178, 532, 178, 179, 258, 337, 339, 
-	413, 415, 359, 360, 416, 412, 494, 495, 
-	384, 530, 539, 178, 180, 182, 36, 257, 
-	202, 203, 255, 227, 181, 35, 183, 251, 
-	1, 184, 186, 34, 250, 248, 185, 33, 
-	187, 244, 188, 190, 32, 243, 241, 189, 
-	31, 191, 237, 192, 194, 30, 236, 234, 
-	193, 29, 195, 230, 196, 198, 28, 229, 
-	226, 197, 27, 212, 0, 201, 206, 178, 
-	204, 205, 208, 2, 211, 3, 214, 6, 
-	24, 217, 9, 21, 220, 12, 18, 223, 
-	15, 225, 231, 233, 238, 240, 245, 247, 
-	252, 254, 178, 259, 261, 73, 334, 281, 
-	282, 335, 306, 260, 72, 262, 330, 38, 
-	263, 265, 71, 329, 327, 264, 70, 266, 
-	323, 267, 269, 69, 322, 320, 268, 68, 
-	270, 316, 271, 273, 67, 315, 313, 272, 
-	66, 274, 309, 275, 277, 65, 308, 305, 
-	276, 64, 291, 37, 280, 285, 178, 283, 
-	284, 287, 39, 290, 40, 293, 43, 61, 
-	296, 46, 58, 299, 49, 55, 302, 52, 
-	304, 310, 312, 317, 319, 324, 326, 331, 
-	333, 178, 338, 109, 340, 408, 75, 341, 
-	343, 108, 407, 405, 342, 107, 344, 401, 
-	345, 347, 106, 400, 398, 346, 105, 348, 
-	394, 349, 351, 104, 393, 391, 350, 103, 
-	352, 387, 353, 355, 102, 386, 383, 354, 
-	101, 369, 74, 358, 363, 178, 361, 362, 
-	365, 76, 368, 77, 371, 80, 98, 374, 
-	83, 95, 377, 86, 92, 380, 89, 382, 
-	388, 390, 395, 397, 402, 404, 409, 411, 
-	178, 178, 417, 419, 146, 145, 439, 440, 
-	492, 464, 418, 420, 488, 111, 421, 423, 
-	144, 487, 485, 422, 143, 424, 481, 425, 
-	427, 142, 480, 478, 426, 141, 428, 474, 
-	429, 431, 140, 473, 471, 430, 139, 432, 
-	467, 433, 435, 138, 466, 463, 434, 137, 
-	449, 110, 438, 443, 178, 441, 442, 445, 
-	112, 448, 113, 451, 116, 134, 454, 119, 
-	131, 457, 122, 128, 460, 125, 462, 468, 
-	470, 475, 477, 482, 484, 489, 491, 147, 
-	496, 497, 511, 500, 501, 529, 148, 505, 
-	499, 504, 502, 503, 506, 507, 150, 510, 
-	508, 149, 151, 513, 153, 174, 163, 516, 
-	156, 171, 519, 159, 168, 522, 162, 165, 
-	525, 164, 528, 178, 531, 177, 534, 535, 
-	533, 538, 178, 536, 537
+	166, 188, 2, 194, 3, 5, 197, 6, 
+	8, 200, 9, 11, 203, 12, 14, 15, 
+	187, 17, 18, 202, 20, 21, 199, 23, 
+	24, 196, 205, 208, 212, 214, 218, 220, 
+	224, 226, 230, 232, 166, 255, 37, 261, 
+	38, 40, 264, 41, 43, 267, 44, 46, 
+	270, 47, 49, 50, 254, 52, 53, 269, 
+	55, 56, 266, 58, 59, 263, 272, 275, 
+	279, 281, 285, 287, 291, 293, 297, 300, 
+	166, 321, 72, 327, 166, 73, 75, 330, 
+	76, 78, 333, 79, 81, 336, 82, 84, 
+	85, 320, 87, 88, 335, 90, 91, 332, 
+	93, 94, 329, 338, 341, 345, 347, 351, 
+	353, 357, 359, 363, 166, 389, 106, 395, 
+	107, 109, 398, 110, 112, 401, 113, 115, 
+	404, 116, 118, 119, 388, 121, 122, 403, 
+	124, 125, 400, 127, 128, 397, 406, 409, 
+	413, 415, 419, 421, 425, 427, 431, 433, 
+	366, 142, 444, 144, 447, 438, 145, 147, 
+	450, 148, 150, 453, 151, 154, 155, 455, 
+	157, 158, 452, 160, 161, 449, 163, 164, 
+	446, 166, 458, 166, 167, 234, 301, 303, 
+	365, 367, 323, 368, 434, 435, 340, 456, 
+	463, 166, 168, 170, 34, 233, 190, 207, 
+	169, 33, 171, 228, 172, 174, 32, 227, 
+	173, 31, 175, 222, 176, 178, 30, 221, 
+	177, 29, 179, 216, 180, 182, 28, 215, 
+	181, 27, 183, 210, 184, 186, 26, 209, 
+	185, 25, 193, 0, 189, 192, 191, 166, 
+	1, 195, 4, 22, 198, 7, 19, 201, 
+	10, 16, 204, 13, 206, 211, 213, 217, 
+	219, 223, 225, 229, 231, 166, 235, 237, 
+	69, 299, 257, 274, 236, 68, 238, 295, 
+	239, 241, 67, 294, 240, 66, 242, 289, 
+	243, 245, 65, 288, 244, 64, 246, 283, 
+	247, 249, 63, 282, 248, 62, 250, 277, 
+	251, 253, 61, 276, 252, 60, 260, 35, 
+	256, 259, 258, 166, 36, 262, 39, 57, 
+	265, 42, 54, 268, 45, 51, 271, 48, 
+	273, 278, 280, 284, 286, 290, 292, 296, 
+	298, 166, 302, 103, 304, 361, 305, 307, 
+	102, 360, 306, 101, 308, 355, 309, 311, 
+	100, 354, 310, 99, 312, 349, 313, 315, 
+	98, 348, 314, 97, 316, 343, 317, 319, 
+	96, 342, 318, 95, 326, 70, 322, 325, 
+	324, 166, 71, 328, 74, 92, 331, 77, 
+	89, 334, 80, 86, 337, 83, 339, 344, 
+	346, 350, 352, 356, 358, 362, 364, 166, 
+	166, 369, 371, 138, 137, 391, 408, 370, 
+	372, 429, 373, 375, 136, 428, 374, 135, 
+	376, 423, 377, 379, 134, 422, 378, 133, 
+	380, 417, 381, 383, 132, 416, 382, 131, 
+	384, 411, 385, 387, 130, 410, 386, 129, 
+	394, 104, 390, 393, 392, 166, 105, 396, 
+	108, 126, 399, 111, 123, 402, 114, 120, 
+	405, 117, 407, 412, 414, 418, 420, 424, 
+	426, 430, 432, 139, 436, 437, 443, 440, 
+	140, 439, 442, 441, 141, 445, 143, 162, 
+	448, 146, 159, 451, 149, 156, 454, 152, 
+	153, 166, 457, 165, 460, 459, 462, 461, 
+	166
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
-	1, 0, 2, 2, 2, 0, 2, 0, 
-	0, 2, 0, 0, 2, 0, 0, 2, 
-	0, 0, 0, 2, 0, 0, 2, 0, 
-	0, 2, 0, 0, 2, 2, 2, 2, 
-	2, 2, 2, 2, 2, 2, 2, 3, 
-	0, 2, 2, 2, 0, 2, 0, 0, 
-	2, 0, 0, 2, 0, 0, 2, 0, 
-	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 0, 2, 2, 2, 2, 2, 
-	2, 2, 2, 2, 2, 2, 4, 0, 
-	2, 2, 2, 0, 2, 5, 0, 0, 
-	2, 0, 0, 2, 0, 0, 2, 0, 
-	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 0, 2, 2, 6, 2, 6, 
-	2, 6, 2, 6, 2, 7, 0, 2, 
-	2, 2, 0, 2, 0, 0, 2, 0, 
+	1, 0, 0, 2, 0, 0, 2, 0, 
 	0, 2, 0, 0, 2, 0, 0, 0, 
 	2, 0, 0, 2, 0, 0, 2, 0, 
 	0, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 2, 2, 6, 0, 8, 0, 
-	2, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 2, 2, 2, 0, 0, 2, 
+	2, 2, 2, 2, 3, 0, 0, 2, 
 	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 9, 0, 12, 2, 2, 6, 2, 
-	13, 13, 0, 0, 2, 2, 6, 2, 
-	6, 2, 0, 14, 2, 2, 0, 2, 
-	0, 0, 2, 2, 2, 0, 2, 2, 
-	0, 2, 2, 0, 2, 2, 2, 0, 
-	2, 2, 2, 2, 0, 2, 2, 2, 
-	0, 2, 2, 2, 2, 0, 2, 2, 
-	2, 0, 2, 2, 2, 2, 0, 2, 
-	2, 2, 0, 2, 0, 0, 0, 15, 
-	0, 0, 2, 0, 2, 0, 2, 0, 
+	2, 0, 0, 0, 2, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 2, 2, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	4, 0, 0, 2, 5, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 0, 0, 
 	0, 2, 0, 0, 2, 0, 0, 2, 
-	0, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 16, 2, 2, 0, 2, 0, 
-	0, 2, 2, 2, 0, 2, 2, 0, 
-	2, 2, 0, 2, 2, 2, 0, 2, 
-	2, 2, 2, 0, 2, 2, 2, 0, 
-	2, 2, 2, 2, 0, 2, 2, 2, 
-	0, 2, 2, 2, 2, 0, 2, 2, 
-	2, 0, 2, 0, 0, 0, 17, 0, 
-	0, 2, 0, 2, 0, 2, 0, 0, 
+	0, 0, 2, 2, 6, 2, 6, 2, 
+	6, 2, 6, 2, 7, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 0, 0, 
+	2, 0, 0, 0, 2, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 2, 2, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	6, 0, 2, 0, 2, 0, 0, 0, 
+	2, 0, 0, 2, 0, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 0, 0, 
+	2, 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, 
+	0, 2, 0, 0, 2, 0, 0, 2, 
+	0, 0, 2, 0, 2, 2, 2, 2, 
+	2, 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, 0, 2, 0, 0, 
 	2, 0, 0, 2, 0, 0, 2, 0, 
 	2, 2, 2, 2, 2, 2, 2, 2, 
-	2, 18, 6, 0, 6, 6, 0, 6, 
-	2, 0, 6, 2, 6, 0, 6, 6, 
-	6, 2, 0, 6, 2, 6, 0, 6, 
-	6, 6, 2, 0, 6, 2, 6, 0, 
-	6, 6, 6, 2, 0, 6, 2, 6, 
-	0, 6, 0, 0, 0, 19, 0, 0, 
-	2, 0, 2, 0, 2, 0, 0, 2, 
-	0, 0, 2, 0, 0, 2, 0, 2, 
-	2, 2, 2, 2, 2, 2, 2, 2, 
-	20, 21, 2, 2, 0, 0, 0, 0, 
-	2, 2, 2, 2, 2, 0, 2, 2, 
-	0, 2, 2, 2, 0, 2, 2, 2, 
-	2, 0, 2, 2, 2, 0, 2, 2, 
-	2, 2, 0, 2, 2, 2, 0, 2, 
-	2, 2, 2, 0, 2, 2, 2, 0, 
-	2, 0, 0, 0, 22, 0, 0, 2, 
-	0, 2, 0, 2, 0, 0, 2, 0, 
+	2, 17, 6, 0, 6, 6, 6, 0, 
+	0, 6, 6, 0, 6, 6, 6, 0, 
+	0, 6, 6, 0, 6, 6, 6, 0, 
+	0, 6, 6, 0, 6, 6, 6, 0, 
+	0, 6, 6, 0, 6, 0, 0, 0, 
+	0, 18, 0, 2, 0, 0, 2, 0, 
 	0, 2, 0, 0, 2, 0, 2, 2, 
-	2, 2, 2, 2, 2, 2, 2, 0, 
-	0, 8, 2, 0, 0, 2, 0, 2, 
-	0, 0, 0, 0, 8, 8, 0, 8, 
-	8, 0, 0, 2, 0, 0, 0, 2, 
+	2, 2, 2, 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, 0, 2, 
 	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 2, 23, 2, 0, 0, 0, 
-	0, 0, 24, 0, 0
+	2, 0, 2, 2, 2, 2, 2, 2, 
+	2, 2, 2, 0, 0, 22, 2, 0, 
+	0, 0, 0, 0, 0, 2, 0, 0, 
+	2, 0, 0, 2, 0, 0, 2, 0, 
+	0, 23, 2, 0, 0, 0, 0, 0, 
+	24
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1157,9 +940,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, 9, 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, 
@@ -1194,17 +977,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, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 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[] = {
@@ -1228,9 +1001,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, 10, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 11, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1265,17 +1038,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, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 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[] = {
@@ -1283,77 +1046,67 @@
 	1, 1, 1, 1, 1, 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, 40, 40, 
-	40, 40, 40, 40, 40, 40, 40, 40, 
-	40, 40, 40, 40, 40, 40, 40, 40, 
-	40, 40, 40, 40, 40, 40, 40, 40, 
-	40, 40, 40, 40, 40, 40, 40, 40, 
-	40, 40, 79, 79, 79, 79, 86, 86, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 79, 79, 
-	79, 79, 79, 79, 79, 79, 118, 118, 
-	118, 118, 118, 118, 118, 118, 118, 118, 
-	118, 118, 118, 118, 118, 118, 118, 118, 
-	118, 118, 118, 118, 118, 118, 118, 118, 
-	118, 118, 118, 118, 118, 118, 118, 118, 
-	118, 118, 118, 79, 1, 1, 1, 1, 
+	1, 1, 1, 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, 37, 73, 73, 
+	77, 77, 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, 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, 109, 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, 186, 0, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 362, 362, 362, 
-	362, 362, 362, 362, 362, 433, 362, 433, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 434, 434, 
-	434, 434, 434, 434, 434, 434, 362, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 362, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 362, 548, 548, 548, 548, 548, 548, 
-	548, 548, 548, 433
+	1, 1, 1, 1, 1, 170, 0, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 254, 254, 254, 
+	254, 254, 254, 254, 254, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 322, 322, 322, 
+	322, 322, 322, 322, 322, 384, 322, 384, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 385, 385, 385, 385, 385, 385, 
+	385, 385, 322, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	186, 186, 186, 186, 186, 186, 186, 186, 
+	474, 474, 474, 474, 474, 474, 474, 384
 };
 
-static const int indic_syllable_machine_start = 178;
-static const int indic_syllable_machine_first_final = 178;
+static const int indic_syllable_machine_start = 166;
+static const int indic_syllable_machine_first_final = 166;
 static const int indic_syllable_machine_error = -1;
 
-static const int indic_syllable_machine_en_main = 178;
+static const int indic_syllable_machine_en_main = 166;
 
 
 #line 36 "hb-ot-shape-complex-indic-machine.rl"
@@ -1360,7 +1113,7 @@
 
 
 
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -1380,7 +1133,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 1384 "hb-ot-shape-complex-indic-machine.hh"
+#line 1137 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	cs = indic_syllable_machine_start;
 	ts = 0;
@@ -1388,7 +1141,7 @@
 	act = 0;
 	}
 
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 113 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -1397,7 +1150,7 @@
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 1401 "hb-ot-shape-complex-indic-machine.hh"
+#line 1154 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -1407,11 +1160,11 @@
 		goto _test_eof;
 _resume:
 	switch ( _indic_syllable_machine_from_state_actions[cs] ) {
-	case 11:
+	case 10:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 1415 "hb-ot-shape-complex-indic-machine.hh"
+#line 1168 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1433,72 +1186,72 @@
 #line 1 "NONE"
 	{te = p+1;}
 	break;
-	case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+	case 14:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (consonant_syllable); }}
 	break;
-	case 17:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+	case 16:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (vowel_syllable); }}
 	break;
-	case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+	case 21:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (standalone_cluster); }}
 	break;
 	case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (symbol_cluster); }}
 	break;
-	case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+	case 18:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
-	case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+	case 11:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (non_indic_cluster); }}
 	break;
-	case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+	case 13:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (consonant_syllable); }}
 	break;
-	case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+	case 15:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (vowel_syllable); }}
 	break;
-	case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+	case 20:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (standalone_cluster); }}
 	break;
 	case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
-	case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+	case 17:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
-	case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+	case 19:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (non_indic_cluster); }}
 	break;
 	case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
 	break;
 	case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
 	break;
 	case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
 	break;
-	case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+	case 8:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
 	break;
 	case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
 	case 5:
@@ -1516,34 +1269,34 @@
 	}
 	}
 	break;
-	case 8:
+	case 22:
 #line 1 "NONE"
 	{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 1;}
 	break;
 	case 6:
 #line 1 "NONE"
 	{te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 5;}
 	break;
-	case 13:
+	case 12:
 #line 1 "NONE"
 	{te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 6;}
 	break;
-#line 1538 "hb-ot-shape-complex-indic-machine.hh"
+#line 1291 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 _again:
 	switch ( _indic_syllable_machine_to_state_actions[cs] ) {
-	case 10:
+	case 9:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 1547 "hb-ot-shape-complex-indic-machine.hh"
+#line 1300 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	if ( ++p != pe )
@@ -1559,7 +1312,7 @@
 
 	}
 
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 122 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl	2018-01-31 01:11:59 UTC (rev 46498)
@@ -38,7 +38,6 @@
 %%{
 
 # Same order as enum indic_category_t.  Not sure how to avoid duplication.
-X    = 0;
 C    = 1;
 V    = 2;
 N    = 3;
@@ -47,12 +46,10 @@
 ZWJ  = 6;
 M    = 7;
 SM   = 8;
-VD   = 9;
 A    = 10;
 PLACEHOLDER = 11;
 DOTTEDCIRCLE = 12;
 RS    = 13;
-Coeng = 14;
 Repha = 15;
 Ra    = 16;
 CM    = 17;
@@ -62,7 +59,6 @@
 c = (C | Ra);			# is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
 z = ZWJ|ZWNJ;			# is_joiner
-h = H | Coeng;			# is_halant_or_coeng
 reph = (Ra H | Repha);		# possible reph
 
 cn = c.ZWJ?.n?;
@@ -69,12 +65,11 @@
 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}? VD{0,2};
-place_holder = PLACEHOLDER | DOTTEDCIRCLE;
-halant_group = (z?.h.(ZWJ.N?)?);
-final_halant_group = halant_group | h.ZWNJ;
+syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?;
+halant_group = (z?.H.(ZWJ.N?)?);
+final_halant_group = halant_group | H.ZWNJ;
 medial_group = CM?;
-halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?;
+halant_or_matra_group = (final_halant_group | (H.ZWJ)? matra_group{0,4});
 
 
 consonant_syllable =	(Repha|CS)? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -51,7 +51,7 @@
   OT_ZWJ = 6,
   OT_M = 7,
   OT_SM = 8,
-  OT_VD = 9,
+  /* OT_VD = 9, UNUSED; we use OT_A instead. */
   OT_A = 10,
   OT_PLACEHOLDER = 11,
   OT_DOTTEDCIRCLE = 12,
@@ -73,7 +73,6 @@
  * consonant syllable logic from the vowel syllable function and get it all right! */
 #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
 #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
-#define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng))
 
 
 /* Visual positions in a syllable from left to right. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -399,10 +399,10 @@
   switch (u >> 12)
   {
     case 0x0u:
+      if (unlikely (u == 0x00A0u)) return _(CP,x);
       if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
       if (hb_in_range<hb_codepoint_t> (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
-      if (unlikely (u == 0x00A0u)) return _(CP,x);
       break;
 
     case 0x1u:
@@ -412,9 +412,9 @@
       break;
 
     case 0x2u:
+      if (unlikely (u == 0x25CCu)) return _(CP,x);
       if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
       if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
-      if (unlikely (u == 0x25CCu)) return _(CP,x);
       break;
 
     case 0xAu:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -49,7 +49,6 @@
 #define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
 #define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
 #define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
-#define IS_KHMR(u) (IN_HALF_BLOCK (u, 0x1780u))
 
 
 #define MATRA_POS_LEFT(u)	POS_PRE_M
@@ -64,7 +63,6 @@
 				  IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
 				  IS_MLYM(u) ? POS_AFTER_POST : \
 				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  IS_KHMR(u) ? POS_AFTER_POST : \
 				  /*default*/  POS_AFTER_SUB    \
 				)
 #define MATRA_POS_TOP(u)	( /* BENG and MLYM don't have top matras. */ \
@@ -76,7 +74,6 @@
 				  IS_TELU(u) ? POS_BEFORE_SUB : \
 				  IS_KNDA(u) ? POS_BEFORE_SUB : \
 				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  IS_KHMR(u) ? POS_AFTER_POST : \
 				  /*default*/  POS_AFTER_SUB    \
 				)
 #define MATRA_POS_BOTTOM(u)	( \
@@ -90,7 +87,6 @@
 				  IS_KNDA(u) ? POS_BEFORE_SUB : \
 				  IS_MLYM(u) ? POS_AFTER_POST : \
 				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  IS_KHMR(u) ? POS_AFTER_POST : \
 				  /*default*/  POS_AFTER_SUB    \
 				)
 
@@ -124,8 +120,6 @@
   0x0D30u, /* Malayalam */	/* No Reph, Logical Repha */
 
   0x0DBBu, /* Sinhala */		/* Reph formed only with ZWJ */
-
-  0x179Au, /* Khmer */		/* No Reph, Visual Repha */
 };
 
 static inline bool
@@ -158,9 +152,9 @@
 }
 
 static inline bool
-is_halant_or_coeng (const hb_glyph_info_t &info)
+is_halant (const hb_glyph_info_t &info)
 {
-  return is_one_of (info, HALANT_OR_COENG_FLAGS);
+  return is_one_of (info, FLAG (OT_H));
 }
 
 static inline void
@@ -200,14 +194,6 @@
     cat = OT_Symbol;
     static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
   }
-  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
-		     u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
-  {
-    /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
-     * https://github.com/roozbehp/unicode-data/issues/5 */
-    cat = OT_M;
-    pos = POS_ABOVE_C;
-  }
   else if (unlikely (u == 0x0A51u))
   {
     /* https://github.com/harfbuzz/harfbuzz/issues/524 */
@@ -224,7 +210,6 @@
 
   else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
   else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
-  else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
   else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
 				    cat = OT_PLACEHOLDER;
   else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
@@ -244,7 +229,7 @@
   {
     pos = matra_position (u, pos);
   }
-  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_VD) | FLAG (OT_A) | FLAG (OT_Symbol))))
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
   {
     pos = POS_SMVD;
   }
@@ -271,7 +256,6 @@
  */
 
 enum base_position_t {
-  BASE_POS_FIRST,
   BASE_POS_LAST_SINHALA,
   BASE_POS_LAST
 };
@@ -280,13 +264,11 @@
   REPH_POS_BEFORE_SUB  = POS_BEFORE_SUB,
   REPH_POS_AFTER_SUB   = POS_AFTER_SUB,
   REPH_POS_BEFORE_POST = POS_BEFORE_POST,
-  REPH_POS_AFTER_POST  = POS_AFTER_POST,
-  REPH_POS_DONT_CARE   = POS_RA_TO_BECOME_REPH
+  REPH_POS_AFTER_POST  = POS_AFTER_POST
 };
 enum reph_mode_t {
   REPH_MODE_IMPLICIT,  /* Reph formed out of initial Ra,H sequence. */
   REPH_MODE_EXPLICIT,  /* Reph formed out of initial Ra,H,ZWJ sequence. */
-  REPH_MODE_VIS_REPHA, /* Encoded Repha character, no reordering needed. */
   REPH_MODE_LOG_REPHA  /* Encoded Repha character, needs reordering. */
 };
 enum blwf_mode_t {
@@ -319,7 +301,6 @@
   {HB_SCRIPT_MALAYALAM,	true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,	false,0x0DCAu,BASE_POS_LAST_SINHALA,
 						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
-  {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
 };
 
 
@@ -351,7 +332,6 @@
   {HB_TAG('p','s','t','f'), F_NONE},
   {HB_TAG('v','a','t','u'), F_GLOBAL},
   {HB_TAG('c','j','c','t'), F_GLOBAL},
-  {HB_TAG('c','f','a','r'), F_NONE},
   /*
    * Other features.
    * These features are applied all at once, after final_reordering.
@@ -385,7 +365,6 @@
   PSTF,
   _VATU,
   _CJCT,
-  CFAR,
 
   INIT,
   _PRES,
@@ -452,17 +431,6 @@
 static void
 override_features_indic (hb_ot_shape_planner_t *plan)
 {
-  /* Uniscribe does not apply 'kern' in Khmer. */
-  if (hb_options ().uniscribe_bug_compatible)
-  {
-    switch ((hb_tag_t) plan->props.script)
-    {
-      case HB_SCRIPT_KHMER:
-	plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL);
-	break;
-    }
-  }
-
   plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
 }
 
@@ -730,8 +698,7 @@
      *    and has more than one consonant, Ra is excluded from candidates for
      *    base consonants. */
     unsigned int limit = start;
-    if (indic_plan->config->reph_pos != REPH_POS_DONT_CARE &&
-	indic_plan->mask_array[RPHF] &&
+    if (indic_plan->mask_array[RPHF] &&
 	start + 3 <= end &&
 	(
 	 (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
@@ -840,22 +807,6 @@
 	    info[i].indic_position() = POS_BELOW_C;
       }
       break;
-
-      case BASE_POS_FIRST:
-      {
-	/* The first consonant is always the base. */
-
-	assert (indic_plan->config->reph_mode == REPH_MODE_VIS_REPHA);
-	assert (!has_reph);
-
-	base = start;
-
-	/* Mark all subsequent consonants as below. */
-	for (unsigned int i = base + 1; i < end; i++)
-	  if (is_consonant (info[i]))
-	    info[i].indic_position() = POS_BELOW_C;
-      }
-      break;
     }
 
     /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
@@ -910,15 +861,15 @@
   if (base < end)
     info[base].indic_position() = POS_BASE_C;
 
-  /* Mark final consonants.  A final consonant is one appearing after a matra,
-   * like in Khmer. */
+  /* Mark final consonants.  A final consonant is one appearing after a matra.
+   * Happens in Sinhala. */
   for (unsigned int i = base + 1; i < end; i++)
     if (info[i].indic_category() == OT_M) {
       for (unsigned int j = i + 1; j < end; j++)
-        if (is_consonant (info[j])) {
-	  info[j].indic_position() = POS_FINAL_C;
-	  break;
-	}
+	if (is_consonant (info[j])) {
+	 info[j].indic_position() = POS_FINAL_C;
+	 break;
+       }
       break;
     }
 
@@ -969,7 +920,7 @@
     indic_position_t last_pos = POS_START;
     for (unsigned int i = start; i < end; i++)
     {
-      if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | HALANT_OR_COENG_FLAGS)))
+      if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_H))))
       {
 	info[i].indic_position() = last_pos;
 	if (unlikely (info[i].indic_category() == OT_H &&
@@ -1133,17 +1084,6 @@
       {
 	for (unsigned int j = 0; j < pref_len; j++)
 	  info[i++].mask |= indic_plan->mask_array[PREF];
-
-	/* Mark the subsequent stuff with 'cfar'.  Used in Khmer.
-	 * Read the feature spec.
-	 * This allows distinguishing the following cases with MS Khmer fonts:
-	 * U+1784,U+17D2,U+179A,U+17D2,U+1782
-	 * U+1784,U+17D2,U+1782,U+17D2,U+179A
-	 */
-	if (indic_plan->mask_array[CFAR])
-	  for (; i < end; i++)
-	    info[i].mask |= indic_plan->mask_array[CFAR];
-
 	break;
       }
     }
@@ -1311,7 +1251,7 @@
 	  _hb_glyph_info_ligated (&info[i]) &&
 	  _hb_glyph_info_multiplied (&info[i]))
       {
-        /* This will make sure that this glyph passes is_halant_or_coeng() test. */
+        /* This will make sure that this glyph passes is_halant() test. */
 	info[i].indic_category() = OT_H;
 	_hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
       }
@@ -1344,7 +1284,7 @@
 	      /* Ok, this was a 'pref' candidate but didn't form any.
 	       * Base is around here... */
 	      base = i;
-	      while (base < end && is_halant_or_coeng (info[base]))
+	      while (base < end && is_halant (info[base]))
 		base++;
 	      info[base].indic_position() = POS_BASE_C;
 
@@ -1360,7 +1300,7 @@
 	{
 	  while (i < end && is_joiner (info[i]))
 	    i++;
-	  if (i == end || !is_halant_or_coeng (info[i]))
+	  if (i == end || !is_halant (info[i]))
 	    break;
 	  i++; /* Skip halant. */
 	  while (i < end && is_joiner (info[i]))
@@ -1382,7 +1322,7 @@
     base--;
   if (base < end)
     while (start < base &&
-	   is_one_of (info[base], (FLAG (OT_N) | HALANT_OR_COENG_FLAGS)))
+	   is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_H))))
       base--;
 
 
@@ -1408,13 +1348,13 @@
     if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
     {
       while (new_pos > start &&
-	     !(is_one_of (info[new_pos], (FLAG (OT_M) | HALANT_OR_COENG_FLAGS))))
+	     !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H)))))
 	new_pos--;
 
       /* If we found no Halant we are done.
        * Otherwise only proceed if the Halant does
        * not belong to the Matra itself! */
-      if (is_halant_or_coeng (info[new_pos]) &&
+      if (is_halant (info[new_pos]) &&
 	  info[new_pos].indic_position() != POS_PRE_M)
       {
 	/* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
@@ -1481,8 +1421,6 @@
     unsigned int new_reph_pos;
     reph_position_t reph_pos = indic_plan->config->reph_pos;
 
-    assert (reph_pos != REPH_POS_DONT_CARE);
-
     /*       1. If reph should be positioned after post-base consonant forms,
      *          proceed to step 5.
      */
@@ -1504,10 +1442,10 @@
      */
     {
       new_reph_pos = start + 1;
-      while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
 	new_reph_pos++;
 
-      if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
       {
 	/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
 	if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1556,10 +1494,10 @@
     {
       /* Copied from step 2. */
       new_reph_pos = start + 1;
-      while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
 	new_reph_pos++;
 
-      if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
       {
 	/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
 	if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1583,7 +1521,7 @@
        * TEST: U+0930,U+094D,U+0915,U+094B,U+094D
        */
       if (!hb_options ().uniscribe_bug_compatible &&
-	  unlikely (is_halant_or_coeng (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. */
@@ -1644,24 +1582,11 @@
 	  if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
 	  {
 	    while (new_pos > start &&
-		   !(is_one_of (info[new_pos - 1], FLAG(OT_M) | HALANT_OR_COENG_FLAGS)))
+		   !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_H))))
 	      new_pos--;
-
-	    /* In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a
-	     * split matra, it should be reordered to *before* the left part of such matra. */
-	    if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
-	    {
-	      unsigned int old_pos = i;
-	      for (unsigned int j = base + 1; j < old_pos; j++)
-		if (info[j].indic_category() == OT_M)
-		{
-		  new_pos--;
-		  break;
-		}
-	    }
 	  }
 
-	  if (new_pos > start && is_halant_or_coeng (info[new_pos - 1]))
+	  if (new_pos > start && is_halant (info[new_pos - 1]))
 	  {
 	    /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
 	    if (new_pos < end && is_joiner (info[new_pos]))
@@ -1766,13 +1691,6 @@
      * Decompose split matras that don't have Unicode decompositions.
      */
 
-    /* Khmer */
-    case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
-    case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
-    case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
-    case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
-    case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
-
 #if 0
     /* Gujarati */
     /* This one has no decomposition in Unicode, but needs no decomposition either. */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,294 @@
+
+#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
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb-private.hh"
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+static const unsigned char _khmer_syllable_machine_trans_keys[] = {
+	7u, 7u, 1u, 16u, 13u, 13u, 1u, 16u, 7u, 13u, 7u, 7u, 1u, 16u, 13u, 13u, 
+	1u, 16u, 7u, 13u, 1u, 16u, 3u, 14u, 3u, 14u, 5u, 14u, 3u, 14u, 5u, 14u, 
+	8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, 3u, 14u, 5u, 14u, 
+	3u, 14u, 5u, 14u, 8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, 
+	3u, 14u, 7u, 13u, 7u, 7u, 1u, 16u, 0
+};
+
+static const char _khmer_syllable_machine_key_spans[] = {
+	1, 16, 1, 16, 7, 1, 16, 1, 
+	16, 7, 16, 12, 12, 10, 12, 10, 
+	1, 11, 6, 1, 6, 12, 12, 10, 
+	12, 10, 1, 11, 6, 1, 6, 12, 
+	12, 7, 1, 16
+};
+
+static const short _khmer_syllable_machine_index_offsets[] = {
+	0, 2, 19, 21, 38, 46, 48, 65, 
+	67, 84, 92, 109, 122, 135, 146, 159, 
+	170, 172, 184, 191, 193, 200, 213, 226, 
+	237, 250, 261, 263, 275, 282, 284, 291, 
+	304, 317, 325, 327
+};
+
+static const char _khmer_syllable_machine_indicies[] = {
+	1, 0, 2, 2, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 2, 0, 3, 0, 4, 4, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 4, 0, 1, 0, 
+	0, 0, 0, 0, 5, 0, 7, 6, 
+	8, 8, 6, 6, 6, 6, 6, 6, 
+	6, 6, 6, 6, 6, 6, 6, 8, 
+	6, 9, 6, 10, 10, 6, 6, 6, 
+	6, 6, 6, 6, 6, 6, 6, 6, 
+	6, 6, 10, 6, 7, 6, 6, 6, 
+	6, 6, 11, 6, 4, 4, 13, 12, 
+	14, 15, 7, 16, 12, 12, 4, 4, 
+	11, 17, 12, 4, 12, 19, 18, 20, 
+	21, 1, 22, 18, 18, 18, 18, 5, 
+	23, 18, 24, 18, 21, 21, 1, 22, 
+	18, 18, 18, 18, 18, 23, 18, 21, 
+	21, 1, 22, 18, 18, 18, 18, 18, 
+	23, 18, 25, 18, 21, 21, 1, 22, 
+	18, 18, 18, 18, 18, 26, 18, 21, 
+	21, 1, 22, 18, 18, 18, 18, 18, 
+	26, 18, 27, 18, 28, 18, 29, 18, 
+	18, 22, 18, 18, 18, 18, 3, 18, 
+	30, 18, 18, 18, 18, 22, 18, 22, 
+	18, 28, 18, 18, 18, 18, 22, 18, 
+	19, 18, 21, 21, 1, 22, 18, 18, 
+	18, 18, 18, 23, 18, 32, 31, 33, 
+	33, 7, 16, 31, 31, 31, 31, 31, 
+	34, 31, 33, 33, 7, 16, 31, 31, 
+	31, 31, 31, 34, 31, 35, 31, 33, 
+	33, 7, 16, 31, 31, 31, 31, 31, 
+	36, 31, 33, 33, 7, 16, 31, 31, 
+	31, 31, 31, 36, 31, 37, 31, 38, 
+	31, 39, 31, 31, 16, 31, 31, 31, 
+	31, 9, 31, 40, 31, 31, 31, 31, 
+	16, 31, 16, 31, 38, 31, 31, 31, 
+	31, 16, 31, 13, 31, 41, 33, 7, 
+	16, 31, 31, 31, 31, 11, 34, 31, 
+	13, 31, 33, 33, 7, 16, 31, 31, 
+	31, 31, 31, 34, 31, 7, 42, 42, 
+	42, 42, 42, 11, 42, 7, 42, 10, 
+	10, 42, 42, 42, 42, 42, 42, 42, 
+	42, 42, 42, 42, 42, 42, 10, 42, 
+	0
+};
+
+static const char _khmer_syllable_machine_trans_targs[] = {
+	10, 14, 17, 20, 11, 21, 10, 24, 
+	27, 30, 31, 32, 10, 22, 33, 34, 
+	26, 35, 10, 12, 4, 0, 16, 3, 
+	13, 15, 1, 10, 18, 2, 19, 10, 
+	23, 5, 8, 25, 6, 10, 28, 7, 
+	29, 9, 10
+};
+
+static const char _khmer_syllable_machine_trans_actions[] = {
+	1, 2, 2, 0, 2, 2, 3, 2, 
+	2, 0, 2, 2, 6, 2, 0, 0, 
+	0, 0, 7, 2, 0, 0, 0, 0, 
+	2, 2, 0, 8, 0, 0, 0, 9, 
+	2, 0, 0, 2, 0, 10, 0, 0, 
+	0, 0, 11
+};
+
+static const char _khmer_syllable_machine_to_state_actions[] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 4, 0, 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_from_state_actions[] = {
+	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
+};
+
+static const unsigned char _khmer_syllable_machine_eof_trans[] = {
+	1, 1, 1, 1, 1, 7, 7, 7, 
+	7, 7, 0, 19, 19, 19, 19, 19, 
+	19, 19, 19, 19, 19, 19, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 43, 43, 43
+};
+
+static const int khmer_syllable_machine_start = 10;
+static const int khmer_syllable_machine_first_final = 10;
+static const int khmer_syllable_machine_error = -1;
+
+static const int khmer_syllable_machine_en_main = 10;
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
+    for (unsigned int i = last; i < p+1; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    last = p+1; \
+    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 HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 181 "hb-ot-shape-complex-khmer-machine.hh"
+	{
+	cs = khmer_syllable_machine_start;
+	ts = 0;
+	te = 0;
+	act = 0;
+	}
+
+#line 95 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int last = 0;
+  unsigned int syllable_serial = 1;
+  
+#line 198 "hb-ot-shape-complex-khmer-machine.hh"
+	{
+	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 5:
+#line 1 "NONE"
+	{ts = p;}
+	break;
+#line 212 "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 68 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p+1;{ found_syllable (consonant_syllable); }}
+	break;
+	case 10:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p+1;{ found_syllable (broken_cluster); }}
+	break;
+	case 6:
+#line 70 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p+1;{ found_syllable (non_khmer_cluster); }}
+	break;
+	case 7:
+#line 68 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (consonant_syllable); }}
+	break;
+	case 9:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (broken_cluster); }}
+	break;
+	case 11:
+#line 70 "hb-ot-shape-complex-khmer-machine.rl"
+	{te = p;p--;{ found_syllable (non_khmer_cluster); }}
+	break;
+	case 1:
+#line 68 "hb-ot-shape-complex-khmer-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+	break;
+	case 3:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+	break;
+#line 266 "hb-ot-shape-complex-khmer-machine.hh"
+	}
+
+_again:
+	switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
+	case 4:
+#line 1 "NONE"
+	{ts = 0;}
+	break;
+#line 275 "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 104 "hb-ot-shape-complex-khmer-machine.rl"
+
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,107 @@
+/*
+ * 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
+
+#include "hb-private.hh"
+
+%%{
+  machine khmer_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum khmer_category_t.  Not sure how to avoid duplication.
+C    = 1;
+V    = 2;
+N    = 3;
+ZWNJ = 5;
+ZWJ  = 6;
+M    = 7;
+SM   = 8;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+RS    = 13;
+Coeng = 14;
+Ra    = 16;
+
+c = (C | Ra | V);		# is_consonant
+n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
+z = ZWJ|ZWNJ;			# is_joiner
+
+cn = c.n?;
+matra_group = z?.M.N?;
+syllable_tail = (SM.SM?)?;
+
+
+broken_cluster =	n? (Coeng.cn)* matra_group* (Coeng.cn)? syllable_tail;
+consonant_syllable =	(c|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
+other =			any;
+
+main := |*
+	consonant_syllable	=> { found_syllable (consonant_syllable); };
+	broken_cluster		=> { found_syllable (broken_cluster); };
+	other			=> { found_syllable (non_khmer_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
+    for (unsigned int i = last; i < p+1; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    last = p+1; \
+    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 HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].khmer_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int last = 0;
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -0,0 +1,945 @@
+/*
+ * 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
+ */
+
+#include "hb-ot-shape-complex-indic-private.hh"
+#include "hb-ot-layout-private.hh"
+
+/* buffer var allocations */
+#define khmer_category() complex_var_u8_0() /* khmer_category_t */
+#define khmer_position() complex_var_u8_1() /* khmer_position_t */
+
+
+/*
+ * Khmer shaper.
+ */
+
+typedef indic_category_t khmer_category_t;
+typedef indic_position_t khmer_position_t;
+
+
+static inline khmer_position_t
+matra_position (khmer_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:
+      return POS_PRE_M;
+
+    case POS_POST_C:
+    case POS_ABOVE_C:
+    case POS_BELOW_C:
+      return POS_AFTER_POST;
+
+    default:
+      return side;
+  };
+}
+
+static inline bool
+is_one_of (const hb_glyph_info_t &info, unsigned int flags)
+{
+  /* If it ligated, all bets are off. */
+  if (_hb_glyph_info_ligated (&info)) return false;
+  return !!(FLAG_UNSAFE (info.khmer_category()) & flags);
+}
+
+static inline bool
+is_joiner (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, JOINER_FLAGS);
+}
+
+static inline bool
+is_consonant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V));
+}
+
+static inline bool
+is_coeng (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_Coeng));
+}
+
+static inline void
+set_khmer_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+  khmer_position_t pos = (khmer_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
+		     u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
+  {
+    /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
+     * https://github.com/roozbehp/unicode-data/issues/5 */
+    cat = OT_M;
+    pos = POS_ABOVE_C;
+  }
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (u == 0x179Au)
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position (pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  info.khmer_category() = cat;
+  info.khmer_position() = pos;
+}
+
+/*
+ * Things above this line should ideally be moved to the Indic table itself.
+ */
+
+
+/*
+ * Khmer shaper.
+ */
+
+struct feature_list_t {
+  hb_tag_t tag;
+  hb_ot_map_feature_flags_t flags;
+};
+
+static const feature_list_t
+khmer_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied in order, one at a time, after initial_reordering.
+   */
+  {HB_TAG('p','r','e','f'), F_NONE},
+  {HB_TAG('b','l','w','f'), F_NONE},
+  {HB_TAG('a','b','v','f'), F_NONE},
+  {HB_TAG('p','s','t','f'), F_NONE},
+  {HB_TAG('c','f','a','r'), F_NONE},
+  /*
+   * Other features.
+   * These features are applied all at once, after final_reordering.
+   * Default Bengali font in Windows for example has intermixed
+   * lookups for init,pres,abvs,blws features.
+   */
+  {HB_TAG('p','r','e','s'), F_GLOBAL},
+  {HB_TAG('a','b','v','s'), F_GLOBAL},
+  {HB_TAG('b','l','w','s'), F_GLOBAL},
+  {HB_TAG('p','s','t','s'), F_GLOBAL},
+  /* Positioning features, though we don't care about the types. */
+  {HB_TAG('d','i','s','t'), F_GLOBAL},
+  {HB_TAG('a','b','v','m'), F_GLOBAL},
+  {HB_TAG('b','l','w','m'), F_GLOBAL},
+};
+
+/*
+ * Must be in the same order as the khmer_features array.
+ */
+enum {
+  PREF,
+  BLWF,
+  ABVF,
+  PSTF,
+  CFAR,
+
+  _PRES,
+  _ABVS,
+  _BLWS,
+  _PSTS,
+  _DIST,
+  _ABVM,
+  _BLWM,
+
+  KHMER_NUM_FEATURES,
+  KHMER_BASIC_FEATURES = _PRES /* Don't forget to update this! */
+};
+
+static void
+setup_syllables (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);
+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);
+
+static void
+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_global_bool_feature (HB_TAG('l','o','c','l'));
+  /* The Indic specs do not require ccmp, but we apply it here since if
+   * there is a use of it, it's typically at the beginning. */
+  map->add_global_bool_feature (HB_TAG('c','c','m','p'));
+
+
+  unsigned int i = 0;
+  map->add_gsub_pause (initial_reordering);
+  for (; i < KHMER_BASIC_FEATURES; i++) {
+    map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+    map->add_gsub_pause (nullptr);
+  }
+  map->add_gsub_pause (final_reordering);
+  for (; i < KHMER_NUM_FEATURES; i++) {
+    map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+  }
+
+  map->add_global_bool_feature (HB_TAG('c','a','l','t'));
+  map->add_global_bool_feature (HB_TAG('c','l','i','g'));
+
+  map->add_gsub_pause (clear_syllables);
+}
+
+static void
+override_features_khmer (hb_ot_shape_planner_t *plan)
+{
+  /* Uniscribe does not apply 'kern' in Khmer. */
+  if (hb_options ().uniscribe_bug_compatible)
+  {
+    plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL);
+  }
+
+  plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
+}
+
+
+struct would_substitute_feature_t
+{
+  inline 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);
+  }
+
+  inline 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_fast (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
+{
+  ASSERT_POD ();
+
+  inline bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+  {
+    hb_codepoint_t glyph = virama_glyph;
+    if (unlikely (virama_glyph == (hb_codepoint_t) -1))
+    {
+      if (!font->get_nominal_glyph (0x17D2u, &glyph))
+	glyph = 0;
+      /* Technically speaking, the spec says we should apply 'locl' to virama too.
+       * Maybe one day... */
+
+      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
+       * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
+      virama_glyph = glyph;
+    }
+
+    *pglyph = glyph;
+    return glyph != 0;
+  }
+
+  mutable hb_codepoint_t virama_glyph;
+
+  would_substitute_feature_t pref;
+
+  hb_mask_t mask_array[KHMER_NUM_FEATURES];
+};
+
+static void *
+data_create_khmer (const hb_ot_shape_plan_t *plan)
+{
+  khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t));
+  if (unlikely (!khmer_plan))
+    return nullptr;
+
+  khmer_plan->virama_glyph = (hb_codepoint_t) -1;
+
+  khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
+    khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
+				 0 : plan->map.get_1_mask (khmer_features[i].tag);
+
+  return khmer_plan;
+}
+
+static void
+data_destroy_khmer (void *data)
+{
+  free (data);
+}
+
+
+enum syllable_type_t {
+  consonant_syllable,
+  broken_cluster,
+  non_khmer_cluster,
+};
+
+#include "hb-ot-shape-complex-khmer-machine.hh"
+
+static void
+setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		   hb_buffer_t              *buffer,
+		   hb_font_t                *font HB_UNUSED)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, khmer_category);
+  HB_BUFFER_ALLOCATE_VAR (buffer, khmer_position);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    set_khmer_properties (info[i]);
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+}
+
+static int
+compare_khmer_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
+{
+  int a = pa->khmer_position();
+  int b = pb->khmer_position();
+
+  return a < b ? -1 : a == b ? 0 : +1;
+}
+
+
+/* Rules from:
+ * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
+
+static void
+initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
+				       hb_face_t *face,
+				       hb_buffer_t *buffer,
+				       unsigned int start, unsigned int end)
+{
+  const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+  /* 1. Khmer shaping assumes that a syllable will begin with a Cons, IndV, or Number. */
+
+  /* The first consonant is always the base. */
+  unsigned int base = start;
+  info[base].khmer_position() = POS_BASE_C;
+
+  /* Mark all subsequent consonants as below. */
+  for (unsigned int i = base + 1; i < end; i++)
+    if (is_consonant (info[i]))
+      info[i].khmer_position() = POS_BELOW_C;
+
+  /* Mark final consonants.  A final consonant is one appearing after a matra,
+   * like in Khmer. */
+  for (unsigned int i = base + 1; i < end; i++)
+    if (info[i].khmer_category() == OT_M) {
+      for (unsigned int j = i + 1; j < end; j++)
+        if (is_consonant (info[j])) {
+	  info[j].khmer_position() = POS_FINAL_C;
+	  break;
+	}
+      break;
+    }
+
+  /* Attach misc marks to previous char to move with them. */
+  {
+    khmer_position_t last_pos = POS_START;
+    for (unsigned int i = start; i < end; i++)
+    {
+      if ((FLAG_UNSAFE (info[i].khmer_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_Coeng))))
+      {
+	info[i].khmer_position() = last_pos;
+	if (unlikely (info[i].khmer_category() == OT_H &&
+		      info[i].khmer_position() == POS_PRE_M))
+	{
+	  /*
+	   * Uniscribe doesn't move the Halant with Left Matra.
+	   * TEST: U+092B,U+093F,U+094DE
+	   * We follow.  This is important for the Sinhala
+	   * U+0DDA split matra since it decomposes to U+0DD9,U+0DCA
+	   * where U+0DD9 is a left matra and U+0DCA is the virama.
+	   * We don't want to move the virama with the left matra.
+	   * TEST: U+0D9A,U+0DDA
+	   */
+	  for (unsigned int j = i; j > start; j--)
+	    if (info[j - 1].khmer_position() != POS_PRE_M) {
+	      info[i].khmer_position() = info[j - 1].khmer_position();
+	      break;
+	    }
+	}
+      } else if (info[i].khmer_position() != POS_SMVD) {
+        last_pos = (khmer_position_t) info[i].khmer_position();
+      }
+    }
+  }
+  /* For post-base consonants let them own anything before them
+   * since the last consonant or matra. */
+  {
+    unsigned int last = base;
+    for (unsigned int i = base + 1; i < end; i++)
+      if (is_consonant (info[i]))
+      {
+	for (unsigned int j = last + 1; j < i; j++)
+	  if (info[j].khmer_position() < POS_SMVD)
+	    info[j].khmer_position() = info[i].khmer_position();
+	last = i;
+      } else if (info[i].khmer_category() == OT_M)
+        last = i;
+  }
+
+  {
+    /* Use syllable() for sort accounting temporarily. */
+    unsigned int syllable = info[start].syllable();
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = i - start;
+
+    /* Sit tight, rock 'n roll! */
+    hb_stable_sort (info + start, end - start, compare_khmer_order);
+    /* Find base again */
+    base = end;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].khmer_position() == POS_BASE_C)
+      {
+	base = i;
+	break;
+      }
+
+    /* Note!  syllable() is a one-byte field. */
+    for (unsigned int i = base; i < end; i++)
+      if (info[i].syllable() != 255)
+      {
+	unsigned int max = i;
+	unsigned int j = start + info[i].syllable();
+	while (j != i)
+	{
+	  max = MAX (max, j);
+	  unsigned int next = start + info[j].syllable();
+	  info[j].syllable() = 255; /* So we don't process j later again. */
+	  j = next;
+	}
+	if (i != max)
+	  buffer->merge_clusters (i, max + 1);
+      }
+
+    /* Put syllable back in. */
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = syllable;
+  }
+
+  /* Setup masks now */
+
+  {
+    hb_mask_t mask;
+
+    /* Post-base */
+    mask = khmer_plan->mask_array[BLWF] | khmer_plan->mask_array[ABVF] | khmer_plan->mask_array[PSTF];
+    for (unsigned int i = base + 1; i < end; i++)
+      info[i].mask  |= mask;
+  }
+
+  unsigned int pref_len = 2;
+  if (khmer_plan->mask_array[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++) {
+      hb_codepoint_t glyphs[2];
+      for (unsigned int j = 0; j < pref_len; j++)
+        glyphs[j] = info[i + j].codepoint;
+      if (khmer_plan->pref.would_substitute (glyphs, pref_len, face))
+      {
+	for (unsigned int j = 0; j < pref_len; j++)
+	  info[i++].mask |= khmer_plan->mask_array[PREF];
+
+	/* Mark the subsequent stuff with 'cfar'.  Used in Khmer.
+	 * Read the feature spec.
+	 * This allows distinguishing the following cases with MS Khmer fonts:
+	 * 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])
+	  for (; i < end; i++)
+	    info[i].mask |= khmer_plan->mask_array[CFAR];
+
+	break;
+      }
+    }
+  }
+}
+
+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)
+{
+  syllable_type_t syllable_type = (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:
+     initial_reordering_consonant_syllable (plan, face, buffer, start, end);
+     break;
+
+    case non_khmer_cluster:
+      break;
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		       hb_font_t *font,
+		       hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable. */
+  bool has_broken_syllables = false;
+  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)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  set_khmer_properties (dottedcircle);
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && !buffer->in_error)
+  {
+    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))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+      /* TODO Set glyph_props? */
+
+      /* Insert dottedcircle after possible Repha. */
+      while (buffer->idx < buffer->len && !buffer->in_error &&
+	     last_syllable == buffer->cur().syllable() &&
+	     buffer->cur().khmer_category() == OT_Repha)
+        buffer->next_glyph ();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+
+  buffer->swap_buffers ();
+}
+
+static void
+initial_reordering (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)
+    initial_reordering_syllable (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)
+{
+  const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+
+  /* This function relies heavily on halant glyphs.  Lots of ligation
+   * and possibly multiple substitutions happened prior to this
+   * phase, and that might have messed up our properties.  Recover
+   * from a particular case of that where we're fairly sure that a
+   * class of OT_H is desired but has been lost. */
+  if (khmer_plan->virama_glyph)
+  {
+    unsigned int virama_glyph = khmer_plan->virama_glyph;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].codepoint == virama_glyph &&
+	  _hb_glyph_info_ligated (&info[i]) &&
+	  _hb_glyph_info_multiplied (&info[i]))
+      {
+        /* This will make sure that this glyph passes is_coeng() test. */
+	info[i].khmer_category() = OT_H;
+	_hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
+      }
+  }
+
+
+  /* 4. Final reordering:
+   *
+   * After the localized forms and basic shaping forms GSUB features have been
+   * applied (see below), the shaping engine performs some final glyph
+   * reordering before applying all the remaining font features to the entire
+   * syllable.
+   */
+
+  bool try_pref = !!khmer_plan->mask_array[PREF];
+
+  /* Find base again */
+  unsigned int base;
+  for (base = start; base < end; base++)
+    if (info[base].khmer_position() >= POS_BASE_C)
+    {
+      if (try_pref && base + 1 < end)
+      {
+	for (unsigned int i = base + 1; i < end; i++)
+	  if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0)
+	  {
+	    if (!(_hb_glyph_info_substituted (&info[i]) &&
+		  _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+	    {
+	      /* Ok, this was a 'pref' candidate but didn't form any.
+	       * Base is around here... */
+	      base = i;
+	      while (base < end && is_coeng (info[base]))
+		base++;
+	      info[base].khmer_position() = POS_BASE_C;
+
+	      try_pref = false;
+	    }
+	    break;
+	  }
+      }
+
+      if (start < base && info[base].khmer_position() > POS_BASE_C)
+        base--;
+      break;
+    }
+  if (base == end && start < base &&
+      is_one_of (info[base - 1], FLAG (OT_ZWJ)))
+    base--;
+  if (base < end)
+    while (start < base &&
+	   is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_Coeng))))
+      base--;
+
+
+  /*   o Reorder matras:
+   *
+   *     If a pre-base matra character had been reordered before applying basic
+   *     features, the glyph can be moved closer to the main consonant based on
+   *     whether half-forms had been formed. Actual position for the matra is
+   *     defined as “after last standalone halant glyph, after initial matra
+   *     position and before the main consonant”. If ZWJ or ZWNJ follow this
+   *     halant, position is moved after it.
+   */
+
+  if (start + 1 < end && start < base) /* Otherwise there can't be any pre-base matra characters. */
+  {
+    /* If we lost track of base, alas, position before last thingy. */
+    unsigned int new_pos = base == end ? base - 2 : base - 1;
+
+    while (new_pos > start &&
+	   !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_Coeng)))))
+      new_pos--;
+
+    /* If we found no Halant we are done.
+     * Otherwise only proceed if the Halant does
+     * not belong to the Matra itself! */
+    if (is_coeng (info[new_pos]) &&
+	info[new_pos].khmer_position() != POS_PRE_M)
+    {
+      /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+      if (new_pos + 1 < end && is_joiner (info[new_pos + 1]))
+	new_pos++;
+    }
+    else
+      new_pos = start; /* No move. */
+
+    if (start < new_pos && info[new_pos].khmer_position () != POS_PRE_M)
+    {
+      /* Now go see if there's actually any matras... */
+      for (unsigned int i = new_pos; i > start; i--)
+	if (info[i - 1].khmer_position () == POS_PRE_M)
+	{
+	  unsigned int old_pos = i - 1;
+	  if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */
+	    base--;
+
+	  hb_glyph_info_t tmp = info[old_pos];
+	  memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * sizeof (info[0]));
+	  info[new_pos] = tmp;
+
+	  /* 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));
+
+	  new_pos--;
+	}
+    } else {
+      for (unsigned int i = start; i < base; i++)
+	if (info[i].khmer_position () == POS_PRE_M) {
+	  buffer->merge_clusters (i, MIN (end, base + 1));
+	  break;
+	}
+    }
+  }
+
+
+  /*   o Reorder pre-base-reordering consonants:
+   *
+   *     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. */
+  {
+    for (unsigned int i = base + 1; i < end; i++)
+      if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0)
+      {
+	/*       1. Only reorder a glyph produced by substitution during application
+	 *          of the <pref> feature. (Note that a font may shape a Ra consonant with
+	 *          the feature generally but block it in certain contexts.)
+	 */
+        /* Note: We just check that something got substituted.  We don't check that
+	 * the <pref> feature actually did it...
+	 *
+	 * Reorder pref only if it ligated. */
+	if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
+	{
+	  /*
+	   *       2. Try to find a target position the same way as for pre-base matra.
+	   *          If it is found, reorder pre-base consonant glyph.
+	   *
+	   *       3. If position is not found, reorder immediately before main
+	   *          consonant.
+	   */
+
+	  unsigned int new_pos = base;
+	  while (new_pos > start &&
+		 !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_Coeng))))
+	    new_pos--;
+
+	  /* In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a
+	   * split matra, it should be reordered to *before* the left part of such matra. */
+	  if (new_pos > start && info[new_pos - 1].khmer_category() == OT_M)
+	  {
+	    unsigned int old_pos = i;
+	    for (unsigned int j = base + 1; j < old_pos; j++)
+	      if (info[j].khmer_category() == OT_M)
+	      {
+		new_pos--;
+		break;
+	      }
+	  }
+
+	  if (new_pos > start && is_coeng (info[new_pos - 1]))
+	  {
+	    /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+	    if (new_pos < end && is_joiner (info[new_pos]))
+	      new_pos++;
+	  }
+
+	  {
+	    unsigned int old_pos = i;
+
+	    buffer->merge_clusters (new_pos, old_pos + 1);
+	    hb_glyph_info_t tmp = info[old_pos];
+	    memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0]));
+	    info[new_pos] = tmp;
+
+	    if (new_pos <= base && base < old_pos)
+	      base++;
+	  }
+	}
+
+        break;
+      }
+  }
+
+
+  /*
+   * Finish off the clusters and go home!
+   */
+  if (hb_options ().uniscribe_bug_compatible)
+  {
+    /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala.
+     * This means, half forms are submerged into the main consonant's cluster.
+     * This is unnecessary, and makes cursor positioning harder, but that's what
+     * Uniscribe does. */
+    buffer->merge_clusters (start, end);
+  }
+}
+
+
+static void
+final_reordering (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;
+
+  foreach_syllable (buffer, start, end)
+    final_reordering_syllable (plan, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_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;
+}
+
+
+static bool
+decompose_khmer (const hb_ot_shape_normalize_context_t *c,
+		 hb_codepoint_t  ab,
+		 hb_codepoint_t *a,
+		 hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+    /* Khmer */
+    case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
+    case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
+    case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
+    case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
+    case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
+  }
+
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_khmer (const hb_ot_shape_normalize_context_t *c,
+	       hb_codepoint_t  a,
+	       hb_codepoint_t  b,
+	       hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+    return false;
+
+  return (bool) c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer =
+{
+  collect_features_khmer,
+  override_features_khmer,
+  data_create_khmer,
+  data_destroy_khmer,
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  decompose_khmer,
+  compose_khmer,
+  setup_masks_khmer,
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -54,9 +54,10 @@
   HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
-  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
   HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \
   HB_COMPLEX_SHAPER_IMPLEMENT (use) \
@@ -285,7 +286,7 @@
 					      planner->map.language_index[0],
 					      HB_TAG ('p','r','e','f'),
 					      nullptr))
-	return &_hb_ot_complex_shaper_indic;
+	return &_hb_ot_complex_shaper_khmer;
       else
 	return &_hb_ot_complex_shaper_default;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -36,264 +36,281 @@
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	1u, 1u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+	1u, 1u, 12u, 12u, 1u, 15u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 
+	8u, 39u, 8u, 39u, 1u, 15u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 
+	8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 
 	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 
-	8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 
-	21u, 42u, 41u, 42u, 42u, 42u, 1u, 5u, 0
+	8u, 39u, 8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 
+	42u, 42u, 1u, 5u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-	1, 44, 1, 32, 32, 1, 32, 32, 
-	32, 19, 19, 19, 32, 32, 32, 32, 
+	1, 1, 15, 15, 1, 1, 44, 1, 
+	32, 32, 15, 32, 32, 32, 19, 19, 
+	19, 32, 32, 32, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 9, 1, 1, 
+	32, 32, 32, 32, 19, 19, 19, 32, 
 	32, 32, 32, 32, 32, 32, 32, 32, 
-	9, 1, 1, 32, 32, 32, 32, 19, 
-	19, 19, 32, 32, 32, 32, 32, 32, 
-	32, 32, 32, 32, 32, 1, 39, 32, 
-	22, 2, 1, 5
+	32, 32, 15, 1, 39, 32, 22, 2, 
+	1, 5
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 2, 47, 49, 82, 115, 117, 150, 
-	183, 216, 236, 256, 276, 309, 342, 375, 
-	408, 441, 474, 507, 540, 573, 606, 639, 
-	672, 682, 684, 686, 719, 752, 785, 818, 
-	838, 858, 878, 911, 944, 977, 1010, 1043, 
-	1076, 1109, 1142, 1175, 1208, 1241, 1243, 1283, 
-	1316, 1339, 1342, 1344
+	0, 2, 4, 20, 36, 38, 40, 85, 
+	87, 120, 153, 169, 202, 235, 268, 288, 
+	308, 328, 361, 394, 427, 460, 493, 526, 
+	559, 592, 625, 658, 691, 724, 734, 736, 
+	738, 771, 804, 837, 870, 890, 910, 930, 
+	963, 996, 1029, 1062, 1095, 1128, 1161, 1194, 
+	1227, 1260, 1293, 1309, 1311, 1351, 1384, 1407, 
+	1410, 1412
 };
 
 static const char _use_syllable_machine_indicies[] = {
-	1, 0, 2, 3, 4, 2, 5, 3, 
-	4, 4, 6, 4, 4, 1, 7, 4, 
-	4, 4, 2, 2, 8, 9, 4, 4, 
-	10, 11, 12, 13, 14, 15, 16, 10, 
-	17, 18, 19, 20, 21, 22, 4, 23, 
-	24, 25, 4, 4, 4, 26, 4, 28, 
-	27, 30, 29, 29, 31, 32, 29, 29, 
-	29, 29, 29, 29, 29, 29, 33, 34, 
-	35, 36, 37, 38, 39, 40, 34, 41, 
-	33, 42, 43, 44, 45, 29, 46, 47, 
-	48, 29, 30, 29, 29, 31, 32, 29, 
-	29, 29, 29, 29, 29, 29, 29, 49, 
-	34, 35, 36, 37, 38, 39, 40, 34, 
-	41, 42, 42, 43, 44, 45, 29, 46, 
-	47, 48, 29, 31, 50, 30, 29, 29, 
-	31, 32, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 34, 35, 36, 37, 38, 
-	39, 40, 34, 41, 42, 42, 43, 44, 
-	45, 29, 46, 47, 48, 29, 30, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 34, 35, 36, 37, 
-	38, 29, 29, 29, 29, 29, 29, 43, 
-	44, 45, 29, 46, 47, 48, 29, 30, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 35, 36, 
-	37, 38, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 46, 47, 48, 29, 
-	30, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	36, 37, 38, 29, 30, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 37, 38, 29, 
-	30, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 38, 29, 30, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 36, 37, 38, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 46, 47, 48, 29, 30, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 36, 37, 38, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 47, 48, 29, 30, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 36, 37, 
-	38, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 48, 29, 30, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 35, 36, 
-	37, 38, 29, 29, 29, 29, 29, 29, 
-	43, 44, 45, 29, 46, 47, 48, 29, 
-	30, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 35, 
-	36, 37, 38, 29, 29, 29, 29, 29, 
-	29, 29, 44, 45, 29, 46, 47, 48, 
-	29, 30, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	35, 36, 37, 38, 29, 29, 29, 29, 
-	29, 29, 29, 29, 45, 29, 46, 47, 
-	48, 29, 30, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	34, 35, 36, 37, 38, 29, 40, 34, 
-	29, 29, 29, 43, 44, 45, 29, 46, 
-	47, 48, 29, 30, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 34, 35, 36, 37, 38, 29, 51, 
-	34, 29, 29, 29, 43, 44, 45, 29, 
-	46, 47, 48, 29, 30, 29, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 34, 35, 36, 37, 38, 29, 
-	29, 34, 29, 29, 29, 43, 44, 45, 
-	29, 46, 47, 48, 29, 30, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	29, 29, 29, 34, 35, 36, 37, 38, 
-	39, 40, 34, 29, 29, 29, 43, 44, 
-	45, 29, 46, 47, 48, 29, 30, 29, 
-	29, 31, 32, 29, 29, 29, 29, 29, 
-	29, 29, 29, 29, 34, 35, 36, 37, 
-	38, 39, 40, 34, 41, 29, 42, 43, 
-	44, 45, 29, 46, 47, 48, 29, 30, 
-	29, 29, 31, 32, 29, 29, 29, 29, 
-	29, 29, 29, 29, 29, 34, 35, 36, 
-	37, 38, 39, 40, 34, 41, 33, 42, 
-	43, 44, 45, 29, 46, 47, 48, 29, 
-	53, 52, 52, 52, 52, 52, 52, 52, 
-	54, 52, 5, 55, 53, 52, 6, 56, 
-	56, 1, 57, 56, 56, 56, 56, 56, 
-	56, 56, 56, 58, 10, 11, 12, 13, 
-	14, 15, 16, 10, 17, 19, 19, 20, 
-	21, 22, 56, 23, 24, 25, 56, 6, 
-	56, 56, 1, 57, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 10, 11, 12, 
-	13, 14, 15, 16, 10, 17, 19, 19, 
-	20, 21, 22, 56, 23, 24, 25, 56, 
-	6, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 10, 11, 
-	12, 13, 14, 56, 56, 56, 56, 56, 
-	56, 20, 21, 22, 56, 23, 24, 25, 
-	56, 6, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	11, 12, 13, 14, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 23, 24, 
-	25, 56, 6, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 12, 13, 14, 56, 6, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 13, 
-	14, 56, 6, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 14, 56, 6, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 12, 13, 
-	14, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 23, 24, 25, 56, 6, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 12, 
-	13, 14, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 24, 25, 56, 
-	6, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	12, 13, 14, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 25, 
-	56, 6, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	11, 12, 13, 14, 56, 56, 56, 56, 
-	56, 56, 20, 21, 22, 56, 23, 24, 
-	25, 56, 6, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 11, 12, 13, 14, 56, 56, 56, 
-	56, 56, 56, 56, 21, 22, 56, 23, 
-	24, 25, 56, 6, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 11, 12, 13, 14, 56, 56, 
-	56, 56, 56, 56, 56, 56, 22, 56, 
-	23, 24, 25, 56, 6, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 10, 11, 12, 13, 14, 56, 
-	16, 10, 56, 56, 56, 20, 21, 22, 
-	56, 23, 24, 25, 56, 6, 56, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 10, 11, 12, 13, 14, 
-	56, 59, 10, 56, 56, 56, 20, 21, 
-	22, 56, 23, 24, 25, 56, 6, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 10, 11, 12, 13, 
-	14, 56, 56, 10, 56, 56, 56, 20, 
-	21, 22, 56, 23, 24, 25, 56, 6, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 56, 56, 56, 56, 10, 11, 12, 
-	13, 14, 15, 16, 10, 56, 56, 56, 
-	20, 21, 22, 56, 23, 24, 25, 56, 
-	6, 56, 56, 1, 57, 56, 56, 56, 
-	56, 56, 56, 56, 56, 56, 10, 11, 
-	12, 13, 14, 15, 16, 10, 17, 56, 
-	19, 20, 21, 22, 56, 23, 24, 25, 
-	56, 1, 60, 3, 56, 56, 56, 3, 
-	56, 56, 6, 56, 56, 1, 57, 56, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	10, 11, 12, 13, 14, 15, 16, 10, 
-	17, 18, 19, 20, 21, 22, 56, 23, 
-	24, 25, 56, 6, 56, 56, 1, 57, 
-	56, 56, 56, 56, 56, 56, 56, 56, 
-	56, 10, 11, 12, 13, 14, 15, 16, 
-	10, 17, 18, 19, 20, 21, 22, 56, 
-	23, 24, 25, 56, 62, 61, 61, 61, 
-	61, 61, 61, 61, 61, 61, 61, 61, 
-	61, 61, 61, 61, 61, 61, 61, 61, 
-	62, 63, 61, 62, 63, 61, 63, 61, 
-	3, 60, 60, 60, 3, 60, 0
+	1, 0, 3, 2, 1, 2, 2, 2, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	2, 2, 4, 2, 5, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 6, 0, 5, 0, 8, 7, 
+	9, 10, 11, 9, 12, 10, 11, 11, 
+	13, 11, 11, 5, 14, 11, 11, 15, 
+	9, 9, 16, 17, 11, 11, 18, 19, 
+	20, 21, 22, 23, 24, 18, 25, 26, 
+	27, 28, 29, 30, 11, 31, 32, 33, 
+	11, 11, 11, 34, 11, 36, 35, 38, 
+	37, 37, 1, 39, 37, 37, 40, 37, 
+	37, 37, 37, 37, 41, 42, 43, 44, 
+	45, 46, 47, 48, 42, 49, 41, 50, 
+	51, 52, 53, 37, 54, 55, 56, 37, 
+	38, 37, 37, 1, 39, 37, 37, 40, 
+	37, 37, 37, 37, 37, 57, 42, 43, 
+	44, 45, 46, 47, 48, 42, 49, 50, 
+	50, 51, 52, 53, 37, 54, 55, 56, 
+	37, 1, 58, 58, 58, 58, 58, 58, 
+	58, 58, 58, 58, 58, 58, 58, 4, 
+	58, 38, 37, 37, 1, 39, 37, 37, 
+	40, 37, 37, 37, 37, 37, 37, 42, 
+	43, 44, 45, 46, 47, 48, 42, 49, 
+	50, 50, 51, 52, 53, 37, 54, 55, 
+	56, 37, 38, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	42, 43, 44, 45, 46, 37, 37, 37, 
+	37, 37, 37, 51, 52, 53, 37, 54, 
+	55, 56, 37, 38, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 43, 44, 45, 46, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	54, 55, 56, 37, 38, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 44, 45, 46, 37, 
+	38, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 45, 46, 37, 38, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 46, 37, 
+	38, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	44, 45, 46, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 54, 55, 56, 
+	37, 38, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 44, 45, 46, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 55, 
+	56, 37, 38, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 44, 45, 46, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 56, 37, 38, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 43, 44, 45, 46, 37, 37, 
+	37, 37, 37, 37, 51, 52, 53, 37, 
+	54, 55, 56, 37, 38, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 43, 44, 45, 46, 37, 
+	37, 37, 37, 37, 37, 37, 52, 53, 
+	37, 54, 55, 56, 37, 38, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 43, 44, 45, 46, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	53, 37, 54, 55, 56, 37, 38, 37, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 42, 43, 44, 45, 
+	46, 37, 48, 42, 37, 37, 37, 51, 
+	52, 53, 37, 54, 55, 56, 37, 38, 
+	37, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 42, 43, 44, 
+	45, 46, 37, 59, 42, 37, 37, 37, 
+	51, 52, 53, 37, 54, 55, 56, 37, 
+	38, 37, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 42, 43, 
+	44, 45, 46, 37, 37, 42, 37, 37, 
+	37, 51, 52, 53, 37, 54, 55, 56, 
+	37, 38, 37, 37, 37, 37, 37, 37, 
+	37, 37, 37, 37, 37, 37, 37, 42, 
+	43, 44, 45, 46, 47, 48, 42, 37, 
+	37, 37, 51, 52, 53, 37, 54, 55, 
+	56, 37, 38, 37, 37, 1, 39, 37, 
+	37, 40, 37, 37, 37, 37, 37, 37, 
+	42, 43, 44, 45, 46, 47, 48, 42, 
+	49, 37, 50, 51, 52, 53, 37, 54, 
+	55, 56, 37, 38, 37, 37, 1, 39, 
+	37, 37, 40, 37, 37, 37, 37, 37, 
+	37, 42, 43, 44, 45, 46, 47, 48, 
+	42, 49, 41, 50, 51, 52, 53, 37, 
+	54, 55, 56, 37, 61, 60, 60, 60, 
+	60, 60, 60, 60, 62, 60, 12, 63, 
+	61, 60, 13, 64, 64, 5, 8, 64, 
+	64, 65, 64, 64, 64, 64, 64, 66, 
+	18, 19, 20, 21, 22, 23, 24, 18, 
+	25, 27, 27, 28, 29, 30, 64, 31, 
+	32, 33, 64, 13, 64, 64, 5, 8, 
+	64, 64, 65, 64, 64, 64, 64, 64, 
+	64, 18, 19, 20, 21, 22, 23, 24, 
+	18, 25, 27, 27, 28, 29, 30, 64, 
+	31, 32, 33, 64, 13, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 18, 19, 20, 21, 22, 64, 
+	64, 64, 64, 64, 64, 28, 29, 30, 
+	64, 31, 32, 33, 64, 13, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 19, 20, 21, 22, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 31, 32, 33, 64, 13, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 20, 21, 
+	22, 64, 13, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 21, 22, 64, 13, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	22, 64, 13, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 20, 21, 22, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 31, 
+	32, 33, 64, 13, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 20, 21, 22, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 32, 33, 64, 13, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 20, 21, 22, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 33, 64, 13, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 19, 20, 21, 22, 
+	64, 64, 64, 64, 64, 64, 28, 29, 
+	30, 64, 31, 32, 33, 64, 13, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 19, 20, 21, 
+	22, 64, 64, 64, 64, 64, 64, 64, 
+	29, 30, 64, 31, 32, 33, 64, 13, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 19, 20, 
+	21, 22, 64, 64, 64, 64, 64, 64, 
+	64, 64, 30, 64, 31, 32, 33, 64, 
+	13, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 18, 19, 
+	20, 21, 22, 64, 24, 18, 64, 64, 
+	64, 28, 29, 30, 64, 31, 32, 33, 
+	64, 13, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 18, 
+	19, 20, 21, 22, 64, 67, 18, 64, 
+	64, 64, 28, 29, 30, 64, 31, 32, 
+	33, 64, 13, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	18, 19, 20, 21, 22, 64, 64, 18, 
+	64, 64, 64, 28, 29, 30, 64, 31, 
+	32, 33, 64, 13, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 18, 19, 20, 21, 22, 23, 24, 
+	18, 64, 64, 64, 28, 29, 30, 64, 
+	31, 32, 33, 64, 13, 64, 64, 5, 
+	8, 64, 64, 65, 64, 64, 64, 64, 
+	64, 64, 18, 19, 20, 21, 22, 23, 
+	24, 18, 25, 64, 27, 28, 29, 30, 
+	64, 31, 32, 33, 64, 5, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 6, 68, 8, 68, 10, 
+	64, 64, 64, 10, 64, 64, 13, 64, 
+	64, 5, 8, 64, 64, 65, 64, 64, 
+	64, 64, 64, 64, 18, 19, 20, 21, 
+	22, 23, 24, 18, 25, 26, 27, 28, 
+	29, 30, 64, 31, 32, 33, 64, 13, 
+	64, 64, 5, 8, 64, 64, 65, 64, 
+	64, 64, 64, 64, 64, 18, 19, 20, 
+	21, 22, 23, 24, 18, 25, 26, 27, 
+	28, 29, 30, 64, 31, 32, 33, 64, 
+	70, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 70, 71, 69, 70, 
+	71, 69, 71, 69, 10, 68, 68, 68, 
+	10, 68, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-	1, 27, 2, 3, 1, 24, 1, 45, 
-	46, 48, 29, 30, 31, 32, 33, 40, 
-	41, 43, 47, 44, 37, 38, 39, 34, 
-	35, 36, 51, 1, 1, 1, 1, 4, 
-	5, 23, 7, 8, 9, 10, 11, 18, 
-	19, 21, 22, 15, 16, 17, 12, 13, 
-	14, 6, 1, 20, 1, 25, 26, 1, 
-	1, 0, 28, 42, 1, 1, 49, 50
+	6, 9, 6, 2, 0, 32, 4, 6, 
+	3, 7, 8, 6, 29, 6, 50, 51, 
+	52, 54, 34, 35, 36, 37, 38, 45, 
+	46, 48, 53, 49, 42, 43, 44, 39, 
+	40, 41, 57, 6, 6, 6, 6, 10, 
+	1, 28, 12, 13, 14, 15, 16, 23, 
+	24, 26, 27, 20, 21, 22, 17, 18, 
+	19, 11, 6, 25, 6, 30, 31, 6, 
+	6, 5, 33, 47, 6, 6, 55, 56
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-	1, 2, 0, 0, 5, 0, 6, 0, 
-	2, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 2, 2, 0, 0, 0, 0, 
-	0, 0, 0, 7, 8, 9, 10, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 11, 0, 12, 0, 0, 13, 
-	14, 0, 2, 0, 15, 16, 0, 0
+	1, 2, 3, 0, 0, 4, 0, 5, 
+	0, 0, 2, 8, 0, 9, 10, 10, 
+	4, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 4, 4, 0, 0, 0, 0, 
+	0, 0, 0, 11, 12, 13, 14, 15, 
+	0, 2, 0, 0, 0, 0, 0, 0, 
+	0, 0, 2, 0, 0, 0, 0, 0, 
+	0, 2, 16, 0, 17, 0, 0, 18, 
+	19, 0, 4, 0, 20, 21, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-	0, 3, 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
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-	0, 4, 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, 0, 
-	0, 0, 0, 0
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-	1, 0, 28, 30, 30, 51, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	53, 56, 53, 57, 57, 57, 57, 57, 
-	57, 57, 57, 57, 57, 57, 57, 57, 
-	57, 57, 57, 57, 57, 61, 57, 57, 
-	62, 62, 62, 61
+	1, 3, 3, 1, 1, 8, 0, 36, 
+	38, 38, 59, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 61, 64, 61, 
+	65, 65, 65, 65, 65, 65, 65, 65, 
+	65, 65, 65, 65, 65, 65, 65, 65, 
+	65, 65, 69, 69, 65, 65, 70, 70, 
+	70, 69
 };
 
-static const int use_syllable_machine_start = 1;
-static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_start = 6;
+static const int use_syllable_machine_first_final = 6;
 static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 1;
+static const int use_syllable_machine_en_main = 6;
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
@@ -300,7 +317,7 @@
 
 
 
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+#line 141 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -320,7 +337,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 324 "hb-ot-shape-complex-use-machine.hh"
+#line 341 "hb-ot-shape-complex-use-machine.hh"
 	{
 	cs = use_syllable_machine_start;
 	ts = 0;
@@ -328,7 +345,7 @@
 	act = 0;
 	}
 
-#line 161 "hb-ot-shape-complex-use-machine.rl"
+#line 162 "hb-ot-shape-complex-use-machine.rl"
 
 
   p = 0;
@@ -337,7 +354,7 @@
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 341 "hb-ot-shape-complex-use-machine.hh"
+#line 358 "hb-ot-shape-complex-use-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -347,11 +364,11 @@
 		goto _test_eof;
 _resume:
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 4:
+	case 7:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 355 "hb-ot-shape-complex-use-machine.hh"
+#line 372 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -369,72 +386,114 @@
 		goto _again;
 
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
-	case 2:
-#line 1 "NONE"
-	{te = p+1;}
-	break;
-	case 8:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
+	case 12:
+#line 130 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (independent_cluster); }}
 	break;
-	case 10:
-#line 131 "hb-ot-shape-complex-use-machine.rl"
+	case 14:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (standard_cluster); }}
 	break;
-	case 6:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+	case 9:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
-	case 5:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
+	case 8:
+#line 137 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (non_cluster); }}
 	break;
-	case 7:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (independent_cluster); }}
-	break;
 	case 11:
 #line 130 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
+	{te = p;p--;{ found_syllable (independent_cluster); }}
 	break;
-	case 9:
+	case 16:
 #line 131 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (standard_cluster); }}
+	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
 	break;
 	case 13:
 #line 132 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (standard_cluster); }}
+	break;
+	case 18:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
 	break;
-	case 12:
-#line 133 "hb-ot-shape-complex-use-machine.rl"
+	case 17:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (numeral_cluster); }}
 	break;
-	case 16:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+	case 21:
+#line 135 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
-	case 14:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+	case 19:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
-	case 15:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
+	case 20:
+#line 137 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (non_cluster); }}
 	break;
-	case 1:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+	case 3:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (standard_cluster); }}
+	break;
+	case 5:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
-#line 429 "hb-ot-shape-complex-use-machine.hh"
+	case 1:
+#line 1 "NONE"
+	{	switch( act ) {
+	case 2:
+	{{p = ((te))-1;} found_syllable (virama_terminated_cluster); }
+	break;
+	case 3:
+	{{p = ((te))-1;} found_syllable (standard_cluster); }
+	break;
+	case 7:
+	{{p = ((te))-1;} found_syllable (broken_cluster); }
+	break;
+	case 8:
+	{{p = ((te))-1;} found_syllable (non_cluster); }
+	break;
 	}
+	}
+	break;
+	case 15:
+#line 1 "NONE"
+	{te = p+1;}
+#line 131 "hb-ot-shape-complex-use-machine.rl"
+	{act = 2;}
+	break;
+	case 2:
+#line 1 "NONE"
+	{te = p+1;}
+#line 132 "hb-ot-shape-complex-use-machine.rl"
+	{act = 3;}
+	break;
+	case 4:
+#line 1 "NONE"
+	{te = p+1;}
+#line 136 "hb-ot-shape-complex-use-machine.rl"
+	{act = 7;}
+	break;
+	case 10:
+#line 1 "NONE"
+	{te = p+1;}
+#line 137 "hb-ot-shape-complex-use-machine.rl"
+	{act = 8;}
+	break;
+#line 488 "hb-ot-shape-complex-use-machine.hh"
+	}
 
 _again:
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 3:
+	case 6:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 438 "hb-ot-shape-complex-use-machine.hh"
+#line 497 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 	if ( ++p != pe )
@@ -450,7 +509,7 @@
 
 	}
 
-#line 170 "hb-ot-shape-complex-use-machine.rl"
+#line 171 "hb-ot-shape-complex-use-machine.rl"
 
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2018-01-31 01:11:59 UTC (rev 46498)
@@ -89,7 +89,8 @@
 CS	= 43; # CONS_WITH_STACKER
 
 
-consonant_modifiers = CMAbv* CMBlw* ((H B | SUB) VS? CMAbv? CMBlw*)*;
+# Override: Adjoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.H.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
 # Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
 medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
 dependent_vowels = VPre* VAbv* VBlw* VPst*;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -75,9 +75,15 @@
   /* 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,
 
-#define use_offset_0x0900u 80
+#define use_offset_0x0348u 80
 
 
+  /* Combining Diacritical Marks */
+                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
+
+#define use_offset_0x0900u 88
+
+
   /* Devanagari */
 
   /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
@@ -188,7 +194,7 @@
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
 
-#define use_offset_0x1000u 1352
+#define use_offset_0x1000u 1360
 
 
   /* Myanmar */
@@ -204,7 +210,7 @@
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
 
-#define use_offset_0x1700u 1512
+#define use_offset_0x1700u 1520
 
 
   /* Tagalog */
@@ -237,7 +243,7 @@
   /* 17D0 */    FM,  VAbv,     H,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x1900u 1752
+#define use_offset_0x1900u 1760
 
 
   /* Limbu */
@@ -281,7 +287,7 @@
   /* 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,
 
-#define use_offset_0x1b00u 2168
+#define use_offset_0x1b00u 2176
 
 
   /* Balinese */
@@ -307,7 +313,7 @@
   /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
-  /* 1BF0 */  FAbv,  FAbv,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Lepcha */
 
@@ -317,7 +323,7 @@
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre,    FM, 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 2504
+#define use_offset_0x1cd0u 2512
 
 
   /* Vedic Extensions */
@@ -326,13 +332,13 @@
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
   /* 1CF0 */     O,     O, VMPst, VMPst, VMAbv,     O,     O, VMPst, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x1df8u 2552
+#define use_offset_0x1df8u 2560
 
 
   /* Combining Diacritical Marks Supplement */
                                                                          O,     O,     O,    FM,     O,     O,     O,     O,
 
-#define use_offset_0x2008u 2560
+#define use_offset_0x2008u 2568
 
 
   /* General Punctuation */
@@ -339,7 +345,7 @@
                                                                          O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
-#define use_offset_0x2060u 2576
+#define use_offset_0x2060u 2584
 
   /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
@@ -348,7 +354,7 @@
   /* 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,
 
-#define use_offset_0x20f0u 2616
+#define use_offset_0x20f0u 2624
 
 
   /* Combining Diacritical Marks for Symbols */
@@ -355,9 +361,15 @@
 
   /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0xa800u 2624
+#define use_offset_0x25c8u 2632
 
 
+  /* Geometric Shapes */
+                                                                         O,     O,     O,     O,    GB,     O,     O,     O,
+
+#define use_offset_0xa800u 2640
+
+
   /* Syloti Nagri */
 
   /* A800 */     B,     B,     O,     B,     B,     B,  VAbv,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
@@ -442,7 +454,7 @@
   /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
-#define use_offset_0xabc0u 3384
+#define use_offset_0xabc0u 3400
 
 
   /* Meetei Mayek */
@@ -452,7 +464,7 @@
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0xfe00u 3448
+#define use_offset_0xfe00u 3464
 
 
   /* Variation Selectors */
@@ -459,7 +471,7 @@
 
   /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
 
-#define use_offset_0x10a00u 3464
+#define use_offset_0x10a00u 3480
 
 
   /* Kharoshthi */
@@ -470,7 +482,7 @@
   /* 10A30 */     B,     B,     B,     B,     O,     O,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,
 
-#define use_offset_0x11000u 3536
+#define use_offset_0x11000u 3552
 
 
   /* Brahmi */
@@ -482,7 +494,7 @@
   /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
   /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
 
   /* Kaithi */
 
@@ -491,7 +503,7 @@
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11100u 3728
+#define use_offset_0x11100u 3744
 
 
   /* Chakma */
@@ -529,7 +541,7 @@
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
   /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
-#define use_offset_0x11280u 4048
+#define use_offset_0x11280u 4064
 
 
   /* Multani */
@@ -557,7 +569,7 @@
   /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
-#define use_offset_0x11400u 4296
+#define use_offset_0x11400u 4312
 
 
   /* Newa */
@@ -580,7 +592,7 @@
   /* 114C0 */ VMAbv, VMPst,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11580u 4520
+#define use_offset_0x11580u 4536
 
 
   /* Siddham */
@@ -623,7 +635,7 @@
   /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
-#define use_offset_0x11a00u 4968
+#define use_offset_0x11a00u 4984
 
 
   /* Zanabazar Square */
@@ -642,7 +654,7 @@
   /* 11A80 */     B,     B,     B,     B,     O,     O,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
   /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11c00u 5128
+#define use_offset_0x11c00u 5144
 
 
   /* Bhaiksuki */
@@ -663,7 +675,7 @@
   /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
 
-#define use_offset_0x11d00u 5312
+#define use_offset_0x11d00u 5328
 
 
   /* Masaram Gondi */
@@ -675,7 +687,7 @@
   /* 11D40 */ VMAbv, VMAbv, CMBlw,  VAbv,  VBlw,     H,     R,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-}; /* Table items: 5408; occupancy: 73% */
+}; /* Table items: 5424; occupancy: 73% */
 
 USE_TABLE_ELEMENT_TYPE
 hb_use_get_categories (hb_codepoint_t u)
@@ -685,8 +697,8 @@
     case 0x0u:
       if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
       if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
       if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
-      if (unlikely (u == 0x034Fu)) return CGJ;
       break;
 
     case 0x1u:
@@ -702,7 +714,7 @@
       if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
       if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
       if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
-      if (unlikely (u == 0x25CCu)) return GB;
+      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
       break;
 
     case 0xAu:
@@ -727,7 +739,6 @@
       if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11D5Fu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
-      if (unlikely (u == 0x1107Fu)) return HN;
       break;
 
     default:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -442,10 +442,10 @@
 {
   if (!plan->has_kern) return;
 
-  OT::hb_apply_context_t c (1, font, buffer);
+  OT::hb_ot_apply_context_t c (1, font, buffer);
   c.set_lookup_mask (plan->kern_mask);
   c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
-  OT::hb_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
+  OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
   skippy_iter.init (&c);
 
   unsigned int count = buffer->len;
@@ -473,6 +473,7 @@
       pos[idx].x_advance += kern1;
       pos[skippy_iter.idx].x_advance += kern2;
       pos[skippy_iter.idx].x_offset += kern2;
+      buffer->unsafe_to_break (idx, skippy_iter.idx + 1);
     }
 
     if (y_kern)
@@ -482,6 +483,7 @@
       pos[idx].y_advance += kern1;
       pos[skippy_iter.idx].y_advance += kern2;
       pos[skippy_iter.idx].y_offset += kern2;
+      buffer->unsafe_to_break (idx, skippy_iter.idx + 1);
     }
 
     idx = skippy_iter.idx;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -345,9 +345,8 @@
       if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0)
         break;
 
-    /* We are going to do a O(n^2).  Only do this if the sequence is short,
-     * but not too short ;). */
-    if (end - i < 2 || end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
+    /* We are going to do a O(n^2).  Only do this if the sequence is short. */
+    if (end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
       i = end;
       continue;
     }
@@ -373,13 +372,11 @@
   buffer->clear_output ();
   count = buffer->len;
   unsigned int starter = 0;
-  bool combine = true;
   buffer->next_glyph ();
   while (buffer->idx < count && !buffer->in_error)
   {
     hb_codepoint_t composed, glyph;
-    if (combine &&
-	/* We don't try to compose a non-mark character with it's preceding starter.
+    if (/* We don't try to compose a non-mark character with it's preceding starter.
 	 * This is both an optimization to avoid trying to compose every two neighboring
 	 * glyphs in most scripts AND a desired feature for Hangul.  Apparently Hangul
 	 * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
@@ -410,11 +407,6 @@
 
 	continue;
       }
-      else if (/* We sometimes custom-tailor the sorted order of marks. In that case, stop
-		* trying to combine as soon as combining-class drops. */
-	       starter < buffer->out_len - 1 &&
-	       info_cc (buffer->prev()) > info_cc (buffer->cur()))
-        combine = false;
     }
 
     /* Blocked, or doesn't compose. */
@@ -421,11 +413,21 @@
     buffer->next_glyph ();
 
     if (info_cc (buffer->prev()) == 0)
-    {
       starter = buffer->out_len - 1;
-      combine = true;
-    }
   }
   buffer->swap_buffers ();
 
+  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
+  {
+    /* For all CGJ, check if it prevented any reordering at all.
+     * If it did NOT, then make it skippable.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     */
+    for (unsigned int i = 1; i + 1 < buffer->len; i++)
+      if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
+	  info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+      {
+	_hb_glyph_info_unhide (&buffer->info[i]);
+      }
+  }
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -40,6 +40,8 @@
 #include "hb-unicode-private.hh"
 #include "hb-set-private.hh"
 
+#include "hb-ot-layout-gsubgpos-private.hh"
+#include "hb-aat-layout-private.hh"
 
 static hb_tag_t common_features[] = {
   HB_TAG('c','c','m','p'),
@@ -450,7 +452,8 @@
   hb_buffer_t *buffer = c->buffer;
 
   if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
-      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES))
     return;
 
   unsigned int count = buffer->len;
@@ -486,7 +489,8 @@
     return;
 
   hb_codepoint_t space;
-  if (c->font->get_nominal_glyph (' ', &space))
+  if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
+      c->font->get_nominal_glyph (' ', &space))
   {
     /* Replace default-ignorables with a zero-advance space glyph. */
     for (/*continue*/; i < count; i++)
@@ -614,7 +618,8 @@
 
   c->plan->substitute (c->font, buffer);
 
-  return;
+  /* XXX Call morx instead. */
+  //hb_aat_layout_substitute (c->font, c->buffer);
 }
 
 static inline void

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -133,8 +133,8 @@
   protected:
   FixedVersion<>version;	/* Version of the avar table
 				 * initially set to 0x00010000u */
-  UINT16	reserved;	/* This field is permanently reserved. Set to 0. */
-  UINT16	axisCount;	/* The number of variation axes in the font. This
+  HBUINT16	reserved;	/* This field is permanently reserved. Set to 0. */
+  HBUINT16	axisCount;	/* The number of variation axes in the font. This
 				 * must be the same number as axisCount in the
 				 * 'fvar' table. */
   SegmentMaps	axisSegmentMapsZ;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -42,11 +42,11 @@
   }
 
   protected:
-  UINT16	subfamilyNameID;/* The name ID for entries in the 'name' table
+  HBUINT16	subfamilyNameID;/* The name ID for entries in the 'name' table
 				 * that provide subfamily names for this instance. */
-  UINT16	reserved;	/* Reserved for future use — set to 0. */
+  HBUINT16	reserved;	/* Reserved for future use — set to 0. */
   Fixed		coordinates[VAR];/* The coordinates array for this instance. */
-  //UINT16	postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
+  //HBUINT16	postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
   //				  * table that provide PostScript names for this
   //				  * instance. */
 
@@ -67,8 +67,8 @@
   Fixed		minValue;	/* The minimum coordinate value for the axis. */
   Fixed		defaultValue;	/* The default coordinate value for the axis. */
   Fixed		maxValue;	/* The maximum coordinate value for the axis. */
-  UINT16	reserved;	/* Reserved for future use — set to 0. */
-  UINT16	axisNameID;	/* The name ID for entries in the 'name' table that
+  HBUINT16	reserved;	/* Reserved for future use — set to 0. */
+  HBUINT16	axisNameID;	/* The name ID for entries in the 'name' table that
 				 * provide a display name for this axis. */
 
   public:
@@ -188,14 +188,14 @@
 				 * initially set to 0x00010000u */
   Offset16	things;		/* Offset in bytes from the beginning of the table
 				 * to the start of the AxisRecord array. */
-  UINT16	reserved;	/* This field is permanently reserved. Set to 2. */
-  UINT16	axisCount;	/* The number of variation axes in the font (the
+  HBUINT16	reserved;	/* This field is permanently reserved. Set to 2. */
+  HBUINT16	axisCount;	/* The number of variation axes in the font (the
 				 * number of records in the axes array). */
-  UINT16	axisSize;	/* The size in bytes of each VariationAxisRecord —
+  HBUINT16	axisSize;	/* The size in bytes of each VariationAxisRecord —
 				 * set to 20 (0x0014) for this version. */
-  UINT16	instanceCount;	/* The number of named instances defined in the font
+  HBUINT16	instanceCount;	/* The number of named instances defined in the font
 				 * (the number of records in the instances array). */
-  UINT16	instanceSize;	/* The size in bytes of each InstanceRecord — set
+  HBUINT16	instanceSize;	/* The size in bytes of each InstanceRecord — set
 				 * to either axisCount * sizeof(Fixed) + 4, or to
 				 * axisCount * sizeof(Fixed) + 6. */
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -55,7 +55,7 @@
     unsigned int u = 0;
     { /* Fetch it. */
       unsigned int w = get_width ();
-      const UINT8 *p = mapData + w * v;
+      const HBUINT8 *p = mapData + w * v;
       for (; w; w--)
 	u = (u << 8) + *p++;
     }
@@ -78,10 +78,10 @@
   { return (format & 0xF) + 1; }
 
   protected:
-  UINT16	format;		/* A packed field that describes the compressed
+  HBUINT16	format;		/* A packed field that describes the compressed
 				 * representation of delta-set indices. */
-  UINT16	mapCount;	/* The number of mapping entries. */
-  UINT8		mapData[VAR];	/* The delta-set index mapping data. */
+  HBUINT16	mapCount;	/* The number of mapping entries. */
+  HBUINT8		mapData[VAR];	/* The delta-set index mapping data. */
 
   public:
   DEFINE_SIZE_ARRAY (4, mapData);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -43,7 +43,7 @@
 
   public:
   Tag		valueTag;	/* Four-byte tag identifying a font-wide measure. */
-  UINT32		varIdx;		/* Outer/inner index into VariationStore item. */
+  HBUINT32		varIdx;		/* Outer/inner index into VariationStore item. */
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -95,13 +95,13 @@
   protected:
   FixedVersion<>version;	/* Version of the metrics variation table
 				 * initially set to 0x00010000u */
-  UINT16	reserved;	/* Not used; set to 0. */
-  UINT16	valueRecordSize;/* The size in bytes of each value record —
+  HBUINT16	reserved;	/* Not used; set to 0. */
+  HBUINT16	valueRecordSize;/* The size in bytes of each value record —
 				 * must be greater than zero. */
-  UINT16	valueRecordCount;/* The number of value records — may be zero. */
+  HBUINT16	valueRecordCount;/* The number of value records — may be zero. */
   OffsetTo<VariationStore>
 		varStore;	/* Offset to item variation store table. */
-  UINT8		values[VAR];	/* Array of value records. The records must be
+  HBUINT8		values[VAR];	/* Array of value records. The records must be
 				 * in binary order of their valueTag field. */
 
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -29,6 +29,8 @@
 #ifndef HB_PRIVATE_HH
 #define HB_PRIVATE_HH
 
+#define _GNU_SOURCE 1
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -40,6 +42,7 @@
 #define HB_OT_H_IN
 #endif
 
+#include <math.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
@@ -86,8 +89,6 @@
 
 #endif // __cplusplus < 201103L
 
-#define _GNU_SOURCE 1
-
 #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
 #define likely(expr) (__builtin_expect (!!(expr), 1))
 #define unlikely(expr) (__builtin_expect (!!(expr), 0))
@@ -297,9 +298,10 @@
 
 /* Misc */
 
-/* Void! */
-struct _hb_void_t {};
-typedef const _hb_void_t *hb_void_t;
+/*
+ * Void!
+ */
+typedef const struct _hb_void_t *hb_void_t;
 #define HB_VOID ((const _hb_void_t *) nullptr)
 
 /* Return the number of 1 bits in mask. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh	2018-01-31 01:11:59 UTC (rev 46498)
@@ -185,6 +185,7 @@
 
   inline void init (void)
   {
+    in_error = false;
     page_map.init ();
     pages.init ();
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -351,7 +351,7 @@
    * full, PS. All of them point to the same name data with our unique name.
    */
 
-  blob = OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (blob);
+  blob = OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (blob);
 
   unsigned int length, new_length, name_str_len;
   const char *orig_sfnt_data = hb_blob_get_data (blob, &length);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc	2018-01-31 01:11:59 UTC (rev 46498)
@@ -24,7 +24,6 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#include "hb-mutex-private.hh"
 #include "hb-open-file-private.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsubgpos-private.hh"

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2018-01-30 21:06:15 UTC (rev 46497)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2018-01-31 01:11:59 UTC (rev 46498)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [1.7.4])
+m4_define([harfbuzz_version], [1.7.5])



More information about the tex-live-commits mailing list