Repository: googlefonts/glyphsets (language: python)

Issue:
Language definition overhaul: use arguments for assembly tools



Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 907015bb27..6f26a5f2f2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
 _version*
 .DS_Store
 *.pyc
+build/
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000..d99f2f30cc
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+    "[python]": {
+        "editor.defaultFormatter": "ms-python.black-formatter"
+    },
+    "python.formatting.provider": "none"
+}
\ No newline at end of file
diff --git a/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.glyphs b/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.glyphs
new file mode 100644
index 0000000000..31448af86b
--- /dev/null
+++ b/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.glyphs
@@ -0,0 +1,199 @@
+{
+.appVersion = "3151";
+.formatVersion = 3;
+date = "2021-10-28 12:22:31 +0000";
+familyName = "GF Latin Core";
+featurePrefixes = (
+{
+automatic = 1;
+code = "languagesystem DFLT dflt;
+
+languagesystem latn dflt;
+languagesystem latn AZE;
+languagesystem latn CRT;
+languagesystem latn KAZ;
+languagesystem latn TAT;
+languagesystem latn TRK;
+languagesystem latn ROM;
+languagesystem latn MOL;
+languagesystem latn CAT;
+";
+name = Languagesystems;
+}
+);
+features = (
+{
+automatic = 1;
+code = "feature locl;
+feature ordn;
+feature case;
+";
+tag = aalt;
+},
+{
+automatic = 1;
+code = "lookup ccmp_Other_1 {
+	@CombiningTopAccents = [acutecomb brevecomb caroncomb circumflexcomb commaturnedabovecomb dieresiscomb dotaccentcomb gravecomb hungarumlautcomb macroncomb ringcomb tildecomb];
+	@CombiningNonTopAccents = [cedillacomb ogonekcomb];
+	sub [i j]' @CombiningTopAccents by [idotless jdotless];
+	sub [i j]' @CombiningNonTopAccents @CombiningTopAccents by [idotless jdotless];
+} ccmp_Other_1;
+";
+tag = ccmp;
+},
+{
+automatic = 1;
+code = "lookup locl_latn_0 {
+	script latn;
+	language AZE;
+	sub i by idotaccent;
+	language CRT;
+	sub i by idotaccent;
+	language KAZ;
+	sub i by idotaccent;
+	language TAT;
+	sub i by idotaccent;
+	language TRK;
+	sub i by idotaccent;
+} locl_latn_0;
+
+lookup locl_latn_1 {
+	script latn;
+	language ROM;
+	sub Scedilla by Scommaaccent;
+	sub scedilla by scommaaccent;
+	language MOL;
+	sub Scedilla by Scommaaccent;
+	sub scedilla by scommaaccent;
+} locl_latn_1;
+
+lookup locl_latn_2 {
+	script latn;
+	language CAT;
+	sub l periodcentered' l by periodcentered.loclCAT;
+	sub L periodcentered' L by periodcentered.loclCAT.case;
+} locl_latn_2;
+";
+tag = locl;
+},
+{
+automatic = 1;
+code = "sub [zero one two three four five six seven eight nine] [A a]' by ordfeminine;
+sub [zero one two three four five six seven eight nine] [O o]' by ordmasculine;
+";
+tag = ordn;
+},
+{
+automatic = 1;
+code = "sub periodcentered.loclCAT by periodcentered.loclCAT.case;
+";
+tag = case;
+}
+);
+fontMaster = (
+{
+id = m01;
+metricValues = (
+{
+over = 16;
+pos = 800;
+},
+{
+over = 16;
+pos = 700;
+},
+{
+over = 16;
+pos = 500;
+},
+{
+over = -16;
+},
+{
+over = -16;
+pos = -200;
+},
+{
+over = -16;
+}
+);
+name = Regular;
+}
+);
+glyphs = (
+{
+glyphname = idotaccent;
+lastChange = "2022-03-04 12:31:03 +0000";
+layers = (
+{
+layerId = m01;
+width = 600;
+}
+);
+},
+{
+color = 10;
+glyphname = .notdef;
+lastChange = "2022-03-04 12:31:22 +0000";
+layers = (
+{
+layerId = m01;
+width = 600;
+}
+);
+},
+{
+glyphname = periodcentered.loclCAT;
+lastChange = "2022-03-04 12:31:03 +0000";
+layers = (
+{
+layerId = m01;
+width = 600;
+}
+);
+},
+{
+glyphname = periodcentered.loclCAT.case;
+lastChange = "2022-03-04 12:31:03 +0000";
+layers = (
+{
+layerId = m01;
+width = 600;
+}
+);
+},
+{
+glyphname = caroncomb.alt;
+lastChange = "2022-03-04 12:31:03 +0000";
+layers = (
+{
+layerId = m01;
+width = 600;
+}
+);
+}
+);
+metrics = (
+{
+type = ascender;
+},
+{
+type = "cap height";
+},
+{
+type = "x-height";
+},
+{
+type = baseline;
+},
+{
+type = descender;
+},
+{
+type = "italic angle";
+}
+);
+unitsPerEm = 1000;
+versionMajor = 1;
+versionMinor = 0;
+}
diff --git a/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.nam b/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.nam
new file mode 100644
index 0000000000..98595a9fd7
--- /dev/null
+++ b/GF_glyphsets/Latin/definitions/GF_Latin_Core.stub.nam
@@ -0,0 +1,89 @@
+0x0020 SPACE
+0x0021 EXCLAMATION MARK
+0x0022 QUOTATION MARK
+0x0023 NUMBER SIGN
+0x0024 DOLLAR SIGN
+0x0025 PERCENT SIGN
+0x0026 AMPERSAND
+0x0027 APOSTROPHE
+0x0028 LEFT PARENTHESIS
+0x0029 RIGHT PARENTHESIS
+0x002A ASTERISK
+0x002B PLUS SIGN
+0x002C COMMA
+0x002D HYPHEN-MINUS
+0x002E FULL STOP
+0x002F SOLIDUS
+0x0030 DIGIT ZERO
+0x0031 DIGIT ONE
+0x0032 DIGIT TWO
+0x0033 DIGIT THREE
+0x0034 DIGIT FOUR
+0x0035 DIGIT FIVE
+0x0036 DIGIT SIX
+0x0037 DIGIT SEVEN
+0x0038 DIGIT EIGHT
+0x0039 DIGIT NINE
+0x003A COLON
+0x003B SEMICOLON
+0x003C LESS-THAN SIGN
+0x003D EQUALS SIGN
+0x003E GREATER-THAN SIGN
+0x003F QUESTION MARK
+0x0040 COMMERCIAL AT
+0x005B LEFT SQUARE BRACKET
+0x005C REVERSE SOLIDUS
+0x005D RIGHT SQUARE BRACKET
+0x005E CIRCUMFLEX ACCENT
+0x005F LOW LINE
+0x0060 GRAVE ACCENT
+0x007B LEFT CURLY BRACKET
+0x007C VERTICAL LINE
+0x007D RIGHT CURLY BRACKET
+0x007E TILDE
+0x00A0 NO-BREAK SPACE
+0x00A1 INVERTED EXCLAMATION MARK
+0x00A2 CENT SIGN
+0x00A3 POUND SIGN
+0x00A5 YEN SIGN
+0x00A7 SECTION SIGN
+0x00A8 DIAERESIS
+0x00A9 COPYRIGHT SIGN
+0x00AA FEMININE ORDINAL INDICATOR
+0x00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00AE REGISTERED SIGN
+0x00AF MACRON
+0x00B0 DEGREE SIGN
+0x00B4 ACUTE ACCENT
+0x00B6 PILCROW SIGN
+0x00B7 MIDDLE DOT
+0x00B8 CEDILLA
+0x00BA MASCULINE ORDINAL INDICATOR
+0x00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00BF INVERTED QUESTION MARK
+0x00D7 MULTIPLICATION SIGN
+0x00F7 DIVISION SIGN
+0x0237 LATIN SMALL LETTER DOTLESS J
+0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+0x02C7 CARON
+0x02D8 BREVE
+0x02D9 DOT ABOVE
+0x02DA RING ABOVE
+0x02DB OGONEK
+0x02DC SMALL TILDE
+0x02DD DOUBLE ACUTE ACCENT
+0x2013 EN DASH
+0x2014 EM DASH
+0x2018 LEFT SINGLE QUOTATION MARK
+0x2019 RIGHT SINGLE QUOTATION MARK
+0x201A SINGLE LOW-9 QUOTATION MARK
+0x201C LEFT DOUBLE QUOTATION MARK
+0x201D RIGHT DOUBLE QUOTATION MARK
+0x201E DOUBLE LOW-9 QUOTATION MARK
+0x2022 BULLET
+0x2026 HORIZONTAL ELLIPSIS
+0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x20AC EURO SIGN
+0x2122 TRADE MARK SIGN
+0x2212 MINUS SIGN
\ No newline at end of file
diff --git a/GF_glyphsets/Latin/glyphs/CustomFilter_GF_Latin.plist b/GF_glyphsets/Latin/glyphs/CustomFilter_GF_Latin.plist
index e175290df2..84856fe429 100644
--- a/GF_glyphsets/Latin/glyphs/CustomFilter_GF_Latin.plist
+++ b/GF_glyphsets/Latin/glyphs/CustomFilter_GF_Latin.plist
@@ -571,6 +571,22 @@
 	<dict>
 		<key>list</key>
 		<array>
+			<string>space</string>
+			<string>exclam</string>
+			<string>quotedbl</string>
+			<string>numbersign</string>
+			<string>dollar</string>
+			<string>percent</string>
+			<string>ampersand</string>
+			<string>quotesingle</string>
+			<string>parenleft</string>
+			<string>parenright</string>
+			<string>asterisk</string>
+			<string>plus</string>
+			<string>comma</string>
+			<string>hyphen</string>
+			<string>period</string>
+			<string>slash</string>
 			<string>zero</string>
 			<string>one</string>
 			<string>two</string>
@@ -581,329 +597,313 @@
 			<string>seven</string>
 			<string>eight</string>
 			<string>nine</string>
-			<string>space</string>
-			<string>nbspace</string>
-			<string>period</string>
 			<string>colon</string>
-			<string>ellipsis</string>
-			<string>exclam</string>
-			<string>asterisk</string>
-			<string>numbersign</string>
-			<string>slash</string>
-			<string>backslash</string>
-			<string>hyphen</string>
-			<string>parenleft</string>
-			<string>parenright</string>
-			<string>braceleft</string>
-			<string>braceright</string>
-			<string>bracketleft</string>
-			<string>bracketright</string>
-			<string>quotedblleft</string>
-			<string>quotedblright</string>
-			<string>quoteleft</string>
-			<string>quoteright</string>
-			<string>guillemetleft</string>
-			<string>guillemetright</string>
-			<string>quotedbl</string>
-			<string>quotesingle</string>
-			<string>bar</string>
-			<string>plus</string>
-			<string>multiply</string>
-			<string>divide</string>
+			<string>semicolon</string>
+			<string>less</string>
 			<string>equal</string>
 			<string>greater</string>
-			<string>less</string>
-			<string>percent</string>
-			<string>dieresiscomb</string>
-			<string>gravecomb</string>
-			<string>acutecomb</string>
-			<string>hungarumlautcomb</string>
-			<string>macroncomb</string>
-			<string>dotaccent</string>
-			<string>degree</string>
+			<string>question</string>
+			<string>at</string>
 			<string>A</string>
-			<string>Aacute</string>
-			<string>Abreve</string>
-			<string>Acircumflex</string>
-			<string>Adieresis</string>
-			<string>Agrave</string>
-			<string>Amacron</string>
-			<string>Aogonek</string>
-			<string>Aring</string>
-			<string>Atilde</string>
-			<string>AE</string>
 			<string>B</string>
 			<string>C</string>
-			<string>Cacute</string>
-			<string>Ccaron</string>
-			<string>Ccedilla</string>
-			<string>Cdotaccent</string>
 			<string>D</string>
-			<string>Eth</string>
-			<string>Dcaron</string>
-			<string>Dcroat</string>
 			<string>E</string>
-			<string>Eacute</string>
-			<string>Ecaron</string>
-			<string>Ecircumflex</string>
-			<string>Edieresis</string>
-			<string>Edotaccent</string>
-			<string>Egrave</string>
-			<string>Emacron</string>
-			<string>Eogonek</string>
 			<string>F</string>
 			<string>G</string>
-			<string>Gbreve</string>
-			<string>Gcommaaccent</string>
-			<string>Gdotaccent</string>
 			<string>H</string>
-			<string>Hbar</string>
 			<string>I</string>
-			<string>Iacute</string>
-			<string>Icircumflex</string>
-			<string>Idieresis</string>
-			<string>Idotaccent</string>
-			<string>Igrave</string>
-			<string>Imacron</string>
-			<string>Iogonek</string>
 			<string>J</string>
 			<string>K</string>
-			<string>Kcommaaccent</string>
 			<string>L</string>
-			<string>Lacute</string>
-			<string>Lcaron</string>
-			<string>Lcommaaccent</string>
-			<string>Lslash</string>
 			<string>M</string>
 			<string>N</string>
-			<string>Nacute</string>
-			<string>Ncaron</string>
-			<string>Ncommaaccent</string>
-			<string>Ntilde</string>
-			<string>Eng</string>
 			<string>O</string>
-			<string>Oacute</string>
-			<string>Ocircumflex</string>
-			<string>Odieresis</string>
-			<string>Ograve</string>
-			<string>Ohungarumlaut</string>
-			<string>Omacron</string>
-			<string>Oslash</string>
-			<string>Otilde</string>
-			<string>OE</string>
 			<string>P</string>
-			<string>Thorn</string>
 			<string>Q</string>
 			<string>R</string>
-			<string>Racute</string>
-			<string>Rcaron</string>
-			<string>Rcommaaccent</string>
 			<string>S</string>
-			<string>Sacute</string>
-			<string>Scaron</string>
-			<string>Scedilla</string>
-			<string>Scommaaccent</string>
-			<string>Germandbls</string>
 			<string>T</string>
-			<string>Tcaron</string>
-			<string>Tcommaaccent</string>
 			<string>U</string>
-			<string>Uacute</string>
-			<string>Ubreve</string>
-			<string>Ucircumflex</string>
-			<string>Udieresis</string>
-			<string>Ugrave</string>
-			<string>Uhungarumlaut</string>
-			<string>Umacron</string>
-			<string>Uogonek</string>
-			<string>Uring</string>
 			<string>V</string>
 			<string>W</string>
-			<string>Wacute</string>
-			<string>Wcircumflex</string>
-			<string>Wdieresis</string>
-			<string>Wgrave</string>
 			<string>X</string>
 			<string>Y</string>
-			<string>Yacute</string>
-			<string>Ycircumflex</string>
-			<string>Ydieresis</string>
-			<string>Ygrave</string>
 			<string>Z</string>
-			<string>Zacute</string>
-			<string>Zcaron</string>
-			<string>Zdotaccent</string>
+			<string>bracketleft</string>
+			<string>backslash</string>
+			<string>bracketright</string>
+			<string>asciicircum</string>
+			<string>underscore</string>
+			<string>grave</string>
 			<string>a</string>
+			<string>b</string>
+			<string>c</string>
+			<string>d</string>
+			<string>e</string>
+			<string>f</string>
+			<string>g</string>
+			<string>h</string>
+			<string>i</string>
+			<string>j</string>
+			<string>k</string>
+			<string>l</string>
+			<string>m</string>
+			<string>n</string>
+			<string>o</string>
+			<string>p</string>
+			<string>q</string>
+			<string>r</string>
+			<string>s</string>
+			<string>t</string>
+			<string>u</string>
+			<string>v</string>
+			<string>w</string>
+			<string>x</string>
+			<string>y</string>
+			<string>z</string>
+			<string>braceleft</string>
+			<string>bar</string>
+			<string>braceright</string>
+			<string>asciitilde</string>
+			<string>nbspace</string>
+			<string>exclamdown</string>
+			<string>cent</string>
+			<string>sterling</string>
+			<string>yen</string>
+			<string>section</string>
+			<string>dieresis</string>
+			<string>copyright</string>
+			<string>ordfeminine</string>
+			<string>guillemetleft</string>
+			<string>registered</string>
+			<string>macron</string>
+			<string>degree</string>
+			<string>acute</string>
+			<string>paragraph</string>
+			<string>periodcentered</string>
+			<string>cedilla</string>
+			<string>ordmasculine</string>
+			<string>guillemetright</string>
+			<string>questiondown</string>
+			<string>Agrave</string>
+			<string>Aacute</string>
+			<string>Acircumflex</string>
+			<string>Atilde</string>
+			<string>Adieresis</string>
+			<string>Aring</string>
+			<string>AE</string>
+			<string>Ccedilla</string>
+			<string>Egrave</string>
+			<string>Eacute</string>
+			<string>Ecircumflex</string>
+			<string>Edieresis</string>
+			<string>Igrave</string>
+			<string>Iacute</string>
+			<string>Icircumflex</string>
+			<string>Idieresis</string>
+			<string>Eth</string>
+			<string>Ntilde</string>
+			<string>Ograve</string>
+			<string>Oacute</string>
+			<string>Ocircumflex</string>
+			<string>Otilde</string>
+			<string>Odieresis</string>
+			<string>multiply</string>
+			<string>Oslash</string>
+			<string>Ugrave</string>
+			<string>Uacute</string>
+			<string>Ucircumflex</string>
+			<string>Udieresis</string>
+			<string>Yacute</string>
+			<string>Thorn</string>
+			<string>germandbls</string>
+			<string>agrave</string>
 			<string>aacute</string>
-			<string>abreve</string>
 			<string>acircumflex</string>
+			<string>atilde</string>
 			<string>adieresis</string>
-			<string>agrave</string>
-			<string>amacron</string>
-			<string>aogonek</string>
 			<string>aring</string>
-			<string>atilde</string>
 			<string>ae</string>
-			<string>b</string>
-			<string>c</string>
-			<string>cacute</string>
-			<string>ccaron</string>
 			<string>ccedilla</string>
-			<string>cdotaccent</string>
-			<string>d</string>
-			<string>eth</string>
-			<string>dcaron</string>
-			<string>dcroat</string>
-			<string>e</string>
+			<string>egrave</string>
 			<string>eacute</string>
-			<string>ecaron</string>
 			<string>ecircumflex</string>
 			<string>edieresis</string>
-			<string>edotaccent</string>
-			<string>egrave</string>
+			<string>igrave</string>
+			<string>iacute</string>
+			<string>icircumflex</string>
+			<string>idieresis</string>
+			<string>eth</string>
+			<string>ntilde</string>
+			<string>ograve</string>
+			<string>oacute</string>
+			<string>ocircumflex</string>
+			<string>otilde</string>
+			<string>odieresis</string>
+			<string>divide</string>
+			<string>oslash</string>
+			<string>ugrave</string>
+			<string>uacute</string>
+			<string>ucircumflex</string>
+			<string>udieresis</string>
+			<string>yacute</string>
+			<string>thorn</string>
+			<string>ydieresis</string>
+			<string>Amacron</string>
+			<string>amacron</string>
+			<string>Abreve</string>
+			<string>abreve</string>
+			<string>Aogonek</string>
+			<string>aogonek</string>
+			<string>Cacute</string>
+			<string>cacute</string>
+			<string>Cdotaccent</string>
+			<string>cdotaccent</string>
+			<string>Ccaron</string>
+			<string>ccaron</string>
+			<string>Dcaron</string>
+			<string>dcaron</string>
+			<string>Dcroat</string>
+			<string>dcroat</string>
+			<string>Emacron</string>
 			<string>emacron</string>
+			<string>Edotaccent</string>
+			<string>edotaccent</string>
+			<string>Eogonek</string>
 			<string>eogonek</string>
-			<string>f</string>
-			<string>g</string>
+			<string>Ecaron</string>
+			<string>ecaron</string>
+			<string>Gbreve</string>
 			<string>gbreve</string>
-			<string>gcommaaccent</string>
+			<string>Gdotaccent</string>
 			<string>gdotaccent</string>
-			<string>h</string>
+			<string>Gcommaaccent</string>
+			<string>gcommaaccent</string>
+			<string>Hbar</string>
 			<string>hbar</string>
-			<string>i</string>
-			<string>idotless</string>
-			<string>iacute</string>
-			<string>icircumflex</string>
-			<string>idieresis</string>
-			<string>idotaccent</string>
-			<string>igrave</string>
+			<string>Itilde</string>
+			<string>itilde</string>
+			<string>Imacron</string>
 			<string>imacron</string>
+			<string>Iogonek</string>
 			<string>iogonek</string>
-			<string>j</string>
-			<string>jdotless</string>
-			<string>k</string>
+			<string>Idotaccent</string>
+			<string>idotless</string>
+			<string>Kcommaaccent</string>
 			<string>kcommaaccent</string>
-			<string>l</string>
+			<string>Lacute</string>
 			<string>lacute</string>
-			<string>lcaron</string>
+			<string>Lcommaaccent</string>
 			<string>lcommaaccent</string>
+			<string>Lcaron</string>
+			<string>lcaron</string>
+			<string>Lslash</string>
 			<string>lslash</string>
-			<string>m</string>
-			<string>n</string>
+			<string>Nacute</string>
 			<string>nacute</string>
-			<string>ncaron</string>
+			<string>Ncommaaccent</string>
 			<string>ncommaaccent</string>
-			<string>ntilde</string>
-			<string>eng</string>
-			<string>o</string>
-			<string>oacute</string>
-			<string>ocircumflex</string>
-			<string>odieresis</string>
-			<string>ograve</string>
+			<string>Ncaron</string>
+			<string>ncaron</string>
+			<string>Ohungarumlaut</string>
 			<string>ohungarumlaut</string>
-			<string>omacron</string>
-			<string>oslash</string>
-			<string>otilde</string>
+			<string>OE</string>
 			<string>oe</string>
-			<string>p</string>
-			<string>thorn</string>
-			<string>q</string>
-			<string>r</string>
+			<string>Racute</string>
 			<string>racute</string>
+			<string>Rcaron</string>
 			<string>rcaron</string>
-			<string>rcommaaccent</string>
-			<string>s</string>
+			<string>Sacute</string>
 			<string>sacute</string>
-			<string>scaron</string>
+			<string>Scedilla</string>
 			<string>scedilla</string>
-			<string>scommaaccent</string>
-			<string>germandbls</string>
-			<string>t</string>
+			<string>Scaron</string>
+			<string>scaron</string>
+			<string>Tcaron</string>
 			<string>tcaron</string>
-			<string>tcommaaccent</string>
-			<string>u</string>
-			<string>uacute</string>
-			<string>ubreve</string>
-			<string>ucircumflex</string>
-			<string>udieresis</string>
-			<string>ugrave</string>
-			<string>uhungarumlaut</string>
+			<string>Utilde</string>
+			<string>utilde</string>
+			<string>Umacron</string>
 			<string>umacron</string>
-			<string>uogonek</string>
+			<string>Uring</string>
 			<string>uring</string>
-			<string>v</string>
-			<string>w</string>
-			<string>wacute</string>
+			<string>Uhungarumlaut</string>
+			<string>uhungarumlaut</string>
+			<string>Uogonek</string>
+			<string>uogonek</string>
+			<string>Wcircumflex</string>
 			<string>wcircumflex</string>
-			<string>wdieresis</string>
-			<string>wgrave</string>
-			<string>x</string>
-			<string>y</string>
-			<string>yacute</string>
+			<string>Ycircumflex</string>
 			<string>ycircumflex</string>
-			<string>ydieresis</string>
-			<string>ygrave</string>
-			<string>z</string>
+			<string>Ydieresis</string>
+			<string>Zacute</string>
 			<string>zacute</string>
-			<string>zcaron</string>
+			<string>Zdotaccent</string>
 			<string>zdotaccent</string>
-			<string>ordfeminine</string>
-			<string>ordmasculine</string>
-			<string>.notdef</string>
-			<string>comma</string>
-			<string>semicolon</string>
-			<string>exclamdown</string>
-			<string>question</string>
-			<string>questiondown</string>
-			<string>periodcentered</string>
-			<string>bullet</string>
-			<string>periodcentered.loclCAT</string>
-			<string>periodcentered.loclCAT.case</string>
+			<string>Zcaron</string>
+			<string>zcaron</string>
+			<string>Scommaaccent</string>
+			<string>scommaaccent</string>
+			<string>Tcommaaccent</string>
+			<string>tcommaaccent</string>
+			<string>jdotless</string>
+			<string>apostrophemod</string>
+			<string>circumflex</string>
+			<string>caron</string>
+			<string>breve</string>
+			<string>dotaccent</string>
+			<string>ring</string>
+			<string>ogonek</string>
+			<string>tilde</string>
+			<string>hungarumlaut</string>
+			<string>gravecomb</string>
+			<string>acutecomb</string>
+			<string>circumflexcomb</string>
+			<string>tildecomb</string>
+			<string>macroncomb</string>
+			<string>brevecomb</string>
+			<string>dotaccentcomb</string>
+			<string>dieresiscomb</string>
+			<string>ringcomb</string>
+			<string>hungarumlautcomb</string>
+			<string>caroncomb</string>
+			<string>commaaccentcomb</string>
+			<string>cedillacomb</string>
+			<string>ogonekcomb</string>
+			<string>Wgrave</string>
+			<string>wgrave</string>
+			<string>Wacute</string>
+			<string>wacute</string>
+			<string>Wdieresis</string>
+			<string>wdieresis</string>
+			<string>Germandbls</string>
+			<string>Etilde</string>
+			<string>etilde</string>
+			<string>Ygrave</string>
+			<string>ygrave</string>
+			<string>Ytilde</string>
+			<string>ytilde</string>
 			<string>endash</string>
 			<string>emdash</string>
-			<string>underscore</string>
+			<string>quoteleft</string>
+			<string>quoteright</string>
 			<string>quotesinglbase</string>
+			<string>quotedblleft</string>
+			<string>quotedblright</string>
 			<string>quotedblbase</string>
+			<string>bullet</string>
+			<string>ellipsis</string>
 			<string>guilsinglleft</string>
 			<string>guilsinglright</string>
-			<string>at</string>
-			<string>ampersand</string>
-			<string>paragraph</string>
-			<string>section</string>
-			<string>copyright</string>
-			<string>registered</string>
-			<string>trademark</string>
-			<string>cent</string>
-			<string>dollar</string>
 			<string>euro</string>
-			<string>sterling</string>
-			<string>yen</string>
+			<string>trademark</string>
 			<string>minus</string>
-			<string>asciitilde</string>
-			<string>asciicircum</string>
-			<string>dotaccentcomb</string>
+			<string>.notdef</string>
+			<string>periodcentered.loclCAT</string>
+			<string>periodcentered.loclCAT.case</string>
 			<string>caroncomb.alt</string>
-			<string>circumflexcomb</string>
-			<string>caroncomb</string>
-			<string>brevecomb</string>
-			<string>ringcomb</string>
-			<string>tildecomb</string>
-			<string>commaturnedabovecomb</string>
-			<string>commaaccentcomb</string>
-			<string>cedillacomb</string>
-			<string>ogonekcomb</string>
-			<string>dieresis</string>
-			<string>grave</string>
-			<string>acute</string>
-			<string>hungarumlaut</string>
-			<string>circumflex</string>
-			<string>caron</string>
-			<string>breve</string>
-			<string>ring</string>
-			<string>tilde</string>
-			<string>macron</string>
-			<string>cedilla</string>
-			<string>ogonek</string>
+			<string>idotaccent</string>
 		</array>
 		<key>name</key>
 		<string>GF_Latin_Core</string>
diff --git a/GF_glyphsets/Latin/glyphs/GF_Latin_Core.glyphs b/GF_glyphsets/Latin/glyphs/GF_Latin_Core.glyphs
index 530e6aa95e..9ac709498c 100644
--- a/GF_glyphsets/Latin/glyphs/GF_Latin_Core.glyphs
+++ b/GF_glyphsets/Latin/glyphs/GF_Latin_Core.glyphs
@@ -1,5 +1,5 @@
 {
-.appVersion = "3203";
+.appVersion = "3151";
 .formatVersion = 3;
 date = "2021-10-28 12:22:31 +0000";
 familyName = "GF Latin Core";
@@ -122,142 +122,104 @@ name = Regular;
 );
 glyphs = (
 {
-color = 10;
-glyphname = A;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = dollar;
+unicode = 36;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 65;
+glyphname = percent;
+unicode = 37;
 },
 {
-glyphname = Aacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ampersand;
+unicode = 38;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 193;
+glyphname = plus;
+unicode = 43;
 },
 {
-glyphname = Abreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = less;
+unicode = 60;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 258;
+glyphname = equal;
+unicode = 61;
 },
 {
-glyphname = Acircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = greater;
+unicode = 62;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 194;
+glyphname = at;
+unicode = 64;
 },
 {
-glyphname = Adieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = asciicircum;
+unicode = 94;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 196;
+glyphname = bar;
+unicode = 124;
 },
 {
-glyphname = Agrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = asciitilde;
+unicode = 126;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 192;
+glyphname = cent;
+unicode = 162;
 },
 {
-glyphname = Amacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = sterling;
+unicode = 163;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 256;
+glyphname = yen;
+unicode = 165;
 },
 {
-glyphname = Aogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = section;
+unicode = 167;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 260;
+glyphname = copyright;
+unicode = 169;
 },
 {
-glyphname = Aring;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = registered;
+unicode = 174;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 197;
+glyphname = degree;
+unicode = 176;
 },
 {
-glyphname = Atilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = paragraph;
+unicode = 182;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 195;
+glyphname = multiply;
+unicode = 215;
 },
 {
-glyphname = AE;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = divide;
+unicode = 247;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 198;
+glyphname = euro;
+unicode = 8364;
 },
 {
-color = 10;
-glyphname = B;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = trademark;
+unicode = 8482;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 66;
+glyphname = minus;
+unicode = 8722;
 },
 {
 color = 10;
-glyphname = C;
+glyphname = .notdef;
 lastChange = "2022-03-04 12:31:22 +0000";
 layers = (
 {
@@ -265,32 +227,17 @@ layerId = m01;
 width = 600;
 }
 );
-unicode = 67;
 },
 {
-glyphname = Cacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 262;
+glyphname = space;
+unicode = 32;
 },
 {
-glyphname = Ccaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 268;
+glyphname = nbspace;
+unicode = 160;
 },
 {
-glyphname = Ccedilla;
+glyphname = periodcentered.loclCAT;
 lastChange = "2022-03-04 12:31:03 +0000";
 layers = (
 {
@@ -298,10 +245,9 @@ layerId = m01;
 width = 600;
 }
 );
-unicode = 199;
 },
 {
-glyphname = Cdotaccent;
+glyphname = periodcentered.loclCAT.case;
 lastChange = "2022-03-04 12:31:03 +0000";
 layers = (
 {
@@ -309,280 +255,197 @@ layerId = m01;
 width = 600;
 }
 );
-unicode = 266;
 },
 {
-color = 10;
-glyphname = D;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = exclam;
+unicode = 33;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 68;
+glyphname = quotedbl;
+unicode = 34;
 },
 {
-glyphname = Dcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = numbersign;
+unicode = 35;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 270;
+glyphname = quotesingle;
+unicode = 39;
 },
 {
-glyphname = Dcroat;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = parenleft;
+unicode = 40;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 272;
+glyphname = parenright;
+unicode = 41;
 },
 {
-glyphname = Eth;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = asterisk;
+unicode = 42;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 208;
+glyphname = comma;
+unicode = 44;
 },
 {
-color = 10;
-glyphname = E;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = hyphen;
+unicode = 45;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 69;
+glyphname = period;
+unicode = 46;
 },
 {
-glyphname = Eacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 201;
+glyphname = slash;
+unicode = 47;
 },
 {
-glyphname = Ecaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = colon;
+unicode = 58;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 282;
+glyphname = semicolon;
+unicode = 59;
 },
 {
-glyphname = Ecircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = question;
+unicode = 63;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 202;
+glyphname = bracketleft;
+unicode = 91;
 },
 {
-glyphname = Edieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = backslash;
+unicode = 92;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 203;
+glyphname = bracketright;
+unicode = 93;
 },
 {
-glyphname = Edotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = underscore;
+unicode = 95;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 278;
+glyphname = braceleft;
+unicode = 123;
 },
 {
-glyphname = Egrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = braceright;
+unicode = 125;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 200;
+glyphname = exclamdown;
+unicode = 161;
 },
 {
-glyphname = Emacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = guillemetleft;
+unicode = 171;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 274;
+glyphname = periodcentered;
+unicode = 183;
 },
 {
-glyphname = Eogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = guillemetright;
+unicode = 187;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 280;
+glyphname = questiondown;
+unicode = 191;
 },
 {
-color = 10;
-glyphname = F;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = endash;
+unicode = 8211;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 70;
+glyphname = emdash;
+unicode = 8212;
 },
 {
-color = 10;
-glyphname = G;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = quoteleft;
+unicode = 8216;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 71;
+glyphname = quoteright;
+unicode = 8217;
 },
 {
-glyphname = Gbreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = quotesinglbase;
+unicode = 8218;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 286;
+glyphname = quotedblleft;
+unicode = 8220;
 },
 {
-glyphname = Gcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = quotedblright;
+unicode = 8221;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 290;
+glyphname = quotedblbase;
+unicode = 8222;
 },
 {
-glyphname = Gdotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = bullet;
+unicode = 8226;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 288;
+glyphname = ellipsis;
+unicode = 8230;
 },
 {
-color = 10;
-glyphname = H;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = guilsinglleft;
+unicode = 8249;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 72;
+glyphname = guilsinglright;
+unicode = 8250;
 },
 {
-glyphname = Hbar;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = zero;
+unicode = 48;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 294;
+glyphname = one;
+unicode = 49;
 },
 {
-color = 10;
-glyphname = I;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = two;
+unicode = 50;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 73;
+glyphname = three;
+unicode = 51;
 },
 {
-glyphname = Iacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = four;
+unicode = 52;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 205;
+glyphname = five;
+unicode = 53;
 },
 {
-glyphname = Icircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = six;
+unicode = 54;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 206;
+glyphname = seven;
+unicode = 55;
 },
 {
-glyphname = Idieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = eight;
+unicode = 56;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 207;
+glyphname = nine;
+unicode = 57;
 },
 {
-glyphname = Idotaccent;
+glyphname = caroncomb.alt;
 lastChange = "2022-03-04 12:31:03 +0000";
 layers = (
 {
@@ -590,180 +453,121 @@ layerId = m01;
 width = 600;
 }
 );
-unicode = 304;
 },
 {
-glyphname = Igrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 204;
+glyphname = grave;
+unicode = 96;
 },
 {
-glyphname = Imacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 298;
+glyphname = dieresis;
+unicode = 168;
 },
 {
-glyphname = Iogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = macron;
+unicode = 175;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 302;
+glyphname = acute;
+unicode = 180;
 },
 {
-color = 10;
-glyphname = J;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = cedilla;
+unicode = 184;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 74;
+glyphname = apostrophemod;
+unicode = 700;
 },
 {
-color = 10;
-glyphname = K;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = circumflex;
+unicode = 710;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 75;
+glyphname = caron;
+unicode = 711;
 },
 {
-glyphname = Kcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = breve;
+unicode = 728;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 310;
+glyphname = dotaccent;
+unicode = 729;
 },
 {
-color = 10;
-glyphname = L;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = ring;
+unicode = 730;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 76;
+glyphname = ogonek;
+unicode = 731;
 },
 {
-glyphname = Lacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = tilde;
+unicode = 732;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 313;
+glyphname = hungarumlaut;
+unicode = 733;
 },
 {
-glyphname = Lcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = gravecomb;
+unicode = 768;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 317;
+glyphname = acutecomb;
+unicode = 769;
 },
 {
-glyphname = Lcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = circumflexcomb;
+unicode = 770;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 315;
+glyphname = tildecomb;
+unicode = 771;
 },
 {
-glyphname = Lslash;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = macroncomb;
+unicode = 772;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 321;
+glyphname = brevecomb;
+unicode = 774;
 },
 {
-color = 10;
-glyphname = M;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = dotaccentcomb;
+unicode = 775;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 77;
+glyphname = dieresiscomb;
+unicode = 776;
 },
 {
-color = 10;
-glyphname = N;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = ringcomb;
+unicode = 778;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 78;
+glyphname = hungarumlautcomb;
+unicode = 779;
 },
 {
-glyphname = Nacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = caroncomb;
+unicode = 780;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 323;
+glyphname = commaaccentcomb;
+unicode = 806;
 },
 {
-glyphname = Ncaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = cedillacomb;
+unicode = 807;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 327;
+glyphname = ogonekcomb;
+unicode = 808;
 },
 {
-glyphname = Ncommaaccent;
+glyphname = idotaccent;
 lastChange = "2022-03-04 12:31:03 +0000";
 layers = (
 {
@@ -771,3131 +575,920 @@ layerId = m01;
 width = 600;
 }
 );
-unicode = 325;
 },
 {
-glyphname = Ntilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 209;
+glyphname = A;
+unicode = 65;
 },
 {
-glyphname = Eng;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = B;
+unicode = 66;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 330;
+glyphname = C;
+unicode = 67;
 },
 {
-color = 10;
-glyphname = O;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = D;
+unicode = 68;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 79;
+glyphname = E;
+unicode = 69;
 },
 {
-glyphname = Oacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = F;
+unicode = 70;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 211;
+glyphname = G;
+unicode = 71;
 },
 {
-glyphname = Ocircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = H;
+unicode = 72;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 212;
+glyphname = I;
+unicode = 73;
 },
 {
-glyphname = Odieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 214;
+glyphname = J;
+unicode = 74;
 },
 {
-glyphname = Ograve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 210;
+glyphname = K;
+unicode = 75;
 },
 {
-glyphname = Ohungarumlaut;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = L;
+unicode = 76;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 336;
+glyphname = M;
+unicode = 77;
 },
 {
-glyphname = Omacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = N;
+unicode = 78;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 332;
+glyphname = O;
+unicode = 79;
 },
 {
-glyphname = Oslash;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = P;
+unicode = 80;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 216;
+glyphname = Q;
+unicode = 81;
 },
 {
-glyphname = Otilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = R;
+unicode = 82;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 213;
+glyphname = S;
+unicode = 83;
 },
 {
-glyphname = OE;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = T;
+unicode = 84;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 338;
+glyphname = U;
+unicode = 85;
 },
 {
-color = 10;
-glyphname = P;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = V;
+unicode = 86;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 80;
+glyphname = W;
+unicode = 87;
 },
 {
-glyphname = Thorn;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = X;
+unicode = 88;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 222;
+glyphname = Y;
+unicode = 89;
 },
 {
-color = 10;
-glyphname = Q;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = Z;
+unicode = 90;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 81;
+glyphname = a;
+unicode = 97;
 },
 {
-color = 10;
-glyphname = R;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = b;
+unicode = 98;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 82;
+glyphname = c;
+unicode = 99;
 },
 {
-glyphname = Racute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = d;
+unicode = 100;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 340;
+glyphname = e;
+unicode = 101;
 },
 {
-glyphname = Rcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = f;
+unicode = 102;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 344;
+glyphname = g;
+unicode = 103;
 },
 {
-glyphname = Rcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = h;
+unicode = 104;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 342;
+glyphname = i;
+unicode = 105;
 },
 {
-color = 10;
-glyphname = S;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = j;
+unicode = 106;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 83;
+glyphname = k;
+unicode = 107;
 },
 {
-glyphname = Sacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = l;
+unicode = 108;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 346;
+glyphname = m;
+unicode = 109;
 },
 {
-glyphname = Scaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = n;
+unicode = 110;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 352;
+glyphname = o;
+unicode = 111;
 },
 {
-glyphname = Scedilla;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = p;
+unicode = 112;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 350;
+glyphname = q;
+unicode = 113;
 },
 {
-glyphname = Scommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = r;
+unicode = 114;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 536;
+glyphname = s;
+unicode = 115;
 },
 {
-glyphname = Germandbls;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = t;
+unicode = 116;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7838;
+glyphname = u;
+unicode = 117;
 },
 {
-color = 10;
-glyphname = T;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = v;
+unicode = 118;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 84;
+glyphname = w;
+unicode = 119;
 },
 {
-glyphname = Tcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = x;
+unicode = 120;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 356;
+glyphname = y;
+unicode = 121;
 },
 {
-glyphname = Tcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = z;
+unicode = 122;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 538;
+glyphname = ordfeminine;
+unicode = 170;
 },
 {
-color = 10;
-glyphname = U;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = ordmasculine;
+unicode = 186;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 85;
+glyphname = Agrave;
+unicode = 192;
 },
 {
-glyphname = Uacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Aacute;
+unicode = 193;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 218;
+glyphname = Acircumflex;
+unicode = 194;
 },
 {
-glyphname = Ubreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Atilde;
+unicode = 195;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 364;
+glyphname = Adieresis;
+unicode = 196;
 },
 {
-glyphname = Ucircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Aring;
+unicode = 197;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 219;
+glyphname = AE;
+unicode = 198;
 },
 {
-glyphname = Udieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Ccedilla;
+unicode = 199;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 220;
+glyphname = Egrave;
+unicode = 200;
 },
 {
-glyphname = Ugrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Eacute;
+unicode = 201;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 217;
+glyphname = Ecircumflex;
+unicode = 202;
 },
 {
-glyphname = Uhungarumlaut;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Edieresis;
+unicode = 203;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 368;
+glyphname = Igrave;
+unicode = 204;
 },
 {
-glyphname = Umacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Iacute;
+unicode = 205;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 362;
+glyphname = Icircumflex;
+unicode = 206;
 },
 {
-glyphname = Uogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Idieresis;
+unicode = 207;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 370;
+glyphname = Eth;
+unicode = 208;
 },
 {
-glyphname = Uring;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Ntilde;
+unicode = 209;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 366;
+glyphname = Ograve;
+unicode = 210;
 },
 {
-color = 10;
-glyphname = V;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = Oacute;
+unicode = 211;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 86;
+glyphname = Ocircumflex;
+unicode = 212;
 },
 {
-color = 10;
-glyphname = W;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = Otilde;
+unicode = 213;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 87;
+glyphname = Odieresis;
+unicode = 214;
 },
 {
-glyphname = Wacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Oslash;
+unicode = 216;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7810;
+glyphname = Ugrave;
+unicode = 217;
 },
 {
-glyphname = Wcircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Uacute;
+unicode = 218;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 372;
+glyphname = Ucircumflex;
+unicode = 219;
 },
 {
-glyphname = Wdieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Udieresis;
+unicode = 220;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7812;
+glyphname = Yacute;
+unicode = 221;
 },
 {
-glyphname = Wgrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Thorn;
+unicode = 222;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7808;
+glyphname = germandbls;
+unicode = 223;
 },
 {
-color = 10;
-glyphname = X;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = agrave;
+unicode = 224;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 88;
+glyphname = aacute;
+unicode = 225;
 },
 {
-color = 10;
-glyphname = Y;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = acircumflex;
+unicode = 226;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 89;
+glyphname = atilde;
+unicode = 227;
 },
 {
-glyphname = Yacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = adieresis;
+unicode = 228;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 221;
+glyphname = aring;
+unicode = 229;
 },
 {
-glyphname = Ycircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ae;
+unicode = 230;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 374;
+glyphname = ccedilla;
+unicode = 231;
 },
 {
-glyphname = Ydieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = egrave;
+unicode = 232;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 376;
+glyphname = eacute;
+unicode = 233;
 },
 {
-glyphname = Ygrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ecircumflex;
+unicode = 234;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7922;
+glyphname = edieresis;
+unicode = 235;
 },
 {
-color = 10;
-glyphname = Z;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = igrave;
+unicode = 236;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 90;
+glyphname = iacute;
+unicode = 237;
 },
 {
-glyphname = Zacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = icircumflex;
+unicode = 238;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 377;
+glyphname = idieresis;
+unicode = 239;
 },
 {
-glyphname = Zcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = eth;
+unicode = 240;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 381;
+glyphname = ntilde;
+unicode = 241;
 },
 {
-glyphname = Zdotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ograve;
+unicode = 242;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 379;
+glyphname = oacute;
+unicode = 243;
 },
 {
-color = 10;
-glyphname = a;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = ocircumflex;
+unicode = 244;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 97;
+glyphname = otilde;
+unicode = 245;
 },
 {
-glyphname = aacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = odieresis;
+unicode = 246;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 225;
+glyphname = oslash;
+unicode = 248;
 },
 {
-glyphname = abreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ugrave;
+unicode = 249;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 259;
+glyphname = uacute;
+unicode = 250;
 },
 {
-glyphname = acircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ucircumflex;
+unicode = 251;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 226;
+glyphname = udieresis;
+unicode = 252;
 },
 {
-glyphname = adieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = yacute;
+unicode = 253;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 228;
+glyphname = thorn;
+unicode = 254;
 },
 {
-glyphname = agrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ydieresis;
+unicode = 255;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 224;
+glyphname = Amacron;
+unicode = 256;
 },
 {
 glyphname = amacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 257;
 },
 {
-glyphname = aogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Abreve;
+unicode = 258;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 261;
+glyphname = abreve;
+unicode = 259;
 },
 {
-glyphname = aring;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Aogonek;
+unicode = 260;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 229;
+glyphname = aogonek;
+unicode = 261;
 },
 {
-glyphname = atilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Cacute;
+unicode = 262;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 227;
+glyphname = cacute;
+unicode = 263;
 },
 {
-glyphname = ae;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Cdotaccent;
+unicode = 266;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 230;
-},
-{
-color = 10;
-glyphname = b;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 98;
-},
-{
-color = 10;
-glyphname = c;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 99;
+glyphname = cdotaccent;
+unicode = 267;
 },
 {
-glyphname = cacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 263;
+glyphname = Ccaron;
+unicode = 268;
 },
 {
 glyphname = ccaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 269;
 },
 {
-glyphname = ccedilla;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 231;
-},
-{
-glyphname = cdotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 267;
-},
-{
-color = 10;
-glyphname = d;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 100;
+glyphname = Dcaron;
+unicode = 270;
 },
 {
 glyphname = dcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 271;
 },
 {
-glyphname = dcroat;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 273;
-},
-{
-glyphname = eth;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 240;
-},
-{
-color = 10;
-glyphname = e;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 101;
+glyphname = Dcroat;
+unicode = 272;
 },
 {
-glyphname = eacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 233;
+glyphname = dcroat;
+unicode = 273;
 },
 {
-glyphname = ecaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 283;
+glyphname = Emacron;
+unicode = 274;
 },
 {
-glyphname = ecircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 234;
+glyphname = emacron;
+unicode = 275;
 },
 {
-glyphname = edieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 235;
+glyphname = Edotaccent;
+unicode = 278;
 },
 {
 glyphname = edotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 279;
 },
 {
-glyphname = egrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 232;
-},
-{
-glyphname = emacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 275;
+glyphname = Eogonek;
+unicode = 280;
 },
 {
 glyphname = eogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 281;
 },
 {
-color = 10;
-glyphname = f;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 102;
+glyphname = Ecaron;
+unicode = 282;
 },
 {
-color = 10;
-glyphname = g;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = ecaron;
+unicode = 283;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 103;
+glyphname = Gbreve;
+unicode = 286;
 },
 {
 glyphname = gbreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 287;
 },
 {
-glyphname = gcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 291;
+glyphname = Gdotaccent;
+unicode = 288;
 },
 {
 glyphname = gdotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
 unicode = 289;
 },
 {
-color = 10;
-glyphname = h;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 104;
-},
-{
-glyphname = hbar;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 295;
-},
-{
-color = 10;
-glyphname = i;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 105;
-},
-{
-glyphname = idotless;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 305;
-},
-{
-glyphname = iacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 237;
-},
-{
-glyphname = icircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 238;
-},
-{
-glyphname = idieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 239;
-},
-{
-glyphname = idotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-},
-{
-glyphname = igrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 236;
-},
-{
-glyphname = imacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 299;
-},
-{
-glyphname = iogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 303;
-},
-{
-color = 10;
-glyphname = j;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 106;
-},
-{
-glyphname = jdotless;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 567;
-},
-{
-color = 10;
-glyphname = k;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 107;
-},
-{
-glyphname = kcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 311;
-},
-{
-color = 10;
-glyphname = l;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 108;
-},
-{
-glyphname = lacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 314;
-},
-{
-glyphname = lcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 318;
-},
-{
-glyphname = lcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 316;
-},
-{
-glyphname = lslash;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 322;
-},
-{
-color = 10;
-glyphname = m;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 109;
-},
-{
-color = 10;
-glyphname = n;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 110;
-},
-{
-glyphname = nacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 324;
-},
-{
-glyphname = ncaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 328;
-},
-{
-glyphname = ncommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 326;
-},
-{
-glyphname = ntilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 241;
-},
-{
-glyphname = eng;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 331;
-},
-{
-color = 10;
-glyphname = o;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 111;
-},
-{
-glyphname = oacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 243;
-},
-{
-glyphname = ocircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 244;
-},
-{
-glyphname = odieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 246;
-},
-{
-glyphname = ograve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 242;
-},
-{
-glyphname = ohungarumlaut;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 337;
-},
-{
-glyphname = omacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 333;
-},
-{
-glyphname = oslash;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 248;
-},
-{
-glyphname = otilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 245;
-},
-{
-glyphname = oe;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 339;
-},
-{
-color = 10;
-glyphname = p;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 112;
-},
-{
-glyphname = thorn;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 254;
-},
-{
-color = 10;
-glyphname = q;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 113;
-},
-{
-color = 10;
-glyphname = r;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 114;
-},
-{
-glyphname = racute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 341;
-},
-{
-glyphname = rcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 345;
-},
-{
-glyphname = rcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 343;
-},
-{
-color = 10;
-glyphname = s;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 115;
-},
-{
-glyphname = sacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 347;
-},
-{
-glyphname = scaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 353;
-},
-{
-glyphname = scedilla;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 351;
-},
-{
-glyphname = scommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 537;
-},
-{
-glyphname = germandbls;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 223;
-},
-{
-color = 10;
-glyphname = t;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 116;
-},
-{
-glyphname = tcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 357;
-},
-{
-glyphname = tcommaaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 539;
-},
-{
-color = 10;
-glyphname = u;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 117;
-},
-{
-glyphname = uacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 250;
-},
-{
-glyphname = ubreve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 365;
-},
-{
-glyphname = ucircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 251;
-},
-{
-glyphname = udieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 252;
-},
-{
-glyphname = ugrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 249;
-},
-{
-glyphname = uhungarumlaut;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 369;
-},
-{
-glyphname = umacron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 363;
-},
-{
-glyphname = uogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 371;
-},
-{
-glyphname = uring;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 367;
-},
-{
-color = 10;
-glyphname = v;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 118;
-},
-{
-color = 10;
-glyphname = w;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 119;
-},
-{
-glyphname = wacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7811;
-},
-{
-glyphname = wcircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 373;
-},
-{
-glyphname = wdieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7813;
-},
-{
-glyphname = wgrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7809;
-},
-{
-color = 10;
-glyphname = x;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 120;
-},
-{
-color = 10;
-glyphname = y;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 121;
-},
-{
-glyphname = yacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 253;
-},
-{
-glyphname = ycircumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 375;
-},
-{
-glyphname = ydieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 255;
-},
-{
-glyphname = ygrave;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 7923;
-},
-{
-color = 10;
-glyphname = z;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 122;
-},
-{
-glyphname = zacute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 378;
-},
-{
-glyphname = zcaron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 382;
-},
-{
-glyphname = zdotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 380;
-},
-{
-glyphname = ordfeminine;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 170;
-},
-{
-glyphname = ordmasculine;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 186;
-},
-{
-color = 10;
-glyphname = zero;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 48;
-},
-{
-color = 10;
-glyphname = one;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 49;
-},
-{
-color = 10;
-glyphname = two;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 50;
-},
-{
-color = 10;
-glyphname = three;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 51;
-},
-{
-color = 10;
-glyphname = four;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 52;
-},
-{
-color = 10;
-glyphname = five;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 53;
-},
-{
-color = 10;
-glyphname = six;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 54;
-},
-{
-color = 10;
-glyphname = seven;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 55;
-},
-{
-color = 10;
-glyphname = eight;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 56;
-},
-{
-color = 10;
-glyphname = nine;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 57;
-},
-{
-color = 10;
-glyphname = space;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 200;
-}
-);
-unicode = 32;
-},
-{
-color = 10;
-glyphname = nbspace;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 200;
-}
-);
-metricWidth = space;
-unicode = 160;
-},
-{
-color = 10;
-glyphname = .notdef;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-},
-{
-color = 10;
-glyphname = period;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 46;
-},
-{
-color = 10;
-glyphname = comma;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 44;
-},
-{
-color = 10;
-glyphname = colon;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 58;
-},
-{
-color = 10;
-glyphname = semicolon;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 59;
-},
-{
-color = 10;
-glyphname = ellipsis;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8230;
-},
-{
-color = 10;
-glyphname = exclam;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 33;
-},
-{
-glyphname = exclamdown;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 161;
-},
-{
-color = 10;
-glyphname = question;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 63;
-},
-{
-glyphname = questiondown;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 191;
-},
-{
-color = 10;
-glyphname = periodcentered;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 183;
-},
-{
-color = 10;
-glyphname = bullet;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8226;
-},
-{
-color = 10;
-glyphname = asterisk;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 42;
-},
-{
-color = 10;
-glyphname = numbersign;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 35;
-},
-{
-color = 10;
-glyphname = slash;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 47;
-},
-{
-color = 10;
-glyphname = backslash;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 92;
-},
-{
-glyphname = periodcentered.loclCAT;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-},
-{
-glyphname = periodcentered.loclCAT.case;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-},
-{
-color = 10;
-glyphname = hyphen;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 45;
-},
-{
-color = 10;
-glyphname = endash;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8211;
-},
-{
-color = 10;
-glyphname = emdash;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8212;
-},
-{
-color = 10;
-glyphname = underscore;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 95;
-},
-{
-color = 10;
-glyphname = parenleft;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 40;
-},
-{
-color = 10;
-glyphname = parenright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 41;
-},
-{
-color = 10;
-glyphname = braceleft;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 123;
-},
-{
-color = 10;
-glyphname = braceright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 125;
-},
-{
-color = 10;
-glyphname = bracketleft;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 91;
-},
-{
-color = 10;
-glyphname = bracketright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 93;
-},
-{
-glyphname = quotesinglbase;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8218;
-},
-{
-glyphname = quotedblbase;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8222;
-},
-{
-color = 10;
-glyphname = quotedblleft;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8220;
-},
-{
-color = 10;
-glyphname = quotedblright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8221;
-},
-{
-color = 10;
-glyphname = quoteleft;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8216;
-},
-{
-color = 10;
-glyphname = quoteright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8217;
-},
-{
-glyphname = guillemetleft;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 171;
-},
-{
-glyphname = guillemetright;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 187;
-},
-{
-glyphname = guilsinglleft;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8249;
-},
-{
-glyphname = guilsinglright;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8250;
-},
-{
-color = 10;
-glyphname = quotedbl;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 34;
-},
-{
-color = 10;
-glyphname = quotesingle;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 39;
-},
-{
-color = 10;
-glyphname = at;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 64;
-},
-{
-color = 10;
-glyphname = ampersand;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 38;
-},
-{
-glyphname = paragraph;
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 182;
-},
-{
-glyphname = section;
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 167;
-},
-{
-color = 10;
-glyphname = copyright;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 169;
-},
-{
-color = 10;
-glyphname = registered;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 174;
-},
-{
-color = 10;
-glyphname = trademark;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 1200;
-}
-);
-unicode = 8482;
-},
-{
-color = 10;
-glyphname = degree;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 176;
-},
-{
-color = 10;
-glyphname = bar;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 124;
-},
-{
-color = 10;
-glyphname = cent;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 162;
+glyphname = Gcommaaccent;
+unicode = 290;
 },
 {
-color = 10;
-glyphname = dollar;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 36;
+glyphname = gcommaaccent;
+unicode = 291;
 },
 {
-color = 10;
-glyphname = euro;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8364;
+glyphname = Hbar;
+unicode = 294;
 },
 {
-color = 10;
-glyphname = sterling;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 163;
+glyphname = hbar;
+unicode = 295;
 },
 {
-color = 10;
-glyphname = yen;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
-{
-layerId = m01;
-width = 600;
-}
-);
-unicode = 165;
+glyphname = Itilde;
+unicode = 296;
 },
 {
-color = 10;
-glyphname = plus;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = itilde;
+unicode = 297;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 43;
+glyphname = Imacron;
+unicode = 298;
 },
 {
-color = 10;
-glyphname = minus;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = imacron;
+unicode = 299;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 8722;
+glyphname = Iogonek;
+unicode = 302;
 },
 {
-color = 10;
-glyphname = multiply;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = iogonek;
+unicode = 303;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 215;
+glyphname = Idotaccent;
+unicode = 304;
 },
 {
-color = 10;
-glyphname = divide;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = idotless;
+unicode = 305;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 247;
+glyphname = Kcommaaccent;
+unicode = 310;
 },
 {
-color = 10;
-glyphname = equal;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = kcommaaccent;
+unicode = 311;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 61;
+glyphname = Lacute;
+unicode = 313;
 },
 {
-color = 10;
-glyphname = greater;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = lacute;
+unicode = 314;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 62;
+glyphname = Lcommaaccent;
+unicode = 315;
 },
 {
-color = 10;
-glyphname = less;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = lcommaaccent;
+unicode = 316;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 60;
+glyphname = Lcaron;
+unicode = 317;
 },
 {
-color = 10;
-glyphname = asciitilde;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = lcaron;
+unicode = 318;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 126;
+glyphname = Lslash;
+unicode = 321;
 },
 {
-color = 10;
-glyphname = asciicircum;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = lslash;
+unicode = 322;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 94;
+glyphname = Nacute;
+unicode = 323;
 },
 {
-color = 10;
-glyphname = percent;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = nacute;
+unicode = 324;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 37;
+glyphname = Ncommaaccent;
+unicode = 325;
 },
 {
-glyphname = dieresiscomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ncommaaccent;
+unicode = 326;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 776;
+glyphname = Ncaron;
+unicode = 327;
 },
 {
-glyphname = dotaccentcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ncaron;
+unicode = 328;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 775;
+glyphname = Ohungarumlaut;
+unicode = 336;
 },
 {
-glyphname = gravecomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ohungarumlaut;
+unicode = 337;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 768;
+glyphname = OE;
+unicode = 338;
 },
 {
-glyphname = acutecomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = oe;
+unicode = 339;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 769;
+glyphname = Racute;
+unicode = 340;
 },
 {
-glyphname = hungarumlautcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = racute;
+unicode = 341;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 779;
+glyphname = Rcaron;
+unicode = 344;
 },
 {
-glyphname = caroncomb.alt;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = rcaron;
+unicode = 345;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
+glyphname = Sacute;
+unicode = 346;
 },
 {
-glyphname = circumflexcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = sacute;
+unicode = 347;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 770;
+glyphname = Scedilla;
+unicode = 350;
 },
 {
-glyphname = caroncomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = scedilla;
+unicode = 351;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 780;
+glyphname = Scaron;
+unicode = 352;
 },
 {
-glyphname = brevecomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = scaron;
+unicode = 353;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 774;
+glyphname = Tcaron;
+unicode = 356;
 },
 {
-glyphname = ringcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = tcaron;
+unicode = 357;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 778;
+glyphname = Utilde;
+unicode = 360;
 },
 {
-glyphname = tildecomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = utilde;
+unicode = 361;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 771;
+glyphname = Umacron;
+unicode = 362;
 },
 {
-glyphname = macroncomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = umacron;
+unicode = 363;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 772;
+glyphname = Uring;
+unicode = 366;
 },
 {
-glyphname = commaturnedabovecomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = uring;
+unicode = 367;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 786;
+glyphname = Uhungarumlaut;
+unicode = 368;
 },
 {
-glyphname = commaaccentcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = uhungarumlaut;
+unicode = 369;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 806;
+glyphname = Uogonek;
+unicode = 370;
 },
 {
-glyphname = cedillacomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = uogonek;
+unicode = 371;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 807;
+glyphname = Wcircumflex;
+unicode = 372;
 },
 {
-glyphname = ogonekcomb;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = wcircumflex;
+unicode = 373;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 808;
+glyphname = Ycircumflex;
+unicode = 374;
 },
 {
-glyphname = dieresis;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = ycircumflex;
+unicode = 375;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 168;
+glyphname = Ydieresis;
+unicode = 376;
 },
 {
-glyphname = dotaccent;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Zacute;
+unicode = 377;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 729;
+glyphname = zacute;
+unicode = 378;
 },
 {
-color = 10;
-glyphname = grave;
-lastChange = "2022-03-04 12:31:22 +0000";
-layers = (
+glyphname = Zdotaccent;
+unicode = 379;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 96;
+glyphname = zdotaccent;
+unicode = 380;
 },
 {
-glyphname = acute;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Zcaron;
+unicode = 381;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 180;
+glyphname = zcaron;
+unicode = 382;
 },
 {
-glyphname = hungarumlaut;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Scommaaccent;
+unicode = 536;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 733;
+glyphname = scommaaccent;
+unicode = 537;
 },
 {
-glyphname = circumflex;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Tcommaaccent;
+unicode = 538;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 710;
+glyphname = tcommaaccent;
+unicode = 539;
 },
 {
-glyphname = caron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = jdotless;
+unicode = 567;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 711;
+glyphname = Wgrave;
+unicode = 7808;
 },
 {
-glyphname = breve;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = wgrave;
+unicode = 7809;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 728;
+glyphname = Wacute;
+unicode = 7810;
 },
 {
-glyphname = ring;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = wacute;
+unicode = 7811;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 730;
+glyphname = Wdieresis;
+unicode = 7812;
 },
 {
-glyphname = tilde;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = wdieresis;
+unicode = 7813;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 732;
+glyphname = Germandbls;
+unicode = 7838;
 },
 {
-glyphname = macron;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Etilde;
+unicode = 7868;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 175;
+glyphname = etilde;
+unicode = 7869;
 },
 {
-glyphname = cedilla;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Ygrave;
+unicode = 7922;
+},
 {
-layerId = m01;
-width = 600;
-}
-);
-unicode = 184;
+glyphname = ygrave;
+unicode = 7923;
 },
 {
-glyphname = ogonek;
-lastChange = "2022-03-04 12:31:03 +0000";
-layers = (
+glyphname = Ytilde;
+unicode = 7928;
+},
 {
-layerId = m01;
-width = 600;
+glyphname = ytilde;
+unicode = 7929;
 }
 );
-unicode = 731;
-}
+instances = (
 );
+kerningLTR = {
+};
 metrics = (
 {
 type = ascender;
@@ -3916,6 +1509,8 @@ type = descender;
 type = "italic angle";
 }
 );
+stems = (
+);
 unitsPerEm = 1000;
 versionMajor = 1;
 versionMinor = 0;
diff --git a/GF_glyphsets/Latin/nam/GF_Latin_Core.nam b/GF_glyphsets/Latin/nam/GF_Latin_Core.nam
index aaf8067077..6469ffad1c 100644
--- a/GF_glyphsets/Latin/nam/GF_Latin_Core.nam
+++ b/GF_glyphsets/Latin/nam/GF_Latin_Core.nam
@@ -1,3 +1,4 @@
+# This file is auto-generated; do not edit. See /README.md for instructions.
 0x0020 SPACE
 0x0021 EXCLAMATION MARK
 0x0022 QUOTATION MARK
@@ -209,6 +210,8 @@
 0x0123 LATIN SMALL LETTER G WITH CEDILLA
 0x0126 LATIN CAPITAL LETTER H WITH STROKE
 0x0127 LATIN SMALL LETTER H WITH STROKE
+0x0128 LATIN CAPITAL LETTER I WITH TILDE
+0x0129 LATIN SMALL LETTER I WITH TILDE
 0x012A LATIN CAPITAL LETTER I WITH MACRON
 0x012B LATIN SMALL LETTER I WITH MACRON
 0x012E LATIN CAPITAL LETTER I WITH OGONEK
@@ -231,18 +234,12 @@
 0x0146 LATIN SMALL LETTER N WITH CEDILLA
 0x0147 LATIN CAPITAL LETTER N WITH CARON
 0x0148 LATIN SMALL LETTER N WITH CARON
-0x014A LATIN CAPITAL LETTER ENG
-0x014B LATIN SMALL LETTER ENG
-0x014C LATIN CAPITAL LETTER O WITH MACRON
-0x014D LATIN SMALL LETTER O WITH MACRON
 0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
 0x0152 LATIN CAPITAL LIGATURE OE
 0x0153 LATIN SMALL LIGATURE OE
 0x0154 LATIN CAPITAL LETTER R WITH ACUTE
 0x0155 LATIN SMALL LETTER R WITH ACUTE
-0x0156 LATIN CAPITAL LETTER R WITH CEDILLA
-0x0157 LATIN SMALL LETTER R WITH CEDILLA
 0x0158 LATIN CAPITAL LETTER R WITH CARON
 0x0159 LATIN SMALL LETTER R WITH CARON
 0x015A LATIN CAPITAL LETTER S WITH ACUTE
@@ -253,10 +250,10 @@
 0x0161 LATIN SMALL LETTER S WITH CARON
 0x0164 LATIN CAPITAL LETTER T WITH CARON
 0x0165 LATIN SMALL LETTER T WITH CARON
+0x0168 LATIN CAPITAL LETTER U WITH TILDE
+0x0169 LATIN SMALL LETTER U WITH TILDE
 0x016A LATIN CAPITAL LETTER U WITH MACRON
 0x016B LATIN SMALL LETTER U WITH MACRON
-0x016C LATIN CAPITAL LETTER U WITH BREVE
-0x016D LATIN SMALL LETTER U WITH BREVE
 0x016E LATIN CAPITAL LETTER U WITH RING ABOVE
 0x016F LATIN SMALL LETTER U WITH RING ABOVE
 0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
@@ -279,6 +276,7 @@
 0x021A LATIN CAPITAL LETTER T WITH COMMA BELOW
 0x021B LATIN SMALL LETTER T WITH COMMA BELOW
 0x0237 LATIN SMALL LETTER DOTLESS J
+0x02BC MODIFIER LETTER APOSTROPHE
 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
 0x02C7 CARON
 0x02D8 BREVE
@@ -298,7 +296,6 @@
 0x030A COMBINING RING ABOVE
 0x030B COMBINING DOUBLE ACUTE ACCENT
 0x030C COMBINING CARON
-0x0312 COMBINING TURNED COMMA ABOVE
 0x0326 COMBINING COMMA BELOW
 0x0327 COMBINING CEDILLA
 0x0328 COMBINING OGONEK
@@ -309,8 +306,12 @@
 0x1E84 LATIN CAPITAL LETTER W WITH DIAERESIS
 0x1E85 LATIN SMALL LETTER W WITH DIAERESIS
 0x1E9E LATIN CAPITAL LETTER SHARP S
+0x1EBC LATIN CAPITAL LETTER E WITH TILDE
+0x1EBD LATIN SMALL LETTER E WITH TILDE
 0x1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
 0x1EF3 LATIN SMALL LETTER Y WITH GRAVE
+0x1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+0x1EF9 LATIN SMALL LETTER Y WITH TILDE
 0x2013 EN DASH
 0x2014 EM DASH
 0x2018 LEFT SINGLE QUOTATION MARK
diff --git a/GF_glyphsets/Latin/txt/nice-names/GF_Latin_Core.txt b/GF_glyphsets/Latin/txt/nice-names/GF_Latin_Core.txt
index d4b982659b..8b5c695635 100644
--- a/GF_glyphsets/Latin/txt/nice-names/GF_Latin_Core.txt
+++ b/GF_glyphsets/Latin/txt/nice-names/GF_Latin_Core.txt
@@ -1,3 +1,20 @@
+# This file is auto-generated; do not edit. See /README.md for instructions.
+space
+exclam
+quotedbl
+numbersign
+dollar
+percent
+ampersand
+quotesingle
+parenleft
+parenright
+asterisk
+plus
+comma
+hyphen
+period
+slash
 zero
 one
 two
@@ -8,326 +25,310 @@ six
 seven
 eight
 nine
-space
-nbspace
-period
 colon
-ellipsis
-exclam
-asterisk
-numbersign
-slash
-backslash
-hyphen
-parenleft
-parenright
-braceleft
-braceright
-bracketleft
-bracketright
-quotedblleft
-quotedblright
-quoteleft
-quoteright
-guillemetleft
-guillemetright
-quotedbl
-quotesingle
-bar
-plus
-multiply
-divide
+semicolon
+less
 equal
 greater
-less
-percent
-dieresiscomb
-gravecomb
-acutecomb
-hungarumlautcomb
-macroncomb
-dotaccent
-degree
+question
+at
 A
-Aacute
-Abreve
-Acircumflex
-Adieresis
-Agrave
-Amacron
-Aogonek
-Aring
-Atilde
-AE
 B
 C
-Cacute
-Ccaron
-Ccedilla
-Cdotaccent
 D
-Eth
-Dcaron
-Dcroat
 E
-Eacute
-Ecaron
-Ecircumflex
-Edieresis
-Edotaccent
-Egrave
-Emacron
-Eogonek
 F
 G
-Gbreve
-Gcommaaccent
-Gdotaccent
 H
-Hbar
 I
-Iacute
-Icircumflex
-Idieresis
-Idotaccent
-Igrave
-Imacron
-Iogonek
 J
 K
-Kcommaaccent
 L
-Lacute
-Lcaron
-Lcommaaccent
-Lslash
 M
 N
-Nacute
-Ncaron
-Ncommaaccent
-Ntilde
-Eng
 O
-Oacute
-Ocircumflex
-Odieresis
-Ograve
-Ohungarumlaut
-Omacron
-Oslash
-Otilde
-OE
 P
-Thorn
 Q
 R
-Racute
-Rcaron
-Rcommaaccent
 S
-Sacute
-Scaron
-Scedilla
-Scommaaccent
-Germandbls
 T
-Tcaron
-Tcommaaccent
 U
-Uacute
-Ubreve
-Ucircumflex
-Udieresis
-Ugrave
-Uhungarumlaut
-Umacron
-Uogonek
-Uring
 V
 W
-Wacute
-Wcircumflex
-Wdieresis
-Wgrave
 X
 Y
-Yacute
-Ycircumflex
-Ydieresis
-Ygrave
 Z
-Zacute
-Zcaron
-Zdotaccent
+bracketleft
+backslash
+bracketright
+asciicircum
+underscore
+grave
 a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+braceleft
+bar
+braceright
+asciitilde
+nbspace
+exclamdown
+cent
+sterling
+yen
+section
+dieresis
+copyright
+ordfeminine
+guillemetleft
+registered
+macron
+degree
+acute
+paragraph
+periodcentered
+cedilla
+ordmasculine
+guillemetright
+questiondown
+Agrave
+Aacute
+Acircumflex
+Atilde
+Adieresis
+Aring
+AE
+Ccedilla
+Egrave
+Eacute
+Ecircumflex
+Edieresis
+Igrave
+Iacute
+Icircumflex
+Idieresis
+Eth
+Ntilde
+Ograve
+Oacute
+Ocircumflex
+Otilde
+Odieresis
+multiply
+Oslash
+Ugrave
+Uacute
+Ucircumflex
+Udieresis
+Yacute
+Thorn
+germandbls
+agrave
 aacute
-abreve
 acircumflex
+atilde
 adieresis
-agrave
-amacron
-aogonek
 aring
-atilde
 ae
-b
-c
-cacute
-ccaron
 ccedilla
-cdotaccent
-d
-eth
-dcaron
-dcroat
-e
+egrave
 eacute
-ecaron
 ecircumflex
 edieresis
-edotaccent
-egrave
+igrave
+iacute
+icircumflex
+idieresis
+eth
+ntilde
+ograve
+oacute
+ocircumflex
+otilde
+odieresis
+divide
+oslash
+ugrave
+uacute
+ucircumflex
+udieresis
+yacute
+thorn
+ydieresis
+Amacron
+amacron
+Abreve
+abreve
+Aogonek
+aogonek
+Cacute
+cacute
+Cdotaccent
+cdotaccent
+Ccaron
+ccaron
+Dcaron
+dcaron
+Dcroat
+dcroat
+Emacron
 emacron
+Edotaccent
+edotaccent
+Eogonek
 eogonek
-f
-g
+Ecaron
+ecaron
+Gbreve
 gbreve
-gcommaaccent
+Gdotaccent
 gdotaccent
-h
+Gcommaaccent
+gcommaaccent
+Hbar
 hbar
-i
-idotless
-iacute
-icircumflex
-idieresis
-idotaccent
-igrave
+Itilde
+itilde
+Imacron
 imacron
+Iogonek
 iogonek
-j
-jdotless
-k
+Idotaccent
+idotless
+Kcommaaccent
 kcommaaccent
-l
+Lacute
 lacute
-lcaron
+Lcommaaccent
 lcommaaccent
+Lcaron
+lcaron
+Lslash
 lslash
-m
-n
+Nacute
 nacute
-ncaron
+Ncommaaccent
 ncommaaccent
-ntilde
-eng
-o
-oacute
-ocircumflex
-odieresis
-ograve
+Ncaron
+ncaron
+Ohungarumlaut
 ohungarumlaut
-omacron
-oslash
-otilde
+OE
 oe
-p
-thorn
-q
-r
+Racute
 racute
+Rcaron
 rcaron
-rcommaaccent
-s
+Sacute
 sacute
-scaron
+Scedilla
 scedilla
-scommaaccent
-germandbls
-t
+Scaron
+scaron
+Tcaron
 tcaron
-tcommaaccent
-u
-uacute
-ubreve
-ucircumflex
-udieresis
-ugrave
-uhungarumlaut
+Utilde
+utilde
+Umacron
 umacron
-uogonek
+Uring
 uring
-v
-w
-wacute
+Uhungarumlaut
+uhungarumlaut
+Uogonek
+uogonek
+Wcircumflex
 wcircumflex
-wdieresis
-wgrave
-x
-y
-yacute
+Ycircumflex
 ycircumflex
-ydieresis
-ygrave
-z
+Ydieresis
+Zacute
 zacute
-zcaron
+Zdotaccent
 zdotaccent
-ordfeminine
-ordmasculine
-.notdef
-comma
-semicolon
-exclamdown
-question
-questiondown
-periodcentered
-bullet
-periodcentered.loclCAT
-periodcentered.loclCAT.case
+Zcaron
+zcaron
+Scommaaccent
+scommaaccent
+Tcommaaccent
+tcommaaccent
+jdotless
+apostrophemod
+circumflex
+caron
+breve
+dotaccent
+ring
+ogonek
+tilde
+hungarumlaut
+gravecomb
+acutecomb
+circumflexcomb
+tildecomb
+macroncomb
+brevecomb
+dotaccentcomb
+dieresiscomb
+ringcomb
+hungarumlautcomb
+caroncomb
+commaaccentcomb
+cedillacomb
+ogonekcomb
+Wgrave
+wgrave
+Wacute
+wacute
+Wdieresis
+wdieresis
+Germandbls
+Etilde
+etilde
+Ygrave
+ygrave
+Ytilde
+ytilde
 endash
 emdash
-underscore
+quoteleft
+quoteright
 quotesinglbase
+quotedblleft
+quotedblright
 quotedblbase
+bullet
+ellipsis
 guilsinglleft
 guilsinglright
-at
-ampersand
-paragraph
-section
-copyright
-registered
-trademark
-cent
-dollar
 euro
-sterling
-yen
+trademark
 minus
-asciitilde
-asciicircum
-dotaccentcomb
+.notdef
+periodcentered.loclCAT
+periodcentered.loclCAT.case
 caroncomb.alt
-circumflexcomb
-caroncomb
-brevecomb
-ringcomb
-tildecomb
-commaturnedabovecomb
-commaaccentcomb
-cedillacomb
-ogonekcomb
-dieresis
-grave
-acute
-hungarumlaut
-circumflex
-caron
-breve
-ring
-tilde
-macron
-cedilla
-ogonek
\ No newline at end of file
+idotaccent
\ No newline at end of file
diff --git a/GF_glyphsets/Latin/txt/prod-names/GF_Latin_Core.txt b/GF_glyphsets/Latin/txt/prod-names/GF_Latin_Core.txt
index 2033d7e193..7e237a5c5c 100644
--- a/GF_glyphsets/Latin/txt/prod-names/GF_Latin_Core.txt
+++ b/GF_glyphsets/Latin/txt/prod-names/GF_Latin_Core.txt
@@ -1,3 +1,20 @@
+# This file is auto-generated; do not edit. See /README.md for instructions.
+space
+exclam
+quotedbl
+numbersign
+dollar
+percent
+ampersand
+quotesingle
+parenleft
+parenright
+asterisk
+plus
+comma
+hyphen
+period
+slash
 zero
 one
 two
@@ -8,326 +25,310 @@ six
 seven
 eight
 nine
-space
-uni00A0
-period
 colon
-ellipsis
-exclam
-asterisk
-numbersign
-slash
-backslash
-hyphen
-parenleft
-parenright
-braceleft
-braceright
-bracketleft
-bracketright
-quotedblleft
-quotedblright
-quoteleft
-quoteright
-guillemotleft
-guillemotright
-quotedbl
-quotesingle
-bar
-plus
-multiply
-divide
+semicolon
+less
 equal
 greater
-less
-percent
-uni0308
-gravecomb
-acutecomb
-uni030B
-uni0304
-dotaccent
-degree
+question
+at
 A
-Aacute
-Abreve
-Acircumflex
-Adieresis
-Agrave
-Amacron
-Aogonek
-Aring
-Atilde
-AE
 B
 C
-Cacute
-Ccaron
-Ccedilla
-Cdotaccent
 D
-Eth
-Dcaron
-Dcroat
 E
-Eacute
-Ecaron
-Ecircumflex
-Edieresis
-Edotaccent
-Egrave
-Emacron
-Eogonek
 F
 G
-Gbreve
-uni0122
-Gdotaccent
 H
-Hbar
 I
-Iacute
-Icircumflex
-Idieresis
-Idotaccent
-Igrave
-Imacron
-Iogonek
 J
 K
-uni0136
 L
-Lacute
-Lcaron
-uni013B
-Lslash
 M
 N
-Nacute
-Ncaron
-uni0145
-Ntilde
-Eng
 O
-Oacute
-Ocircumflex
-Odieresis
-Ograve
-Ohungarumlaut
-Omacron
-Oslash
-Otilde
-OE
 P
-Thorn
 Q
 R
-Racute
-Rcaron
-uni0156
 S
-Sacute
-Scaron
-Scedilla
-uni0218
-uni1E9E
 T
-Tcaron
-uni021A
 U
-Uacute
-Ubreve
-Ucircumflex
-Udieresis
-Ugrave
-Uhungarumlaut
-Umacron
-Uogonek
-Uring
 V
 W
-Wacute
-Wcircumflex
-Wdieresis
-Wgrave
 X
 Y
-Yacute
-Ycircumflex
-Ydieresis
-Ygrave
 Z
-Zacute
-Zcaron
-Zdotaccent
+bracketleft
+backslash
+bracketright
+asciicircum
+underscore
+grave
 a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+braceleft
+bar
+braceright
+asciitilde
+uni00A0
+exclamdown
+cent
+sterling
+yen
+section
+dieresis
+copyright
+ordfeminine
+guillemotleft
+registered
+macron
+degree
+acute
+paragraph
+periodcentered
+cedilla
+ordmasculine
+guillemotright
+questiondown
+Agrave
+Aacute
+Acircumflex
+Atilde
+Adieresis
+Aring
+AE
+Ccedilla
+Egrave
+Eacute
+Ecircumflex
+Edieresis
+Igrave
+Iacute
+Icircumflex
+Idieresis
+Eth
+Ntilde
+Ograve
+Oacute
+Ocircumflex
+Otilde
+Odieresis
+multiply
+Oslash
+Ugrave
+Uacute
+Ucircumflex
+Udieresis
+Yacute
+Thorn
+germandbls
+agrave
 aacute
-abreve
 acircumflex
+atilde
 adieresis
-agrave
-amacron
-aogonek
 aring
-atilde
 ae
-b
-c
-cacute
-ccaron
 ccedilla
-cdotaccent
-d
-eth
-dcaron
-dcroat
-e
+egrave
 eacute
-ecaron
 ecircumflex
 edieresis
-edotaccent
-egrave
+igrave
+iacute
+icircumflex
+idieresis
+eth
+ntilde
+ograve
+oacute
+ocircumflex
+otilde
+odieresis
+divide
+oslash
+ugrave
+uacute
+ucircumflex
+udieresis
+yacute
+thorn
+ydieresis
+Amacron
+amacron
+Abreve
+abreve
+Aogonek
+aogonek
+Cacute
+cacute
+Cdotaccent
+cdotaccent
+Ccaron
+ccaron
+Dcaron
+dcaron
+Dcroat
+dcroat
+Emacron
 emacron
+Edotaccent
+edotaccent
+Eogonek
 eogonek
-f
-g
+Ecaron
+ecaron
+Gbreve
 gbreve
-uni0123
+Gdotaccent
 gdotaccent
-h
+uni0122
+uni0123
+Hbar
 hbar
-i
-dotlessi
-iacute
-icircumflex
-idieresis
-i.loclTRK
-igrave
+Itilde
+itilde
+Imacron
 imacron
+Iogonek
 iogonek
-j
-uni0237
-k
+Idotaccent
+dotlessi
+uni0136
 uni0137
-l
+Lacute
 lacute
-lcaron
+uni013B
 uni013C
+Lcaron
+lcaron
+Lslash
 lslash
-m
-n
+Nacute
 nacute
-ncaron
+uni0145
 uni0146
-ntilde
-eng
-o
-oacute
-ocircumflex
-odieresis
-ograve
+Ncaron
+ncaron
+Ohungarumlaut
 ohungarumlaut
-omacron
-oslash
-otilde
+OE
 oe
-p
-thorn
-q
-r
+Racute
 racute
+Rcaron
 rcaron
-uni0157
-s
+Sacute
 sacute
-scaron
+Scedilla
 scedilla
-uni0219
-germandbls
-t
+Scaron
+scaron
+Tcaron
 tcaron
-uni021B
-u
-uacute
-ubreve
-ucircumflex
-udieresis
-ugrave
-uhungarumlaut
+Utilde
+utilde
+Umacron
 umacron
-uogonek
+Uring
 uring
-v
-w
-wacute
+Uhungarumlaut
+uhungarumlaut
+Uogonek
+uogonek
+Wcircumflex
 wcircumflex
-wdieresis
-wgrave
-x
-y
-yacute
+Ycircumflex
 ycircumflex
-ydieresis
-ygrave
-z
+Ydieresis
+Zacute
 zacute
-zcaron
+Zdotaccent
 zdotaccent
-ordfeminine
-ordmasculine
-.notdef
-comma
-semicolon
-exclamdown
-question
-questiondown
-periodcentered
-bullet
-periodcentered.loclCAT
-periodcentered.loclCAT.case
+Zcaron
+zcaron
+uni0218
+uni0219
+uni021A
+uni021B
+uni0237
+uni02BC
+circumflex
+caron
+breve
+dotaccent
+ring
+ogonek
+tilde
+hungarumlaut
+gravecomb
+acutecomb
+uni0302
+tildecomb
+uni0304
+uni0306
+uni0307
+uni0308
+uni030A
+uni030B
+uni030C
+uni0326
+uni0327
+uni0328
+Wgrave
+wgrave
+Wacute
+wacute
+Wdieresis
+wdieresis
+uni1E9E
+uni1EBC
+uni1EBD
+Ygrave
+ygrave
+uni1EF8
+uni1EF9
 endash
 emdash
-underscore
+quoteleft
+quoteright
 quotesinglbase
+quotedblleft
+quotedblright
 quotedblbase
+bullet
+ellipsis
 guilsinglleft
 guilsinglright
-at
-ampersand
-paragraph
-section
-copyright
-registered
-trademark
-cent
-dollar
 Euro
-sterling
-yen
+trademark
 minus
-asciitilde
-asciicircum
-uni0307
+.notdef
+periodcentered.loclCAT
+periodcentered.loclCAT.case
 uni030C.alt
-uni0302
-uni030C
-uni0306
-uni030A
-tildecomb
-uni0312
-uni0326
-uni0327
-uni0328
-dieresis
-grave
-acute
-hungarumlaut
-circumflex
-caron
-breve
-ring
-tilde
-macron
-cedilla
-ogonek
\ No newline at end of file
+i.loclTRK
\ No newline at end of file
diff --git a/GF_glyphsets/update-gs.sh b/GF_glyphsets/update-gs.sh
index 4feb4d3225..dbdf9be0c2 100644
--- a/GF_glyphsets/update-gs.sh
+++ b/GF_glyphsets/update-gs.sh
@@ -7,7 +7,7 @@ DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
 cd $DIR
 
 echo "clean-up"
-rm -rf ./*/nam ./*/txt ./*/glyphs/*.plist
+rm -rf ./*/nam/*.nam ./*/txt/*/*.txt ./*/glyphs/*.plist
 
 echo "Updating lists"
 
@@ -16,7 +16,6 @@ scripts=$(ls -d */ | cut -f1 -d'/')
 for script in $scripts
 do
     echo $script
-    mkdir $script/nam $script/txt $script/txt/prod-names $script/txt/nice-names
     sets=$(ls ./$script/glyphs/*.glyphs | xargs -n 1 basename | sed -e 's/\.glyphs$//')
     if [[ $sets == *GF_Latin_Core* ]]
     then
@@ -34,3 +33,9 @@ do
         glyphsets filter-list $set -o $script/txt/prod-names/$set.txt --prod-names
     done
 done
+
+# Language definition overhaul:
+# After all the files were created using the old approach,
+# now use the new approach to replace files for those glyphsets
+# that are supported under the new approach
+python ../scripts/assemble_charactersets.py
\ No newline at end of file
diff --git a/Lib/glyphsets/definitions/__init__.py b/Lib/glyphsets/definitions/__init__.py
new file mode 100644
index 0000000000..14fd2628a9
--- /dev/null
+++ b/Lib/glyphsets/definitions/__init__.py
@@ -0,0 +1,55 @@
+# Google Fonts glyphset definitions to be consumed by other tools.
+# The "script" value needs to correspond to the folder name
+# in /GF_Glyphsets of this repo in order to find the other definition files.
+
+import os
+
+glyphset_definitions = {
+    "GF_Latin_Core": {
+        "script": "Latin",
+        "language_codes": [
+            "ca_Latn",  # Catalan
+            "cs_Latn",  # Czech
+            "cy_Latn",  # Welsh
+            "da_Latn",  # Danish
+            "de_Latn",  # German
+            "en_Latn",  # English
+            "es_Latn",  # Spanish
+            "fi_Latn",  # Finnish
+            "fr_Latn",  # French
+            "gn_Latn",  # Guarani
+            "hr_Latn",  # Croatian
+            "hu_Latn",  # Hungarian
+            "is_Latn",  # Icelandic
+            "it_Latn",  # Italian
+            "lt_Latn",  # Lithuanian
+            "lv_Latn",  # Latvian
+            "mt_Latn",  # Maltese
+            "nb_Latn",  # Norwegian Bokmål
+            "nl_Latn",  # Dutch
+            "pl_Latn",  # Polish
+            "pt_Latn",  # Portuguese
+            "qu_Latn",  # Quechua
+            "ro_Latn",  # Romanian
+            "sk_Latn",  # Slovak
+            "sq_Latn",  # Albanian
+            "sr_Latn",  # Serbian (Latin)
+            "sv_Latn",  # Swedish
+            "tr_Latn",  # Turkish
+        ],
+    }
+}
+
+
+def unicodes_per_glyphset(glyphset_name):
+    character_set = set()
+    # Read .nam file
+    nam_path = os.path.join(os.path.dirname(__file__), "nam", f"{glyphset_name}.nam")
+    if os.path.exists(nam_path):
+        with open(nam_path, "r") as f:
+            nam_stub_lines = f.readlines()
+        for line in nam_stub_lines:
+            unicode = line.split(" ")[0]
+            if unicode.startswith("0x"):
+                character_set.add(int(unicode[2:], 16))
+    return list(sorted(character_set))
diff --git a/Lib/glyphsets/definitions/nam/GF_Latin_Core.nam b/Lib/glyphsets/definitions/nam/GF_Latin_Core.nam
new file mode 100644
index 0000000000..6469ffad1c
--- /dev/null
+++ b/Lib/glyphsets/definitions/nam/GF_Latin_Core.nam
@@ -0,0 +1,329 @@
+# This file is auto-generated; do not edit. See /README.md for instructions.
+0x0020 SPACE
+0x0021 EXCLAMATION MARK
+0x0022 QUOTATION MARK
+0x0023 NUMBER SIGN
+0x0024 DOLLAR SIGN
+0x0025 PERCENT SIGN
+0x0026 AMPERSAND
+0x0027 APOSTROPHE
+0x0028 LEFT PARENTHESIS
+0x0029 RIGHT PARENTHESIS
+0x002A ASTERISK
+0x002B PLUS SIGN
+0x002C COMMA
+0x002D HYPHEN-MINUS
+0x002E FULL STOP
+0x002F SOLIDUS
+0x0030 DIGIT ZERO
+0x0031 DIGIT ONE
+0x0032 DIGIT TWO
+0x0033 DIGIT THREE
+0x0034 DIGIT FOUR
+0x0035 DIGIT FIVE
+0x0036 DIGIT SIX
+0x0037 DIGIT SEVEN
+0x0038 DIGIT EIGHT
+0x0039 DIGIT NINE
+0x003A COLON
+0x003B SEMICOLON
+0x003C LESS-THAN SIGN
+0x003D EQUALS SIGN
+0x003E GREATER-THAN SIGN
+0x003F QUESTION MARK
+0x0040 COMMERCIAL AT
+0x0041 LATIN CAPITAL LETTER A
+0x0042 LATIN CAPITAL LETTER B
+0x0043 LATIN CAPITAL LETTER C
+0x0044 LATIN CAPITAL LETTER D
+0x0045 LATIN CAPITAL LETTER E
+0x0046 LATIN CAPITAL LETTER F
+0x0047 LATIN CAPITAL LETTER G
+0x0048 LATIN CAPITAL LETTER H
+0x0049 LATIN CAPITAL LETTER I
+0x004A LATIN CAPITAL LETTER J
+0x004B LATIN CAPITAL LETTER K
+0x004C LATIN CAPITAL LETTER L
+0x004D LATIN CAPITAL LETTER M
+0x004E LATIN CAPITAL LETTER N
+0x004F LATIN CAPITAL LETTER O
+0x0050 LATIN CAPITAL LETTER P
+0x0051 LATIN CAPITAL LETTER Q
+0x0052 LATIN CAPITAL LETTER R
+0x0053 LATIN CAPITAL LETTER S
+0x0054 LATIN CAPITAL LETTER T
+0x0055 LATIN CAPITAL LETTER U
+0x0056 LATIN CAPITAL LETTER V
+0x0057 LATIN CAPITAL LETTER W
+0x0058 LATIN CAPITAL LETTER X
+0x0059 LATIN CAPITAL LETTER Y
+0x005A LATIN CAPITAL LETTER Z
+0x005B LEFT SQUARE BRACKET
+0x005C REVERSE SOLIDUS
+0x005D RIGHT SQUARE BRACKET
+0x005E CIRCUMFLEX ACCENT
+0x005F LOW LINE
+0x0060 GRAVE ACCENT
+0x0061 LATIN SMALL LETTER A
+0x0062 LATIN SMALL LETTER B
+0x0063 LATIN SMALL LETTER C
+0x0064 LATIN SMALL LETTER D
+0x0065 LATIN SMALL LETTER E
+0x0066 LATIN SMALL LETTER F
+0x0067 LATIN SMALL LETTER G
+0x0068 LATIN SMALL LETTER H
+0x0069 LATIN SMALL LETTER I
+0x006A LATIN SMALL LETTER J
+0x006B LATIN SMALL LETTER K
+0x006C LATIN SMALL LETTER L
+0x006D LATIN SMALL LETTER M
+0x006E LATIN SMALL LETTER N
+0x006F LATIN SMALL LETTER O
+0x0070 LATIN SMALL LETTER P
+0x0071 LATIN SMALL LETTER Q
+0x0072 LATIN SMALL LETTER R
+0x0073 LATIN SMALL LETTER S
+0x0074 LATIN SMALL LETTER T
+0x0075 LATIN SMALL LETTER U
+0x0076 LATIN SMALL LETTER V
+0x0077 LATIN SMALL LETTER W
+0x0078 LATIN SMALL LETTER X
+0x0079 LATIN SMALL LETTER Y
+0x007A LATIN SMALL LETTER Z
+0x007B LEFT CURLY BRACKET
+0x007C VERTICAL LINE
+0x007D RIGHT CURLY BRACKET
+0x007E TILDE
+0x00A0 NO-BREAK SPACE
+0x00A1 INVERTED EXCLAMATION MARK
+0x00A2 CENT SIGN
+0x00A3 POUND SIGN
+0x00A5 YEN SIGN
+0x00A7 SECTION SIGN
+0x00A8 DIAERESIS
+0x00A9 COPYRIGHT SIGN
+0x00AA FEMININE ORDINAL INDICATOR
+0x00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00AE REGISTERED SIGN
+0x00AF MACRON
+0x00B0 DEGREE SIGN
+0x00B4 ACUTE ACCENT
+0x00B6 PILCROW SIGN
+0x00B7 MIDDLE DOT
+0x00B8 CEDILLA
+0x00BA MASCULINE ORDINAL INDICATOR
+0x00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00BF INVERTED QUESTION MARK
+0x00C0 LATIN CAPITAL LETTER A WITH GRAVE
+0x00C1 LATIN CAPITAL LETTER A WITH ACUTE
+0x00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x00C3 LATIN CAPITAL LETTER A WITH TILDE
+0x00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+0x00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+0x00C6 LATIN CAPITAL LETTER AE
+0x00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+0x00C8 LATIN CAPITAL LETTER E WITH GRAVE
+0x00C9 LATIN CAPITAL LETTER E WITH ACUTE
+0x00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+0x00CC LATIN CAPITAL LETTER I WITH GRAVE
+0x00CD LATIN CAPITAL LETTER I WITH ACUTE
+0x00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+0x00D0 LATIN CAPITAL LETTER ETH
+0x00D1 LATIN CAPITAL LETTER N WITH TILDE
+0x00D2 LATIN CAPITAL LETTER O WITH GRAVE
+0x00D3 LATIN CAPITAL LETTER O WITH ACUTE
+0x00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x00D5 LATIN CAPITAL LETTER O WITH TILDE
+0x00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+0x00D7 MULTIPLICATION SIGN
+0x00D8 LATIN CAPITAL LETTER O WITH STROKE
+0x00D9 LATIN CAPITAL LETTER U WITH GRAVE
+0x00DA LATIN CAPITAL LETTER U WITH ACUTE
+0x00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+0x00DD LATIN CAPITAL LETTER Y WITH ACUTE
+0x00DE LATIN CAPITAL LETTER THORN
+0x00DF LATIN SMALL LETTER SHARP S
+0x00E0 LATIN SMALL LETTER A WITH GRAVE
+0x00E1 LATIN SMALL LETTER A WITH ACUTE
+0x00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x00E3 LATIN SMALL LETTER A WITH TILDE
+0x00E4 LATIN SMALL LETTER A WITH DIAERESIS
+0x00E5 LATIN SMALL LETTER A WITH RING ABOVE
+0x00E6 LATIN SMALL LETTER AE
+0x00E7 LATIN SMALL LETTER C WITH CEDILLA
+0x00E8 LATIN SMALL LETTER E WITH GRAVE
+0x00E9 LATIN SMALL LETTER E WITH ACUTE
+0x00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x00EB LATIN SMALL LETTER E WITH DIAERESIS
+0x00EC LATIN SMALL LETTER I WITH GRAVE
+0x00ED LATIN SMALL LETTER I WITH ACUTE
+0x00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x00EF LATIN SMALL LETTER I WITH DIAERESIS
+0x00F0 LATIN SMALL LETTER ETH
+0x00F1 LATIN SMALL LETTER N WITH TILDE
+0x00F2 LATIN SMALL LETTER O WITH GRAVE
+0x00F3 LATIN SMALL LETTER O WITH ACUTE
+0x00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x00F5 LATIN SMALL LETTER O WITH TILDE
+0x00F6 LATIN SMALL LETTER O WITH DIAERESIS
+0x00F7 DIVISION SIGN
+0x00F8 LATIN SMALL LETTER O WITH STROKE
+0x00F9 LATIN SMALL LETTER U WITH GRAVE
+0x00FA LATIN SMALL LETTER U WITH ACUTE
+0x00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x00FC LATIN SMALL LETTER U WITH DIAERESIS
+0x00FD LATIN SMALL LETTER Y WITH ACUTE
+0x00FE LATIN SMALL LETTER THORN
+0x00FF LATIN SMALL LETTER Y WITH DIAERESIS
+0x0100 LATIN CAPITAL LETTER A WITH MACRON
+0x0101 LATIN SMALL LETTER A WITH MACRON
+0x0102 LATIN CAPITAL LETTER A WITH BREVE
+0x0103 LATIN SMALL LETTER A WITH BREVE
+0x0104 LATIN CAPITAL LETTER A WITH OGONEK
+0x0105 LATIN SMALL LETTER A WITH OGONEK
+0x0106 LATIN CAPITAL LETTER C WITH ACUTE
+0x0107 LATIN SMALL LETTER C WITH ACUTE
+0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+0x010B LATIN SMALL LETTER C WITH DOT ABOVE
+0x010C LATIN CAPITAL LETTER C WITH CARON
+0x010D LATIN SMALL LETTER C WITH CARON
+0x010E LATIN CAPITAL LETTER D WITH CARON
+0x010F LATIN SMALL LETTER D WITH CARON
+0x0110 LATIN CAPITAL LETTER D WITH STROKE
+0x0111 LATIN SMALL LETTER D WITH STROKE
+0x0112 LATIN CAPITAL LETTER E WITH MACRON
+0x0113 LATIN SMALL LETTER E WITH MACRON
+0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+0x0117 LATIN SMALL LETTER E WITH DOT ABOVE
+0x0118 LATIN CAPITAL LETTER E WITH OGONEK
+0x0119 LATIN SMALL LETTER E WITH OGONEK
+0x011A LATIN CAPITAL LETTER E WITH CARON
+0x011B LATIN SMALL LETTER E WITH CARON
+0x011E LATIN CAPITAL LETTER G WITH BREVE
+0x011F LATIN SMALL LETTER G WITH BREVE
+0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+0x0121 LATIN SMALL LETTER G WITH DOT ABOVE
+0x0122 LATIN CAPITAL LETTER G WITH CEDILLA
+0x0123 LATIN SMALL LETTER G WITH CEDILLA
+0x0126 LATIN CAPITAL LETTER H WITH STROKE
+0x0127 LATIN SMALL LETTER H WITH STROKE
+0x0128 LATIN CAPITAL LETTER I WITH TILDE
+0x0129 LATIN SMALL LETTER I WITH TILDE
+0x012A LATIN CAPITAL LETTER I WITH MACRON
+0x012B LATIN SMALL LETTER I WITH MACRON
+0x012E LATIN CAPITAL LETTER I WITH OGONEK
+0x012F LATIN SMALL LETTER I WITH OGONEK
+0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x0131 LATIN SMALL LETTER DOTLESS I
+0x0136 LATIN CAPITAL LETTER K WITH CEDILLA
+0x0137 LATIN SMALL LETTER K WITH CEDILLA
+0x0139 LATIN CAPITAL LETTER L WITH ACUTE
+0x013A LATIN SMALL LETTER L WITH ACUTE
+0x013B LATIN CAPITAL LETTER L WITH CEDILLA
+0x013C LATIN SMALL LETTER L WITH CEDILLA
+0x013D LATIN CAPITAL LETTER L WITH CARON
+0x013E LATIN SMALL LETTER L WITH CARON
+0x0141 LATIN CAPITAL LETTER L WITH STROKE
+0x0142 LATIN SMALL LETTER L WITH STROKE
+0x0143 LATIN CAPITAL LETTER N WITH ACUTE
+0x0144 LATIN SMALL LETTER N WITH ACUTE
+0x0145 LATIN CAPITAL LETTER N WITH CEDILLA
+0x0146 LATIN SMALL LETTER N WITH CEDILLA
+0x0147 LATIN CAPITAL LETTER N WITH CARON
+0x0148 LATIN SMALL LETTER N WITH CARON
+0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x0152 LATIN CAPITAL LIGATURE OE
+0x0153 LATIN SMALL LIGATURE OE
+0x0154 LATIN CAPITAL LETTER R WITH ACUTE
+0x0155 LATIN SMALL LETTER R WITH ACUTE
+0x0158 LATIN CAPITAL LETTER R WITH CARON
+0x0159 LATIN SMALL LETTER R WITH CARON
+0x015A LATIN CAPITAL LETTER S WITH ACUTE
+0x015B LATIN SMALL LETTER S WITH ACUTE
+0x015E LATIN CAPITAL LETTER S WITH CEDILLA
+0x015F LATIN SMALL LETTER S WITH CEDILLA
+0x0160 LATIN CAPITAL LETTER S WITH CARON
+0x0161 LATIN SMALL LETTER S WITH CARON
+0x0164 LATIN CAPITAL LETTER T WITH CARON
+0x0165 LATIN SMALL LETTER T WITH CARON
+0x0168 LATIN CAPITAL LETTER U WITH TILDE
+0x0169 LATIN SMALL LETTER U WITH TILDE
+0x016A LATIN CAPITAL LETTER U WITH MACRON
+0x016B LATIN SMALL LETTER U WITH MACRON
+0x016E LATIN CAPITAL LETTER U WITH RING ABOVE
+0x016F LATIN SMALL LETTER U WITH RING ABOVE
+0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x0172 LATIN CAPITAL LETTER U WITH OGONEK
+0x0173 LATIN SMALL LETTER U WITH OGONEK
+0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+0x0179 LATIN CAPITAL LETTER Z WITH ACUTE
+0x017A LATIN SMALL LETTER Z WITH ACUTE
+0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x017C LATIN SMALL LETTER Z WITH DOT ABOVE
+0x017D LATIN CAPITAL LETTER Z WITH CARON
+0x017E LATIN SMALL LETTER Z WITH CARON
+0x0218 LATIN CAPITAL LETTER S WITH COMMA BELOW
+0x0219 LATIN SMALL LETTER S WITH COMMA BELOW
+0x021A LATIN CAPITAL LETTER T WITH COMMA BELOW
+0x021B LATIN SMALL LETTER T WITH COMMA BELOW
+0x0237 LATIN SMALL LETTER DOTLESS J
+0x02BC MODIFIER LETTER APOSTROPHE
+0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+0x02C7 CARON
+0x02D8 BREVE
+0x02D9 DOT ABOVE
+0x02DA RING ABOVE
+0x02DB OGONEK
+0x02DC SMALL TILDE
+0x02DD DOUBLE ACUTE ACCENT
+0x0300 COMBINING GRAVE ACCENT
+0x0301 COMBINING ACUTE ACCENT
+0x0302 COMBINING CIRCUMFLEX ACCENT
+0x0303 COMBINING TILDE
+0x0304 COMBINING MACRON
+0x0306 COMBINING BREVE
+0x0307 COMBINING DOT ABOVE
+0x0308 COMBINING DIAERESIS
+0x030A COMBINING RING ABOVE
+0x030B COMBINING DOUBLE ACUTE ACCENT
+0x030C COMBINING CARON
+0x0326 COMBINING COMMA BELOW
+0x0327 COMBINING CEDILLA
+0x0328 COMBINING OGONEK
+0x1E80 LATIN CAPITAL LETTER W WITH GRAVE
+0x1E81 LATIN SMALL LETTER W WITH GRAVE
+0x1E82 LATIN CAPITAL LETTER W WITH ACUTE
+0x1E83 LATIN SMALL LETTER W WITH ACUTE
+0x1E84 LATIN CAPITAL LETTER W WITH DIAERESIS
+0x1E85 LATIN SMALL LETTER W WITH DIAERESIS
+0x1E9E LATIN CAPITAL LETTER SHARP S
+0x1EBC LATIN CAPITAL LETTER E WITH TILDE
+0x1EBD LATIN SMALL LETTER E WITH TILDE
+0x1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
+0x1EF3 LATIN SMALL LETTER Y WITH GRAVE
+0x1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+0x1EF9 LATIN SMALL LETTER Y WITH TILDE
+0x2013 EN DASH
+0x2014 EM DASH
+0x2018 LEFT SINGLE QUOTATION MARK
+0x2019 RIGHT SINGLE QUOTATION MARK
+0x201A SINGLE LOW-9 QUOTATION MARK
+0x201C LEFT DOUBLE QUOTATION MARK
+0x201D RIGHT DOUBLE QUOTATION MARK
+0x201E DOUBLE LOW-9 QUOTATION MARK
+0x2022 BULLET
+0x2026 HORIZONTAL ELLIPSIS
+0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x20AC EURO SIGN
+0x2122 TRADE MARK SIGN
+0x2212 MINUS SIGN
\ No newline at end of file
diff --git a/README.md b/README.md
index 5d3ad99fa0..3c92dd4157 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,66 @@
+Attention: Repository under transition
+======================================
+
+The assembly of character sets is currently undergoing a transition from the previous approach of using the `glyphsets` command and `data.json` as a database to using the `gflanguages` package as the database and assembling `.nam` and other files from that.
+
+This transition is currently complete for:
+* GF_Latin_Core
+
+How to assemble glyphs and characters using the new approach
+------------------------------------------------------------
+
+1. Define the glyphset in the Python module in `Lib/glyphsets/definitions/__init__.py` with language codes for your character set.
+2. Optional: Have a `.stub.nam` file under `GF_Glyphsets/*/definitions/` for your character set, containing _encoded_ characters that you want to see included that can't be inferred from the `gflanguages` definitions.
+3. Optional: Have a `.stub.glyphs` file under `GF_Glyphsets/*/definitions/` for your character set, containing _unencoded_ glyphs that you want to see included.
+4. Update all glyphsets using `sh GF_glyphsets/update-gs.sh` as usual, see below for details.
+
+The final `.glyphs` files are the sum of `gflanguages` + `.stub.nam` + `.stub.glyphs`.
+
+_Bonus points:_ Sadly, in the creation of the `.glyphs` files, it's not possible to exactly recreate the glyph sorting that Glyphs.app uses by default, so the `.glyphs` files look a bit different from what's expected. If you care, please open every freshly adjusted `.glyphs` file in Glyphs.app, select all glyphs, and run "Update Glyph Info" from the "Glyphs" menu on them to sort them and save the file. But the files will work as-is in any case.
+
+What happens under the hood
+---------------------------
+
+1. `update-gs.sh` runs as previously, except that it won't deleted the entire folder structure as previously, thus preserving the vital new `definitions` folder.
+2. It continues to build all files under the old approach.
+3. Afterwards, it calls the new script (`scripts/assemble_charactersets.py`) which will write over existing nam/glyphs/txt files (for supported glyphsets, see list at top).
+
+Data flow visualization
+-----------------------
+
+Visualizes in a simplified way how the various data sources are combined into a final glyphset, then rendered out to various format.
+This process is repeated for every glyphset defined in `Lib/glyphsets/definitions/__init__.py`.
+
+Read this top to bottom.
+
+```
+┌──────────────────┐
+│ Language codes   │
+│ "en_Latn"        │
+│ "de_Latn"        │
+│ ...              │
+└──────────────────┘
+         │
+┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
+│ gflanguages      │   │ .stub.nam        │   │ .stub.glyphs     │
+│ (Python package) │   │ (optional)       │   │ (optional)       │
+└──────────────────┘   └──────────────────┘   └──────────────────┘
+         │                      │                      │
+         ╰──────────────────────┼──────────────────────╯
+                                │
+                ╔═══════════════════════════════╗
+                ║ complete glyphset             ║ 
+                ╚═══════════════════════════════╝
+                                │
+         ╭──────────────────────┼──────────────────────┬──────────────────────╮
+         │                      │                      │                      │
+┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
+│ .txt             │   │ .nam             │   │ .glyphs          │   │ .plist           │
+│ (nice & prod)    │   │                  │   │                  │   │                  │
+└──────────────────┘   └──────────────────┘   └──────────────────┘   └──────────────────┘
+```
+
+
 Glyphsets
 =========
 
diff --git a/requirements.txt b/requirements.txt
index 72f4f5b851..9bef102b32 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,4 +2,5 @@ setuptools
 FontTools[ufo]
 glyphsLib
 defcon
+gflanguages
 unicodedata2
diff --git a/scripts/assemble_charactersets.py b/scripts/assemble_charactersets.py
new file mode 100644
index 0000000000..3f960e273f
--- /dev/null
+++ b/scripts/assemble_charactersets.py
@@ -0,0 +1,213 @@
+"""
+Assemble .nam files from .nam stub files and language definitions.
+"""
+
+import sys
+import os
+import shutil
+import gflanguages
+import unicodedata
+import glyphsLib
+import functools
+import plistlib
+from glyphsLib.glyphdata import get_glyph, _lookup_attributes_by_unicode
+
+# Insert local module path at beginning of sys.path
+# so that up-to-date version of glyphsets package is used
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "Lib"))
+from glyphsets.definitions import glyphset_definitions  # noqa: E402
+from glyphsets.definitions import unicodes_per_glyphset  # noqa: E402
+
+
+def sort_unicodes(a, b):
+    if a.unicode and b.unicode:
+        return int(a.unicode, 16) - int(b.unicode, 16)
+    elif a.unicode:
+        return -1
+    elif b.unicode:
+        return 1
+    else:
+        return 0
+
+
+def sort_by_category(a, b):
+    info_a = get_glyph(a.name)
+    info_b = get_glyph(b.name)
+
+    value = sorted([info_a.category, info_b.category]).index(info_a.category)
+    if value == 0:
+        value = -1
+    value *= -1
+
+    return value
+
+
+def assemble_characterset(root_folder, glyphset_name):
+    script = glyphset_definitions[glyphset_name]["script"]
+    language_codes = glyphset_definitions[glyphset_name]["language_codes"]
+
+    nam_stub_path = os.path.join(
+        root_folder, script, "definitions", f"{glyphset_name}.stub.nam"
+    )
+    nam_path = os.path.join(root_folder, script, "nam", f"{glyphset_name}.nam")
+    nam_in_package_path = os.path.abspath(
+        os.path.join(
+            root_folder,
+            "..",
+            "Lib",
+            "glyphsets",
+            "definitions",
+            "nam",
+            f"{glyphset_name}.nam",
+        )
+    )
+    glyphs_stub_path = os.path.join(
+        root_folder, script, "definitions", f"{glyphset_name}.stub.glyphs"
+    )
+    glyphs_path = os.path.join(root_folder, script, "glyphs", f"{glyphset_name}.glyphs")
+    txt_nicenames_path = os.path.join(
+        root_folder, script, "txt", "nice-names", f"{glyphset_name}.txt"
+    )
+    txt_prodnames_path = os.path.join(
+        root_folder, script, "txt", "prod-names", f"{glyphset_name}.txt"
+    )
+    plist_path = os.path.join(
+        root_folder, script, "glyphs", f"CustomFilter_GF_{script}.plist"
+    )
+
+    character_set = set()
+
+    # Assemble character sets from gflanguages
+    languages = gflanguages.LoadLanguages()
+    for language_code in language_codes:
+        chars = languages[language_code].exemplar_chars
+        # chars.base.upper() is important because many Latin languages don't
+        # contain a complete set of uppercase letters in "index"
+        character_set.update(
+            {
+                ord(c)
+                for c in list(
+                    set(chars.base)
+                    | set(chars.base.upper())
+                    | set(chars.index)
+                    | set(chars.marks)
+                    | set(chars.numerals)
+                    | set(chars.punctuation)
+                    # | set(chars.auxiliary) # Not to be part of charsets
+                )
+                if c not in (" ", "{", "}", "◌")
+            }
+        )
+
+    # Read .stub.nam file
+    if os.path.exists(nam_stub_path):
+        with open(nam_stub_path, "r") as f:
+            nam_stub_lines = f.readlines()
+        for line in nam_stub_lines:
+            unicode = line.split(" ")[0]
+            if unicode.startswith("0x"):
+                character_set.add(int(unicode[2:], 16))
+
+    # Call get_glyph once so that GLYPHDATA gets filled in glyphsLib
+    get_glyph("A")
+    # If I import GLYPHDATA at the top of the file, it doesn't get filled
+    from glyphsLib.glyphdata import GLYPHDATA
+
+    assert type(GLYPHDATA) is glyphsLib.glyphdata.GlyphData
+
+    # Create glyphs file and add characters
+    if os.path.exists(glyphs_stub_path):
+        font = glyphsLib.load(glyphs_stub_path)
+    else:
+        font = glyphsLib.GSFont()
+        font.familyName = glyphset_name
+    for _i, unicode in enumerate(sorted(list(character_set))):
+        unicode = f"{unicode:#0{6}X}".replace("0X", "")
+        glyph_info = _lookup_attributes_by_unicode(unicode, GLYPHDATA)
+        glyph = glyphsLib.GSGlyph(glyph_info["name"])
+        glyph.unicode = unicode
+        font.glyphs.append(glyph)
+
+    # Sort
+    font.glyphs = sorted(font.glyphs, key=functools.cmp_to_key(sort_by_category))
+    unicode_sorted_glyphs = sorted(font.glyphs, key=functools.cmp_to_key(sort_unicodes))
+    glyph_names = [glyph.name for glyph in unicode_sorted_glyphs]
+    production_glyph_names = [
+        get_glyph(glyph.name).production_name for glyph in unicode_sorted_glyphs
+    ]
+
+    # Save glyphs file
+    font.axes = []
+    for master in font.masters:
+        master.axes = []
+    font.instances = []
+    font.save(glyphs_path)
+
+    # Output sorted character set to .nam file
+    with open(nam_path, "w") as f:
+        f.write(
+            "# This file is auto-generated; do not edit. See /README.md for instructions.\n"
+        )
+        for i, unicode in enumerate(sorted(list(character_set))):
+            unicode_string = f"{unicode:#0{6}X}".replace("0X", "0x")
+            f.write(f"{unicode_string} {unicodedata.name(chr(unicode))}")
+            if i < len(character_set) - 1:
+                f.write("\n")
+    shutil.copyfile(nam_path, nam_in_package_path)
+
+    # Output txt files
+    with open(txt_nicenames_path, "w") as f:
+        f.write(
+            "# This file is auto-generated; do not edit. See /README.md for instructions.\n"
+        )
+        f.write("\n".join(glyph_names))
+    with open(txt_prodnames_path, "w") as f:
+        f.write(
+            "# This file is auto-generated; do not edit. See /README.md for instructions.\n"
+        )
+        f.write("\n".join(production_glyph_names))
+
+    # Adjust .plist
+    with open(plist_path, "rb") as f:
+        plist = plistlib.load(f)
+    for plist_glyphset in plist:
+        if plist_glyphset["name"] == glyphset_name:
+            plist_glyphset["list"] = glyph_names
+    with open(plist_path, "wb") as f:
+        plistlib.dump(plist, f)
+
+
+if __name__ == "__main__":
+    # Check for gflanguages version
+    installed = None
+    latest = None
+    for line in os.popen("pip index versions gflanguages").read().split("\n"):
+        if "INSTALLED" in line:
+            installed = line.split(" ")[-1].strip()
+        if "LATEST" in line:
+            latest = line.split(" ")[-1].strip()
+
+    print(
+        f"""
+*************************************************************
+*
+*   WARNING:
+*   Make sure you're using the correct version of gflanguages,
+*   otherwise the glyphsets will be incorrect.
+*
+*   You have: {installed}
+*   Location: {gflanguages.__file__}
+*
+*************************************************************
+"""
+    )
+
+    root_folder = os.path.abspath(
+        os.path.join(os.path.dirname(__file__), "..", "GF_Glyphsets")
+    )
+
+    for glyphset_name in glyphset_definitions:
+        print(f"Assembling '{glyphset_name}'...")
+        assemble_characterset(root_folder, glyphset_name)
+        # Proof of work:
+        assert unicodes_per_glyphset(glyphset_name) != []
diff --git a/scripts/assemble_languages.py b/scripts/assemble_languages.py
new file mode 100644
index 0000000000..0992c4c345
--- /dev/null
+++ b/scripts/assemble_languages.py
@@ -0,0 +1,68 @@
+"""
+Read all languages and regions from gflanguages and print out the languages that are supported
+in Europe or Americas and have more than 5 million speakers.
+"""
+
+import argparse
+import gflanguages
+
+SPEAKERS = 5000000
+
+
+def main(args):
+    arg_parser = argparse.ArgumentParser(
+        description="Generates a list of language ids based on given requirements."
+    )
+    arg_parser.add_argument(
+        "--regions", nargs="+", help="Region or region groups where languages are used."
+    )
+    arg_parser.add_argument(
+        "--population", help="Minimum speakers’ population.", default=SPEAKERS
+    )
+    arg_parser.add_argument("--script", help="Script of the languages.")
+    arg_parser.add_argument(
+        "--include-languages",
+        nargs="+",
+        default=[],
+        help="Languages that should be included even if they don’t match the other requirements.",
+    )
+    options = arg_parser.parse_args(args)
+    options.population = int(options.population)
+
+    regions = gflanguages.LoadRegions()
+    languages = gflanguages.LoadLanguages()
+
+    country_codes = set()
+
+    # Go through countries and add them to the set if their region_group is in options.regions or they are in options.regions
+    for country_code in regions:
+        if set(regions[country_code].region_group).intersection(
+            set(options.regions)
+        ) or (country_code in options.regions):
+            country_codes.add(country_code)
+
+    # Go through languages and add them to the set if their regions are in country_codes
+    language_codes = set()
+
+    # Print languages if they are supported through the logic
+    for language_code in sorted(languages.keys()):
+        if (
+            (
+                language_code in options.include_languages
+                or set(languages[language_code].region).intersection(country_codes)
+            )
+            and languages[language_code].population >= options.population
+            and languages[language_code].script == options.script
+        ):
+            if not languages[language_code].exemplar_chars:
+                print(
+                    f"WARNING, {languages[language_code].name} has no character defintions."
+                )
+            language_codes.add(language_code)
+            print(f"  - {language_code}  # {languages[language_code].name}")
+
+
+if __name__ == "__main__":
+    import sys
+
+    main(sys.argv[1:])
diff --git a/scripts/find_language_for_character.py b/scripts/find_language_for_character.py
new file mode 100644
index 0000000000..b37f0fd9f6
--- /dev/null
+++ b/scripts/find_language_for_character.py
@@ -0,0 +1,74 @@
+"""
+Browse through all gflanguages and find the input character.
+
+Syntax:
+python scripts/find_language_for_character.py <character>
+(<character> can be either a single 0x0000 string or unicode character.)
+
+Please manually install tabulate if not present: pip install tabulate
+"""
+
+import argparse
+import gflanguages
+import sys
+import tabulate
+import unicodedata
+
+regions = gflanguages.LoadRegions()
+languages = gflanguages.LoadLanguages()
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description="Find languages using a given character."
+    )
+    parser.add_argument(
+        "character", metavar="CHAR", help="Unicode character or 0x0000 string"
+    )
+    args = parser.parse_args()
+
+    input_character = args.character
+    if input_character.startswith("0x"):
+        input_character = chr(int(input_character, 16))
+    unicode_string = f"{ord(input_character):#0{6}X}".replace("0X", "0x")
+    print(
+        f"Character: [{input_character}]  ({unicode_string} {unicodedata.name(input_character)})"
+    )
+
+    found_languages = []
+
+    # Read language definitions
+    for lang_code in languages:
+        lang = languages[lang_code]
+        if lang.exemplar_chars:
+            chars = lang.exemplar_chars
+            for category in ("base", "index", "marks", "numerals", "punctuation"):
+                if (
+                    input_character in getattr(chars, category)
+                    or input_character in getattr(chars, category).upper()
+                ):
+                    # Find regions
+                    found_regions = set()
+                    for country_code in regions:
+                        if country_code in lang.region:
+                            found_regions.update(
+                                set(regions[country_code].region_group)
+                            )
+
+                    found_languages.append(
+                        (
+                            lang_code,
+                            lang.name,
+                            category,
+                            lang.population,
+                            lang.script,
+                            ", ".join(list(found_regions)),
+                        )
+                    )
+
+    found_languages = sorted(found_languages, key=lambda x: x[3], reverse=True)
+    print(
+        tabulate.tabulate(
+            found_languages,
+            headers=["Language", "Name", "Category", "Speakers", "Script", "Regions"],
+        )
+    )
diff --git a/setup.py b/setup.py
index fe520bf729..15695faaf5 100644
--- a/setup.py
+++ b/setup.py
@@ -20,7 +20,7 @@
 from setuptools import setup
 
 # Read the contents of the README file
-with open('README.md') as f:
+with open('README.md', encoding="utf-8") as f:
     long_description = f.read()
 
 setup(
@@ -35,13 +35,15 @@
             'Felipe Sanches, '
             'Lasse Fister, '
             'Marc Foley, '
+            'Yanone, '
             'Roderick Sheeter'),
     author_email='dave@lab6.com',
     package_dir={'': 'Lib'},
-    packages=['glyphsets'],
+    packages=['glyphsets', 'glyphsets.definitions'],
     package_data={'glyphsets': [
                       "encodings/*.nam",
                       "encodings/GF Glyph Sets/*.nam",
+                      "definitions/nam/*.nam",
                       "*.json",
                   ]
                  },


Test patch:
diff --git a/tests/__init__.py b/tests/__init__.py
index de282f2164..5bbab891a9 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -3,6 +3,7 @@
 import os
 import pytest
 
+
 DATA_FP = os.path.join(os.path.dirname(__file__), "data")
 
 glyphs_data = {
diff --git a/tests/test_glyphsets.py b/tests/test_glyphsets.py
new file mode 100644
index 0000000000..af1c15f470
--- /dev/null
+++ b/tests/test_glyphsets.py
@@ -0,0 +1,5 @@
+from glyphsets.definitions import unicodes_per_glyphset
+
+
+def test_definitions():
+    assert len(unicodes_per_glyphset("GF_Latin_Core")) == 328