The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 013
MANIFEST 22
MANIFEST.SKIP 01
META.json 041
META.yml 1919
MYMETA.yml 230
README.TXT 22
buildutils/convert_tags.pl 22
buildutils/convert_tags_from_html.pl 22
lib/Font/TTF/AATKern.pm 22
lib/Font/TTF/AATutils.pm 22
lib/Font/TTF/Anchor.pm 22
lib/Font/TTF/Bsln.pm 22
lib/Font/TTF/Cmap.pm 936
lib/Font/TTF/Coverage.pm 22
lib/Font/TTF/Cvt_.pm 22
lib/Font/TTF/DSIG.pm 813
lib/Font/TTF/Delta.pm 22
lib/Font/TTF/Dumper.pm 22
lib/Font/TTF/EBDT.pm 22
lib/Font/TTF/EBLC.pm 22
lib/Font/TTF/Fdsc.pm 22
lib/Font/TTF/Feat.pm 22
lib/Font/TTF/Features/Cvar.pm 56
lib/Font/TTF/Features/Size.pm 56
lib/Font/TTF/Features/Sset.pm 56
lib/Font/TTF/Fmtx.pm 22
lib/Font/TTF/Font.pm 49
lib/Font/TTF/Fpgm.pm 22
lib/Font/TTF/GDEF.pm 7979
lib/Font/TTF/GPOS.pm 22
lib/Font/TTF/GSUB.pm 1151
lib/Font/TTF/Glat.pm 45
lib/Font/TTF/Gloc.pm 34
lib/Font/TTF/Glyf.pm 22
lib/Font/TTF/Glyph.pm 3244
lib/Font/TTF/GrFeat.pm 167167
lib/Font/TTF/Hdmx.pm 22
lib/Font/TTF/Head.pm 22
lib/Font/TTF/Hhea.pm 22
lib/Font/TTF/Hmtx.pm 22
lib/Font/TTF/Kern/ClassArray.pm 22
lib/Font/TTF/Kern/CompactClassArray.pm 22
lib/Font/TTF/Kern/OrderedList.pm 22
lib/Font/TTF/Kern/StateTable.pm 22
lib/Font/TTF/Kern/Subtable.pm 22
lib/Font/TTF/Kern.pm 55
lib/Font/TTF/LTSH.pm 22
lib/Font/TTF/Loca.pm 33
lib/Font/TTF/Manual.pod 43
lib/Font/TTF/Maxp.pm 22
lib/Font/TTF/Mort/Chain.pm 22
lib/Font/TTF/Mort/Contextual.pm 22
lib/Font/TTF/Mort/Insertion.pm 22
lib/Font/TTF/Mort/Ligature.pm 22
lib/Font/TTF/Mort/Noncontextual.pm 22
lib/Font/TTF/Mort/Rearrangement.pm 22
lib/Font/TTF/Mort/Subtable.pm 22
lib/Font/TTF/Mort.pm 22
lib/Font/TTF/Name.pm 2525
lib/Font/TTF/OS_2.pm 22
lib/Font/TTF/OTTags.pm 93513
lib/Font/TTF/OldCmap.pm 44
lib/Font/TTF/OldMort.pm 22
lib/Font/TTF/PCLT.pm 22
lib/Font/TTF/PSNames.pm 22
lib/Font/TTF/Post.pm 22
lib/Font/TTF/Prep.pm 22
lib/Font/TTF/Prop.pm 22
lib/Font/TTF/Segarr.pm 22
lib/Font/TTF/Silf.pm 34
lib/Font/TTF/Sill.pm 22
lib/Font/TTF/Table.pm 2241
lib/Font/TTF/Ttc.pm 22
lib/Font/TTF/Ttopen.pm 78
lib/Font/TTF/Useall.pm 22
lib/Font/TTF/Utils.pm 22
lib/Font/TTF/Vhea.pm 22
lib/Font/TTF/Vmtx.pm 22
lib/Font/TTF/Win32.pm 22
lib/Font/TTF/Woff/MetaData.pm 112
lib/Font/TTF/Woff/PrivateData.pm 122
lib/Font/TTF/Woff.pm 22
lib/Font/TTF/XMLparse.pm 22
lib/Font/TTF.pm 45
lib/ttfmod.pl 22
t/tags.t 11
87 files changed (This is a version diff) 6821230
@@ -1,3 +1,16 @@
+1.05 (r1069, 2015-01-26)
+
+* Add support for GSUB Type 8 Reverse-chaining substitution
+* OpenType script/lang/feature tags now based on ISO/IEC 14496-22
+* Remove deprecated GDL_old.pm 
+*
+* Bug fixes:
+*    Fix rt.cpan.org 92150, 93597
+*	 Force 0xFFFF sentry to be in a segment by itself in format 4 cmap subtables
+*    Less aggressive cmap format 4 optimization to eliminate USV holes
+*    Fix various issues reading WOFF-compressed font tables
+*    Fix reading DSIG
+
 1.04  (r994, 2014-01-09)
 
 * Bug fixes:
@@ -84,7 +84,6 @@ LICENSE
 Makefile.PL
 MANIFEST			This list of files
 MANIFEST.SKIP
-MYMETA.yml
 README.TXT
 t/OFL.txt
 t/tags.t
@@ -92,4 +91,5 @@ t/testfont.ttf
 t/testfont.woff
 t/ttfcopy.t
 TODO
-META.yml                                 Module meta-data (added by MakeMaker)
+META.yml                                 Module YAML meta-data (added by MakeMaker)
+META.json                                Module JSON meta-data (added by MakeMaker)
@@ -31,3 +31,4 @@ description-pak
 ^doc-pak
 \.swp
 ^\.hg/
+^MYMETA\..*$
@@ -0,0 +1,41 @@
+{
+   "abstract" : "TTF font support for Perl",
+   "author" : [
+      "martin_hosken@sil.org"
+   ],
+   "dynamic_config" : 1,
+   "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.120921",
+   "license" : [
+      "artistic_2"
+   ],
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+      "version" : "2"
+   },
+   "name" : "Font-TTF",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "inc"
+      ]
+   },
+   "prereqs" : {
+      "build" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "configure" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "IO::String" : "0"
+         }
+      }
+   },
+   "release_status" : "stable",
+   "version" : "1.05"
+}
@@ -1,22 +1,22 @@
---- #YAML:1.0
-name:               Font-TTF
-version:            1.04
-abstract:           TTF font support for Perl
+---
+abstract: 'TTF font support for Perl'
 author:
-    - martin_hosken@sil.org
-license:            artistic_2
-distribution_type:  module
-configure_requires:
-    ExtUtils::MakeMaker:  0
+  - martin_hosken@sil.org
 build_requires:
-    ExtUtils::MakeMaker:  0
-requires:
-    IO::String:  0
-no_index:
-    directory:
-        - t
-        - inc
-generated_by:       ExtUtils::MakeMaker version 6.57_05
+  ExtUtils::MakeMaker: 0
+configure_requires:
+  ExtUtils::MakeMaker: 0
+dynamic_config: 1
+generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.120921'
+license: artistic_2
 meta-spec:
-    url:      http://module-build.sourceforge.net/META-spec-v1.4.html
-    version:  1.4
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
+name: Font-TTF
+no_index:
+  directory:
+    - t
+    - inc
+requires:
+  IO::String: 0
+version: 1.05
@@ -1,23 +0,0 @@
----
-abstract: 'TTF font support for Perl'
-author:
-  - martin_hosken@sil.org
-build_requires:
-  ExtUtils::MakeMaker: 0
-configure_requires:
-  ExtUtils::MakeMaker: 0
-distribution_type: module
-dynamic_config: 0
-generated_by: 'ExtUtils::MakeMaker version 6.57_05'
-license: artistic_2
-meta-spec:
-  url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
-name: Font-TTF
-no_index:
-  directory:
-    - t
-    - inc
-requires:
-  IO::String: 0
-version: 1.04
@@ -87,12 +87,12 @@ I do not anticipate any more restructuring changes (but reserve the right to do
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 (see CONTRIBUTORS for other authors).
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -84,11 +84,11 @@ foreach my $tag (sort keys(%iso639list))
 
 =head1 AUTHOR
 
-Bob Hallissy L<Bob_Hallissy@sil.org>
+Bob Hallissy L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org)
+Copyright (c) 1998-2014, SIL International (http://www.sil.org)
 
 This script is released under the terms of the Artistic License 2.0.
 For details, see the full text of the license in the file LICENSE.
@@ -176,11 +176,11 @@ print ");\n";
 
 =head1 AUTHOR
 
-Bob Hallissy L<Bob_Hallissy@sil.org>
+Bob Hallissy L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org)
+Copyright (c) 1998-2014, SIL International (http://www.sil.org)
 
 This script is released under the terms of the Artistic License 2.0.
 For details, see the full text of the license in the file LICENSE.
@@ -133,12 +133,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -696,12 +696,12 @@ sub AAT_write_lookup
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -209,12 +209,12 @@ sub out_xml
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -160,12 +160,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -28,9 +28,7 @@ Number of subtables in this table
 
 An array of subtables ([0..Num-1])
 
-=back
-
-Each subtables also has its own instance variables which are, again, not
+Each subtable also has its own instance variables which are, again, not
 preceded by a space.
 
 =over 4
@@ -57,6 +55,21 @@ A hash keyed by the codepoint value (not a string) storing the glyph id
 
 =back
 
+=back
+
+The following cmap options are controlled by instance variables that start with a space:
+
+=over 4
+
+=item allowholes
+
+By default, when generating format 4 cmap subtables character codes that point to glyph zero
+(normally called .notdef) are not included in the subtable. In some cases including some of these
+character codes can result in a smaller format 4 subtable. To enable this behavior, set allowholes 
+to non-zero. 
+
+=back
+
 =head1 METHODS
 
 =cut
@@ -78,7 +91,7 @@ fill in the segmented array accordingly.
 
 sub read
 {
-    my ($self) = @_;
+    my ($self, $keepzeros) = @_;
     $self->SUPER::read or return $self;
 
     my ($dat, $i, $j, $k, $id, @ids, $s);
@@ -182,7 +195,7 @@ sub read
                     { $id = unpack("n", substr($dat, ($j << 1) + $num * 6 +
                                         2 + ($k - $start) * 2 + $range, 2)) + $delta; }
                     $id -= 65536 if $id >= 65536;
-                    $s->{'val'}{$k} = $id if ($id);
+                    $s->{'val'}{$k} = $id if ($id || $keepzeros);
                 }
             }
         } elsif ($form == 8 || $form == 12 || $form == 13)
@@ -416,7 +429,14 @@ sub out
         {
             my (@starts, @ends, @deltas, @range);
 
-            push(@keys, 0xFFFF) unless ($keys[-1] == 0xFFFF);
+            # There appears to be a bug in Windows that requires the final 0xFFFF (sentry)
+            # to be in a segment by itself -- otherwise Windows 7 and 8 (at least) won't install
+            # or preview the font, complaining that it doesn't appear to be a valid font.
+            # Therefore we can't just add 0XFFFF to the USV list as we used to do:
+            # push(@keys, 0xFFFF) unless ($keys[-1] == 0xFFFF);
+            # Instead, for now *remove* 0xFFFF from the USV list, and add a segement
+            # for it after all the other segments are computed.
+            pop @keys if $keys[-1] == 0xFFFF;
             
             # Step 1: divide into maximal length idDelta runs
             
@@ -444,7 +464,8 @@ sub out
                 next if $ends[$start] - $starts[$start]  >  7;      # if count > 8, we always treat this as a run unto itself
                 for ($end = $start+1; $end <= $#starts; $end++)
                 {
-                    last if $starts[$end] - $ends[$end-1] > 4 || $ends[$end] - $starts[$end] > 7;   # gap > 4 or count > 8 so $end is beyond end of macro-range
+                    last if $starts[$end] - $ends[$end-1] > ($self->{' allowholes'} ? 5 : 1) 
+                        || $ends[$end] - $starts[$end] > 7;   # gap > 4 or count > 8 so $end is beyond end of macro-range
                 }
                 $end--; #Ending index of this macro-range
                 
@@ -473,6 +494,12 @@ sub out
                 # Finished with this macro-range
                 $start = $end;
             }
+
+            # Ok, add the final segment containing the sentry value
+            push(@keys, 0xFFFF);
+            push @starts, 0xFFFF;
+            push @ends, 0xFFFF;
+            push @range, 0;
             
             # What is left is a collection of segments that will represent the cmap in mimimum-sized format 4 subtable
             
@@ -703,12 +730,12 @@ Format 14 (Unicode Variation Sequences) cmaps are not supported.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -335,12 +335,12 @@ sub release
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -74,12 +74,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -23,17 +23,17 @@ sub read
 
     $self->SUPER::read || return $self;
     $self->{' INFILE'}->read($dat, 8);
-    ($self->{'version'}, $self->{'numtables'}, $self->{'perms'}) = unpack("LNN", $dat);
+    ($self->{'version'}, $self->{'numtables'}, $self->{'perms'}) = unpack("Nnn", $dat);
     for ($i = 0; $i < $self->{'numtables'}; $i++)
     {
         $self->{' INFILE'}->read($dat, 12);
-        push (@records, [unpack("L3", $dat)]);
+        push (@records, [unpack("N3", $dat)]);
     }
     foreach $r (@records)
     {
         if ($r->[0] == 1)
         {
-            $self->{' INFILE'}->seek($self->{' OFFSET'} + $r->[2]);
+            $self->{' INFILE'}->seek($self->{' OFFSET'} + $r->[2],0);
             $self->{' INFILE'}->read($dat, $r->[1]);
             push @{$self->{'records'}}, substr($dat, 8);
         }
@@ -41,6 +41,11 @@ sub read
     $self;
 }
 
+sub isempty
+{
+    my ($self) = @_;
+    return $self->read->{'numtables'} == 0;
+}
 
 sub out
 {
@@ -48,16 +53,16 @@ sub out
     my ($i, $curlen);
 
     return $self->SUPER::out($fh) unless $self->{' read'};      # this is never true
-    $fh->print(pack("LNN", $self->{'version'}, $self->{'numtables'}, $self->{'perms'}));
+    $fh->print(pack("Nnn", $self->{'version'}, $self->{'numtables'}, $self->{'perms'}));
     $curlen = 0;
     for ($i = 0; $i < $self->{'numtables'}; $i++)
     {
-        $fh->print(pack("L3", 1, length($self->{'records'}[$i]) + 8, $curlen + $self->{'numtables'} * 12 + 8));
+        $fh->print(pack("N3", 1, length($self->{'records'}[$i]) + 8, $curlen + $self->{'numtables'} * 12 + 8));
         $curlen += length($self->{'records'}[$i]) + 8;
     }
     for ($i = 0; $i < $self->{'numtables'}; $i++)
     {
-        $fh->print(pack("NNL", 0, 0, length($self->{'records'}[$i])));
+        $fh->print(pack("nnN", 0, 0, length($self->{'records'}[$i])));
         $fh->print($self->{'records'}[$i]);
     }
     $self;
@@ -67,12 +72,12 @@ sub out
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -170,12 +170,12 @@ sub out_xml
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -75,12 +75,12 @@ sub myfilter
 
 =head1 AUTHOR
 
-Bob Hallissy L<Bob_Hallissy@sil.org>
+Bob Hallissy L<http://scripts.sil.org/FontUtils>.
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -291,7 +291,7 @@ Only Format 7 is implemented.  XML output is not supported (yet).
 
 =head1 AUTHOR
 
-NIIBE Yutaka L<gniibe@fsij.org>.  
+NIIBE Yutaka L<mailto:gniibe@fsij.org>.  
 This was written at the CodeFest Akihabara 2006 hosted by FSIJ.
 
 ?? patch sent with licensing requirements or not?
@@ -299,7 +299,7 @@ This was written at the CodeFest Akihabara 2006 hosted by FSIJ.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -241,14 +241,14 @@ Only indexFormat ==1 is implemented.  XML output is not supported (yet).
 
 =head1 AUTHOR
 
-NIIBE Yutaka L<gniibe@fsij.org>.  
+NIIBE Yutaka L<mailto:gniibe@fsij.org>.  
 This was written at the CodeFest Akihabara 2006 hosted by FSIJ.
 
 Patch sent with licensing requirements??
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -122,12 +122,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -198,12 +198,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -145,20 +145,21 @@ sub new
     bless $self, $class;
 }
 
+sub out_xml
+{
+}
+
 1;
 
 =head1 AUTHOR
 
-David Raymond L<David_Raymond@sil.org>. 
-
+David Raymond L<http://scripts.sil.org/FontUtils>. 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
-
-
 =cut
@@ -110,21 +110,22 @@ sub new
     bless $self, $class;
 }
 
+sub out_xml
+{
+}
+
 1;
 
 =head1 AUTHOR
 
-David Raymond David_Raymond@sil.org. 
-
+David Raymond L<http://scripts.sil.org/FontUtils>. 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
-
-
 =cut
 
@@ -88,20 +88,21 @@ sub new
     bless $self, $class;
 }
 
+sub out_xml
+{
+}
+
 1;
 
 =head1 AUTHOR
 
-David Raymond L<David_Raymond@sil.org>. 
-
+David Raymond L<http://scripts.sil.org/FontUtils>. 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
-
-
 =cut
@@ -102,12 +102,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -791,6 +791,7 @@ order as per the order in the directory:
 
 May optionally take a list of table names in which case func is called
 for each of them in the given order.
+
 =cut
 
 sub tables_do
@@ -873,10 +874,14 @@ somewhat spurious results for this table type.
 
 Only type 0 & type 2 tables are supported (type 1 & type 3 yet to come).
 
-=item TTC
+=item TTC and WOFF
 
 The current Font::TTF::Font::out method does not support the writing of TrueType
-Collections.
+Collections or WOFF files.
+
+=item DSIG
+
+Haven't figured out how to correctly calculate and output digital signature (DSIG) table
 
 =back
 
@@ -906,12 +911,12 @@ For more details see the appropriate class files.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -80,12 +80,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -99,10 +99,10 @@ use Font::TTF::Ttopen;
 use vars qw(@ISA $new_gdef);
 
 @ISA = qw(Font::TTF::Table);
-$new_gdef = 1;	# Prior to 2012-07, this config variable did more than it does today.
-				# Currently all it does is force the GDEF to include a field in the
-				# header for the MARKS class definition. That is, it makes sure the
-				# font is compatible with at least the OT 1.2 specification.
+$new_gdef = 1;  # Prior to 2012-07, this config variable did more than it does today.
+                # Currently all it does is force the GDEF to include a field in the
+                # header for the MARKS class definition. That is, it makes sure the
+                # font is compatible with at least the OT 1.2 specification.
 
 =head2 $t->read
 
@@ -135,37 +135,37 @@ sub read
     
     if ($self->{'Version'} > 0x00010000)
     {
-    	# Ok, header guaranteed to have both MarAttachClassDef MarkGlyphSetsDef
+        # Ok, header guaranteed to have both MarAttachClassDef MarkGlyphSetsDef
         $fh->read($dat, 4);
         ($macoff, $mgsoff) = TTF_Unpack('S2', $dat);
     }
     else
     {
-    	# What I've seen in other code (examples:
-    	#     http://skia.googlecode.com/svn/trunk/third_party/harfbuzz/src/harfbuzz-gdef.c and
-    	#     http://doxygen.reactos.org/d0/d55/otvalid_8h_a0487daffceceb98ba425bbf2806fbaff.html
-    	# ) is to read GPOS and GDEF and see if any lookups have a
-    	# MarkAttachType in the upper byte of their flag word and if so then assume that the
-    	# MarkAttachClassDef field is in the header. While this is probably the most 
-    	# reliable way to do it, it would require us to read GSUB and GPOS. 
-    	# Prior to 2012-07 what we did is depend on our $new_gdef class variable to tell us
-    	# whether to assume a MarkAttachClassDef. 
-    	# What we do now is see if the header actually has room for the MarkAttachClassDef field.
-    	
-    	my $minOffset = $self->{' LENGTH'};
-    	foreach ($goff, $aoff, $loff)
-    	{
-    		$minOffset = $_ if $_ > 0 && $_ < $minOffset;
-    	}
-    	if ($minOffset >= 12)
-    	{
-    		# There is room for the field, so read it:
-		    $fh->read($dat, 2);
-		    ($macoff) = TTF_Unpack('S', $dat);
-		    # Sanity check:
-		    $macoff = 0 if $macoff >= $self->{' LENGTH'};
-		}
-	}
+        # What I've seen in other code (examples:
+        #     http://skia.googlecode.com/svn/trunk/third_party/harfbuzz/src/harfbuzz-gdef.c and
+        #     http://doxygen.reactos.org/d0/d55/otvalid_8h_a0487daffceceb98ba425bbf2806fbaff.html
+        # ) is to read GPOS and GDEF and see if any lookups have a
+        # MarkAttachType in the upper byte of their flag word and if so then assume that the
+        # MarkAttachClassDef field is in the header. While this is probably the most 
+        # reliable way to do it, it would require us to read GSUB and GPOS. 
+        # Prior to 2012-07 what we did is depend on our $new_gdef class variable to tell us
+        # whether to assume a MarkAttachClassDef. 
+        # What we do now is see if the header actually has room for the MarkAttachClassDef field.
+        
+        my $minOffset = $self->{' LENGTH'};
+        foreach ($goff, $aoff, $loff)
+        {
+            $minOffset = $_ if $_ > 0 && $_ < $minOffset;
+        }
+        if ($minOffset >= 12)
+        {
+            # There is room for the field, so read it:
+            $fh->read($dat, 2);
+            ($macoff) = TTF_Unpack('S', $dat);
+            # Sanity check:
+            $macoff = 0 if $macoff >= $self->{' LENGTH'};
+        }
+    }
 
     if ($goff > 0)
     {
@@ -253,22 +253,22 @@ sub read
     
     if ($mgsoff > 0)
     {
-    	my ($fmt, $count, $off);
-    	$fh->seek($mgsoff + $boff, 0);
-    	$fh->read($dat, 4);
-    	($fmt, $count) = TTF_Unpack('SS', $dat);
-    	# Sanity check opportunity: Could verify $fmt == 1, but I don't.
-    	$self->{'MARKSETS'} = [];
-    	$fh->read($dat, $count << 2);	# NB: These offets are ULONGs!
-    	foreach $off (TTF_Unpack('L*', $dat))
-    	{
+        my ($fmt, $count, $off);
+        $fh->seek($mgsoff + $boff, 0);
+        $fh->read($dat, 4);
+        ($fmt, $count) = TTF_Unpack('SS', $dat);
+        # Sanity check opportunity: Could verify $fmt == 1, but I don't.
+        $self->{'MARKSETS'} = [];
+        $fh->read($dat, $count << 2);   # NB: These offets are ULONGs!
+        foreach $off (TTF_Unpack('L*', $dat))
+        {
             unless (defined $self->{' CACHE'}{$off + $mgsoff})
             {
                 $fh->seek($off + $mgsoff + $boff, 0);
                 $self->{' CACHE'}{$off + $mgsoff} = Font::TTF::Coverage->new(1)->read($fh);
             }
             push @{$self->{'MARKSETS'}}, $self->{' CACHE'}{$off + $mgsoff};
-    	}
+        }
     }
 
     $self;
@@ -291,17 +291,17 @@ sub out
     $loc = $fh->tell();
     if (defined $self->{'MARKSETS'} && @{$self->{'MARKSETS'}} > 0)
     {
-    	$self->{'Version'} = 0x00010002;
-    	$fh->print(TTF_Pack('LSSSSS', $self->{'Version'}, 0, 0, 0, 0, 0));
+        $self->{'Version'} = 0x00010002;
+        $fh->print(TTF_Pack('LSSSSS', $self->{'Version'}, 0, 0, 0, 0, 0));
     }
     else
     {
-    	$self->{'Version'} = 0x00010000;
-	    if ($new_gdef || defined $self->{'MARKS'})
-	    { $fh->print(TTF_Pack('LSSSS', $self->{'Version'}, 0, 0, 0, 0)); }
-	    else
-	    { $fh->print(TTF_Pack('LSSS', $self->{'Version'}, 0, 0, 0)); }
-	}
+        $self->{'Version'} = 0x00010000;
+        if ($new_gdef || defined $self->{'MARKS'})
+        { $fh->print(TTF_Pack('LSSSS', $self->{'Version'}, 0, 0, 0, 0)); }
+        else
+        { $fh->print(TTF_Pack('LSSS', $self->{'Version'}, 0, 0, 0)); }
+    }
 
     if (defined $self->{'GLYPH'})
     {
@@ -372,15 +372,15 @@ sub out
     {
 
         my (@reftables, $ctables, $c, $out); 
-    	$ctables = {};    	
-    	$mgsoff = $fh->tell() - $loc;
-    	$out = TTF_Pack('SS', 1, $#{$self->{'MARKSETS'}}+1);
-    	foreach $c (@{$self->{'MARKSETS'}})
-		{
-			$out .= pack('N', Font::TTF::Ttopen::ref_cache($c, $ctables, length($out), 'N'));
-		}
-		push (@reftables, [$ctables, 0]);
-		Font::TTF::Ttopen::out_final($fh, $out, \@reftables);
+        $ctables = {};      
+        $mgsoff = $fh->tell() - $loc;
+        $out = TTF_Pack('SS', 1, $#{$self->{'MARKSETS'}}+1);
+        foreach $c (@{$self->{'MARKSETS'}})
+        {
+            $out .= pack('N', Font::TTF::Ttopen::ref_cache($c, $ctables, length($out), 'N'));
+        }
+        push (@reftables, [$ctables, 0]);
+        Font::TTF::Ttopen::out_final($fh, $out, \@reftables);
     }
 
     $loc1 = $fh->tell();
@@ -423,50 +423,50 @@ sub update
     
     unless ($Font::TTF::Coverage::dontsort)
     {
-    	if (defined $self->{'ATTACH'} and defined $self->{'ATTACH'}{'COVERAGE'} and !$self->{'ATTACH'}{'COVERAGE'}{'dontsort'} )
-    	{
-    		my @map = $self->{'ATTACH'}{'COVERAGE'}->sort();
-        	if (defined $self->{'ATTACH'}{'POINTS'})
-        	{
-				# And also a POINTS array which now needs to be re-sorted
+        if (defined $self->{'ATTACH'} and defined $self->{'ATTACH'}{'COVERAGE'} and !$self->{'ATTACH'}{'COVERAGE'}{'dontsort'} )
+        {
+            my @map = $self->{'ATTACH'}{'COVERAGE'}->sort();
+            if (defined $self->{'ATTACH'}{'POINTS'})
+            {
+                # And also a POINTS array which now needs to be re-sorted
                 my $newpoints = [];
                 foreach (0 .. $#map)
                 { push @{$newpoints}, $self->{'ATTACH'}{'POINTS'}[$map[$_]]; }
                 $self->{'ATTACH'}{'POINTS'} = $newpoints;
             }
-    	}
-    	if (defined $self->{'LIG'} and defined $self->{'LIG'}{'COVERAGE'} and !$self->{'LIG'}{'COVERAGE'}{'dontsort'} )
-    	{
-    		my @map = $self->{'LIG'}{'COVERAGE'}->sort();
-        	if (defined $self->{'LIG'}{'LIGS'})
-        	{
-				# And also a LIGS array which now needs to be re-sorted
+        }
+        if (defined $self->{'LIG'} and defined $self->{'LIG'}{'COVERAGE'} and !$self->{'LIG'}{'COVERAGE'}{'dontsort'} )
+        {
+            my @map = $self->{'LIG'}{'COVERAGE'}->sort();
+            if (defined $self->{'LIG'}{'LIGS'})
+            {
+                # And also a LIGS array which now needs to be re-sorted
                 my $newligs = [];
                 foreach (0 .. $#map)
                 { push @{$newligs}, $self->{'LIG'}{'LIGS'}[$map[$_]]; }
                 $self->{'LIG'}{'LIGS'} = $newligs;
             }
-    	}
-    	if (defined $self->{'MARKSETS'})
-    	{
-    		foreach (@{$self->{'MARKSETS'}})
-    		{$_->sort();}		# Don't care about map
-    	}
+        }
+        if (defined $self->{'MARKSETS'})
+        {
+            foreach (@{$self->{'MARKSETS'}})
+            {$_->sort();}       # Don't care about map
+        }
     }
     
     $self;
 }
-    	
+
 1;
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -693,12 +693,12 @@ sub out_value
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -44,6 +44,12 @@ The action array is empty (in fact there is no rule array for this type of
 rule) and the ADJUST value should be added to the glyph id to find the replacement
 glyph id value
 
+=item r
+
+The action array is a list of replacement glyphs in coverage order. This ACTION_TYPE
+is used only for Type 8 Reverse Chaining lookups which, by design, are single glyph
+substitution.
+
 =back
 
 =item MATCH_TYPE
@@ -73,11 +79,11 @@ The array holds offsets to coverage tables
 =head1 CORRESPONDANCE TO LAYOUT TYPES
 
 The following table gives the values for ACTION_TYPE and MATCH_TYPE for each
-of the 11 different lookup types found in the GSUB table definition I have:
+of the 12 different lookup types found in the GSUB table definition:
 
-                1.1 1.2 2   3   4   5.1 5.2 5.3 6.1 6.2 6.3
-  ACTION_TYPE    o   g  g   a   g    l   l   l   l   l   l
-  MATCH_TYPE                    g    g   c   o   g   c   o
+                1.1 1.2  2  3  4  5.1 5.2 5.3  6.1 6.2 6.3  8
+  ACTION_TYPE    o   g   g  a  g   l   l   l    l   l   l   r
+  MATCH_TYPE                   g   g   c   o    g   c   o   o
 
 Hopefully, the rest of the uses of the variables should make sense from this
 table.
@@ -173,6 +179,34 @@ sub read_sub
         }
         $lookup->{'ACTION_TYPE'} = 'g';
         $lookup->{'MATCH_TYPE'} = 'g';
+    } elsif ($type == 8)
+    {
+        $t = {};
+        unless ($count == 0)
+        {
+            @subst = ();
+            $fh->read($dat, $count << 1);
+            foreach $s (TTF_Unpack('S*', $dat))
+            { push(@subst, $self->read_cover($s, $loc, $lookup, $fh, 1)); }
+            $t->{'PRE'} = [@subst];
+        }
+        $fh->read($dat, 2);
+        $count = TTF_Unpack('S', $dat);
+        unless ($count == 0)
+        {
+            @subst = ();
+            $fh->read($dat, $count << 1);
+            foreach $s (TTF_Unpack('S*', $dat))
+            { push(@subst, $self->read_cover($s, $loc, $lookup, $fh, 1)); }
+            $t->{'POST'} = [@subst];
+        }
+        $fh->read($dat, 2);
+        $count = TTF_Unpack('S', $dat);
+        $fh->read($dat, $count << 1);
+        $t->{'ACTION'} = [TTF_Unpack('S*', $dat)];
+        $lookup->{'RULES'} = [[$t]];
+        $lookup->{'ACTION_TYPE'} = 'r';
+        $lookup->{'MATCH_TYPE'} = 'o';
     } elsif ($type == 5 || $type == 6)
     { $self->read_context($lookup, $fh, $type, $fmt, $cover, $count, $loc); }
     $lookup;
@@ -229,6 +263,17 @@ sub out_sub
             substr($out, ($i << 1) + 6, 2) = pack('n', $offc);
             $offc = length($out);
         }
+    } elsif ($type == 8)
+    {
+        $out = pack("nn", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base));
+        $r = $lookup->{'RULES'}[0][0];
+        $out .= pack('n', defined $r->{'PRE'} ? scalar @{$r->{'PRE'}} : 0);
+        foreach $t (@{$r->{'PRE'}})
+        { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); }
+        $out .= pack('n', defined $r->{'POST'} ? scalar @{$r->{'POST'}} : 0);
+        foreach $t (@{$r->{'POST'}})
+        { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); }
+        $out .= pack("n*", $#{$r->{'ACTION'}} + 1, @{$r->{'ACTION'}});
     } elsif ($type == 4 || $type == 5 || $type == 6)
     { $out = $self->out_context($lookup, $fh, $type, $fmt, $ctables, $out, $num, $base); }
 #    Font::TTF::Ttopen::out_final($fh, $out, [[$ctables, 0]]);
@@ -237,18 +282,13 @@ sub out_sub
 
 1;
 
-=head1 BUGS
-
-Does not yet support lookup type 8 (Reverse Chaining Contextual Single Substitution)
-
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
-
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -1,6 +1,6 @@
 package Font::TTF::Glat;
 
-=head1 TITLE
+=head1 NAME
 
 Font::TTF::Glat - Hold glyph attributes
 
@@ -30,13 +30,14 @@ use vars qw(@ISA);
 sub read
 {
     my ($self) = @_;
+    $self->SUPER::read or return $self;
+
     my ($gloc) = $self->{' PARENT'}{'Gloc'};
     my ($fh) = $self->{' INFILE'};
     my ($numGlyphs);
     my ($base) = $self->{' OFFSET'};
     my ($dat, $i);
 
-    $self->SUPER::read or return $self;
     $gloc->read;
     $numGlyphs = $gloc->{'numGlyphs'};
     $fh->seek($base, 0);
@@ -130,12 +131,12 @@ sub minsize
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -38,11 +38,12 @@ use vars qw(@ISA);
 sub read
 {
     my ($self) = @_;
+    $self->SUPER::read or return $self;
+
     my ($fh) = $self->{' INFILE'};
     my ($numGlyphs);
     my ($dat, $flags);
 
-    $self->SUPER::read or return $self;
     $fh->read($dat, 4);
     ($self->{'Version'}) = TTF_Unpack("v", $dat);
     $fh->read($dat, 4);
@@ -102,12 +103,12 @@ sub minsize
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -163,12 +163,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -16,13 +16,27 @@ In addition to the named variables in a glyph header (C<xMin> etc.), there are
 also all capital instance variables for holding working information, mostly
 from the location table.
 
+=head2 Variables for all glyphs:
+
 The standard attributes each glyph has are:
 
- numberOfContours
- xMin
- yMin
- xMax
- yMax
+=over 4
+
+=item numberOfContours
+
+For simple glyphs this will be the count of contours. For compound glyphs this will be -1.
+
+=item xMin
+
+=item yMin
+
+=item xMax
+
+=item yMax
+
+These identify the bounding box of the glyph.
+
+=back
 
 There are also other, derived, instance variables for each glyph which are read
 when the whole glyph is read (via C<read_dat>):
@@ -40,11 +54,7 @@ The string containing the hinting code for the glyph
 
 =back
 
-In addition there are other attribute like instance variables for simple glyphs:
-
-=over 4
-
-For each contour there is:
+=head2 Variables for simple glyphs (numberOfContours E<gt>= 0):
 
 =over 4
 
@@ -54,9 +64,13 @@ An array of endpoints for each contour in the glyph. There are
 C<numberOfContours> contours in a glyph. The number of points in a glyph is
 equal to the highest endpoint of a contour.
 
+=item numPoints
+
+This is a generated value which contains the total number of points for this simple glyph.
+
 =back
 
-There are also a number of arrays indexed by point number
+There are also a number of arrays indexed by point number:
 
 =over 4
 
@@ -77,9 +91,7 @@ The absolute y co-ordinate of the point
 
 =back
 
-=back
-
-For composite glyphs there are other variables
+=head2 Variables for compound glyphs (numberOfContours == -1):
 
 =over 4
 
@@ -128,7 +140,7 @@ compound glyph.
 
 =back
 
-The private instance variables are:
+=head2 Private instance variables:
 
 =over 4
 
@@ -545,26 +557,26 @@ sub update
             }
             if ($i > 0 && $rflags[-1] == $flag && $repeat < 255)
             {
-            	$repeat++;
+                $repeat++;
             } else
             {
-            	if ($repeat)
-            	{
-            		$rflags[-1] |= 8;
-            		push @rflags, $repeat;
-            	}
-            	push @rflags, $flag;
-            	$repeat = 0;
+                if ($repeat)
+                {
+                    $rflags[-1] |= 8;
+                    push @rflags, $repeat;
+                }
+                push @rflags, $flag;
+                $repeat = 0;
             } 
             $self->{'flags'}[$i] = $flag;
         }
-		# Add final repeat if needed, then pack up the flag bytes:
-    	if ($repeat)
-    	{
-    		$rflags[-1] |= 8;
-    		push @rflags, $repeat;
-    	}
-        $self->{' DAT'} .= pack("C*", @rflags);	
+        # Add final repeat if needed, then pack up the flag bytes:
+        if ($repeat)
+        {
+            $rflags[-1] |= 8;
+            push @rflags, $repeat;
+        }
+        $self->{' DAT'} .= pack("C*", @rflags); 
         for ($i = 0; $i < $self->{'numPoints'}; $i++)
         {
             $flag = $self->{'flags'}[$i];
@@ -874,12 +886,12 @@ C<update> doesn't re-calculate the bounding box or C<numberOfContours>.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -63,54 +63,54 @@ Reads the features from the TTF file into memory
 
 sub read
 {
-	my ($self) = @_;
-	my ($featureCount, $features);
-
-	return $self if $self->{' read'};
-	$self->SUPER::read_dat or return $self;
-
-	($self->{'version'}, $featureCount) = TTF_Unpack("vS", $self->{' dat'});
-
-	$features = [];
-	foreach (1 .. $featureCount) {
-		my ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex, $reserved);
-		if ($self->{'version'} == 1)
-		{
-			($feature, $nSettings, $settingTable, $featureFlags, $nameIndex)
-				= TTF_Unpack("SSLSS", substr($self->{' dat'}, $_ * 12, 12));
-			#The version 1 Feat table ends with a feature (id 1) named NoName
-			#with zero settings but with an offset to the last entry in the setting
-			#array. This last setting has id 0 and an invalid name id. This last
-			#feature is changed to have one setting.
-			if ($_ == $featureCount && $nSettings == 0) {$nSettings = 1;}
-		}
-		else #version == 2
-			{($feature, $nSettings, $reserved, $settingTable, $featureFlags, $nameIndex)
-				= TTF_Unpack("LSSLSS", substr($self->{' dat'}, 12 + ($_ - 1) * 16, 16))};
-		$feature = 
-			{
-				'feature'	=> $feature,
-				'name'		=> $nameIndex,
-			};
-			
-		#interpret the featureFlags & store settings
-		$feature->{'exclusive'} = (($featureFlags & 0x8000) != 0);
-		
-		my @settings = TTF_Unpack("S*", substr($self->{' dat'}, $settingTable, $nSettings * 4));
-		if ($featureFlags & 0x4000)
-			{$feature->{'default'} = $featureFlags & 0x00FF;}
-		else
-			{$feature->{'default'} = $settings[0];}
-		$feature->{'settings'} = {@settings};
-		
-		push(@$features, $feature);
-	}
-	
-	$self->{'features'} = $features;
-	
-	delete $self->{' dat'}; # no longer needed, and may become obsolete
-	$self->{' read'} = 1;
-	$self;
+    my ($self) = @_;
+    my ($featureCount, $features);
+
+    return $self if $self->{' read'};
+    $self->SUPER::read_dat or return $self;
+
+    ($self->{'version'}, $featureCount) = TTF_Unpack("vS", $self->{' dat'});
+
+    $features = [];
+    foreach (1 .. $featureCount) {
+        my ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex, $reserved);
+        if ($self->{'version'} == 1)
+        {
+            ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex)
+                = TTF_Unpack("SSLSS", substr($self->{' dat'}, $_ * 12, 12));
+            #The version 1 Feat table ends with a feature (id 1) named NoName
+            #with zero settings but with an offset to the last entry in the setting
+            #array. This last setting has id 0 and an invalid name id. This last
+            #feature is changed to have one setting.
+            if ($_ == $featureCount && $nSettings == 0) {$nSettings = 1;}
+        }
+        else #version == 2
+            {($feature, $nSettings, $reserved, $settingTable, $featureFlags, $nameIndex)
+                = TTF_Unpack("LSSLSS", substr($self->{' dat'}, 12 + ($_ - 1) * 16, 16))};
+        $feature = 
+            {
+                'feature'   => $feature,
+                'name'      => $nameIndex,
+            };
+            
+        #interpret the featureFlags & store settings
+        $feature->{'exclusive'} = (($featureFlags & 0x8000) != 0);
+        
+        my @settings = TTF_Unpack("S*", substr($self->{' dat'}, $settingTable, $nSettings * 4));
+        if ($featureFlags & 0x4000)
+            {$feature->{'default'} = $featureFlags & 0x00FF;}
+        else
+            {$feature->{'default'} = $settings[0];}
+        $feature->{'settings'} = {@settings};
+        
+        push(@$features, $feature);
+    }
+    
+    $self->{'features'} = $features;
+    
+    delete $self->{' dat'}; # no longer needed, and may become obsolete
+    $self->{' read'} = 1;
+    $self;
 }
 
 =head2 $t->out($fh)
@@ -121,58 +121,58 @@ Writes the features to a TTF file
 
 sub out
 {
-	my ($self, $fh) = @_;
-	my ($features, $numFeatures, $settings, $featureFlags, $featuresData, $settingsData);
-	
-	return $self->SUPER::out($fh) unless $self->{' read'};
-
-	$features = $self->{'features'};
-	$numFeatures = @$features;
-	$featuresData = $settingsData = '';
-
-	foreach (@$features) {
-		$settings = $_->{'settings'};
-		$featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000);
-		
-#		output default setting first instead of using the featureFlags (as done below)
-#		$featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000) |
-#								($_->{'default'} != 0 ? 0x4000 | ($_->{'default'} & 0x00FF) 
-#														: 0x0000);
-		if ($self->{'version'} == 1)
-		{
-			$featuresData .= TTF_Pack("SSLSS",
-										$_->{'feature'},
-										scalar keys %$settings,
-										12 + 12 * $numFeatures + length $settingsData,
-										$featureFlags, 
-										$_->{'name'});
-		}
-		else #version == 2
-		{
-			$featuresData .= TTF_Pack("LSSLSS",
-										$_->{'feature'},
-										scalar keys %$settings,
-										0, 
-										12 + 16 * $numFeatures + length $settingsData,
-										$featureFlags, 
-										$_->{'name'});
-		}
-		
-		#output default setting first
-		#the settings may not be in their original order
-		my $defaultSetting = $_->{'default'};
-		$settingsData .= TTF_Pack("SS", $defaultSetting, $settings->{$defaultSetting});
-		foreach (sort {$a <=> $b} keys %$settings) {
-			if ($_ == $defaultSetting) {next;} #skip default setting
-			$settingsData .= TTF_Pack("SS", $_, $settings->{$_});
-		}
-	}
-
-	$fh->print(TTF_Pack("vSSL", $self->{'version'}, $numFeatures, 0, 0));
-	$fh->print($featuresData);
-	$fh->print($settingsData);
-
-	$self;
+    my ($self, $fh) = @_;
+    my ($features, $numFeatures, $settings, $featureFlags, $featuresData, $settingsData);
+    
+    return $self->SUPER::out($fh) unless $self->{' read'};
+
+    $features = $self->{'features'};
+    $numFeatures = @$features;
+    $featuresData = $settingsData = '';
+
+    foreach (@$features) {
+        $settings = $_->{'settings'};
+        $featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000);
+        
+#       output default setting first instead of using the featureFlags (as done below)
+#       $featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000) |
+#                               ($_->{'default'} != 0 ? 0x4000 | ($_->{'default'} & 0x00FF) 
+#                                                       : 0x0000);
+        if ($self->{'version'} == 1)
+        {
+            $featuresData .= TTF_Pack("SSLSS",
+                                        $_->{'feature'},
+                                        scalar keys %$settings,
+                                        12 + 12 * $numFeatures + length $settingsData,
+                                        $featureFlags, 
+                                        $_->{'name'});
+        }
+        else #version == 2
+        {
+            $featuresData .= TTF_Pack("LSSLSS",
+                                        $_->{'feature'},
+                                        scalar keys %$settings,
+                                        0, 
+                                        12 + 16 * $numFeatures + length $settingsData,
+                                        $featureFlags, 
+                                        $_->{'name'});
+        }
+        
+        #output default setting first
+        #the settings may not be in their original order
+        my $defaultSetting = $_->{'default'};
+        $settingsData .= TTF_Pack("SS", $defaultSetting, $settings->{$defaultSetting});
+        foreach (sort {$a <=> $b} keys %$settings) {
+            if ($_ == $defaultSetting) {next;} #skip default setting
+            $settingsData .= TTF_Pack("SS", $_, $settings->{$_});
+        }
+    }
+
+    $fh->print(TTF_Pack("vSSL", $self->{'version'}, $numFeatures, 0, 0));
+    $fh->print($featuresData);
+    $fh->print($settingsData);
+
+    $self;
 }
 
 =head2 $t->minsize()
@@ -195,52 +195,52 @@ Prints a human-readable representation of the table
 
 sub print
 {
-	my ($self, $fh) = @_;
-	my ($names, $features, $settings);
-
-	$self->read;
-
-	$names = $self->{' PARENT'}->{'name'};
-	$names->read;
-
-	$fh = 'STDOUT' unless defined $fh;
-
-	$features = $self->{'features'};
-	foreach (@$features) {
-		$fh->printf("Feature %s, %s, default: %d name %d # '%s'\n",
-					$_->{'feature'} > 0x01000000 ? '"' . $self->num_to_tag($_->{'feature'}) . '"' : $_->{'feature'}, 
-					($_->{'exclusive'} ? "exclusive" : "additive"),
-					$_->{'default'}, 
-					$_->{'name'},
-					$names->{'strings'}[$_->{'name'}][3][1]{1033});
-		$settings = $_->{'settings'};
-		foreach (sort { $a <=> $b } keys %$settings) {
-			$fh->printf("\tSetting %d, name %d # '%s'\n",
-						$_, $settings->{$_}, $names->{'strings'}[$settings->{$_}][3][1]{1033});
-		}
-	}
-	
-	$self;
+    my ($self, $fh) = @_;
+    my ($names, $features, $settings);
+
+    $self->read;
+
+    $names = $self->{' PARENT'}->{'name'};
+    $names->read;
+
+    $fh = 'STDOUT' unless defined $fh;
+
+    $features = $self->{'features'};
+    foreach (@$features) {
+        $fh->printf("Feature %s, %s, default: %d name %d # '%s'\n",
+                    $_->{'feature'} > 0x01000000 ? '"' . $self->num_to_tag($_->{'feature'}) . '"' : $_->{'feature'}, 
+                    ($_->{'exclusive'} ? "exclusive" : "additive"),
+                    $_->{'default'}, 
+                    $_->{'name'},
+                    $names->{'strings'}[$_->{'name'}][3][1]{1033});
+        $settings = $_->{'settings'};
+        foreach (sort { $a <=> $b } keys %$settings) {
+            $fh->printf("\tSetting %d, name %d # '%s'\n",
+                        $_, $settings->{$_}, $names->{'strings'}[$settings->{$_}][3][1]{1033});
+        }
+    }
+    
+    $self;
 }
 
 sub settingName
 {
-	my ($self, $feature, $setting) = @_;
-
-	$self->read;
-
-	my $names = $self->{' PARENT'}->{'name'};
-	$names->read;
-	
-	my $features = $self->{'features'};
-	my ($featureEntry) = grep { $_->{'feature'} == $feature } @$features;
-	my $featureName = $names->{'strings'}[$featureEntry->{'name'}][3][1]{1033};
-	my $settingName = $featureEntry->{'exclusive'}
-			? $names->{'strings'}[$featureEntry->{'settings'}->{$setting}][3][1]{1033}
-			: $names->{'strings'}[$featureEntry->{'settings'}->{$setting & ~1}][3][1]{1033}
-				. (($setting & 1) == 0 ? " On" : " Off");
-
-	($featureName, $settingName);
+    my ($self, $feature, $setting) = @_;
+
+    $self->read;
+
+    my $names = $self->{' PARENT'}->{'name'};
+    $names->read;
+    
+    my $features = $self->{'features'};
+    my ($featureEntry) = grep { $_->{'feature'} == $feature } @$features;
+    my $featureName = $names->{'strings'}[$featureEntry->{'name'}][3][1]{1033};
+    my $settingName = $featureEntry->{'exclusive'}
+            ? $names->{'strings'}[$featureEntry->{'settings'}->{$setting}][3][1]{1033}
+            : $names->{'strings'}[$featureEntry->{'settings'}->{$setting & ~1}][3][1]{1033}
+                . (($setting & 1) == 0 ? " On" : " Off");
+
+    ($featureName, $settingName);
 }
 
 =head2 $t->tag_to_num ($feat_str)
@@ -253,18 +253,18 @@ padding if it is present, so we do the same here.
 
 sub tag_to_num
 {
-	my ($self, $feat_tag) = @_;
-	my $new_feat_num;
-	
-	if ($feat_tag > 0)
-		{$new_feat_num = $feat_tag;}	# already a number, so just return it.
-	else
-	{
-		$feat_tag =~ s/[ \000]+$//o;	# strip trailing nulls or space
-		$new_feat_num = unpack('N', pack('a4', $feat_tag)); #adds null padding on right if less than 4 chars
-	}
-	
-	return $new_feat_num;
+    my ($self, $feat_tag) = @_;
+    my $new_feat_num;
+    
+    if ($feat_tag > 0)
+        {$new_feat_num = $feat_tag;}    # already a number, so just return it.
+    else
+    {
+        $feat_tag =~ s/[ \000]+$//o;    # strip trailing nulls or space
+        $new_feat_num = unpack('N', pack('a4', $feat_tag)); #adds null padding on right if less than 4 chars
+    }
+    
+    return $new_feat_num;
 }
 
 =head2 $t->num_to_tag ($feat_num)
@@ -278,18 +278,18 @@ are returned unchanged.
 
 sub num_to_tag
 {
-	my ($self, $feat_num) = @_;
-	my $new_feat_tag;
-	
-	if ($feat_num > 0x01000000)
-	{
-		$new_feat_tag = unpack('a4', pack('N', $feat_num));
-		$new_feat_tag =~ s/[ \000]+$//o;	# strip trailing nulls or space
-	}
-	else
-		{$new_feat_tag = $feat_num;}
-	
-	return $new_feat_tag;
+    my ($self, $feat_num) = @_;
+    my $new_feat_tag;
+    
+    if ($feat_num > 0x01000000)
+    {
+        $new_feat_tag = unpack('a4', pack('N', $feat_num));
+        $new_feat_tag =~ s/[ \000]+$//o;    # strip trailing nulls or space
+    }
+    else
+        {$new_feat_tag = $feat_num;}
+    
+    return $new_feat_tag;
 }
 
 1;
@@ -308,7 +308,7 @@ Alan Ward (derived from Jonathan Kew's Feat.pm).
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -155,12 +155,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -256,12 +256,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -165,12 +165,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -207,12 +207,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -146,12 +146,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -86,12 +86,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -102,12 +102,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -136,12 +136,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -168,12 +168,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -160,9 +160,9 @@ sub read_subtable
     $t->{'type'} = $cov >> 8;
     if ($t->{'Version'} == 0)
     {
-    	# NB: Cambria is an example of a font that plays an unsual trick: The
-    	# kern table is much larger than can be represented by the header $len
-    	# would allow. So we use the number of pairs to figure out how much to read. 
+        # NB: Cambria is an example of a font that plays an unsual trick: The
+        # kern table is much larger than can be represented by the header $len
+        # would allow. So we use the number of pairs to figure out how much to read. 
         $fh->read($dat, 8);
         $t->{'Num'} = unpack("n", $dat);
         $fh->read($dat, $t->{'Num'} * 6);
@@ -348,12 +348,12 @@ No real support functions to I<do> anything with the kerning tables yet.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -93,12 +93,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -71,7 +71,7 @@ sub read
 {
     my ($self) = @_;
 
-	# Do this before $self->SUPER::read because this can alter the file pointer:
+    # Do this before $self->SUPER::read because this can alter the file pointer:
     my ($glyfLoc) = $self->{' PARENT'}{'glyf'}->_read->{' OFFSET'};		# May seek on $fh!
 
     $self->SUPER::read or return $self;
@@ -180,12 +180,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -62,7 +62,7 @@ To help with using the system, each module (or table) will not only describe the
 methods it supports, which are relatively few, but also the instance variables
 it supports, which are many. Most of the variables directly reflect table
 attributes as specified in the OpenType specification, available from Microsoft
-(L<http::/www.microsoft.com/typography>), Adobe and Apple. A list of the names
+(L<http://www.microsoft.com/typography>), Adobe and Apple. A list of the names
 used is also given in each module, but not necessarily with any further
 description. After all, this code is not a TrueType manual as well!
 
@@ -174,7 +174,6 @@ and C<Font> at the top:
  name--
 
  post--
- 
 There is an important universal dependency which it is up to the user to
 keep up to date. This is C<maxp/numOfGlyphs> which is used to iterate over all
 the glyphs. Note that the glyphs themselves are not held in the C<glyph> table
@@ -206,14 +205,14 @@ information we need (and there is lots more that you could add) then we simply
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 (see CONTRIBUTORS for other authors).
 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -183,12 +183,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -189,12 +189,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -149,12 +149,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -172,12 +172,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -239,12 +239,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -88,12 +88,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -100,12 +100,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -193,12 +193,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -113,12 +113,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -497,30 +497,30 @@ Useful for creating @cover parameter to set_name().
 
 sub pe_list
 {
-	my ($self) = @_;
-	my (@cover, %ids);
-
-	foreach my $nid (0 .. $#{$self->{'strings'}})
-	{
-		if (defined $self->{'strings'}[$nid])
-		{
-    		foreach my $pid (0 .. $#{$self->{'strings'}[$nid]})
-    		{
-    			if (defined $self->{'strings'}[$nid][$pid])
-    			{
-    				foreach my $eid (0 .. $#{$self->{'strings'}[$nid][$pid]})
-	    			{
-	    				if (defined $self->{'strings'}[$nid][$pid][$eid] && !$ids{$pid}{$eid})
-	    				{
-	    					$ids{$pid}{$eid} = 1;
-	    					push @cover, [$pid, $eid];
-	    				}
-	    			}
-	    		}
-    		}
-    	}
+    my ($self) = @_;
+    my (@cover, %ids);
+
+    foreach my $nid (0 .. $#{$self->{'strings'}})
+    {
+        if (defined $self->{'strings'}[$nid])
+        {
+            foreach my $pid (0 .. $#{$self->{'strings'}[$nid]})
+            {
+                if (defined $self->{'strings'}[$nid][$pid])
+                {
+                    foreach my $eid (0 .. $#{$self->{'strings'}[$nid][$pid]})
+                    {
+                        if (defined $self->{'strings'}[$nid][$pid][$eid] && !$ids{$pid}{$eid})
+                        {
+                            $ids{$pid}{$eid} = 1;
+                            push @cover, [$pid, $eid];
+                        }
+                    }
+                }
+            }
+        }
     }
-	return @cover;
+    return @cover;
 }
 
 
@@ -900,12 +900,12 @@ once Perl 5.6 has been released and I can find all the mapping tables, etc.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -1020,12 +1020,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -1,3 +1,5 @@
+use utf8;  # NB: This file includes non-ASCII string constants in UTF-8 encoding
+
 package Font::TTF::OTTags;
 
 =head1 NAME
@@ -12,10 +14,10 @@ Font::TTF::OTTags - Utilities for TrueType/OpenType tags
   $script_tag = $tttags{'SCRIPT'}{'Cypriot Syllabary'};  # returns 'cprt'
   $lang_name = $ttnames{'LANGUAGE'}{'ALT '};             # returns 'Altai'
   
-  # Map iso639 tag to/from OT lang tag
+  # Map iso639-2 tag to/from OT lang tag
   @isotags = $iso639{'ALT '};    # returns [ 'atv', 'alt' ]
   $lang_tag = $iso639{'atv'};    # returns 'ALT '
-  	
+    
   # Read latest tags file to add to built-in definitions
   readtagsfile ("C:\\Program Files\\Microsoft VOLT\\TAGS.txt");
 
@@ -37,9 +39,10 @@ retrieve feature tag or name
 
 =back
 
-Built-in data has been derived from Microsofts tag registry at
-L<http://www.microsoft.com/typography/otspec/ttoreg.htm>, 
-updated to draft v1.5 of the OpenType Spec.
+Built-in data has been derived from the 2014-07-11 draft of the
+3rd edition of ISO/IEC 14496-22 
+(Information technology - Coding of audio-visual objects - Part 22: Open Font Format)
+which, when finalized and approved, will replace the second edition (ISO/IEC 14496-22:2009).
 
 =head1 METHODS
 
@@ -59,19 +62,24 @@ require Exporter;
 'SCRIPT' => {
     "Arabic" => 'arab',
     "Armenian" => 'armn',
+    "Avestan" => 'avst',
     "Balinese" => 'bali',
+    "Bamum" => 'bamu',
+    "Batak" => 'batk',
     "Bengali" => 'beng',
     "Bengali v.2" => 'bng2',
     "Bopomofo" => 'bopo',
+    "Brahmi" => 'brah',
     "Braille" => 'brai',
     "Buginese" => 'bugi',
     "Buhid" => 'buhd',
     "Byzantine Music" => 'byzm',
-    "CJK Ideographic" => 'hani',
     "Canadian Syllabics" => 'cans',
     "Carian" => 'cari',
+    "Chakma" => 'cakm',
     "Cham" => 'cham',
     "Cherokee" => 'cher',
+    "CJK Ideographic" => 'hani',
     "Coptic" => 'copt',
     "Cypriot Syllabary" => 'cprt',
     "Cyrillic" => 'cyrl',
@@ -79,6 +87,7 @@ require Exporter;
     "Deseret" => 'dsrt',
     "Devanagari" => 'deva',
     "Devanagari v.2" => 'dev2',
+    "Egyptian hieroglyphs" => 'egyp',
     "Ethiopic" => 'ethi',
     "Georgian" => 'geor',
     "Glagolitic" => 'glag',
@@ -93,7 +102,11 @@ require Exporter;
     "Hanunoo" => 'hano',
     "Hebrew" => 'hebr',
     "Hiragana" => 'kana',
+    "Imperial Aramaic" => 'armi',
+    "Inscriptional Pahlavi" => 'phli',
+    "Inscriptional Parthian" => 'prti',
     "Javanese" => 'java',
+    "Kaithi" => 'kthi',
     "Kannada" => 'knda',
     "Kannada v.2" => 'knd2',
     "Katakana" => 'kana',
@@ -105,30 +118,42 @@ require Exporter;
     "Lepcha" => 'lepc',
     "Limbu" => 'limb',
     "Linear B" => 'linb',
+    "Lisu (Fraser)" => 'lisu',
     "Lycian" => 'lyci',
     "Lydian" => 'lydi',
     "Malayalam" => 'mlym',
     "Malayalam v.2" => 'mlm2',
+    "Mandaic, Mandaean" => 'mand',
     "Mathematical Alphanumeric Symbols" => 'math',
+    "Meitei Mayek (Meithei, Meetei)" => 'mtei',
+    "Meroitic Cursive" => 'merc',
+    "Meroitic Hieroglyphs" => 'mero',
+    "Miao" => 'plrd',
     "Mongolian" => 'mong',
     "Musical Symbols" => 'musc',
     "Myanmar" => 'mymr',
-    "N'Ko" => 'nko ',
+    "Myanmar v.2" => 'mym2',
     "New Tai Lue" => 'talu',
+    "N'Ko" => 'nko ',
     "Ogham" => 'ogam',
     "Ol Chiki" => 'olck',
     "Old Italic" => 'ital',
     "Old Persian Cuneiform" => 'xpeo',
-    "Oriya" => 'orya',
-    "Oriya v.2" => 'ory2',
+    "Old South Arabian" => 'sarb',
+    "Old Turkic, Orkhon Runic" => 'orkh',
+    "Odia (formerly Oriya)" => 'orya',
+    "Odia (formerly Oriya) v.2" => 'ory2',
     "Osmanya" => 'osma',
     "Phags-pa" => 'phag',
     "Phoenician" => 'phnx',
     "Rejang" => 'rjng',
     "Runic" => 'runr',
+    "Samaritan" => 'samr',
     "Saurashtra" => 'saur',
+    "Sharada" => 'shrd',
     "Shavian" => 'shaw',
     "Sinhala" => 'sinh',
+    "Sora Sompeng" => 'sora',
     "Sumero-Akkadian Cuneiform" => 'xsux',
     "Sundanese" => 'sund',
     "Syloti Nagri" => 'sylo',
@@ -136,6 +161,9 @@ require Exporter;
     "Tagalog" => 'tglg',
     "Tagbanwa" => 'tagb',
     "Tai Le" => 'tale',
+    "Tai Tham (Lanna)" => 'lana',
+    "Tai Viet" => 'tavt',
+    "Takri" => 'takr',
     "Tamil" => 'taml',
     "Tamil v.2" => 'tml2',
     "Telugu" => 'telu',
@@ -153,35 +181,52 @@ require Exporter;
     "Aari" => 'ARI ',
     "Abaza" => 'ABA ',
     "Abkhazian" => 'ABK ',
+    "Achi" => 'ACR ',
+    "Acholi" => 'ACH ',
     "Adyghe" => 'ADY ',
     "Afar" => 'AFR ',
     "Afrikaans" => 'AFK ',
     "Agaw" => 'AGW ',
+    "Aiton" => 'AIO ',
+    "Akan" => 'AKA ',
     "Albanian" => 'SQI ',
     "Alsatian" => 'ALS ',
     "Altai" => 'ALT ',
     "Amharic" => 'AMH ',
+    "Anglo-Saxon" => 'ANG ',
     "Arabic" => 'ARA ',
-    "Arakanese" => 'ARK ',
+    "Aragonese" => 'ARG ',
+    "Arakwal" => 'RKW ',
+    "Armenian East" => 'HYE0',
     "Armenian" => 'HYE ',
+    "Aromanian" => 'RUP ',
+    "Arpitan" => 'FRP ',
     "Assamese" => 'ASM ',
+    "Asturian" => 'AST ',
     "Athapaskan" => 'ATH ',
     "Avar" => 'AVR ',
     "Awadhi" => 'AWA ',
     "Aymara" => 'AYM ',
-    "Azeri" => 'AZE ',
+    "Azerbaijani" => 'AZE ',
     "Badaga" => 'BAD ',
     "Baghelkhandi" => 'BAG ',
+    "Bagri" => 'BGQ ',
     "Balante" => 'BLN ',
+    "Balinese" => 'BAN ',
     "Balkar" => 'BAL ',
-    "Balochi" => 'BLI ',
     "Balti" => 'BLT ',
-    "Bambara" => 'BMB ',
+    "Baluchi" => 'BLI ',
+    "Bambara (Bamanankan)" => 'BMB ',
     "Bamileke" => 'BML ',
+    "Banda" => 'BAD0',
+    "Bandjalang" => 'BDY ',
+    "Baoulé" => 'BAU ',
     "Bashkir" => 'BSH ',
     "Basque" => 'EUQ ',
-    "Baule" => 'BAU ',
-    "Belarussian" => 'BEL ',
+    "Batak Simalungun" => 'BTS ',
+    "Batak Toba" => 'BBC ',
+    "Bavarian" => 'BAR ',
+    "Belarusian" => 'BEL ',
     "Bemba" => 'BEM ',
     "Bench" => 'BCH ',
     "Bengali" => 'BEN ',
@@ -192,50 +237,75 @@ require Exporter;
     "Bible Cree" => 'BCR ',
     "Bikol" => 'BIK ',
     "Bilen" => 'BIL ',
+    "Bishnupriya Manipuri" => 'BPY ',
+    "Bislama" => 'BIS ',
     "Blackfoot" => 'BKF ',
+    "Bodo" => 'BRX ',
     "Bosnian" => 'BOS ',
+    "Bouyei" => 'PCC ',
     "Brahui" => 'BRH ',
     "Braj Bhasha" => 'BRI ',
     "Breton" => 'BRE ',
+    "Bugis" => 'BUG ',
     "Bulgarian" => 'BGR ',
     "Burmese" => 'BRM ',
+    "Cajun French" => 'FRC ',
     "Carrier" => 'CRR ',
     "Catalan" => 'CAT ',
     "Cebuano" => 'CEB ',
+    "Central Yupik" => 'ESU ',
     "Chaha Gurage" => 'CHG ',
+    "Chamorro" => 'CHA ',
     "Chattisgarhi" => 'CHH ',
     "Chechen" => 'CHE ',
     "Cherokee" => 'CHR ',
-    "Chichewa" => 'CHI ',
+    "Cheyenne" => 'CHY ',
+    "Chichewa (Chewa, Nyanja)" => 'CHI ',
+    "Chiga" => 'CGG ',
     "Chin" => 'QIN ',
-    "Chinese Hong Kong" => 'ZHH ',
     "Chinese Phonetic" => 'ZHP ',
     "Chinese Simplified" => 'ZHS ',
     "Chinese Traditional" => 'ZHT ',
+    "Chinese, Hong Kong SAR" => 'ZHH ',
     "Chipewyan" => 'CHP ',
+    "Chittagonian" => 'CTG ',
+    "Choctaw" => 'CHO ',
     "Chukchi" => 'CHK ',
     "Church Slavonic" => 'CSL ',
+    "Chuukese" => 'CHK0',
     "Chuvash" => 'CHU ',
     "Comorian" => 'CMR ',
     "Coptic" => 'COP ',
+    "Cornish" => 'COR ',
     "Corsican" => 'COS ',
     "Cree" => 'CRE ',
+    "Creoles" => 'CPP ',
     "Crimean Tatar" => 'CRT ',
     "Croatian" => 'HRV ',
     "Czech" => 'CSY ',
+    "Dan" => 'DNJ ',
     "Dangme" => 'DNG ',
     "Danish" => 'DAN ',
     "Dargwa" => 'DAR ',
     "Dari" => 'DRI ',
-    "Dhivehi" => 'DIV ',
-    "Dhivehi (deprecated)" => 'DHV ',
+    "Dayi" => 'DAX ',
+    "Dehong Dai" => 'TDD ',
+    "Dhangu" => 'DHG ',
+    "Dhuwal" => 'DUJ ',
+    "Dimli" => 'DIQ ',
     "Dinka" => 'DNK ',
-    "Djerma" => 'DJR ',
+    "Divehi (Dhivehi, Maldivian) (deprecated)" => 'DHV ',
+    "Divehi (Dhivehi, Maldivian)" => 'DIV ',
+    "Djambarrpuyngu" => 'DJR0',
+    "Dogri" => 'DGO ',
     "Dogri" => 'DGR ',
     "Dungan" => 'DUN ',
+    "Dutch (Flemish)" => 'FLE ',
     "Dutch" => 'NLD ',
     "Dzongkha" => 'DZN ',
     "Eastern Cree" => 'ECR ',
+    "Eastern Maninkakan" => 'EMK ',
+    "Eastern Pwo Karen" => 'KJP ',
     "Ebira" => 'EBI ',
     "Edo" => 'EDO ',
     "Efik" => 'EFI ',
@@ -246,82 +316,108 @@ require Exporter;
     "Even" => 'EVN ',
     "Evenki" => 'EVK ',
     "Ewe" => 'EWE ',
+    "Fang" => 'FAN0',
+    "Fanti" => 'FAT ',
     "Faroese" => 'FOS ',
-    "Farsi" => 'FAR ',
     "Fijian" => 'FJI ',
     "Filipino" => 'PIL ',
     "Finnish" => 'FIN ',
-    "Flemish" => 'FLE ',
     "Fon" => 'FON ',
     "Forest Nenets" => 'FNE ',
-    "French" => 'FRA ',
     "French Antillean" => 'FAN ',
+    "French" => 'FRA ',
     "Frisian" => 'FRI ',
     "Friulian" => 'FRL ',
-    "Fulani" => 'FUL ',
+    "Fulah" => 'FUL ',
     "Futa" => 'FTA ',
     "Ga" => 'GAD ',
-    "Gaelic" => 'GAE ',
     "Gagauz" => 'GAG ',
     "Galician" => 'GAL ',
+    "Ganda" => 'LUG ',
     "Garhwali" => 'GAW ',
     "Garo" => 'GRO ',
     "Garshuni" => 'GAR ',
     "Ge'ez" => 'GEZ ',
     "Georgian" => 'KAT ',
     "German" => 'DEU ',
+    "Gilaki" => 'GLK ',
     "Gilyak" => 'GIL ',
+    "Githabul" => 'GIH ',
+    "Gogo" => 'GOG ',
     "Gondi" => 'GON ',
     "Greek" => 'ELL ',
     "Greenlandic" => 'GRN ',
     "Guarani" => 'GUA ',
     "Gujarati" => 'GUJ ',
+    "Gumatj" => 'GNN ',
     "Gumuz" => 'GMZ ',
-    "Haitian" => 'HAI ',
+    "Gupapuyngu" => 'GUF ',
+    "Gusii" => 'GUZ ',
+    "Haitian (Haitian Creole)" => 'HAI ',
     "Halam" => 'HAL ',
     "Hammer-Banna" => 'HBN ',
     "Harari" => 'HRI ',
     "Harauti" => 'HAR ',
+    "Haryanvi" => 'BGC ',
     "Hausa" => 'HAU ',
-    "Hawaiin" => 'HAW ',
+    "Hawaiian" => 'HAW ',
+    "Haya" => 'HAY ',
+    "Hazaragi" => 'HAZ ',
     "Hebrew" => 'IWR ',
+    "Herero" => 'HER ',
     "High Mari" => 'HMA ',
     "Hiligaynon" => 'HIL ',
     "Hindi" => 'HIN ',
     "Hindko" => 'HND ',
+    "Hiri Motu" => 'HMO ',
+    "Hmong Daw" => 'MWW ',
+    "Hmong" => 'HMN ',
     "Ho" => 'HO  ',
     "Hungarian" => 'HUN ',
+    "Iban" => 'IBA ',
+    "Ibibio" => 'IBB ',
     "Icelandic" => 'ISL ',
+    "Ido" => 'IDO ',
     "Igbo" => 'IBO ',
-    "Ijo" => 'IJO ',
+    "Ijo languages" => 'IJO ',
     "Ilokano" => 'ILO ',
     "Inari Sami" => 'ISM ',
     "Indonesian" => 'IND ',
     "Ingush" => 'ING ',
+    "Interlingua" => 'INA ',
+    "Interlingue" => 'ILE ',
     "Inuktitut" => 'INU ',
-    "Irish" => 'IRI ',
+    "Inupiat" => 'IPK ',
     "Irish Traditional" => 'IRT ',
+    "Irish" => 'IRI ',
     "Italian" => 'ITA ',
+    "Jamaican Creole" => 'JAM ',
     "Japanese" => 'JAN ',
     "Javanese" => 'JAV ',
-    "Judezmo" => 'JUD ',
     "Jula" => 'JUL ',
     "Kabardian" => 'KAB ',
+    "Kabuverdianu (Crioulo)" => 'KEA ',
+    "Kabyle" => 'KAB0',
     "Kachchi" => 'KAC ',
     "Kalenjin" => 'KAL ',
     "Kalmyk" => 'KLM ',
     "Kamba" => 'KMB ',
+    "Kanauji" => 'BJJ ',
     "Kannada" => 'KAN ',
     "Kanuri" => 'KNR ',
+    "Kaqchikel" => 'CAK ',
     "Karachay" => 'KAR ',
     "Karaim" => 'KRM ',
     "Karakalpak" => 'KRK ',
     "Karelian" => 'KRL ',
     "Karen" => 'KRN ',
     "Kashmiri" => 'KSH ',
+    "Kashubian" => 'CSB ',
     "Kazakh" => 'KAZ ',
     "Kebena" => 'KEB ',
+    "Kekchi" => 'KEK ',
     "Khakass" => 'KHA ',
+    "Khamti Shan" => 'KHT ',
     "Khanty-Kazim" => 'KHK ',
     "Khanty-Shurishkar" => 'KHS ',
     "Khanty-Vakhi" => 'KHV ',
@@ -330,23 +426,33 @@ require Exporter;
     "Khowar" => 'KHW ',
     "Khutsuri Georgian" => 'KGE ',
     "Kikongo" => 'KON ',
-    "Kikuyu" => 'KIK ',
+    "Kikuyu (Gikuyu)" => 'KIK ',
     "Kildin Sami" => 'KSM ',
-    "Kirghiz" => 'KIR ',
+    "Kinyarwanda" => 'RUA ',
+    "Kirghiz (Kyrgyz)" => 'KIR ',
+    "Kiribati (Gilbertese)" => 'GIL0',
+    "Kirmanjki" => 'KIU ',
     "Kisii" => 'KIS ',
+    "Kituba" => 'MKW ',
     "Kodagu" => 'KOD ',
     "Kokni" => 'KKN ',
+    "Komi" => 'KOM ',
     "Komi-Permyak" => 'KOP ',
     "Komi-Zyrian" => 'KOZ ',
     "Komo" => 'KMO ',
     "Komso" => 'KMS ',
+    "Kongo" => 'KON0',
     "Konkani" => 'KOK ',
     "Koorete" => 'KRT ',
-    "Korean" => 'KOR ',
     "Korean Old Hangul" => 'KOH ',
+    "Korean" => 'KOR ',
     "Koryak" => 'KYK ',
+    "Kosraean" => 'KOS ',
+    "Kpelle (Guinea)" => 'GKP ',
+    "Kpelle (Liberia)" => 'XPE ',
     "Kpelle" => 'KPL ',
     "Krio" => 'KRI ',
+    "Kuanyama" => 'KUA ',
     "Kui" => 'KUI ',
     "Kulvi" => 'KUL ',
     "Kumaoni" => 'KMN ',
@@ -354,33 +460,50 @@ require Exporter;
     "Kurdish" => 'KUR ',
     "Kurukh" => 'KUU ',
     "Kuy" => 'KUY ',
+    "K'iche'" => 'QUC ',
     "L-Cree" => 'LCR ',
     "Ladakhi" => 'LDK ',
     "Ladin" => 'LAD ',
+    "Ladino" => 'JUD ',
     "Lahuli" => 'LAH ',
     "Lak" => 'LAK ',
+    "Laki" => 'LKI ',
     "Lambani" => 'LAM ',
+    "Lampung" => 'LJP ',
     "Lao" => 'LAO ',
     "Latin" => 'LAT ',
     "Latvian" => 'LVI ',
     "Laz" => 'LAZ ',
     "Lezgi" => 'LEZ ',
+    "Ligurian" => 'LIJ ',
     "Limbu" => 'LMB ',
+    "Limburgish" => 'LIM ',
     "Lingala" => 'LIN ',
+    "Lisu" => 'LIS ',
     "Lithuanian" => 'LTH ',
+    "Lojban" => 'JBO ',
+    "Loma" => 'LOM ',
+    "Lombard" => 'LMO ',
     "Lomwe" => 'LMW ',
     "Low Mari" => 'LMA ',
+    "Low Saxon" => 'NDS ',
     "Lower Sorbian" => 'LSB ',
-    "Luba" => 'LUB ',
-    "Luganda" => 'LUG ',
-    "Luhya" => 'LUH ',
+    "Luba-Katanga" => 'LUB ',
+    "Luba-Lulua" => 'LUA ',
     "Lule Sami" => 'LSM ',
     "Luo" => 'LUO ',
+    "Luri" => 'LRC ',
     "Luxembourgish" => 'LTZ ',
+    "Luyia" => 'LUH ',
+    "Lü" => 'XBD ',
     "Macedonian" => 'MKD ',
+    "Madura" => 'MAD ',
+    "Magahi" => 'MAG ',
     "Maithili" => 'MTH ',
     "Majang" => 'MAJ ',
-    "Makua" => 'MAK ',
+    "Makasar" => 'MKR ',
+    "Makhuwa" => 'MAK ',
+    "Makonde" => 'KDE ',
     "Malagasy" => 'MLG ',
     "Malay" => 'MLY ',
     "Malayalam Reformed" => 'MLR ',
@@ -388,19 +511,29 @@ require Exporter;
     "Male" => 'MLE ',
     "Malinke" => 'MLN ',
     "Maltese" => 'MTS ',
+    "Mam" => 'MAM ',
     "Manchu" => 'MCH ',
+    "Mandar" => 'MDR ',
     "Mandinka" => 'MND ',
     "Maninka" => 'MNK ',
     "Manipuri" => 'MNI ',
     "Mansi" => 'MAN ',
-    "Manx Gaelic" => 'MNX ',
+    "Manx" => 'MNX ',
     "Maori" => 'MRI ',
     "Mapudungun" => 'MAP ',
     "Marathi" => 'MAR ',
+    "Marshallese" => 'MAH ',
     "Marwari" => 'MAW ',
+    "Mayan" => 'MYN ',
+    "Mazanderani" => 'MZN ',
     "Mbundu" => 'MBN ',
     "Me'en" => 'MEN ',
     "Mende" => 'MDE ',
+    "Meru" => 'MER ',
+    "Mewati" => 'WTM ',
+    "Minangkabau" => 'MIN ',
+    "Minjangbal" => 'XJB ',
+    "Mirandese" => 'MWL ',
     "Mizo" => 'MIZ ',
     "Mohawk" => 'MOH ',
     "Moksha" => 'MOK ',
@@ -408,139 +541,227 @@ require Exporter;
     "Mon" => 'MON ',
     "Mongolian" => 'MNG ',
     "Moose Cree" => 'MCR ',
+    "Morisyen" => 'MFE ',
     "Moroccan" => 'MOR ',
+    "Mossi" => 'MOS ',
     "Mundari" => 'MUN ',
+    "Muscogee" => 'MUS ',
     "N'Ko" => 'NKO ',
     "N-Cree" => 'NCR ',
     "Naga-Assamese" => 'NAG ',
     "Nagari" => 'NGR ',
+    "Nahuatl" => 'NAH ',
     "Nanai" => 'NAN ',
     "Naskapi" => 'NAS ',
+    "Nauruan" => 'NAU ',
+    "Navajo" => 'NAV ',
+    "Ndau" => 'NDC ',
     "Ndebele" => 'NDB ',
     "Ndonga" => 'NDG ',
+    "Neapolitan" => 'NAP ',
     "Nepali" => 'NEP ',
     "Newari" => 'NEW ',
+    "Ngbaka" => 'NGA ',
+    "Nigerian Fulfulde" => 'FUV ',
+    "Nimadi" => 'NOE ',
     "Nisi" => 'NIS ',
     "Niuean" => 'NIU ',
-    "Nkole" => 'NKL ',
     "Nogai" => 'NOG ',
+    "Norfolk" => 'PIH ',
     "Northern Sami" => 'NSM ',
-    "Northern Tai" => 'NTA ',
+    "Northern Thai" => 'NTA ',
     "Norway House Cree" => 'NHC ',
+    "Norwegian Nynorsk (Nynorsk, Norwegian)" => 'NYN ',
     "Norwegian" => 'NOR ',
-    "Nynorsk" => 'NYN ',
+    "Novial" => 'NOV ',
+    "Nyamwezi" => 'NYM ',
+    "Nyankole" => 'NKL ',
     "Occitan" => 'OCI ',
+    "Odia (formerly Oriya)" => 'ORI ',
     "Oji-Cree" => 'OCR ',
     "Ojibway" => 'OJB ',
-    "Oriya" => 'ORI ',
+    "Old Irish" => 'SGA ',
     "Oromo" => 'ORO ',
     "Ossetian" => 'OSS ',
+    "Pa'o Karen" => 'BLK ',
+    "Palauan" => 'PAU ',
     "Palaung" => 'PLG ',
     "Palestinian Aramaic" => 'PAA ',
     "Pali" => 'PAL ',
     "Palpa" => 'PAP ',
+    "Pampangan" => 'PAM ',
+    "Pangasinan" => 'PAG ',
+    "Papiamentu" => 'PAP0',
     "Pashto" => 'PAS ',
-    "Phonetic transcription-Americanist conventions" => 'APPH',
-    "Phonetic transcription-IPA conventions" => 'IPPH',
+    "Pennsylvania German" => 'PDC ',
+    "Persian" => 'FAR ',
+    "Phake" => 'PHK ',
+    "Phonetic transcription - Americanist conventions" => 'APPH',
+    "Phonetic transcription - IPA conventions" => 'IPPH',
+    "Picard" => 'PCD ',
+    "Piemontese" => 'PMS ',
+    "Pocomchi" => 'POH ',
+    "Pohnpeian" => 'PON ',
     "Polish" => 'PLK ',
     "Polytonic Greek" => 'PGR ',
     "Portuguese" => 'PTG ',
     "Provencal" => 'PRO ',
     "Punjabi" => 'PAN ',
+    "Quechua (Bolivia)" => 'QUH ',
+    "Quechua (Ecuador)" => 'QVI ',
+    "Quechua (Peru)" => 'QWH ',
+    "Quechua" => 'QUZ ',
     "R-Cree" => 'RCR ',
     "Rajasthani" => 'RAJ ',
-    "Rhaeto-Romanic" => 'RMS ',
+    "Rakhine" => 'ARK ',
+    "Rarotongan" => 'RAR ',
+    "Rejang" => 'REJ ',
     "Riang" => 'RIA ',
+    "Ripuarian" => 'KSH0',
+    "Ritarungo" => 'RIT ',
     "Romanian" => 'ROM ',
+    "Romansh" => 'RMS ',
     "Romany" => 'ROY ',
-    "Ruanda" => 'RUA ',
-    "Russian" => 'RUS ',
+    "Rotuman" => 'RTM ',
+    "Rundi" => 'RUN ',
     "Russian Buriat" => 'RBU ',
+    "Russian" => 'RUS ',
     "Rusyn" => 'RSY ',
     "Sadri" => 'SAD ',
+    "Sakha" => 'YAK ',
     "Samoan" => 'SMO ',
+    "Samogitian" => 'SGS ',
+    "San Blas Kuna" => 'CUK ',
     "Sango" => 'SGO ',
     "Sanskrit" => 'SAN ',
     "Santali" => 'SAT ',
-    "Saraiki" => 'SRK ',
+    "Sardinian" => 'SRD ',
+    "Sasak" => 'SAS ',
+    "Saterland Frisian" => 'STQ ',
     "Sayisi" => 'SAY ',
+    "Scots" => 'SCO ',
+    "Scottish Gaelic (Gaelic)" => 'GAE ',
     "Sekota" => 'SEK ',
     "Selkup" => 'SEL ',
     "Sena" => 'SNA ',
+    "Seraiki" => 'SRK ',
     "Serbian" => 'SRB ',
     "Serer" => 'SRR ',
     "Shan" => 'SHN ',
+    "Shona" => 'SNA0',
     "Sibe" => 'SIB ',
+    "Sicilian" => 'SCN ',
     "Sidamo" => 'SID ',
+    "Silesian" => 'SZL ',
     "Silte Gurage" => 'SIG ',
     "Sindhi" => 'SND ',
-    "Sinhalese" => 'SNH ',
+    "Sinhala (Sinhalese)" => 'SNH ',
     "Skolt Sami" => 'SKS ',
     "Slavey" => 'SLA ',
     "Slovak" => 'SKY ',
     "Slovenian" => 'SLV ',
     "Sodo Gurage" => 'SOG ',
+    "Soga" => 'XOG ',
     "Somali" => 'SML ',
+    "Songe" => 'SOP ',
     "Soninke" => 'SNK ',
-    "Sotho" => 'SOT ',
+    "Sotho, Northern" => 'NSO ',
+    "Sotho, Southern" => 'SOT ',
     "South Slavey" => 'SSL ',
+    "Southern Kiwai" => 'KJD ',
     "Southern Sami" => 'SSM ',
     "Spanish" => 'ESP ',
+    "Standard Morrocan Tamazigh" => 'ZGH ',
+    "Sukuma" => 'SUK ',
+    "Sundanese" => 'SUN ',
     "Suri" => 'SUR ',
     "Sutu" => 'SXT ',
     "Svan" => 'SVA ',
     "Swadaya Aramaic" => 'SWA ',
     "Swahili" => 'SWK ',
-    "Swazi" => 'SWZ ',
+    "Swati" => 'SWZ ',
     "Swedish" => 'SVE ',
+    "Sylheti" => 'SYL ',
     "Syriac" => 'SYR ',
+    "S'gaw Karen" => 'KSW ',
     "TH-Cree" => 'TCR ',
     "Tabasaran" => 'TAB ',
+    "Tachelhit" => 'SHI ',
+    "Tagalog" => 'TGL ',
     "Tahitian" => 'THT ',
-    "Tai Lue" => 'XBD ',
-    "Tajiki" => 'TAJ ',
+    "Tajik" => 'TAJ ',
+    "Tamashek" => 'TMH ',
+    "Tamazight" => 'TZM ',
     "Tamil" => 'TAM ',
+    "Tarifit" => 'RIF ',
     "Tatar" => 'TAT ',
     "Telugu" => 'TEL ',
     "Temne" => 'TMN ',
+    "Tetum" => 'TET ',
     "Thai" => 'THA ',
     "Tibetan" => 'TIB ',
     "Tigre" => 'TGR ',
     "Tigrinya" => 'TGY ',
+    "Tiv" => 'TIV ',
     "Todo" => 'TOD ',
+    "Tok Pisin" => 'TPI ',
+    "Toma" => 'TOD0',
     "Tonga" => 'TNG ',
     "Tongan" => 'TGN ',
+    "Torki" => 'AZB ',
     "Tsonga" => 'TSG ',
     "Tswana" => 'TNA ',
     "Tulu" => 'TUL ',
+    "Tumbuka" => 'TUM ',
     "Tundra Nenets" => 'TNE ',
     "Turkish" => 'TRK ',
     "Turkmen" => 'TKM ',
     "Turoyo Aramaic" => 'TUA ',
+    "Tuvalu" => 'TVL ',
     "Tuvin" => 'TUV ',
     "Twi" => 'TWI ',
+    "Tzotzil" => 'TZO ',
+    "Tày" => 'TYZ ',
     "Udmurt" => 'UDM ',
     "Ukrainian" => 'UKR ',
+    "Umbundu" => 'UMB ',
+    "Upper Saxon" => 'SXU ',
     "Upper Sorbian" => 'USB ',
     "Urdu" => 'URD ',
     "Uyghur" => 'UYG ',
     "Uzbek" => 'UZB ',
     "Venda" => 'VEN ',
+    "Venetian" => 'VEC ',
     "Vietnamese" => 'VIT ',
+    "Vlax Romani" => 'RMY ',
+    "Volapük" => 'VOL ',
+    "Võro" => 'VRO ',
     "Wa" => 'WA  ',
     "Wagdi" => 'WAG ',
+    "Walloon" => 'WLN ',
+    "Waray-Waray" => 'WAR ',
+    "Wayuu" => 'GUC ',
     "Welsh" => 'WEL ',
     "West-Cree" => 'WCR ',
+    "Western Kayah" => 'KYU ',
+    "Western Panjabi" => 'PNB ',
+    "Western Pwo Karen" => 'PWO ',
     "Wolof" => 'WLF ',
     "Woods Cree" => 'DCR ',
     "Xhosa" => 'XHS ',
     "Y-Cree" => 'YCR ',
-    "Yakut" => 'YAK ',
+    "Yao" => 'YAO ',
+    "Yapese" => 'YAP ',
     "Yi Classic" => 'YIC ',
     "Yi Modern" => 'YIM ',
     "Yiddish" => 'JII ',
     "Yoruba" => 'YBA ',
+    "Zamboanga Chavacano" => 'CBK ',
     "Zande" => 'ZND ',
+    "Zarma" => 'DJR ',
+    "Zazaki" => 'ZZA ',
+    "Zealandic" => 'ZEA ',
+    "Zhuang" => 'ZHA ',
     "Zulu" => 'ZUL ',
     },
 
@@ -669,8 +890,10 @@ require Exporter;
     "Denominators" => 'dnom',
     "Discretionary Ligatures" => 'dlig',
     "Distances" => 'dist',
+    "Dotless Forms" => 'dtls',
     "Expert Forms" => 'expt',
     "Final Glyph on Line Alternates" => 'falt',
+    "Flattened ascent forms" => 'flac',
     "Fractions" => 'frac',
     "Full Widths" => 'fwid',
     "Glyph Composition / Decomposition" => 'ccmp',
@@ -693,16 +916,17 @@ require Exporter;
     "Kerning" => 'kern',
     "Leading Jamo Forms" => 'ljmo',
     "Left Bounds" => 'lfbd',
-    "Left-to-right alternates" => 'ltra',
+    "Left-to-right glyph alternates" => 'ltra',
     "Left-to-right mirrored forms" => 'ltrm',
     "Lining Figures" => 'lnum',
     "Localized Forms" => 'locl',
-    "Mark Positioning" => 'mark',
     "Mark Positioning via Substitution" => 'mset',
+    "Mark Positioning" => 'mark',
     "Mark to Mark Positioning" => 'mkmk',
+    "Math script style alternates" => 'ssty',
     "Mathematical Greek" => 'mgrk',
-    "Medial Forms" => 'medi',
     "Medial Forms #2" => 'med2',
+    "Medial Forms" => 'medi',
     "NLC Kanji Forms" => 'nlck',
     "Nukta Forms" => 'nukt',
     "Numerators" => 'numr',
@@ -711,8 +935,8 @@ require Exporter;
     "Optical size" => 'size',
     "Ordinals" => 'ordn',
     "Ornaments" => 'ornm',
-    "Petite Capitals" => 'pcap',
     "Petite Capitals From Capitals" => 'c2pc',
+    "Petite Capitals" => 'pcap',
     "Post-base Forms" => 'pstf',
     "Post-base Substitutions" => 'psts',
     "Pre-Base Forms" => 'pref',
@@ -726,6 +950,7 @@ require Exporter;
     "Rakar Forms" => 'rkrf',
     "Randomize" => 'rand',
     "Reph Forms" => 'rphf',
+    "Required Contextual Alternates" => 'rclt',
     "Required Ligatures" => 'rlig',
     "Right Bounds" => 'rtbd',
     "Right-to-left alternates" => 'rtla',
@@ -734,9 +959,10 @@ require Exporter;
     "Scientific Inferiors" => 'sinf',
     "Simplified Forms" => 'smpl',
     "Slashed Zero" => 'zero',
-    "Small Capitals" => 'smcp',
     "Small Capitals From Capitals" => 'c2sc',
+    "Small Capitals" => 'smcp',
     "Standard Ligatures" => 'liga',
+    "Stretching Glyph Decomposition" => 'stch',
     "Stylistic Alternates" => 'salt',
     "Stylistic Set 1" => 'ss01',
     "Stylistic Set 10" => 'ss10',
@@ -762,9 +988,9 @@ require Exporter;
     "Superscript" => 'sups',
     "Swash" => 'swsh',
     "Tabular Figures" => 'tnum',
-    "Terminal Forms" => 'fina',
     "Terminal Forms #2" => 'fin2',
     "Terminal Forms #3" => 'fin3',
+    "Terminal Forms" => 'fina',
     "Third Widths" => 'twid',
     "Titling" => 'titl',
     "Traditional Forms" => 'trad',
@@ -784,76 +1010,117 @@ require Exporter;
 %iso639 = (
     'ABA ' => 'abq',
     'ABK ' => 'abk',
+    'ACH ' => 'ach',
+    'ACR ' => 'acr',
     'ADY ' => 'ady',
     'AFK ' => 'afr',
     'AFR ' => 'aar',
     'AGW ' => 'ahg',
+    'AIO ' => 'aio',
+    'AKA ' => 'aka',
     'ALS ' => 'gsw',
     'ALT ' => 'atv alt',
     'AMH ' => 'amh',
+    'ANG ' => 'ang',
     'ARA ' => 'ara',
+    'ARG ' => 'arg',
     'ARI ' => 'aiw',
     'ARK ' => 'mhv rmz rki',
     'ASM ' => 'asm',
+    'AST ' => 'ast',
     'ATH ' => 'apk apj apl apm apw nav bea sek bcr caf crx clc gwi haa chp dgr scs xsl srs ing hoi koy hup ktw mvb wlk coq ctc gce tol tuu kkz tgx tht aht tfn taa tau tcb kuu tce ttm txc',
     'AVR ' => 'ava',
     'AWA ' => 'awa',
     'AYM ' => 'aym',
+    'AZB ' => 'azb',
     'AZE ' => 'aze',
     'BAD ' => 'bfq',
+    'BAD0' => 'bad',
     'BAG ' => 'bfy',
     'BAL ' => 'krc',
+    'BAN ' => 'ban',
+    'BAR ' => 'bar',
     'BAU ' => 'bci',
+    'BBC ' => 'bbc',
     'BCH ' => 'bcq',
+    'BDY ' => 'bdy',
     'BEL ' => 'bel',
     'BEM ' => 'bem',
     'BEN ' => 'ben',
+    'BGC ' => 'bgc',
+    'BGQ ' => 'bgq',
     'BGR ' => 'bul',
     'BHI ' => 'bhi bhb',
     'BHO ' => 'bho',
-    'BIK ' => 'bik',
+    'BIK ' => 'bik bhk bcl bto cts bln',
     'BIL ' => 'byn',
+    'BIS ' => 'bis',
+    'BJJ ' => 'bjj',
     'BKF ' => 'bla',
     'BLI ' => 'bal',
+    'BLK ' => 'blk',
     'BLN ' => 'bjt ble',
     'BLT ' => 'bft',
     'BMB ' => 'bam',
     'BOS ' => 'bos',
+    'BPY ' => 'bpy',
     'BRE ' => 'bre',
     'BRH ' => 'brh',
     'BRI ' => 'bra',
     'BRM ' => 'mya',
+    'BRX ' => 'brx',
     'BSH ' => 'bak',
     'BTI ' => 'btb',
+    'BTS ' => 'bts',
+    'BUG ' => 'bug',
+    'CAK ' => 'cak',
     'CAT ' => 'cat',
+    'CBK ' => 'cbk',
     'CEB ' => 'ceb',
+    'CGG ' => 'cgg',
+    'CHA ' => 'cha',
     'CHE ' => 'che',
     'CHG ' => 'sgw',
     'CHH ' => 'hne',
     'CHI ' => 'nya',
     'CHK ' => 'ckt',
+    'CHK0' => 'chk',
+    'CHO ' => 'cho',
     'CHP ' => 'chp',
     'CHR ' => 'chr',
     'CHU ' => 'chv',
+    'CHY ' => 'chy',
     'CMR ' => 'swb wlc wni zdj',
     'COP ' => 'cop',
+    'COR ' => 'cor',
     'COS ' => 'cos',
+    'CPP ' => 'cpp',
     'CRE ' => 'cre',
     'CRR ' => 'crx caf',
     'CRT ' => 'crh',
+    'CSB ' => 'csb',
     'CSL ' => 'chu',
     'CSY ' => 'ces',
+    'CTG ' => 'ctg',
+    'CUK ' => 'cuk',
     'DAN ' => 'dan',
     'DAR ' => 'dar',
+    'DAX ' => 'dax',
     'DCR ' => 'cwd',
     'DEU ' => 'deu',
+    'DGO ' => 'dgo',
     'DGR ' => 'doi',
+    'DHG ' => 'dhg',
     'DHV ' => 'div',
+    'DIQ ' => 'diq',
     'DIV ' => 'div',
     'DJR ' => 'dje',
+    'DJR0' => 'djr',
     'DNG ' => 'ada',
+    'DNJ ' => 'dnj',
     'DNK ' => 'din',
     'DRI ' => 'prs',
+    'DUJ ' => 'duj',
     'DUN ' => 'dng',
     'DZN ' => 'dzo',
     'EBI ' => 'igb',
@@ -861,16 +1128,20 @@ require Exporter;
     'EDO ' => 'bin',
     'EFI ' => 'efi',
     'ELL ' => 'ell',
+    'EMK ' => 'emk',
     'ENG ' => 'eng',
     'ERZ ' => 'myv',
     'ESP ' => 'spa',
+    'ESU ' => 'esu',
     'ETI ' => 'est',
     'EUQ ' => 'eus',
     'EVK ' => 'evn',
     'EVN ' => 'eve',
     'EWE ' => 'ewe',
     'FAN ' => 'acf',
+    'FAN0' => 'fan',
     'FAR ' => 'fas',
+    'FAT ' => 'fat',
     'FIN ' => 'fin',
     'FJI ' => 'fij',
     'FLE ' => 'vls',
@@ -878,73 +1149,107 @@ require Exporter;
     'FON ' => 'fon',
     'FOS ' => 'fao',
     'FRA ' => 'fra',
+    'FRC ' => 'frc',
     'FRI ' => 'fry',
     'FRL ' => 'fur',
+    'FRP ' => 'frp',
     'FTA ' => 'fuf',
     'FUL ' => 'ful',
+    'FUV ' => 'fuv',
     'GAD ' => 'gaa',
     'GAE ' => 'gla',
     'GAG ' => 'gag',
     'GAL ' => 'glg',
     'GAW ' => 'gbm',
     'GEZ ' => 'gez',
+    'GIH ' => 'gih',
     'GIL ' => 'niv',
+    'GIL0' => 'gil',
+    'GKP ' => 'gkp',
+    'GLK ' => 'glk',
     'GMZ ' => 'guk',
-    'GON ' => 'gon',
+    'GNN ' => 'gnn',
+    'GOG ' => 'gog',
+    'GON ' => 'gon gno ggo',
     'GRN ' => 'kal',
     'GRO ' => 'grt',
     'GUA ' => 'grn',
+    'GUC ' => 'guc',
+    'GUF ' => 'guf',
     'GUJ ' => 'guj',
+    'GUZ ' => 'guz',
     'HAI ' => 'hat',
     'HAL ' => 'flm',
     'HAR ' => 'hoj',
     'HAU ' => 'hau',
     'HAW ' => 'haw',
+    'HAY ' => 'hay',
+    'HAZ ' => 'haz',
     'HBN ' => 'amf',
+    'HER ' => 'her',
     'HIL ' => 'hil',
     'HIN ' => 'hin',
     'HMA ' => 'mrj',
+    'HMN ' => 'hmn',
+    'HMO ' => 'hmo',
     'HND ' => 'hno hnd',
     'HO  ' => 'hoc',
     'HRI ' => 'har',
     'HRV ' => 'hrv',
     'HUN ' => 'hun',
     'HYE ' => 'hye',
+    'HYE0' => 'hye',
+    'IBA ' => 'iba',
+    'IBB ' => 'ibb',
     'IBO ' => 'ibo',
+    'IDO ' => 'ido',
     'IJO ' => 'ijc',
+    'ILE ' => 'ile',
     'ILO ' => 'ilo',
+    'INA ' => 'ina',
     'IND ' => 'ind',
     'ING ' => 'inh',
     'INU ' => 'iku',
+    'IPK ' => 'ipk',
     'IRI ' => 'gle',
     'IRT ' => 'gle',
     'ISL ' => 'isl',
     'ISM ' => 'smn',
     'ITA ' => 'ita',
     'IWR ' => 'heb',
+    'JAM ' => 'jam',
     'JAN ' => 'jpn',
     'JAV ' => 'jav',
+    'JBO ' => 'jbo',
     'JII ' => 'yid',
     'JUD ' => 'lad',
     'JUL ' => 'dyu',
     'KAB ' => 'kbd',
+    'KAB0' => 'kab',
     'KAC ' => 'kfr',
     'KAL ' => 'kln',
     'KAN ' => 'kan',
     'KAR ' => 'krc',
     'KAT ' => 'kat',
     'KAZ ' => 'kaz',
+    'KDE ' => 'kde',
+    'KEA ' => 'kea',
     'KEB ' => 'ktb',
+    'KEK ' => 'kek',
     'KGE ' => 'kat',
     'KHA ' => 'kjh',
     'KHK ' => 'kca',
     'KHM ' => 'khm',
     'KHS ' => 'kca',
+    'KHT ' => 'kht',
     'KHV ' => 'kca',
     'KHW ' => 'khw',
     'KIK ' => 'kik',
     'KIR ' => 'kir',
     'KIS ' => 'kqs kss',
+    'KIU ' => 'kiu',
+    'KJD ' => 'kjd',
+    'KJP ' => 'kjp',
     'KKN ' => 'kex',
     'KLM ' => 'xal',
     'KMB ' => 'kam',
@@ -955,9 +1260,12 @@ require Exporter;
     'KOD ' => 'kfa',
     'KOH ' => 'okm',
     'KOK ' => 'kok',
+    'KOM ' => 'kom',
     'KON ' => 'ktu',
+    'KON0' => 'kon',
     'KOP ' => 'koi',
     'KOR ' => 'kor',
+    'KOS ' => 'kos',
     'KOZ ' => 'kpv',
     'KPL ' => 'kpe',
     'KRI ' => 'kri',
@@ -967,8 +1275,11 @@ require Exporter;
     'KRN ' => 'kar',
     'KRT ' => 'kqy',
     'KSH ' => 'kas',
+    'KSH0' => 'ksh',
     'KSI ' => 'kha',
     'KSM ' => 'sjd',
+    'KSW ' => 'ksw',
+    'KUA ' => 'kua',
     'KUI ' => 'kxu',
     'KUL ' => 'kfx',
     'KUM ' => 'kum',
@@ -976,6 +1287,7 @@ require Exporter;
     'KUU ' => 'kru',
     'KUY ' => 'kdt',
     'KYK ' => 'kpy',
+    'KYU ' => 'kyu',
     'LAD ' => 'lld',
     'LAH ' => 'bfu',
     'LAK ' => 'lbe',
@@ -986,33 +1298,52 @@ require Exporter;
     'LCR ' => 'crm',
     'LDK ' => 'lbj',
     'LEZ ' => 'lez',
+    'LIJ ' => 'lij',
+    'LIM ' => 'lim',
     'LIN ' => 'lin',
+    'LIS ' => 'lis',
+    'LJP ' => 'ljp',
+    'LKI ' => 'lki',
     'LMA ' => 'mhr',
     'LMB ' => 'lif',
+    'LMO ' => 'lmo',
     'LMW ' => 'ngl',
+    'LOM ' => 'lom',
+    'LRC ' => 'lrc luz bqi zum',
     'LSB ' => 'dsb',
     'LSM ' => 'smj',
     'LTH ' => 'lit',
     'LTZ ' => 'ltz',
-    'LUB ' => 'lua lub',
+    'LUA ' => 'lua',
+    'LUB ' => 'lub',
     'LUG ' => 'lug',
     'LUH ' => 'luy',
     'LUO ' => 'luo',
     'LVI ' => 'lav',
+    'MAD ' => 'mad',
+    'MAG ' => 'mag',
+    'MAH ' => 'mah',
     'MAJ ' => 'mpe',
     'MAK ' => 'vmw',
     'MAL ' => 'mal',
+    'MAM ' => 'mam',
     'MAN ' => 'mns',
     'MAP ' => 'arn',
     'MAR ' => 'mar',
-    'MAW ' => 'mwr',
+    'MAW ' => 'mwr dhd rwr mve wry mtr swv',
     'MBN ' => 'kmb',
     'MCH ' => 'mnc',
     'MCR ' => 'crm',
     'MDE ' => 'men',
+    'MDR ' => 'mdr',
     'MEN ' => 'mym',
+    'MER ' => 'mer',
+    'MFE ' => 'mfe',
+    'MIN ' => 'min',
     'MIZ ' => 'lus',
     'MKD ' => 'mkd',
+    'MKR ' => 'mak',
+    'MKW ' => 'mkw',
     'MLE ' => 'mdy',
     'MLG ' => 'mlg',
     'MLN ' => 'mlq',
@@ -1021,35 +1352,52 @@ require Exporter;
     'MND ' => 'mnk',
     'MNG ' => 'mon',
     'MNI ' => 'mni',
-    'MNK ' => 'man',
+    'MNK ' => 'man mnk myq mku msc emk mwk mlq',
     'MNX ' => 'glv',
-    'MOH ' => 'moh',
+    'MOH ' => 'mho',
     'MOK ' => 'mdf',
     'MOL ' => 'mol',
     'MON ' => 'mnw',
+    'MOS ' => 'mos',
     'MRI ' => 'mri',
     'MTH ' => 'mai',
     'MTS ' => 'mlt',
     'MUN ' => 'unr',
+    'MUS ' => 'mus',
+    'MWL ' => 'mwl',
+    'MWW ' => 'mww',
+    'MYN ' => 'myn',
+    'MZN ' => 'mzn',
     'NAG ' => 'nag',
+    'NAH ' => 'nah',
     'NAN ' => 'gld',
+    'NAP ' => 'nap',
     'NAS ' => 'nsk',
+    'NAU ' => 'nau',
+    'NAV ' => 'nav',
     'NCR ' => 'csw',
     'NDB ' => 'nbl nde',
+    'NDC ' => 'ndc',
     'NDG ' => 'ndo',
+    'NDS ' => 'nds',
     'NEP ' => 'nep',
     'NEW ' => 'new',
+    'NGA ' => 'nga',
     'NHC ' => 'csw',
     'NIS ' => 'dap',
     'NIU ' => 'niu',
     'NKL ' => 'nyn',
-    'NKO ' => 'nqo',
+    'NKO ' => 'ngo',
     'NLD ' => 'nld',
+    'NOE ' => 'noe',
     'NOG ' => 'nog',
     'NOR ' => 'nob',
+    'NOV ' => 'nov',
     'NSM ' => 'sme',
+    'NSO ' => 'nso',
     'NTA ' => 'nod',
     'NTO ' => 'epo',
+    'NYM ' => 'nym',
     'NYN ' => 'nno',
     'OCI ' => 'oci',
     'OCR ' => 'ojs',
@@ -1058,34 +1406,68 @@ require Exporter;
     'ORO ' => 'orm',
     'OSS ' => 'oss',
     'PAA ' => 'sam',
+    'PAG ' => 'pag',
     'PAL ' => 'pli',
+    'PAM ' => 'pam',
     'PAN ' => 'pan',
     'PAP ' => 'plp',
+    'PAP0' => 'pap',
     'PAS ' => 'pus',
+    'PAU ' => 'pau',
+    'PCC ' => 'pcc',
+    'PCD ' => 'pcd',
+    'PDC ' => 'pdc',
     'PGR ' => 'ell',
+    'PHK ' => 'phk',
+    'PIH ' => 'pih',
     'PIL ' => 'fil',
     'PLG ' => 'pce rbb pll',
     'PLK ' => 'pol',
+    'PMS ' => 'pms',
+    'PNB ' => 'pnb',
+    'POH ' => 'poh',
+    'PON ' => 'pon',
     'PRO ' => 'pro',
     'PTG ' => 'por',
+    'PWO ' => 'pwo',
     'QIN ' => 'bgr cnh cnw czt sez tcp csy ctd flm pck tcz zom cmr dao hlt cka cnk mrh mwg cbl cnb csh',
+    'QUC ' => 'quc',
+    'QUH ' => 'quh',
+    'QUZ ' => 'quz',
+    'QVI ' => 'qvi',
+    'QWH ' => 'qwh',
     'RAJ ' => 'raj',
+    'RAR ' => 'rar',
     'RBU ' => 'bxr',
     'RCR ' => 'atj',
+    'REJ ' => 'rej',
     'RIA ' => 'ria',
+    'RIF ' => 'rif',
+    'RIT ' => 'rit',
+    'RKW ' => 'rkw',
     'RMS ' => 'roh',
+    'RMY ' => 'rmy',
     'ROM ' => 'ron',
     'ROY ' => 'rom',
     'RSY ' => 'rue',
+    'RTM ' => 'rtm',
     'RUA ' => 'kin',
+    'RUN ' => 'run',
+    'RUP ' => 'rup',
     'RUS ' => 'rus',
     'SAD ' => 'sck',
     'SAN ' => 'san',
+    'SAS ' => 'sas',
     'SAT ' => 'sat',
     'SAY ' => 'chp',
+    'SCN ' => 'scn',
+    'SCO ' => 'sco',
     'SEK ' => 'xan',
     'SEL ' => 'sel',
+    'SGA ' => 'sga',
     'SGO ' => 'sag',
+    'SGS ' => 'sgs',
+    'SHI ' => 'shi',
     'SHN ' => 'shn',
     'SIB ' => 'sjo',
     'SID ' => 'sid',
@@ -1097,17 +1479,23 @@ require Exporter;
     'SML ' => 'som',
     'SMO ' => 'smo',
     'SNA ' => 'she',
+    'SNA0' => 'sna',
     'SND ' => 'snd',
     'SNH ' => 'sin',
     'SNK ' => 'snk',
     'SOG ' => 'gru',
-    'SOT ' => 'nso sot',
-    'SQI ' => 'sqi',
+    'SOP ' => 'sop',
+    'SOT ' => 'sot',
+    'SQI ' => 'gsw',
     'SRB ' => 'srp',
+    'SRD ' => 'srd',
     'SRK ' => 'skr',
     'SRR ' => 'srr',
     'SSL ' => 'xsl',
     'SSM ' => 'sma',
+    'STQ ' => 'stq',
+    'SUK ' => 'suk',
+    'SUN ' => 'sun',
     'SUR ' => 'suq',
     'SVA ' => 'sva',
     'SVE ' => 'swe',
@@ -1115,55 +1503,87 @@ require Exporter;
     'SWK ' => 'swa',
     'SWZ ' => 'ssw',
     'SXT ' => 'ngo',
+    'SXU ' => 'sxu',
+    'SYL ' => 'syl',
     'SYR ' => 'syr',
+    'SZL ' => 'szl',
     'TAB ' => 'tab',
     'TAJ ' => 'tgk',
     'TAM ' => 'tam',
     'TAT ' => 'tat',
     'TCR ' => 'cwd',
+    'TDD ' => 'tdd',
     'TEL ' => 'tel',
+    'TET ' => 'tet',
+    'TGL ' => 'tgl',
     'TGN ' => 'ton',
     'TGR ' => 'tig',
     'TGY ' => 'tir',
     'THA ' => 'tha',
     'THT ' => 'tah',
     'TIB ' => 'bod',
+    'TIV ' => 'tiv',
     'TKM ' => 'tuk',
+    'TMH ' => 'tmh',
     'TMN ' => 'tem',
     'TNA ' => 'tsn',
     'TNE ' => 'enh',
     'TNG ' => 'toi',
     'TOD ' => 'xal',
+    'TOD0' => 'tod',
+    'TPI ' => 'tpi',
     'TRK ' => 'tur',
     'TSG ' => 'tso',
     'TUA ' => 'tru',
     'TUL ' => 'tcy',
+    'TUM ' => 'tum',
     'TUV ' => 'tyv',
-    'TWI ' => 'aka',
+    'TVL ' => 'tvl',
+    'TWI ' => 'twi',
+    'TYZ ' => 'tyz',
+    'TZM ' => 'tzm',
+    'TZO ' => 'tzo',
     'UDM ' => 'udm',
     'UKR ' => 'ukr',
+    'UMB ' => 'umb',
     'URD ' => 'urd',
     'USB ' => 'hsb',
     'UYG ' => 'uig',
-    'UZB ' => 'uzb',
+    'UZB ' => 'uzb uzn uzs',
+    'VEC ' => 'vec',
     'VEN ' => 'ven',
     'VIT ' => 'vie',
+    'VOL ' => 'vol',
+    'VRO ' => 'vro',
     'WA  ' => 'wbm',
     'WAG ' => 'wbr',
+    'WAR ' => 'war',
     'WCR ' => 'crk',
     'WEL ' => 'cym',
     'WLF ' => 'wol',
+    'WLN ' => 'wln',
+    'WTM ' => 'wtm',
     'XBD ' => 'khb',
     'XHS ' => 'xho',
+    'XJB ' => 'xjb',
+    'XOG ' => 'xog',
+    'XPE ' => 'xpe',
     'YAK ' => 'sah',
+    'YAO ' => 'yao',
+    'YAP ' => 'yap',
     'YBA ' => 'yor',
+    'YCR ' => 'cre',
     'YIM ' => 'iii',
+    'ZEA ' => 'zea',
+    'ZGH ' => 'zgh',
+    'ZHA ' => 'zha',
     'ZHH ' => 'zho',
     'ZHP ' => 'zho',
     'ZHS ' => 'zho',
     'ZHT ' => 'zho',
     'ZND ' => 'zne',
     'ZUL ' => 'zul',
+    'ZZA ' => 'zza',
 );
 
 {
@@ -1171,17 +1591,17 @@ require Exporter;
     {
         map { $ttnames{$s}{$tttags{$s}{$_}} = $_ }  keys %{$tttags{$s}};
     }
-	
-	# For ISO639 info, the raw data is a space-separated list of ISO639
-	# language IDs. We convert that list to an array.
-	
-	foreach my $tag (keys %iso639)
-	{
-		my $list = $iso639{$tag};
-		$iso639{$tag} = [ split(' ', $list) ];
-		# Also set the reverse mapping:
-		map { $iso639{$_} = $tag } @{$iso639{$tag}};
-	}
+    
+    # For ISO639 info, the raw data is a space-separated list of ISO639
+    # language IDs. We convert that list to an array.
+    
+    foreach my $tag (keys %iso639)
+    {
+        my $list = $iso639{$tag};
+        $iso639{$tag} = [ split(' ', $list) ];
+        # Also set the reverse mapping:
+        map { $iso639{$_} = $tag } @{$iso639{$tag}};
+    }
 }
 
 
@@ -1197,27 +1617,27 @@ sub readtagsfile
 {
     my $fname = shift;
     open (TAGS, $fname) or return 0;
-	my ($what, $name, $tag);
-	while (<TAGS>)
-	{
-		($what, $name, $tag) = (m/"([^"]*)", "([^"]*)", "([^"]*)"/);  #"
-		$ttnames{$what}{$tag} = $name;
-		$tttags{$what}{$name} = $tag;
-	}
-	close TAGS;
-    return 1;	
+    my ($what, $name, $tag);
+    while (<TAGS>)
+    {
+        ($what, $name, $tag) = (m/"([^"]*)", "([^"]*)", "([^"]*)"/);  #"
+        $ttnames{$what}{$tag} = $name;
+        $tttags{$what}{$name} = $tag;
+    }
+    close TAGS;
+    return 1;   
 }
 
 1;
 
 =head1 AUTHOR
 
-Bob Hallissy. L<Bob_Hallissy@sil.org>
+Bob Hallissy. L<http://scripts.sil.org/FontUtils>.
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -158,7 +158,7 @@ sub read
                     else
                     { $id = unpack("n", substr($dat, ($j << 1) + $num * 6 +
                                         2 + ($k - $start) * 2 + $range, 2)) + $delta; }
-		            $id -= 65536 if $id > 65536;
+                    $id -= 65536 if $id > 65536;
                     push (@ids, $id);
                 }
                 $s->{'val'}->fastadd_segment($start, 0, @ids);
@@ -269,7 +269,7 @@ sub out
             for ($j = 0; $j < $num; $j++)
             {
                 $delta = $segs->[$j]{'VAL'}[0]; $flat = 1;
-                for ($k = $k < $segs->[$j]{'LEN'}; $k++)
+                for ($k = 1; $k < $segs->[$j]{'LEN'}; $k++)
                 {
                     if ($segs->[$j]{'VAL'}[$k] == 0)
                     { $flat = 0; }
@@ -353,12 +353,12 @@ No support for format 2 tables (MBCS)
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -707,12 +707,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -126,12 +126,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -4441,12 +4441,12 @@ sub parse
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -312,12 +312,12 @@ No support for type 4 tables
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -82,12 +82,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -163,12 +163,12 @@ None known
 
 =head1 AUTHOR
 
-Jonathan Kew L<Jonathan_Kew@sil.org>. 
+Jonathan Kew L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -369,12 +369,12 @@ No known bugs.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -315,12 +315,13 @@ Reads the Silf table into the internal data structure
 sub read
 {
     my ($self) = @_;
+    $self->SUPER::read or return $self;
+
     my ($dat, $d);
     my ($fh) = $self->{' INFILE'};
     my ($moff) = $self->{' OFFSET'};
     my ($numsilf, @silfo);
     
-    $self->SUPER::read or return $self;
     $fh->read($dat, 4);
     ($self->{'Version'}) = TTF_Unpack("v", $dat);
     if ($self->{'Version'} >= 3)
@@ -872,12 +873,12 @@ sub minsize
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -126,13 +126,13 @@ sub minsize
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -68,7 +68,7 @@ use IO::String;
 $VERSION = 0.0001;
 
 my $havezlib = eval {require Compress::Zlib};
-	
+
 =head2 Font::TTF::Table->new(%parms)
 
 Creates a new table or subclass. Table instance variables are passed in
@@ -88,7 +88,6 @@ sub new
     bless $self, $class;
 }
 
-
 =head2 $t->read
 
 Reads the table from the input file. Acts as a superclass to all true tables.
@@ -96,6 +95,11 @@ This method marks the table as read and then just sets the input file pointer
 but does not read any data. If the table has already been read, then returns
 C<undef> else returns C<$self>
 
+For WOFF-compressed tables, the table is first decompressed and a
+replacement file handle is created for reading the decompressed data. In this
+case ORIGINALOFFSET will preserve the original value of OFFSET for 
+applications that care.
+
 =cut
 
 sub read
@@ -107,12 +111,13 @@ sub read
     $self->{' INFILE'}->seek($self->{' OFFSET'}, 0);
     if (0 < $self->{' ZLENGTH'} && $self->{' ZLENGTH'} < $self->{' LENGTH'})
     {
-    	# WOFF table is compressed. Uncompress it to memory and create new fh
-    	die ("Cannot uncompress WOFF data: Compress::Zlib not present.\n") unless $havezlib;
-    	my $dat;
-    	$self->{' INFILE'}->read($dat, $self->{' ZLENGTH'}); 
-    	$dat = Compress::Zlib::uncompress($dat);
-    	warn "$self->{' NAME'} table decompressed to wrong length" if $self->{' LENGTH'} != bytes::length($dat);
+        # WOFF table is compressed. Uncompress it to memory and create new fh
+        die ("Cannot uncompress WOFF data: Compress::Zlib not present.\n") unless $havezlib;
+        $self->{' ORIGINALOFFSET'} = $self->{' OFFSET'};    # Preserve this for those who care
+        my $dat;
+        $self->{' INFILE'}->read($dat, $self->{' ZLENGTH'}); 
+        $dat = Compress::Zlib::uncompress($dat);
+        warn "$self->{' NAME'} table decompressed to wrong length" if $self->{' LENGTH'} != bytes::length($dat);
         $self->{' INFILE'} = IO::String->new($dat);
         binmode $self->{' INFILE'};
         $self->{' OFFSET'} = 0;
@@ -140,18 +145,18 @@ sub read_dat
     $self->{' INFILE'}->seek($self->{' OFFSET'}, 0);
     if (0 < $self->{' ZLENGTH'} && $self->{' ZLENGTH'} < $self->{' LENGTH'})
     {
-    	# WOFF table is compressed. Uncompress it directly to ' dat'
-    	die ("Cannot uncompress WOFF data: Compress::Zlib not present.\n") unless $havezlib;
-    	my $dat;
-    	$self->{' INFILE'}->read($dat, $self->{' ZLENGTH'}); 
-    	$dat = Compress::Zlib::uncompress($dat);
-    	warn "$self->{' NAME'} table decompressed to wrong length" if $self->{' LENGTH'} != bytes::length($dat);
-    	$self->{' dat'} = $dat;
- 	}
- 	else
- 	{
-	    $self->{' INFILE'}->read($self->{' dat'}, $self->{' LENGTH'});
-	}
+        # WOFF table is compressed. Uncompress it directly to ' dat'
+        die ("Cannot uncompress WOFF data: Compress::Zlib not present.\n") unless $havezlib;
+        my $dat;
+        $self->{' INFILE'}->read($dat, $self->{' ZLENGTH'}); 
+        $dat = Compress::Zlib::uncompress($dat);
+        warn "$self->{' NAME'} table decompressed to wrong length" if $self->{' LENGTH'} != bytes::length($dat);
+        $self->{' dat'} = $dat;
+    }
+    else
+    {
+        $self->{' INFILE'}->read($self->{' dat'}, $self->{' LENGTH'});
+    }
     $self;
 }
 
@@ -175,6 +180,20 @@ sub out
     }
 
     return undef unless defined $self->{' INFILE'};
+    
+    if (0 < $self->{' ZLENGTH'} && $self->{' ZLENGTH'} < $self->{' LENGTH'})
+    {
+        # WOFF table is compressed. Have to uncompress first
+        $self->read_dat;
+        $fh->print($self->{' dat'});
+        return $self;
+    }
+
+    # We don't really have to keep the following code... we could have 
+    # just always done a full read_dat() on the table. But the following
+    # is more memory-friendly so I've kept it for the more common case 
+    # of non-compressed tables.
+
     $self->{' INFILE'}->seek($self->{' OFFSET'}, 0);
     $len = $self->{' LENGTH'};
     while ($len > 0)
@@ -428,12 +447,12 @@ No known bugs
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -159,12 +159,12 @@ No known bugs, but then not ever executed!
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -177,8 +177,9 @@ match.
 
 =item RULES
 
-The rules are a complex array. Each element of the array corresponds to an
-element in the coverage table (governed by the coverage index). If there is
+The rules are a complex array. In most cases, each element of the array 
+corresponds to an element in the coverage table (governed by the coverage index). 
+In a few caess, such as when there is
 no coverage table, then there is considered to be only one element in the rules
 array. Each element of the array is itself an array corresponding to the
 possibly multiple string matches which may follow the initial glyph. Each
@@ -240,8 +241,6 @@ This is the offset to the class definition for the before match glyphs
 
 This is the offset to the class definition for the after match glyphs.
 
-=back
-
 =item ACTION_TYPE
 
 This string holds the type of information held in the ACTION variable of a RULE.
@@ -272,6 +271,8 @@ are stored relative to another base within the subtable.
 
 =back
 
+=back
+
 =head1 METHODS
 
 =cut
@@ -411,7 +412,7 @@ sub read
         }
         foreach $lTag (@{$l->{$tag}{'LANG_TAGS'}}, 'DEFAULT')
         {
-        	# Make copies of referenced languages for each reference. 
+            # Make copies of referenced languages for each reference. 
             next unless $l->{$tag}{$lTag}{' REFTAG'};
             $temp = $l->{$tag}{$lTag}{' REFTAG'};
             $l->{$tag}{$lTag} = &copy($l->{$tag}{$temp});
@@ -1328,12 +1329,12 @@ repeated if necessary. Within lookup sharing is possible.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -87,12 +87,12 @@ use Font::TTF::Dumper;
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -623,12 +623,12 @@ No known bugs
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -164,12 +164,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -79,12 +79,12 @@ None known
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -34,12 +34,12 @@ sub findfonts
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -8,12 +8,6 @@ Font::TTF::Woff::MetaData - WOFF metadata
 
 Currently a stub, thus read() results in read_dat()
 
-=head1 INSTANCE VARIABLES
-
-=over 4
-
-=back
-
 =cut
 
 use Font::TTF::Utils;
@@ -25,16 +19,13 @@ require Font::TTF::Table;
 
 =head1 AUTHOR
 
-Bob Hallissy. L<Bob_Hallissy@sil.org>
-
+Bob Hallissy. L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
-
-
 =cut
@@ -8,12 +8,6 @@ Font::TTF::Woff::PrivateData - WOFF Private data
 
 Currently a stub, thus read() results in read_dat()
 
-=head1 INSTANCE VARIABLES
-
-=over 4
-
-=back
-
 =cut
 
 use Font::TTF::Utils;
@@ -23,20 +17,16 @@ require Font::TTF::Table;
 
 1;
 
-
 =head1 AUTHOR
 
-Bob Hallissy. L<Bob_Hallissy@sil.org>
-
+Bob Hallissy. L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
-
-
 =cut
 
@@ -46,12 +46,12 @@ require Font::TTF::Table;
 
 =head1 AUTHOR
 
-Bob Hallissy. L<Bob_Hallissy@sil.org>
+Bob Hallissy. L<http://scripts.sil.org/FontUtils>.
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -177,12 +177,12 @@ sub read_xml
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>. 
+Martin Hosken L<http://scripts.sil.org/FontUtils>. 
 
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2014, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
@@ -1,6 +1,7 @@
 package Font::TTF;
 
-$VERSION = '1.04';    # MJPH     8-Jan-2014      License, POD, and perl -w tidying; bug fixes
+$VERSION = '1.05';   # MJPH    19-Jan-2015      Bug fixes; updated OT tags; GSUB Lookup Type 8 support
+# $VERSION = '1.04';    # MJPH     8-Jan-2014      License, POD, and perl -w tidying; bug fixes
 # $VERSION = '1.03';    # MJPH     5-Sep-2013      Add $t->minsize()
 # $VERSION = '1.02';    # MJPH    30-Aug-2012      Fix case typo in Useall
 # $VERSION = '1.01';    # MJPH    30-Aug-2012      add IO::String prerequisite
@@ -31,16 +32,16 @@ including modify and inspect nearly all tables.
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 (see CONTRIBUTORS for other authors).
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org) 
+Copyright (c) 1998-2015, SIL International (http://www.sil.org) 
 
 This module is released under the terms of the Artistic License 2.0. 
 For details, see the full text of the license in the file LICENSE.
 
 .
 
-=cut
\ No newline at end of file
+=cut
@@ -175,11 +175,11 @@ else
 
 =head1 AUTHOR
 
-Martin Hosken L<Martin_Hosken@sil.org>
+Martin Hosken L<http://scripts.sil.org/FontUtils>.
 
 =head1 LICENSING
 
-Copyright (c) 1998-2013, SIL International (http://www.sil.org)
+Copyright (c) 1998-2014, SIL International (http://www.sil.org)
 
 This script is released under the terms of the Artistic License 2.0.
 For details, see the full text of the license in the file LICENSE.
@@ -8,7 +8,7 @@ ok($tttags{'SCRIPT'}{'Cypriot Syllabary'} eq 'cprt', 'tttags{SCRIPT}');
 
 ok($ttnames{'LANGUAGE'}{'AFK '} eq 'Afrikaans', 'ttnames{LANGUAGE}');
 
-ok($ttnames{'LANGUAGE'}{'DHV '} eq 'Dhivehi (deprecated)' && $ttnames{'LANGUAGE'}{'DIV '} eq 'Dhivehi', 'ttnames{LANGUAGE} Dhivehi');
+ok($ttnames{'LANGUAGE'}{'DHV '} eq 'Divehi (Dhivehi, Maldivian) (deprecated)' && $ttnames{'LANGUAGE'}{'DIV '} eq 'Divehi (Dhivehi, Maldivian)', 'ttnames{LANGUAGE} Dhivehi');
 
 ok($ttnames{'FEATURE'}{'cv01'} eq 'Character Variants 01', 'ttnames{FEATURE}');