浏览代码

feat: matplotlib support

Timothy J. Baek 11 月之前
父节点
当前提交
ef300248ba

+ 9 - 3
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -139,7 +139,7 @@
 	};
 	};
 
 
 	const executePython = async (code) => {
 	const executePython = async (code) => {
-		if (!code.includes('input')) {
+		if (!code.includes('input') && !code.includes('matplotlib')) {
 			executePythonAsWorker(code);
 			executePythonAsWorker(code);
 		} else {
 		} else {
 			result = null;
 			result = null;
@@ -148,6 +148,8 @@
 
 
 			executing = true;
 			executing = true;
 
 
+			document.pyodideMplTarget = document.getElementById('plt-canvas');
+
 			let pyodide = await loadPyodide({
 			let pyodide = await loadPyodide({
 				indexURL: '/pyodide/',
 				indexURL: '/pyodide/',
 				stdout: (text) => {
 				stdout: (text) => {
@@ -181,7 +183,8 @@
 					code.includes('requests') ? 'requests' : null,
 					code.includes('requests') ? 'requests' : null,
 					code.includes('bs4') ? 'beautifulsoup4' : null,
 					code.includes('bs4') ? 'beautifulsoup4' : null,
 					code.includes('numpy') ? 'numpy' : null,
 					code.includes('numpy') ? 'numpy' : null,
-					code.includes('pandas') ? 'pandas' : null
+					code.includes('pandas') ? 'pandas' : null,
+					code.includes('matplotlib') ? 'matplotlib' : null
 				].filter(Boolean);
 				].filter(Boolean);
 
 
 				console.log(packages);
 				console.log(packages);
@@ -221,7 +224,8 @@ __builtins__.input = input`);
 			code.includes('requests') ? 'requests' : null,
 			code.includes('requests') ? 'requests' : null,
 			code.includes('bs4') ? 'beautifulsoup4' : null,
 			code.includes('bs4') ? 'beautifulsoup4' : null,
 			code.includes('numpy') ? 'numpy' : null,
 			code.includes('numpy') ? 'numpy' : null,
-			code.includes('pandas') ? 'pandas' : null
+			code.includes('pandas') ? 'pandas' : null,
+			code.includes('matplotlib') ? 'matplotlib' : null
 		].filter(Boolean);
 		].filter(Boolean);
 
 
 		const pyodideWorker = new Worker('/pyodide-worker.js');
 		const pyodideWorker = new Worker('/pyodide-worker.js');
@@ -309,5 +313,7 @@ __builtins__.input = input`);
 				<div class="text-sm">{stdout || stderr || result}</div>
 				<div class="text-sm">{stdout || stderr || result}</div>
 			</div>
 			</div>
 		{/if}
 		{/if}
+
+		<div id="plt-canvas" />
 	</div>
 	</div>
 {/if}
 {/if}

二进制
static/pyodide/cycler-0.12.1-py3-none-any.whl


+ 78 - 0
static/pyodide/cycler-0.12.1-py3-none-any.whl.metadata

@@ -0,0 +1,78 @@
+Metadata-Version: 2.1
+Name: cycler
+Version: 0.12.1
+Summary: Composable style cycles
+Author-email: Thomas A Caswell <matplotlib-users@python.org>
+License: Copyright (c) 2015, matplotlib project
+        All rights reserved.
+        
+        Redistribution and use in source and binary forms, with or without
+        modification, are permitted provided that the following conditions are met:
+        
+        * Redistributions of source code must retain the above copyright notice, this
+          list of conditions and the following disclaimer.
+        
+        * Redistributions in binary form must reproduce the above copyright notice,
+          this list of conditions and the following disclaimer in the documentation
+          and/or other materials provided with the distribution.
+        
+        * Neither the name of the matplotlib project nor the names of its
+          contributors may be used to endorse or promote products derived from
+          this software without specific prior written permission.
+        
+        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+        AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+        IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+        DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+        FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+        DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+        SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+        CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+        OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Project-URL: homepage, https://matplotlib.org/cycler/
+Project-URL: repository, https://github.com/matplotlib/cycler
+Keywords: cycle kwargs
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Development Status :: 4 - Beta
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Provides-Extra: docs
+Requires-Dist: ipython ; extra == 'docs'
+Requires-Dist: matplotlib ; extra == 'docs'
+Requires-Dist: numpydoc ; extra == 'docs'
+Requires-Dist: sphinx ; extra == 'docs'
+Provides-Extra: tests
+Requires-Dist: pytest ; extra == 'tests'
+Requires-Dist: pytest-cov ; extra == 'tests'
+Requires-Dist: pytest-xdist ; extra == 'tests'
+
+|PyPi|_ |Conda|_ |Supported Python versions|_ |GitHub Actions|_ |Codecov|_
+
+.. |PyPi| image:: https://img.shields.io/pypi/v/cycler.svg?style=flat
+.. _PyPi: https://pypi.python.org/pypi/cycler
+
+.. |Conda| image:: https://img.shields.io/conda/v/conda-forge/cycler
+.. _Conda:  https://anaconda.org/conda-forge/cycler
+
+.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/cycler.svg
+.. _Supported Python versions: https://pypi.python.org/pypi/cycler
+
+.. |GitHub Actions| image:: https://github.com/matplotlib/cycler/actions/workflows/tests.yml/badge.svg
+.. _GitHub Actions: https://github.com/matplotlib/cycler/actions
+
+.. |Codecov| image:: https://codecov.io/github/matplotlib/cycler/badge.svg?branch=main&service=github
+.. _Codecov: https://codecov.io/github/matplotlib/cycler?branch=main
+
+cycler: composable cycles
+=========================
+
+Docs: https://matplotlib.org/cycler/

二进制
static/pyodide/fonttools-4.48.1-py3-none-any.whl


+ 3237 - 0
static/pyodide/fonttools-4.48.1-py3-none-any.whl.metadata

@@ -0,0 +1,3237 @@
+Metadata-Version: 2.1
+Name: fonttools
+Version: 4.48.1
+Summary: Tools to manipulate font files
+Home-page: http://github.com/fonttools/fonttools
+Author: Just van Rossum
+Author-email: just@letterror.com
+Maintainer: Behdad Esfahbod
+Maintainer-email: behdad@behdad.org
+License: MIT
+Platform: Any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Environment :: Other Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Text Processing :: Fonts
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Requires-Python: >=3.8
+License-File: LICENSE
+Provides-Extra: all
+Requires-Dist: fs <3,>=2.2.0 ; extra == 'all'
+Requires-Dist: lxml >=4.0 ; extra == 'all'
+Requires-Dist: zopfli >=0.1.4 ; extra == 'all'
+Requires-Dist: lz4 >=1.7.4.2 ; extra == 'all'
+Requires-Dist: pycairo ; extra == 'all'
+Requires-Dist: matplotlib ; extra == 'all'
+Requires-Dist: sympy ; extra == 'all'
+Requires-Dist: skia-pathops >=0.5.0 ; extra == 'all'
+Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'all'
+Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'all'
+Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'all'
+Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'all'
+Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'all'
+Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'all'
+Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'all'
+Provides-Extra: graphite
+Requires-Dist: lz4 >=1.7.4.2 ; extra == 'graphite'
+Provides-Extra: interpolatable
+Requires-Dist: pycairo ; extra == 'interpolatable'
+Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'interpolatable'
+Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'interpolatable'
+Provides-Extra: lxml
+Requires-Dist: lxml >=4.0 ; extra == 'lxml'
+Provides-Extra: pathops
+Requires-Dist: skia-pathops >=0.5.0 ; extra == 'pathops'
+Provides-Extra: plot
+Requires-Dist: matplotlib ; extra == 'plot'
+Provides-Extra: repacker
+Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'repacker'
+Provides-Extra: symfont
+Requires-Dist: sympy ; extra == 'symfont'
+Provides-Extra: type1
+Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'type1'
+Provides-Extra: ufo
+Requires-Dist: fs <3,>=2.2.0 ; extra == 'ufo'
+Provides-Extra: unicode
+Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'unicode'
+Provides-Extra: woff
+Requires-Dist: zopfli >=0.1.4 ; extra == 'woff'
+Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'woff'
+Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'woff'
+
+|CI Build Status| |Coverage Status| |PyPI| |Gitter Chat|
+
+What is this?
+~~~~~~~~~~~~~
+
+| fontTools is a library for manipulating fonts, written in Python. The
+  project includes the TTX tool, that can convert TrueType and OpenType
+  fonts to and from an XML text format, which is also called TTX. It
+  supports TrueType, OpenType, AFM and to an extent Type 1 and some
+  Mac-specific formats. The project has an `MIT open-source
+  licence <LICENSE>`__.
+| Among other things this means you can use it free of charge.
+
+`User documentation <https://fonttools.readthedocs.io/en/latest/>`_ and
+`developer documentation <https://fonttools.readthedocs.io/en/latest/developer.html>`_
+are available at `Read the Docs <https://fonttools.readthedocs.io/>`_.
+
+Installation
+~~~~~~~~~~~~
+
+FontTools requires `Python <http://www.python.org/download/>`__ 3.8
+or later. We try to follow the same schedule of minimum Python version support as
+NumPy (see `NEP 29 <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__).
+
+The package is listed in the Python Package Index (PyPI), so you can
+install it with `pip <https://pip.pypa.io>`__:
+
+.. code:: sh
+
+    pip install fonttools
+
+If you would like to contribute to its development, you can clone the
+repository from GitHub, install the package in 'editable' mode and
+modify the source code in place. We recommend creating a virtual
+environment, using `virtualenv <https://virtualenv.pypa.io>`__ or
+Python 3 `venv <https://docs.python.org/3/library/venv.html>`__ module.
+
+.. code:: sh
+
+    # download the source code to 'fonttools' folder
+    git clone https://github.com/fonttools/fonttools.git
+    cd fonttools
+
+    # create new virtual environment called e.g. 'fonttools-venv', or anything you like
+    python -m virtualenv fonttools-venv
+
+    # source the `activate` shell script to enter the environment (Unix-like); to exit, just type `deactivate`
+    . fonttools-venv/bin/activate
+
+    # to activate the virtual environment in Windows `cmd.exe`, do
+    fonttools-venv\Scripts\activate.bat
+
+    # install in 'editable' mode
+    pip install -e .
+
+Optional Requirements
+---------------------
+
+The ``fontTools`` package currently has no (required) external dependencies
+besides the modules included in the Python Standard Library.
+However, a few extra dependencies are required by some of its modules, which
+are needed to unlock optional features.
+The ``fonttools`` PyPI distribution also supports so-called "extras", i.e. a
+set of keywords that describe a group of additional dependencies, which can be
+used when installing via pip, or when specifying a requirement.
+For example:
+
+.. code:: sh
+
+    pip install fonttools[ufo,lxml,woff,unicode]
+
+This command will install fonttools, as well as the optional dependencies that
+are required to unlock the extra features named "ufo", etc.
+
+- ``Lib/fontTools/misc/etree.py``
+
+  The module exports a ElementTree-like API for reading/writing XML files, and
+  allows to use as the backend either the built-in ``xml.etree`` module or
+  `lxml <https://lxml.de>`__. The latter is preferred whenever present,
+  as it is generally faster and more secure.
+
+  *Extra:* ``lxml``
+
+- ``Lib/fontTools/ufoLib``
+
+  Package for reading and writing UFO source files; it requires:
+
+  * `fs <https://pypi.org/pypi/fs>`__: (aka ``pyfilesystem2``) filesystem
+    abstraction layer.
+
+  * `enum34 <https://pypi.org/pypi/enum34>`__: backport for the built-in ``enum``
+    module (only required on Python < 3.4).
+
+  *Extra:* ``ufo``
+
+- ``Lib/fontTools/ttLib/woff2.py``
+
+  Module to compress/decompress WOFF 2.0 web fonts; it requires:
+
+  * `brotli <https://pypi.python.org/pypi/Brotli>`__: Python bindings of
+    the Brotli compression library.
+
+  *Extra:* ``woff``
+
+- ``Lib/fontTools/ttLib/sfnt.py``
+
+  To better compress WOFF 1.0 web fonts, the following module can be used
+  instead of the built-in ``zlib`` library:
+
+  * `zopfli <https://pypi.python.org/pypi/zopfli>`__: Python bindings of
+    the Zopfli compression library.
+
+  *Extra:* ``woff``
+
+- ``Lib/fontTools/unicode.py``
+
+  To display the Unicode character names when dumping the ``cmap`` table
+  with ``ttx`` we use the ``unicodedata`` module in the Standard Library.
+  The version included in there varies between different Python versions.
+  To use the latest available data, you can install:
+
+  * `unicodedata2 <https://pypi.python.org/pypi/unicodedata2>`__:
+    ``unicodedata`` backport for Python 3.x updated to the latest Unicode
+    version 15.0.
+
+  *Extra:* ``unicode``
+
+- ``Lib/fontTools/varLib/interpolatable.py``
+
+  Module for finding wrong contour/component order between different masters.
+  It requires one of the following packages in order to solve the so-called
+  "minimum weight perfect matching problem in bipartite graphs", or
+  the Assignment problem:
+
+  * `scipy <https://pypi.python.org/pypi/scipy>`__: the Scientific Library
+    for Python, which internally uses `NumPy <https://pypi.python.org/pypi/numpy>`__
+    arrays and hence is very fast;
+  * `munkres <https://pypi.python.org/pypi/munkres>`__: a pure-Python
+    module that implements the Hungarian or Kuhn-Munkres algorithm.
+
+  To plot the results to a PDF or HTML format, you also need to install:
+
+  * `pycairo <https://pypi.org/project/pycairo/>`__: Python bindings for the
+    Cairo graphics library. Note that wheels are currently only available for
+    Windows, for other platforms see pycairo's `installation instructions
+    <https://pycairo.readthedocs.io/en/latest/getting_started.html>`__.
+
+  *Extra:* ``interpolatable``
+
+- ``Lib/fontTools/varLib/plot.py``
+
+  Module for visualizing DesignSpaceDocument and resulting VariationModel.
+
+  * `matplotlib <https://pypi.org/pypi/matplotlib>`__: 2D plotting library.
+
+  *Extra:* ``plot``
+
+- ``Lib/fontTools/misc/symfont.py``
+
+  Advanced module for symbolic font statistics analysis; it requires:
+
+  * `sympy <https://pypi.python.org/pypi/sympy>`__: the Python library for
+    symbolic mathematics.
+
+  *Extra:* ``symfont``
+
+- ``Lib/fontTools/t1Lib.py``
+
+  To get the file creator and type of Macintosh PostScript Type 1 fonts
+  on Python 3 you need to install the following module, as the old ``MacOS``
+  module is no longer included in Mac Python:
+
+  * `xattr <https://pypi.python.org/pypi/xattr>`__: Python wrapper for
+    extended filesystem attributes (macOS platform only).
+
+  *Extra:* ``type1``
+
+- ``Lib/fontTools/ttLib/removeOverlaps.py``
+
+  Simplify TrueType glyphs by merging overlapping contours and components.
+
+  * `skia-pathops <https://pypi.python.org/pypy/skia-pathops>`__: Python
+    bindings for the Skia library's PathOps module, performing boolean
+    operations on paths (union, intersection, etc.).
+
+  *Extra:* ``pathops``
+
+- ``Lib/fontTools/pens/cocoaPen.py`` and ``Lib/fontTools/pens/quartzPen.py``
+
+  Pens for drawing glyphs with Cocoa ``NSBezierPath`` or ``CGPath`` require:
+
+  * `PyObjC <https://pypi.python.org/pypi/pyobjc>`__: the bridge between
+    Python and the Objective-C runtime (macOS platform only).
+
+- ``Lib/fontTools/pens/qtPen.py``
+
+  Pen for drawing glyphs with Qt's ``QPainterPath``, requires:
+
+  * `PyQt5 <https://pypi.python.org/pypi/PyQt5>`__: Python bindings for
+    the Qt cross platform UI and application toolkit.
+
+- ``Lib/fontTools/pens/reportLabPen.py``
+
+  Pen to drawing glyphs as PNG images, requires:
+
+  * `reportlab <https://pypi.python.org/pypi/reportlab>`__: Python toolkit
+    for generating PDFs and graphics.
+
+- ``Lib/fontTools/pens/freetypePen.py``
+
+  Pen to drawing glyphs with FreeType as raster images, requires:
+
+  * `freetype-py <https://pypi.python.org/pypi/freetype-py>`__: Python binding
+    for the FreeType library.
+    
+- ``Lib/fontTools/ttLib/tables/otBase.py``
+
+  Use the Harfbuzz library to serialize GPOS/GSUB using ``hb_repack`` method, requires:
+  
+  * `uharfbuzz <https://pypi.python.org/pypi/uharfbuzz>`__: Streamlined Cython
+    bindings for the harfbuzz shaping engine
+    
+  *Extra:* ``repacker``
+
+How to make a new release
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1) Update ``NEWS.rst`` with all the changes since the last release. Write a
+   changelog entry for each PR, with one or two short sentences summarizing it,
+   as well as links to the PR and relevant issues addressed by the PR. Do not
+   put a new title, the next command will do it for you.
+2) Use semantic versioning to decide whether the new release will be a 'major',
+   'minor' or 'patch' release. It's usually one of the latter two, depending on
+   whether new backward compatible APIs were added, or simply some bugs were fixed.
+3) Run ``python setup.py release`` command from the tip of the ``main`` branch.
+   By default this bumps the third or 'patch' digit only, unless you pass ``--major``
+   or ``--minor`` to bump respectively the first or second digit.
+   This bumps the package version string, extracts the changes since the latest
+   version from ``NEWS.rst``, and uses that text to create an annotated git tag
+   (or a signed git tag if you pass the ``--sign`` option and your git and Github
+   account are configured for `signing commits <https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification/signing-commits>`__
+   using a GPG key).
+   It also commits an additional version bump which opens the main branch for
+   the subsequent developmental cycle
+4) Push both the tag and commit to the upstream repository, by running the command
+   ``git push --follow-tags``. Note: it may push other local tags as well, be
+   careful.
+5) Let the CI build the wheel and source distribution packages and verify both
+   get uploaded to the Python Package Index (PyPI).
+6) [Optional] Go to fonttools `Github Releases <https://github.com/fonttools/fonttools/releases>`__
+   page and create a new release, copy-pasting the content of the git tag
+   message. This way, the release notes are nicely formatted as markdown, and
+   users watching the repo will get an email notification. One day we shall
+   automate that too.
+
+
+Acknowledgements
+~~~~~~~~~~~~~~~~
+
+In alphabetical order:
+
+aschmitz, Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
+Jelle Bosma, Sascha Brawer, Tom Byrer, Antonio Cavedoni, Frédéric Coiffier,
+Vincent Connare, David Corbett, Simon Cozens, Dave Crossland, Simon Daniels,
+Peter Dekkers, Behdad Esfahbod, Behnam Esfahbod, Hannes Famira, Sam Fishman,
+Matt Fontaine, Takaaki Fuji, Rob Hagemans, Yannis Haralambous, Greg Hitchcock,
+Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo Jacquerye, Jack Jansen,
+Tom Kacvinsky, Jens Kutilek, Antoine Leca, Werner Lemberg, Tal Leming, Peter
+Lofting, Cosimo Lupo, Olli Meier, Masaya Nakamura, Dave Opstad, Laurence Penney,
+Roozbeh Pournader, Garret Rieger, Read Roberts, Colin Rofls, Guido van Rossum,
+Just van Rossum, Andreas Seidel, Georg Seifert, Chris Simpkins, Miguel Sousa,
+Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul Wise.
+
+Copyrights
+~~~~~~~~~~
+
+| Copyright (c) 1999-2004 Just van Rossum, LettError
+  (just@letterror.com)
+| See `LICENSE <LICENSE>`__ for the full license.
+
+Copyright (c) 2000 BeOpen.com. All Rights Reserved.
+
+Copyright (c) 1995-2001 Corporation for National Research Initiatives.
+All Rights Reserved.
+
+Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All
+Rights Reserved.
+
+Have fun!
+
+.. |CI Build Status| image:: https://github.com/fonttools/fonttools/workflows/Test/badge.svg
+   :target: https://github.com/fonttools/fonttools/actions?query=workflow%3ATest
+.. |Coverage Status| image:: https://codecov.io/gh/fonttools/fonttools/branch/main/graph/badge.svg
+   :target: https://codecov.io/gh/fonttools/fonttools
+.. |PyPI| image:: https://img.shields.io/pypi/v/fonttools.svg
+   :target: https://pypi.org/project/FontTools
+.. |Gitter Chat| image:: https://badges.gitter.im/fonttools-dev/Lobby.svg
+   :alt: Join the chat at https://gitter.im/fonttools-dev/Lobby
+   :target: https://gitter.im/fonttools-dev/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
+
+Changelog
+~~~~~~~~~
+
+4.48.1 (released 2024-02-06)
+----------------------------
+
+- Fixed uploading wheels to PyPI, no code changes since v4.48.0.
+
+4.48.0 (released 2024-02-06)
+----------------------------
+
+- [varLib] Do not log when there are no OTL tables to be merged.
+- [setup.py] Do not restrict lxml<5 any more, tests pass just fine with lxml>=5.
+- [feaLib] Remove glyph and class names length restrictions in FEA (#3424).
+- [roundingPens] Added ``transformRoundFunc`` parameter to the rounding pens to allow
+  for custom rounding of the components' transforms (#3426).
+- [feaLib] Keep declaration order of ligature components within a ligature set, instead
+  of sorting by glyph name (#3429).
+- [feaLib] Fixed ordering of alternates in ``aalt`` lookups, following the declaration
+  order of feature references within the ``aalt`` feature block (#3430).
+- [varLib.instancer] Fixed a bug in the instancer's IUP optimization (#3432).
+- [sbix] Support sbix glyphs with new graphicType "flip" (#3433).
+- [svgPathPen] Added ``--glyphs`` option to dump the SVG paths for the named glyphs
+  in the font (0572f78).
+- [designspaceLib] Added "description" attribute to ``<mappings>`` and ``<mapping>``
+  elements, and allow multiple ``<mappings>`` elements to group ``<mapping>`` elements
+  that are logically related (#3435, #3437).
+- [otlLib] Correctly choose the most compact GSUB contextual lookup format (#3439).
+
+4.47.2 (released 2024-01-11)
+----------------------------
+
+Minor release to fix uploading wheels to PyPI.
+
+4.47.1 (released 2024-01-11)
+----------------------------
+
+- [merge] Improve help message and add standard command line options (#3408)
+- [otlLib] Pass ``ttFont`` to ``name.addName`` in ``buildStatTable`` (#3406)
+- [featureVars] Re-use ``FeatureVariationRecord``'s when possible (#3413)
+
+4.47.0 (released 2023-12-18)
+----------------------------
+
+- [varLib.models] New API for VariationModel: ``getMasterScalars`` and
+  ``interpolateFromValuesAndScalars``.
+- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular,
+  add a Summary page in the front, and an Index and Table-of-Contents in the back.
+  Change the page size to Letter.
+- [Docs/designspaceLib] Defined a new ``public.fontInfo`` lib key, not used anywhere yet (#3358).
+
+4.46.0 (released 2023-12-02)
+----------------------------
+
+- [featureVars] Allow to register the same set of substitution rules to multiple features.
+  The ``addFeatureVariations`` function can now take a list of featureTags; similarly, the
+  lib key 'com.github.fonttools.varLib.featureVarsFeatureTag' can now take a
+  comma-separateed string of feature tags (e.g. "salt,ss01") instead of a single tag (#3360).
+- [featureVars] Don't overwrite GSUB FeatureVariations, but append new records to it
+  for features which are not already there. But raise ``VarLibError`` if the feature tag
+  already has feature variations associated with it (#3363).
+- [varLib] Added ``addGSUBFeatureVariations`` function to add GSUB Feature Variations
+  to an existing variable font from rules defined in a DesignSpace document (#3362).
+- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular,
+  a new test for "underweight" glyphs. The new test reports quite a few false-positives
+  though. Please send feedback.
+
+4.45.1 (released 2023-11-23)
+----------------------------
+
+- [varLib.interpolatable] Various bugfixes and improvements, better reporting, reduced
+  false positives.
+- [ttGlyphSet] Added option to not recalculate glyf bounds (#3348).
+
+4.45.0 (released 2023-11-20)
+----------------------------
+
+- [varLib.interpolatable] Vastly improved algorithms. Also available now is ``--pdf``
+  and ``--html`` options to generate a PDF or HTML report of the interpolation issues.
+  The PDF/HTML report showcases the problematic masters, the interpolated broken
+  glyph, as well as the proposed fixed version.
+
+4.44.3 (released 2023-11-15)
+----------------------------
+
+- [subset] Only prune codepage ranges for OS/2.version >= 1, ignore otherwise (#3334).
+- [instancer] Ensure hhea vertical metrics stay in sync with OS/2 ones after instancing
+  MVAR table containing 'hasc', 'hdsc' or 'hlgp' tags (#3297).
+
+4.44.2 (released 2023-11-14)
+----------------------------
+
+- [glyf] Have ``Glyph.recalcBounds`` skip empty components (base glyph with no contours)
+  when computing the bounding box of composite glyphs. This simply restores the existing
+  behavior before some changes were introduced in fonttools 4.44.0 (#3333).
+
+4.44.1 (released 2023-11-14)
+----------------------------
+
+- [feaLib] Ensure variable mark anchors are deep-copied while building since they
+  get modified in-place and later reused (#3330).
+- [OS/2|subset] Added method to ``recalcCodePageRanges`` to OS/2 table class; added
+  ``--prune-codepage-ranges`` to `fonttools subset` command (#3328, #2607).
+
+4.44.0 (released 2023-11-03)
+----------------------------
+
+- [instancer] Recalc OS/2 AvgCharWidth after instancing if default changes (#3317).
+- [otlLib] Make ClassDefBuilder class order match varLib.merger's, i.e. large
+  classes first, then glyph lexicographic order (#3321, #3324).
+- [instancer] Allow not specifying any of min:default:max values and let be filled
+  up with fvar's values (#3322, #3323).
+- [instancer] When running --update-name-table ignore axes that have no STAT axis
+  values (#3318, #3319).
+- [Debg] When dumping to ttx, write the embedded JSON as multi-line string with
+  indentation (92cbfee0d).
+- [varStore] Handle > 65535 items per encoding by splitting VarData subtable (#3310).
+- [subset] Handle null-offsets in MarkLigPos subtables.
+- [subset] Keep East Asian spacing fatures vhal, halt, chws, vchw by default (#3305).
+- [instancer.solver] Fixed case where axisDef < lower and upper < axisMax (#3304).
+- [glyf] Speed up compilation, mostly around ``recalcBounds`` (#3301).
+- [varLib.interpolatable] Speed it up when working on variable fonts, plus various
+  micro-optimizations (#3300).
+- Require unicodedata2 >= 15.1.0 when installed with 'unicode' extra, contains UCD 15.1.
+
+4.43.1 (released 2023-10-06)
+----------------------------
+
+- [EBDT] Fixed TypeError exception in `_reverseBytes` method triggered when dumping
+  some bitmap fonts with `ttx -z bitwise` option (#3162).
+- [v/hhea] Fixed UnboundLocalError exception in ``recalc`` method when no vmtx or hmtx
+  tables are present (#3290).
+- [bezierTools] Fixed incorrectly typed cython local variable leading to TypeError when
+  calling ``calcQuadraticArcLength`` (#3288).
+- [feaLib/otlLib] Better error message when building Coverage table with missing glyph (#3286).
+
+4.43.0 (released 2023-09-29)
+----------------------------
+
+- [subset] Set up lxml ``XMLParser(resolve_entities=False)`` when parsing OT-SVG documents
+  to prevent XML External Entity (XXE) attacks (9f61271dc):
+  https://codeql.github.com/codeql-query-help/python/py-xxe/
+- [varLib.iup] Added workaround for a Cython bug in ``iup_delta_optimize`` that was
+  leading to IUP tolerance being incorrectly initialised, resulting in sub-optimal deltas
+  (60126435d, cython/cython#5732).
+- [varLib] Added new command-line entry point ``fonttools varLib.avar`` to add an
+  ``avar`` table to an existing VF from axes mappings in a .designspace file (0a3360e52).
+- [instancer] Fixed bug whereby no longer used variation regions were not correctly pruned
+  after VarData optimization (#3268).
+- Added support for Python 3.12 (#3283).
+
+4.42.1 (released 2023-08-20)
+----------------------------
+
+- [t1Lib] Fixed several Type 1 issues (#3238, #3240).
+- [otBase/packer] Allow sharing tables reached by different offset sizes (#3241, #3236).
+- [varLib/merger] Fix Cursive attachment merging error when all anchors are NULL (#3248, #3247).
+- [ttLib] Fixed warning when calling ``addMultilingualName`` and ``ttFont`` parameter was not
+  passed on to ``findMultilingualName`` (#3253).
+
+4.42.0 (released 2023-08-02)
+----------------------------
+
+- [varLib] Use sentinel value 0xFFFF to mark a glyph advance in hmtx/vmtx as non
+  participating, allowing sparse masters to contain glyphs for variation purposes other
+  than {H,V}VAR (#3235).
+- [varLib/cff] Treat empty glyphs in non-default masters as missing, thus not participating
+  in CFF2 delta computation, similarly to how varLib already treats them for gvar (#3234).
+- Added varLib.avarPlanner script to deduce 'correct' avar v1 axis mappings based on
+  glyph average weights (#3223).
+
+4.41.1 (released 2023-07-21)
+----------------------------
+
+- [subset] Fixed perf regression in v4.41.0 by making ``NameRecordVisitor`` only visit
+  tables that do contain nameID references (#3213, #3214).
+- [varLib.instancer] Support instancing fonts containing null ConditionSet offsets in
+  FeatureVariationRecords (#3211, #3212).
+- [statisticsPen] Report font glyph-average weight/width and font-wide slant.
+- [fontBuilder] Fixed head.created date incorrectly set to 0 instead of the current
+  timestamp, regression introduced in v4.40.0 (#3210).
+- [varLib.merger] Support sparse ``CursivePos`` masters (#3209).
+
+4.41.0 (released 2023-07-12)
+----------------------------
+
+- [fontBuilder] Fixed bug in setupOS2 with default panose attribute incorrectly being
+  set to a dict instead of a Panose object (#3201).
+- [name] Added method to ``removeUnusedNameRecords`` in the user range (#3185).
+- [varLib.instancer] Fixed issue with L4 instancing (moving default) (#3179).
+- [cffLib] Use latin1 so we can roundtrip non-ASCII in {Full,Font,Family}Name (#3202).
+- [designspaceLib] Mark <source name="..."> as optional in docs (as it is in the code).
+- [glyf-1] Fixed drawPoints() bug whereby last cubic segment becomes quadratic (#3189, #3190).
+- [fontBuilder] Propagate the 'hidden' flag to the fvar Axis instance (#3184).
+- [fontBuilder] Update setupAvar() to also support avar 2, fixing ``_add_avar()`` call
+  site (#3183).
+- Added new ``voltLib.voltToFea`` submodule (originally Tiro Typeworks' "Volto") for
+  converting VOLT OpenType Layout sources to FEA format (#3164).
+
+4.40.0 (released 2023-06-12)
+----------------------------
+
+- Published native binary wheels to PyPI for all the python minor versions and platform
+  and architectures currently supported that would benefit from this. They will include
+  precompiled Cython-accelerated modules (e.g. cu2qu) without requiring to compile them
+  from source. The pure-python wheel and source distribution will continue to be
+  published as always (pip will automatically chose them when no binary wheel is
+  available for the given platform, e.g. pypy). Use ``pip install --no-binary=fonttools fonttools``
+  to expliclity request pip to install from the pure-python source.
+- [designspaceLib|varLib] Add initial support for specifying axis mappings and build
+  ``avar2`` table from those (#3123).
+- [feaLib] Support variable ligature caret position (#3130).
+- [varLib|glyf] Added option to --drop-implied-oncurves; test for impliable oncurve
+  points either before or after rounding (#3146, #3147, #3155, #3156).
+- [TTGlyphPointPen] Don't error with empty contours, simply ignore them (#3145).
+- [sfnt] Fixed str vs bytes remnant of py3 transition in code dealing with de/compiling
+  WOFF metadata (#3129).
+- [instancer-solver] Fixed bug when moving default instance with sparse masters (#3139, #3140).
+- [feaLib] Simplify variable scalars that don’t vary (#3132).
+- [pens] Added filter pen that explicitly emits closing line when lastPt != movePt (#3100).
+- [varStore] Improve optimize algorithm and better document the algorithm (#3124, #3127).
+  Added ``quantization`` option (#3126).
+- Added CI workflow config file for building native binary wheels (#3121).
+- [fontBuilder] Added glyphDataFormat=0 option; raise error when glyphs contain cubic
+  outlines but glyphDataFormat was not explicitly set to 1 (#3113, #3119).
+- [subset] Prune emptied GDEF.MarkGlyphSetsDef and remap indices; ensure GDEF is
+  subsetted before GSUB and GPOS (#3114, #3118).
+- [xmlReader] Fixed issue whereby DSIG table data was incorrectly parsed (#3115, #2614).
+- [varLib/merger] Fixed merging of SinglePos with pos=0 (#3111, #3112).
+- [feaLib] Demote "Feature has not been defined" error to a warning when building aalt
+  and referenced feature is empty (#3110).
+- [feaLib] Dedupe multiple substitutions with classes (#3105).
+
+4.39.4 (released 2023-05-10)
+----------------------------
+
+- [varLib.interpolatable] Allow for sparse masters (#3075)
+- [merge] Handle differing default/nominalWidthX in CFF (#3070)
+- [ttLib] Add missing main.py file to ttLib package (#3088)
+- [ttx] Fix missing composite instructions in XML (#3092)
+- [ttx] Fix split tables option to work on filenames containing '%' (#3096)
+- [featureVars] Process lookups for features other than rvrn last (#3099)
+- [feaLib] support multiple substitution with classes (#3103)
+
+4.39.3 (released 2023-03-28)
+----------------------------
+
+- [sbix] Fixed TypeError when compiling empty glyphs whose imageData is None, regression
+  was introduced in v4.39 (#3059).
+- [ttFont] Fixed AttributeError on python <= 3.10 when opening a TTFont from a tempfile
+  SpooledTemporaryFile, seekable method only added on python 3.11 (#3052).
+
+4.39.2 (released 2023-03-16)
+----------------------------
+
+- [varLib] Fixed regression introduced in 4.39.1 whereby an incomplete 'STAT' table
+  would be built even though a DesignSpace v5 did contain 'STAT' definitions (#3045, #3046).
+
+4.39.1 (released 2023-03-16)
+----------------------------
+
+- [avar2] Added experimental support for reading/writing avar version 2 as specified in
+  this draft proposal: https://github.com/harfbuzz/boring-expansion-spec/blob/main/avar2.md
+- [glifLib] Wrap underlying XML library exceptions with GlifLibError when parsing GLIFs,
+  and also print the name and path of the glyph that fails to be parsed (#3042).
+- [feaLib] Consult avar for normalizing user-space values in ConditionSets and in
+  VariableScalars (#3042, #3043).
+- [ttProgram] Handle string input to Program.fromAssembly() (#3038).
+- [otlLib] Added a config option to emit GPOS 7 lookups, currently disabled by default
+  because of a macOS bug (#3034).
+- [COLRv1] Added method to automatically compute ClipBoxes (#3027).
+- [ttFont] Fixed getGlyphID to raise KeyError on missing glyphs instead of returning
+  None. The regression was introduced in v4.27.0 (#3032).
+- [sbix] Fixed UnboundLocalError: cannot access local variable 'rawdata' (#3031).
+- [varLib] When building VF, do not overwrite a pre-existing ``STAT`` table that was built
+  with feaLib from FEA feature file. Also, added support for building multiple VFs
+  defined in Designspace v5 from ``fonttools varLib`` script (#3024).
+- [mtiLib] Only add ``Debg`` table with lookup names when ``FONTTOOLS_LOOKUP_DEBUGGING``
+  env variable is set (#3023).
+
+4.39.0 (released 2023-03-06)
+----------------------------
+
+- [mtiLib] Optionally add `Debg` debug info for MTI feature builds (#3018).
+- [ttx] Support reading input file from standard input using special `-` character,
+  similar to existing `-o -` option to write output to standard output (#3020).
+- [cython] Prevent ``cython.compiled`` raise AttributeError if cython not installed
+  properly (#3017).
+- [OS/2] Guard against ZeroDivisionError when calculating xAvgCharWidth in the unlikely
+  scenario no glyph has non-zero advance (#3015).
+- [subset] Recompute xAvgCharWidth independently of --no-prune-unicode-ranges,
+  previously the two options were involuntarily bundled together (#3012).
+- [fontBuilder] Add ``debug`` parameter to addOpenTypeFeatures method to add source
+  debugging information to the font in the ``Debg`` private table (#3008).
+- [name] Make NameRecord `__lt__` comparison not fail on Unicode encoding errors (#3006).
+- [featureVars] Fixed bug in ``overlayBox`` (#3003, #3005).
+- [glyf] Added experimental support for cubic bezier curves in TrueType glyf table, as
+  outlined in glyf v1 proposal (#2988):
+  https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-cubicOutlines.md
+- Added new qu2cu module and related qu2cuPen, the reverse of cu2qu for converting
+  TrueType quadratic splines to cubic bezier curves (#2993).
+- [glyf] Added experimental support for reading and writing Variable Composites/Components
+  as defined in glyf v1 spec proposal (#2958):
+  https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-varComposites.md.
+- [pens]: Added `addVarComponent` method to pen protocols' base classes, which pens can implement
+  to handle varcomponents (by default they get decomposed) (#2958).
+- [misc.transform] Added DecomposedTransform class which implements an affine transformation
+  with separate translate, rotation, scale, skew, and transformation-center components (#2598)
+- [sbix] Ensure Glyph.referenceGlyphName is set; fixes error after dumping and
+  re-compiling sbix table with 'dupe' glyphs (#2984).
+- [feaLib] Be cleverer when merging chained single substitutions into same lookup
+  when they are specified using the inline notation (#2150, #2974).
+- [instancer] Clamp user-inputted axis ranges to those of fvar (#2959).
+- [otBase/subset] Define ``__getstate__`` for BaseTable so that a copied/pickled 'lazy'
+  object gets its own OTTableReader to read from; incidentally fixes a bug while
+  subsetting COLRv1 table containing ClipBoxes on python 3.11 (#2965, #2968).
+- [sbix] Handle glyphs with "dupe" graphic type on compile correctly (#2963).
+- [glyf] ``endPointsOfContours`` field should be unsigned! Kudos to behdad for
+  spotting one of the oldest bugs in FT. Probably nobody has ever dared to make
+  glyphs with more than 32767 points... (#2957).
+- [feaLib] Fixed handling of ``ignore`` statements with unmarked glyphs to match
+  makeotf behavior, which assumes the first glyph is marked (#2950).
+- Reformatted code with ``black`` and enforce new code style via CI check (#2925).
+- [feaLib] Sort name table entries following OT spec prescribed order in the builder (#2927).
+- [cu2quPen] Add Cu2QuMultiPen that converts multiple outlines at a time in
+  interpolation compatible way; its methods take a list of tuples arguments
+  that would normally be passed to individual segment pens, and at the end it
+  dispatches the converted outlines to each pen (#2912).
+- [reverseContourPen/ttGlyphPen] Add outputImpliedClosingLine option (#2913, #2914,
+  #2921, #2922, #2995).
+- [gvar] Avoid expanding all glyphs unnecessarily upon compile (#2918).
+- [scaleUpem] Fixed bug whereby CFF2 vsindex was scaled; it should not (#2893, #2894).
+- [designspaceLib] Add DS.getAxisByTag and refactor getAxis (#2891).
+- [unicodedata] map Zmth<->math in ot_tag_{to,from}_script (#1737, #2889).
+- [woff2] Support encoding/decoding OVERLAP_SIMPLE glyf flags (#2576, #2884).
+- [instancer] Update OS/2 class and post.italicAngle when default moved (L4)
+- Dropped support for Python 3.7 which reached EOL, fontTools requires 3.8+.
+- [instancer] Fixed instantiateFeatureVariations logic when a rule range becomes
+  default-applicable (#2737, #2880).
+- [ttLib] Add main to ttFont and ttCollection that just decompile and re-compile the
+  input font (#2869).
+- [featureVars] Insert 'rvrn' lookup at the beginning of LookupList, to work around bug
+  in Apple implementation of 'rvrn' feature which the spec says it should be processed
+  early whereas on macOS 10.15 it follows lookup order (#2140, #2867).
+- [instancer/mutator] Remove 'DSIG' table if present.
+- [svgPathPen] Don't close path in endPath(), assume open unless closePath() (#2089, #2865).
+
+4.38.0 (released 2022-10-21)
+----------------------------
+
+- [varLib.instancer] Added support for L4 instancing, i.e. moving the default value of
+  an axis while keeping it variable. Thanks Behdad! (#2728, #2861).  
+  It's now also possible to restrict an axis min/max values beyond the current default
+  value, e.g. a font wght has min=100, def=400, max=900 and you want a partial VF that
+  only varies between 500 and 700, you can now do that.  
+  You can either specify two min/max values (wght=500:700), and the new default will be
+  set to either the minimum or maximum, depending on which one is closer to the current
+  default (e.g. 500 in this case). Or you can specify three values (e.g. wght=500:600:700)
+  to specify the new default value explicitly.
+- [otlLib/featureVars] Set a few Count values so one doesn't need to compile the font
+  to update them (#2860).
+- [varLib.models] Make extrapolation work for 2-master models as well where one master
+  is at the default location (#2843, #2846).  
+  Add optional extrapolate=False to normalizeLocation() (#2847, #2849).
+- [varLib.cff] Fixed sub-optimal packing of CFF2 deltas by no longer rounding them to
+  integer (#2838).
+- [scaleUpem] Calculate numShorts in VarData after scale; handle CFF hintmasks (#2840).
+
+4.37.4 (released 2022-09-30)
+----------------------------
+
+- [subset] Keep nameIDs used by CPAL palette entry labels (#2837).
+- [varLib] Avoid negative hmtx values when creating font from variable CFF2 font (#2827).
+- [instancer] Don't prune stat.ElidedFallbackNameID (#2828).
+- [unicodedata] Update Scripts/Blocks to Unicode 15.0 (#2833).
+
+4.37.3 (released 2022-09-20)
+----------------------------
+
+- Fix arguments in calls to (glyf) glyph.draw() and drawPoints(), whereby offset wasn't
+  correctly passed down; this fix also exposed a second bug, where lsb and tsb were not
+  set (#2824, #2825, adobe-type-tools/afdko#1560).
+
+4.37.2 (released 2022-09-15)
+----------------------------
+
+- [subset] Keep CPAL table and don't attempt to prune unused color indices if OT-SVG
+  table is present even if COLR table was subsetted away; OT-SVG may be referencing the
+  CPAL table; for now we assume that's the case (#2814, #2815).
+- [varLib.instancer] Downgrade GPOS/GSUB version if there are no more FeatureVariations
+  after instancing (#2812).
+- [subset] Added ``--no-lazy`` to optionally load fonts eagerly (mostly to ease
+  debugging of table lazy loading, no practical effects) (#2807).
+- [varLib] Avoid building empty COLR.DeltaSetIndexMap with only identity mappings (#2803).
+- [feaLib] Allow multiple value record types (by promoting to the most general format)
+  within the same PairPos subtable; e.g. this allows variable and non variable kerning
+  rules to share the same subtable. This also fixes a bug whereby some kerning pairs
+  would become unreachable while shapiong because of premature subtable splitting (#2772, #2776).
+- [feaLib] Speed up ``VarScalar`` by caching models for recurring master locations (#2798).
+- [feaLib] Optionally cythonize ``feaLib.lexer``, speeds up parsing FEA a bit (#2799).
+- [designspaceLib] Avoid crash when handling unbounded rule conditions (#2797).
+- [post] Don't crash if ``post`` legacy format 1 is malformed/improperly used (#2786)
+- [gvar] Don't be "lazy" (load all glyph variations up front) when TTFont.lazy=False (#2771).
+- [TTFont] Added ``normalizeLocation`` method to normalize a location dict from the
+  font's defined axes space (also known as "user space") into the normalized (-1..+1)
+  space. It applies ``avar`` mapping if the font contains an ``avar`` table (#2789).
+- [TTVarGlyphSet] Support drawing glyph instances from CFF2 variable glyph set (#2784).
+- [fontBuilder] Do not error when building cmap if there are zero code points (#2785).
+- [varLib.plot] Added ability to plot a variation model and set of accompaning master
+  values corresponding to the model's master locations into a pyplot figure (#2767).
+- [Snippets] Added ``statShape.py`` script to draw statistical shape of a glyph as an
+  ellips (requires pycairo) (baecd88).
+- [TTVarGlyphSet] implement drawPoints natively, avoiding going through
+  SegmentToPointPen (#2778).
+- [TTVarGlyphSet] Fixed bug whereby drawing a composite glyph multiple times, its
+  components would shif; needed an extra copy (#2774).
+
+4.37.1 (released 2022-08-24)
+----------------------------
+
+- [subset] Fixed regression introduced with v4.37.0 while subsetting the VarStore of
+  ``HVAR`` and ``VVAR`` tables, whereby an ``AttributeError: subset_varidxes`` was
+  thrown because an apparently unused import statement (with the side-effect of
+  dynamically binding that ``subset_varidxes`` method to the VarStore class) had been
+  accidentally deleted in an unrelated PR (#2679, #2773).
+- [pens] Added ``cairoPen`` (#2678).
+- [gvar] Read ``gvar`` more lazily by not parsing all of the ``glyf`` table (#2771).
+- [ttGlyphSet] Make ``drawPoints(pointPen)`` method work for CFF fonts as well via
+  adapter pen (#2770).
+
+4.37.0 (released 2022-08-23)
+----------------------------
+
+- [varLib.models] Reverted PR #2717 which added support for "narrow tents" in v4.36.0,
+  as it introduced a regression (#2764, #2765). It will be restored in upcoming release
+  once we found a solution to the bug.
+- [cff.specializer] Fixed issue in charstring generalizer with the ``blend`` operator
+  (#2750, #1975).
+- [varLib.models] Added support for extrapolation (#2757).
+- [ttGlyphSet] Ensure the newly added ``_TTVarGlyphSet`` inherits from ``_TTGlyphSet``
+  to keep backward compatibility with existing API (#2762).
+- [kern] Allow compiling legacy kern tables with more than 64k entries (d21cfdede).
+- [visitor] Added new visitor API to traverse tree of objects and dispatch based
+  on the attribute type: cf. ``fontTools.misc.visitor`` and ``fontTools.ttLib.ttVisitor``. Added ``fontTools.ttLib.scaleUpem`` module that uses the latter to
+  change a font's units-per-em and scale all the related fields accordingly (#2718,
+  #2755).
+
+4.36.0 (released 2022-08-17)
+----------------------------
+
+- [varLib.models] Use a simpler model that generates narrower "tents" (regions, master
+  supports) whenever possible: specifically when any two axes that actively "cooperate"
+  (have masters at non-zero positions for both axes) have a complete set of intermediates.
+  The simpler algorithm produces fewer overlapping regions and behaves better with
+  respect to rounding at the peak positions than the generic solver, always matching
+  intermediate masters exactly, instead of maximally 0.5 units off. This may be useful
+  when 100% metrics compatibility is desired (#2218, #2717).
+- [feaLib] Remove warning when about ``GDEF`` not being built when explicitly not
+  requested; don't build one unconditonally even when not requested (#2744, also works
+  around #2747).
+- [ttFont] ``TTFont.getGlyphSet`` method now supports selecting a location that
+  represents an instance of a variable font (supports both user-scale and normalized
+  axes coordinates via the ``normalized=False`` parameter). Currently this only works
+  for TrueType-flavored variable fonts (#2738).
+
+4.35.0 (released 2022-08-15)
+----------------------------
+
+- [otData/otConverters] Added support for 'biased' PaintSweepGradient start/end angles
+  to match latest COLRv1 spec (#2743).
+- [varLib.instancer] Fixed bug in ``_instantiateFeatureVariations`` when at the same
+  time pinning one axis and restricting the range of a subsequent axis; the wrong axis
+  tag was being used in the latter step (as the records' axisIdx was updated in the
+  preceding step but looked up using the old axes order in the following step) (#2733,
+  #2734).
+- [mtiLib] Pad script tags with space when less than 4 char long (#1727).
+- [merge] Use ``'.'`` instead of ``'#'`` in duplicate glyph names (#2742).
+- [gvar] Added support for lazily loading glyph variations (#2741).
+- [varLib] In ``build_many``, we forgot to pass on ``colr_layer_reuse`` parameter to
+  the ``build`` method (#2730).
+- [svgPathPen] Add a main that prints SVG for input text (6df779fd).
+- [cffLib.width] Fixed off-by-one in optimized values; previous code didn't match the
+  code block above it (2963fa50).
+- [varLib.interpolatable] Support reading .designspace and .glyphs files (via optional
+  ``glyphsLib``).
+- Compile some modules with Cython when available and building/installing fonttools
+  from source: ``varLib.iup`` (35% faster), ``pens.momentsPen`` (makes
+  ``varLib.interpolatable`` 3x faster).
+- [feaLib] Allow features to be built for VF without also building a GDEF table (e.g.
+  only build GSUB); warn when GDEF would be needed but isn't requested (#2705, 2694).
+- [otBase] Fixed ``AttributeError`` when uharfbuzz < 0.23.0 and 'repack' method is
+  missing (32aa8eaf). Use new ``uharfbuzz.repack_with_tag`` when available (since
+  uharfbuzz>=0.30.0), enables table-specific optimizations to be performed during
+  repacking (#2724).
+- [statisticsPen] By default report all glyphs (4139d891). Avoid division-by-zero
+  (52b28f90).
+- [feaLib] Added missing required argument to FeatureLibError exception (#2693)
+- [varLib.merge] Fixed error during error reporting (#2689). Fixed undefined
+  ``NotANone`` variable (#2714).
+
+4.34.4 (released 2022-07-07)
+----------------------------
+
+- Fixed typo in varLib/merger.py that causes NameError merging COLR glyphs
+  containing more than 255 layers (#2685).
+
+4.34.3 (released 2022-07-07)
+----------------------------
+
+- [designspaceLib] Don't make up bad PS names when no STAT data (#2684)
+
+4.34.2 (released 2022-07-06)
+----------------------------
+
+- [varStore/subset] fixed KeyError exception to do with NO_VARIATION_INDEX while
+  subsetting varidxes in GPOS/GDEF (a08140d).
+
+4.34.1 (released 2022-07-06)
+----------------------------
+
+- [instancer] When optimizing HVAR/VVAR VarStore, use_NO_VARIATION_INDEX=False to avoid
+  including NO_VARIATION_INDEX in AdvWidthMap, RsbMap, LsbMap mappings, which would
+  push the VarIdx width to maximum (4bytes), which is not desirable. This also fixes
+  a hard crash when attempting to subset a varfont after it had been partially instanced
+  with use_NO_VARIATION_INDEX=True.
+
+4.34.0 (released 2022-07-06)
+----------------------------
+
+- [instancer] Set RIBBI bits in head and OS/2 table when cutting instances and the
+  subfamily nameID=2 contains strings like 'Italic' or 'Bold' (#2673).
+- [otTraverse] Addded module containing methods for traversing trees of otData tables
+  (#2660).
+- [otTables] Made DeltaSetIndexMap TTX dump less verbose by omitting no-op entries
+  (#2660).
+- [colorLib.builder] Added option to disable PaintColrLayers's reuse of layers from
+  LayerList (#2660).
+- [varLib] Added support for merging multiple master COLRv1 tables into a variable
+  COLR table (#2660, #2328). Base color glyphs of same name in different masters must have
+  identical paint graph structure (incl. number of layers, palette indices, number
+  of color line stops, corresponding paint formats at each level of the graph),
+  but can differ in the variable fields (e.g. PaintSolid.Alpha). PaintVar* tables
+  are produced when this happens and a VarStore/DeltaSetIndexMap is added to the
+  variable COLR table. It is possible for non-default masters to be 'sparse', i.e.
+  omit some of the color glyphs present in the default master.
+- [feaLib] Let the Parser set nameIDs 1 through 6 that were previously reserved (#2675).
+- [varLib.varStore] Support NO_VARIATION_INDEX in optimizer and instancer.
+- [feaLib] Show all missing glyphs at once at end of parsing (#2665).
+- [varLib.iup] Rewrite force-set conditions and limit DP loopback length (#2651).
+  For Noto Sans, IUP time drops from 23s down to 9s, with only a slight size increase
+  in the final font. This basically turns the algorithm from O(n^3) into O(n).
+- [featureVars] Report about missing glyphs in substitution rules (#2654).
+- [mutator/instancer] Added CLI flag to --no-recalc-timestamp (#2649).
+- [SVG] Allow individual SVG documents in SVG OT table to be compressed on uncompressed,
+  and remember that when roundtripping to/from ttx. The SVG.docList is now a list
+  of SVGDocument namedtuple-like dataclass containing an extra ``compressed`` field,
+  and no longer a bare 3-tuple (#2645).
+- [designspaceLib] Check for descriptor types with hasattr() to allow custom classes
+  that don't inherit the default descriptors (#2634).
+- [subset] Enable sharing across subtables of extension lookups for harfbuzz packing
+  (#2626). Updated how table packing falls back to fontTools from harfbuzz (#2668).
+- [subset] Updated default feature tags following current Harfbuzz (#2637).
+- [svgLib] Fixed regex for real number to support e.g. 1e-4 in addition to 1.0e-4.
+  Support parsing negative rx, ry on arc commands (#2596, #2611).
+- [subset] Fixed subsetting SinglePosFormat2 when ValueFormat=0 (#2603).
+
+4.33.3 (released 2022-04-26)
+----------------------------
+
+- [designspaceLib] Fixed typo in ``deepcopyExceptFonts`` method, preventing font
+  references to be transferred (#2600). Fixed another typo in the name of ``Range``
+  dataclass's ``__post_init__`` magic method (#2597).
+
+4.33.2 (released 2022-04-22)
+----------------------------
+
+- [otBase] Make logging less verbose when harfbuzz fails to serialize. Do not exit
+  at the first failure but continue attempting to fix offset overflow error using
+  the pure-python serializer even when the ``USE_HARFBUZZ_REPACKER`` option was
+  explicitly set to ``True``. This is normal with fonts with relatively large
+  tables, at least until hb.repack implements proper table splitting.
+
+4.33.1 (released 2022-04-22)
+----------------------------
+
+- [otlLib] Put back the ``FONTTOOLS_GPOS_COMPACT_MODE`` environment variable to fix
+  regression in ufo2ft (and thus fontmake) introduced with v4.33.0 (#2592, #2593).
+  This is deprecated and will be removed one ufo2ft gets updated to use the new
+  config setup.
+
+4.33.0 (released 2022-04-21)
+----------------------------
+
+- [OS/2 / merge] Automatically recalculate ``OS/2.xAvgCharWidth`` after merging
+  fonts with ``fontTools.merge`` (#2591, #2538).
+- [misc/config] Added ``fontTools.misc.configTools`` module, a generic configuration
+  system (#2416, #2439).
+  Added ``fontTools.config`` module, a fontTools-specific configuration
+  system using ``configTools`` above.
+  Attached a ``Config`` object to ``TTFont``.
+- [otlLib] Replaced environment variable for GPOS compression level with an
+  equivalent option using the new config system.
+- [designspaceLib] Incremented format version to 5.0 (#2436).
+  Added discrete axes, variable fonts, STAT information, either design- or
+  user-space location on instances.
+  Added ``fontTools.designspaceLib.split`` module to split a designspace
+  into sub-spaces that interpolate and that represent the variable fonts
+  listed in the document.
+  Made instance names optional and allow computing them from STAT data instead.
+  Added ``fontTools.designspaceLib.statNames`` module.
+  Allow instances to have the same location as a previously defined STAT label.
+  Deprecated some attributes:
+  ``SourceDescriptor``: ``copyLib``, ``copyInfo``, ``copyGroups``, ``copyFeatures``.
+  ``InstanceDescriptor``: ``kerning``, ``info``; ``glyphs``: use rules or sparse
+  sources.
+  For both, ``location``: use the more explicit designLocation.
+  Note: all are soft deprecations and existing code should keep working.
+  Updated documentation for Python methods and the XML format.
+- [varLib] Added ``build_many`` to build several variable fonts from a single
+  designspace document (#2436).
+  Added ``fontTools.varLib.stat`` module to build STAT tables from a designspace
+  document.
+- [otBase] Try to use the Harfbuzz Repacker for packing GSUB/GPOS tables when
+  ``uharfbuzz`` python bindings are available (#2552). Disable it by setting the
+  "fontTools.ttLib.tables.otBase:USE_HARFBUZZ_REPACKER" config option to ``False``.
+  If the option is set explicitly to ``True`` but ``uharfbuzz`` can't be imported
+  or fails to serialize for any reasons, an error will be raised (ImportError or
+  uharfbuzz errors).
+- [CFF/T2] Ensure that ``pen.closePath()`` gets called for CFF2 charstrings (#2577).
+  Handle implicit CFF2 closePath within ``T2OutlineExtractor`` (#2580).
+
+4.32.0 (released 2022-04-08)
+----------------------------
+
+- [otlLib] Disable GPOS7 optimization to work around bug in Apple CoreText.
+  Always force Chaining GPOS8 for now (#2540).
+- [glifLib] Added ``outputImpliedClosingLine=False`` parameter to ``Glyph.draw()``,
+  to control behaviour of ``PointToSegmentPen`` (6b4e2e7).
+- [varLib.interpolatable] Check for wrong contour starting point (#2571).
+- [cffLib] Remove leftover ``GlobalState`` class and fix calls to ``TopDictIndex()``
+  (#2569, #2570).
+- [instancer] Clear ``AxisValueArray`` if it is empty after instantiating (#2563).
+
+4.31.2 (released 2022-03-22)
+----------------------------
+
+- [varLib] fix instantiation of GPOS SinglePos values (#2555).
+
+4.31.1 (released 2022-03-18)
+----------------------------
+
+- [subset] fix subsetting OT-SVG when glyph id attribute is on the root ``<svg>``
+  element (#2553).
+
+4.31.0 (released 2022-03-18)
+----------------------------
+
+- [ttCollection] Fixed 'ResourceWarning: unclosed file' warning (#2549).
+- [varLib.merger] Handle merging SinglePos with valueformat=0 (#2550).
+- [ttFont] Update glyf's glyphOrder when calling TTFont.setGlyphOrder() (#2544).
+- [ttFont] Added ``ensureDecompiled`` method to load all tables irrespective
+  of the ``lazy`` attribute (#2551).
+- [otBase] Added ``iterSubTable`` method to iterate over BaseTable's children of
+  type BaseTable; useful for traversing a tree of otTables (#2551).
+
+4.30.0 (released 2022-03-10)
+----------------------------
+
+- [varLib] Added debug logger showing the glyph name for which ``gvar`` is built (#2542).
+- [varLib.errors] Fixed undefined names in ``FoundANone`` and ``UnsupportedFormat``
+  exceptions (ac4d5611).
+- [otlLib.builder] Added ``windowsNames`` and ``macNames`` (bool) parameters to the
+  ``buildStatTabe`` function, so that one can select whether to only add one or both
+  of the two sets (#2528).
+- [t1Lib] Added the ability to recreate PostScript stream (#2504).
+- [name] Added ``getFirstDebugName``, ``getBest{Family,SubFamily,Full}Name`` methods (#2526).
+
+4.29.1 (released 2022-02-01)
+----------------------------
+
+- [colorLib] Fixed rounding issue with radial gradient's start/end circles inside
+  one another (#2521).
+- [freetypePen] Handle rotate/skew transform when auto-computing width/height of the
+  buffer; raise PenError wen missing moveTo (#2517)
+
+4.29.0 (released 2022-01-24)
+----------------------------
+
+- [ufoLib] Fixed illegal characters and expanded reserved filenames (#2506).
+- [COLRv1] Don't emit useless PaintColrLayers of lenght=1 in LayerListBuilder (#2513).
+- [ttx] Removed legacy ``waitForKeyPress`` method on Windows (#2509).
+- [pens] Added FreeTypePen that uses ``freetype-py`` and the pen protocol for
+  rasterizating outline paths (#2494).
+- [unicodedata] Updated the script direction list to Unicode 14.0 (#2484).
+  Bumped unicodedata2 dependency to 14.0 (#2499).
+- [psLib] Fixed type of ``fontName`` in ``suckfont`` (#2496).
+
+4.28.5 (released 2021-12-19)
+----------------------------
+
+- [svgPathPen] Continuation of #2471: make sure all occurrences of ``str()`` are now
+  replaced with user-defined ``ntos`` callable.
+- [merge] Refactored code into submodules, plus several bugfixes and improvements:
+  fixed duplicate-glyph-resolution GSUB-lookup generation code; use tolerance in glyph
+  comparison for empty glyph's width; ignore space of default ignorable glyphs;
+  downgrade duplicates-resolution missing-GSUB from assert to warn; added --drop-tables
+  option (#2473, #2475, #2476).
+
+4.28.4 (released 2021-12-15)
+----------------------------
+
+- [merge] Merge GDEF marksets in Lookups properly (#2474).
+- [feaLib] Have ``fontTools feaLib`` script exit with error code when build fails (#2459)
+- [svgPathPen] Added ``ntos`` option to customize number formatting (e.g. rounding) (#2471).
+- [subset] Speed up subsetting of large CFF fonts (#2467).
+- [otTables] Speculatively promote lookups to extension to speed up compilation. If the
+  offset to lookup N is too big to fit in a ushort, the offset to lookup N+1 is going to
+  be too big as well, so we promote to extension all lookups from lookup N onwards (#2465).
+
+4.28.3 (released 2021-12-03)
+----------------------------
+
+- [subset] Fixed bug while subsetting ``COLR`` table, whereby incomplete layer records
+  pointing to missing glyphs were being retained leading to ``struct.error`` upon
+  compiling. Make it so that ``glyf`` glyph closure, which follows the ``COLR`` glyph
+  closure, does not influence the ``COLR`` table subsetting (#2461, #2462).
+- [docs] Fully document the ``cmap`` and ``glyf`` tables (#2454, #2457).
+- [colorLib.unbuilder] Fixed CLI by deleting no longer existing parameter (180bb1867).
+
+4.28.2 (released 2021-11-22)
+----------------------------
+
+- [otlLib] Remove duplicates when building coverage (#2433).
+- [docs] Add interrogate configuration (#2443).
+- [docs] Remove comment about missing “start” optional argument to ``calcChecksum`` (#2448).
+- [cu2qu/cli] Adapt to the latest ufoLib2.
+- [subset] Support subsetting SVG table and remove it from the list of  drop by default tables (#534).
+- [subset] add ``--pretty-svg`` option to pretty print SVG table contents (#2452).
+- [merge] Support merging ``CFF`` tables (CID-keyed ``CFF`` is still not supported) (#2447).
+- [merge] Support ``--output-file`` (#2447).
+- [docs] Split table docs into individual pages (#2444).
+- [feaLib] Forbid empty classes (#2446).
+- [docs] Improve documentation for ``fontTools.ttLib.ttFont`` (#2442).
+
+4.28.1 (released 2021-11-08)
+----------------------------
+
+- [subset] Fixed AttributeError while traversing a color glyph's Paint graph when there is no
+  LayerList, which is optional (#2441).
+
+4.28.0 (released 2021-11-05)
+----------------------------
+
+- Dropped support for EOL Python 3.6, require Python 3.7 (#2417).
+- [ufoLib/glifLib] Make filename-clash checks faster by using a set instead of a list (#2422).
+- [subset] Don't crash if optional ClipList and LayerList are ``None`` (empty) (#2424, 2439).
+- [OT-SVG] Removed support for old deprecated version 1 and embedded color palettes,
+  which were never officially part of the OpenType SVG spec. Upon compile, reuse offsets
+  to SVG documents that are identical (#2430).
+- [feaLib] Added support for Variable Feature File syntax. This is experimental and subject
+  to change until it is finalized in the Adobe FEA spec (#2432).
+- [unicodedata] Update Scripts/ScriptExtensions/Blocks to UnicodeData 14.0 (#2437).
+
+4.27.1 (released 2021-09-23)
+----------------------------
+
+- [otlLib] Fixed error when chained contextual lookup builder overflows (#2404, #2411).
+- [bezierTools] Fixed two floating-point bugs: one when computing `t` for a point
+  lying on an almost horizontal/vertical line; another when computing the intersection
+  point between a curve and a line (#2413).
+
+4.27.0 (released 2021-09-14)
+----------------------------
+
+- [ttLib/otTables] Cleaned up virtual GID handling: allow virtual GIDs in ``Coverage``
+  and ``ClassDef`` readers; removed unused ``allowVID`` argument from ``TTFont``
+  constructor, and ``requireReal`` argument in ``TTFont.getGlyphID`` method.
+  Make ``TTFont.setGlyphOrder`` clear reverse glyphOrder map, and assume ``glyphOrder``
+  internal attribute is never modified outside setGlyphOrder; added ``TTFont.getGlyphNameMany``
+  and ``getGlyphIDMany`` (#1536, #1654, #2334, #2398).
+- [py23] Dropped internal use of ``fontTools.py23`` module to fix deprecation warnings
+  in client code that imports from fontTools (#2234, #2399, #2400).
+- [subset] Fix subsetting COLRv1 clip boxes when font is loaded lazily (#2408).
+
+4.26.2 (released 2021-08-09)
+----------------------------
+
+- [otTables] Added missing ``CompositeMode.PLUS`` operator (#2390).
+
+4.26.1 (released 2021-08-03)
+----------------------------
+
+- [transform] Added ``transformVector`` and ``transformVectors`` methods to the
+  ``Transform`` class. Similar to ``transformPoint`` but ignore the translation
+  part (#2386).
+
+4.26.0 (released 2021-08-03)
+----------------------------
+
+- [xmlWriter] Default to ``"\n"`` for ``newlinestr`` instead of platform-specific
+  ``os.linesep`` (#2384).
+- [otData] Define COLRv1 ClipList and ClipBox (#2379).
+- [removeOverlaps/instancer] Added --ignore-overlap-errors option to work around
+  Skia PathOps.Simplify bug (#2382, #2363, google/fonts#3365).
+- NOTE: This will be the last version to support Python 3.6. FontTools will require
+  Python 3.7 or above from the next release (#2350)
+
+4.25.2 (released 2021-07-26)
+----------------------------
+
+- [COLRv1] Various changes to sync with the latest CORLv1 draft spec. In particular:
+  define COLR.VarIndexMap, remove/inline ColorIndex struct, add VarIndexBase to ``PaintVar*`` tables (#2372);
+  add reduced-precicion specialized transform Paints;
+  define Angle as fraction of half circle encoded as F2Dot14;
+  use FWORD (int16) for all Paint center coordinates;
+  change PaintTransform to have an offset to Affine2x3;
+- [ttLib] when importing XML, only set sfntVersion if the font has no reader and is empty (#2376)
+
+4.25.1 (released 2021-07-16)
+----------------------------
+
+- [ttGlyphPen] Fixed bug in ``TTGlyphPointPen``, whereby open contours (i.e. starting
+  with segmentType "move") would throw ``NotImplementedError``. They are now treated
+  as if they are closed, like with the ``TTGlyphPen`` (#2364, #2366).
+
+4.25.0 (released 2021-07-05)
+----------------------------
+
+- [tfmLib] Added new library for parsing TeX Font Metric (TFM) files (#2354).
+- [TupleVariation] Make shared tuples order deterministic on python < 3.7 where
+  Counter (subclass of dict) doesn't remember insertion order (#2351, #2353).
+- [otData] Renamed COLRv1 structs to remove 'v1' suffix and match the updated draft
+  spec: 'LayerV1List' -> 'LayerList', 'BaseGlyphV1List' -> 'BaseGlyphList',
+  'BaseGlyphV1Record' -> 'BaseGlyphPaintRecord' (#2346).
+  Added 8 new ``PaintScale*`` tables: with/without centers, uniform vs non-uniform.
+  Added ``*AroundCenter`` variants to ``PaintRotate`` and ``PaintSkew``: the default
+  versions no longer have centerX/Y, but default to origin.
+  ``PaintRotate``, ``PaintSkew`` and ``PaintComposite`` formats were re-numbered.
+  NOTE: these are breaking changes; clients using the experimental COLRv1 API will
+  have to be updated (#2348).
+- [pointPens] Allow ``GuessSmoothPointPen`` to accept a tolerance. Fixed call to
+  ``math.atan2`` with x/y parameters inverted. Sync the code with fontPens (#2344).
+- [post] Fixed parsing ``post`` table format 2.0 when it contains extra garbage
+  at the end of the stringData array (#2314).
+- [subset] drop empty features unless 'size' with FeatureParams table (#2324).
+- [otlLib] Added ``otlLib.optimize`` module; added GPOS compaction algorithm.
+  The compaction can be run on existing fonts with ``fonttools otlLib.optimize``
+  or using the snippet ``compact_gpos.py``. There's experimental support for
+  compacting fonts at compilation time using an environment variable, but that
+  might be removed later (#2326).
+
+4.24.4 (released 2021-05-25)
+----------------------------
+
+- [subset/instancer] Fixed ``AttributeError`` when instantiating a VF that
+  contains GPOS ValueRecords with ``Device`` tables but without the respective
+  non-Device values (e.g. ``XAdvDevice`` without ``XAdvance``). When not
+  explicitly set, the latter are assumed to be 0 (#2323).
+
+4.24.3 (released 2021-05-20)
+----------------------------
+
+- [otTables] Fixed ``AttributeError`` in methods that split LigatureSubst,
+  MultipleSubst and AlternateSubst subtables when an offset overflow occurs.
+  The ``Format`` attribute was removed in v4.22.0 (#2319).
+
+4.24.2 (released 2021-05-20)
+----------------------------
+
+- [ttGlyphPen] Fixed typing annotation of TTGlyphPen glyphSet parameter (#2315).
+- Fixed two instances of DeprecationWarning: invalid escape sequence (#2311).
+
+4.24.1 (released 2021-05-20)
+----------------------------
+
+- [subset] Fixed AttributeError when SinglePos subtable has None Value (ValueFormat 0)
+  (#2312, #2313).
+
+4.24.0 (released 2021-05-17)
+----------------------------
+
+- [pens] Add ``ttGlyphPen.TTGlyphPointPen`` similar to ``TTGlyphPen`` (#2205).
+
+4.23.1 (released 2021-05-14)
+----------------------------
+
+- [subset] Fix ``KeyError`` after subsetting ``COLR`` table that initially contains
+  both v0 and v1 color glyphs when the subset only requested v1 glyphs; we were
+  not pruning the v0 portion of the table (#2308).
+- [colorLib] Set ``LayerV1List`` attribute to ``None`` when empty, it's optional
+  in CORLv1 (#2308).
+
+4.23.0 (released 2021-05-13)
+----------------------------
+
+- [designspaceLib] Allow to use ``\\UNC`` absolute paths on Windows (#2299, #2306).
+- [varLib.merger] Fixed bug where ``VarLibMergeError`` was raised with incorrect
+  parameters (#2300).
+- [feaLib] Allow substituting a glyph class with ``NULL`` to delete multiple glyphs
+  (#2303).
+- [glyf] Fixed ``NameError`` exception in ``getPhantomPoints`` (#2295, #2305).
+- [removeOverlaps] Retry pathops.simplify after rounding path coordinates to integers
+  if it fails the first time using floats, to work around a rare and hard to debug
+  Skia bug (#2288).
+- [varLib] Added support for building, reading, writing and optimizing 32-bit
+  ``ItemVariationStore`` as used in COLRv1 table (#2285).
+- [otBase/otConverters] Add array readers/writers for int types (#2285).
+- [feaLib] Allow more than one lookahead glyph/class in contextual positioning with
+  "value at end" (#2293, #2294).
+- [COLRv1] Default varIdx should be 0xFFFFFFFF (#2297, #2298).
+- [pens] Make RecordingPointPen actually pass on identifiers; replace asserts with
+  explicit ``PenError`` exception (#2284).
+- [mutator] Round lsb for CF2 fonts as well (#2286).
+
+4.22.1 (released 2021-04-26)
+----------------------------
+
+- [feaLib] Skip references to named lookups if the lookup block definition
+  is empty, similarly to makeotf. This also fixes an ``AttributeError`` while
+  generating ``aalt`` feature (#2276, #2277).
+- [subset] Fixed bug with ``--no-hinting`` implementation for Device tables (#2272,
+  #2275). The previous code was alwyas dropping Device tables if no-hinting was
+  requested, but some Device tables (DeltaFormat=0x8000) are also used to encode
+  variation indices and need to be retained.
+- [otBase] Fixed bug in getting the ValueRecordSize when decompiling ``MVAR``
+  table with ``lazy=True`` (#2273, #2274).
+- [varLib/glyf/gvar] Optimized and simplified ``GlyphCoordinates`` and
+  ``TupleVariation`` classes, use ``bytearray`` where possible, refactored
+  phantom-points calculations. We measured about 30% speedup in total time
+  of loading master ttfs, building gvar, and saving (#2261, #2266).
+- [subset] Fixed ``AssertionError`` while pruning unused CPAL palettes when
+  ``0xFFFF`` is present (#2257, #2259).
+
+4.22.0 (released 2021-04-01)
+----------------------------
+
+- [ttLib] Remove .Format from Coverage, ClassDef, SingleSubst, LigatureSubst,
+  AlternateSubst, MultipleSubst (#2238).
+  ATTENTION: This will change your TTX dumps!
+- [misc.arrayTools] move Vector to its own submodule, and rewrite as a tuple
+  subclass (#2201).
+- [docs] Added a terminology section for varLib (#2209).
+- [varLib] Move rounding to VariationModel, to avoid error accumulation from
+  multiple deltas (#2214)
+- [varLib] Explain merge errors in more human-friendly terms (#2223, #2226)
+- [otlLib] Correct some documentation (#2225)
+- [varLib/otlLib] Allow merging into VariationFont without first saving GPOS
+  PairPos2 (#2229)
+- [subset] Improve PairPosFormat2 subsetting (#2221)
+- [ttLib] TTFont.save: create file on disk as late as possible (#2253)
+- [cffLib] Add missing CFF2 dict operators LanguageGroup and ExpansionFactor
+  (#2249)
+  ATTENTION: This will change your TTX dumps!
+
+4.21.1 (released 2021-02-26)
+----------------------------
+
+- [pens] Reverted breaking change that turned ``AbstractPen`` and ``AbstractPointPen``
+  into abstract base classes (#2164, #2198).
+
+4.21.0 (released 2021-02-26)
+----------------------------
+
+- [feaLib] Indent anchor statements in ``asFea()`` to make them more legible and
+  diff-able (#2193).
+- [pens] Turn ``AbstractPen`` and ``AbstractPointPen`` into abstract base classes
+  (#2164).
+- [feaLib] Added support for parsing and building ``STAT`` table from AFDKO feature
+  files (#2039).
+- [instancer] Added option to update name table of generated instance using ``STAT``
+  table's axis values (#2189).
+- [bezierTools] Added functions to compute bezier point-at-time, as well as line-line,
+  curve-line and curve-curve intersections (#2192).
+
+4.20.0 (released 2021-02-15)
+----------------------------
+
+- [COLRv1] Added ``unbuildColrV1`` to deconstruct COLRv1 otTables to raw json-able
+  data structure; it does the reverse of ``buildColrV1`` (#2171).
+- [feaLib] Allow ``sub X by NULL`` sequence to delete a glyph (#2170).
+- [arrayTools] Fixed ``Vector`` division (#2173).
+- [COLRv1] Define new ``PaintSweepGradient`` (#2172).
+- [otTables] Moved ``Paint.Format`` enum class outside of ``Paint`` class definition,
+  now named ``PaintFormat``. It was clashing with paint instance ``Format`` attribute
+  and thus was breaking lazy load of COLR table which relies on magic ``__getattr__``
+  (#2175).
+- [COLRv1] Replace hand-coded builder functions with otData-driven dynamic
+  implementation (#2181).
+- [COLRv1] Define additional static (non-variable) Paint formats (#2181).
+- [subset] Added support for subsetting COLR v1 and CPAL tables (#2174, #2177).
+- [fontBuilder] Allow ``setupFvar`` to optionally take ``designspaceLib.AxisDescriptor``
+  objects. Added new ``setupAvar`` method. Support localised names for axes and
+  named instances (#2185).
+
+4.19.1 (released 2021-01-28)
+----------------------------
+
+- [woff2] An initial off-curve point with an overlap flag now stays an off-curve
+  point after compression.
+
+4.19.0 (released 2021-01-25)
+----------------------------
+
+- [codecs] Handle ``errors`` parameter different from 'strict' for the custom
+  extended mac encodings (#2137, #2132).
+- [featureVars] Raise better error message when a script is missing the required
+  default language system (#2154).
+- [COLRv1] Avoid abrupt change caused by rounding ``PaintRadialGradient.c0`` when
+  the start circle almost touches the end circle's perimeter (#2148).
+- [COLRv1] Support building unlimited lists of paints as 255-ary trees of
+  ``PaintColrLayers`` tables (#2153).
+- [subset] Prune redundant format-12 cmap subtables when all non-BMP characters
+  are dropped (#2146).
+- [basePen] Raise ``MissingComponentError`` instead of bare ``KeyError`` when a
+  referenced component is missing (#2145).
+
+4.18.2 (released 2020-12-16)
+----------------------------
+
+- [COLRv1] Implemented ``PaintTranslate`` paint format (#2129).
+- [varLib.cff] Fixed unbound local variable error (#1787).
+- [otlLib] Don't crash when creating OpenType class definitions if some glyphs
+  occur more than once (#2125).
+
+4.18.1 (released 2020-12-09)
+----------------------------
+
+- [colorLib] Speed optimization for ``LayerV1ListBuilder`` (#2119).
+- [mutator] Fixed missing tab in ``interpolate_cff2_metrics`` (0957dc7a).
+
+4.18.0 (released 2020-12-04)
+----------------------------
+
+- [COLRv1] Update to latest draft: added ``PaintRotate`` and ``PaintSkew`` (#2118).
+- [woff2] Support new ``brotlicffi`` bindings for PyPy (#2117).
+- [glifLib] Added ``expectContentsFile`` parameter to ``GlyphSet``, for use when
+  reading existing UFOs, to comply with the specification stating that a
+  ``contents.plist`` file must exist in a glyph set (#2114).
+- [subset] Allow ``LangSys`` tags in ``--layout-scripts`` option (#2112). For example:
+  ``--layout-scripts=arab.dflt,arab.URD,latn``; this will keep ``DefaultLangSys``
+  and ``URD`` language for ``arab`` script, and all languages for ``latn`` script.
+- [varLib.interpolatable] Allow UFOs to be checked; report open paths, non existant
+  glyphs; add a ``--json`` option to produce a machine-readable list of
+  incompatibilities
+- [pens] Added ``QuartzPen`` to create ``CGPath`` from glyph outlines on macOS.
+  Requires pyobjc (#2107).
+- [feaLib] You can export ``FONTTOOLS_LOOKUP_DEBUGGING=1`` to enable feature file
+  debugging info stored in ``Debg`` table (#2106).
+- [otlLib] Build more efficient format 1 and format 2 contextual lookups whenever
+  possible (#2101).
+
+4.17.1 (released 2020-11-16)
+----------------------------
+
+- [colorLib] Fixed regression in 4.17.0 when building COLR v0 table; when color
+  layers are stored in UFO lib plist, we can't distinguish tuples from lists so
+  we need to accept either types (e5439eb9, googlefonts/ufo2ft/issues#426).
+
+4.17.0 (released 2020-11-12)
+----------------------------
+
+- [colorLib/otData] Updated to latest draft ``COLR`` v1 spec (#2092).
+- [svgLib] Fixed parsing error when arc commands' boolean flags are not separated
+  by space or comma (#2094).
+- [varLib] Interpret empty non-default glyphs as 'missing', if the default glyph is
+  not empty (#2082).
+- [feaLib.builder] Only stash lookup location for ``Debg`` if ``Builder.buildLookups_``
+  has cooperated (#2065, #2067).
+- [varLib] Fixed bug in VarStore optimizer (#2073, #2083).
+- [varLib] Add designspace lib key for custom feavar feature tag (#2080).
+- Add HashPointPen adapted from psautohint. With this pen, a hash value of a glyph
+  can be computed, which can later be used to detect glyph changes (#2005).
+
+4.16.1 (released 2020-10-05)
+----------------------------
+
+- [varLib.instancer] Fixed ``TypeError`` exception when instantiating a VF with
+  a GSUB table 1.1 in which ``FeatureVariations`` attribute is present but set to
+  ``None`` -- indicating that optional ``FeatureVariations`` is missing (#2077).
+- [glifLib] Make ``x`` and ``y`` attributes of the ``point`` element required
+  even when validation is turned off, and raise a meaningful ``GlifLibError``
+  message when that happens (#2075).
+
+4.16.0 (released 2020-09-30)
+----------------------------
+
+- [removeOverlaps] Added new module and ``removeOverlaps`` function that merges
+  overlapping contours and components in TrueType glyphs. It requires the
+  `skia-pathops <https://github.com/fonttools/skia-pathops>`__ module.
+  Note that removing overlaps invalidates the TrueType hinting (#2068).
+- [varLib.instancer] Added ``--remove-overlaps`` command-line option.
+  The ``overlap`` option in ``instantiateVariableFont`` now takes an ``OverlapMode``
+  enum: 0: KEEP_AND_DONT_SET_FLAGS, 1: KEEP_AND_SET_FLAGS (default), and 2: REMOVE.
+  The latter is equivalent to calling ``removeOverlaps`` on the generated static
+  instance. The option continues to accept ``bool`` value for backward compatibility.
+
+
+4.15.0 (released 2020-09-21)
+----------------------------
+
+- [plistlib] Added typing annotations to plistlib module. Set up mypy static
+  typechecker to run automatically on CI (#2061).
+- [ttLib] Implement private ``Debg`` table, a reverse-DNS namespaced JSON dict.
+- [feaLib] Optionally add an entry into the ``Debg`` table with the original
+  lookup name (if any), feature name / script / language combination (if any),
+  and original source filename and line location. Annotate the ttx output for
+  a lookup with the information from the Debg table (#2052).
+- [sfnt] Disabled checksum checking by default in ``SFNTReader`` (#2058).
+- [Docs] Document ``mtiLib`` module (#2027).
+- [varLib.interpolatable] Added checks for contour node count and operation type
+  of each node (#2054).
+- [ttLib] Added API to register custom table packer/unpacker classes (#2055).
+
+4.14.0 (released 2020-08-19)
+----------------------------
+
+- [feaLib] Allow anonymous classes in LookupFlags definitions (#2037).
+- [Docs] Better document DesignSpace rules processing order (#2041).
+- [ttLib] Fixed 21-year old bug in ``maxp.maxComponentDepth`` calculation (#2044,
+  #2045).
+- [varLib.models] Fixed misspelled argument name in CLI entry point (81d0042a).
+- [subset] When subsetting GSUB v1.1, fixed TypeError by checking whether the
+  optional FeatureVariations table is present (e63ecc5b).
+- [Snippets] Added snippet to show how to decompose glyphs in a TTF (#2030).
+- [otlLib] Generate GSUB type 5 and GPOS type 7 contextual lookups where appropriate
+  (#2016).
+
+4.13.0 (released 2020-07-10)
+----------------------------
+
+- [feaLib/otlLib] Moved lookup subtable builders from feaLib to otlLib; refactored
+  some common code (#2004, #2007).
+- [docs] Document otlLib module (#2009).
+- [glifLib] Fixed bug with some UFO .glif filenames clashing on case-insensitive
+  filesystems (#2001, #2002).
+- [colorLib] Updated COLRv1 implementation following changes in the draft spec:
+  (#2008, googlefonts/colr-gradients-spec#24).
+
+4.12.1 (released 2020-06-16)
+----------------------------
+
+- [_n_a_m_e] Fixed error in ``addMultilingualName`` with one-character names.
+  Only attempt to recovered malformed UTF-16 data from a ``bytes`` string,
+  not from unicode ``str`` (#1997, #1998).
+
+4.12.0 (released 2020-06-09)
+----------------------------
+
+- [otlLib/varLib] Ensure that the ``AxisNameID`` in the ``STAT`` and ``fvar``
+  tables is grater than 255 as per OpenType spec (#1985, #1986).
+- [docs] Document more modules in ``fontTools.misc`` package: ``filenames``,
+  ``fixedTools``, ``intTools``, ``loggingTools``, ``macCreatorType``, ``macRes``,
+  ``plistlib`` (#1981).
+- [OS/2] Don't calculate whole sets of unicode codepoints, use faster and more memory
+  efficient ranges and bisect lookups (#1984).
+- [voltLib] Support writing back abstract syntax tree as VOLT data (#1983).
+- [voltLib] Accept DO_NOT_TOUCH_CMAP keyword (#1987).
+- [subset/merge] Fixed a namespace clash involving a private helper class (#1955).
+
+4.11.0 (released 2020-05-28)
+----------------------------
+
+- [feaLib] Introduced ``includeDir`` parameter on Parser and IncludingLexer to
+  explicitly specify the directory to search when ``include()`` statements are
+  encountered (#1973).
+- [ufoLib] Silently delete duplicate glyphs within the same kerning group when reading
+  groups (#1970).
+- [ttLib] Set version of COLR table when decompiling COLRv1 (commit 9d8a7e2).
+
+4.10.2 (released 2020-05-20)
+----------------------------
+
+- [sfnt] Fixed ``NameError: SimpleNamespace`` while reading TTC header. The regression
+  was introduced with 4.10.1 after removing ``py23`` star import.
+
+4.10.1 (released 2020-05-19)
+----------------------------
+
+- [sfnt] Make ``SFNTReader`` pickleable even when TTFont is loaded with lazy=True
+  option and thus keeps a reference to an external file (#1962, #1967).
+- [feaLib.ast] Restore backward compatibility (broken in 4.10 with #1905) for
+  ``ChainContextPosStatement`` and ``ChainContextSubstStatement`` classes.
+  Make them accept either list of lookups or list of lists of lookups (#1961).
+- [docs] Document some modules in ``fontTools.misc`` package: ``arrayTools``,
+  ``bezierTools`` ``cliTools`` and ``eexec`` (#1956).
+- [ttLib._n_a_m_e] Fixed ``findMultilingualName()`` when name record's ``string`` is
+  encoded as bytes sequence (#1963).
+
+4.10.0 (released 2020-05-15)
+----------------------------
+
+- [varLib] Allow feature variations to be active across the entire space (#1957).
+- [ufoLib] Added support for ``formatVersionMinor`` in UFO's ``fontinfo.plist`` and for
+  ``formatMinor`` attribute in GLIF file as discussed in unified-font-object/ufo-spec#78.
+  No changes in reading or writing UFOs until an upcoming (non-0) minor update of the
+  UFO specification is published (#1786).
+- [merge] Fixed merging fonts with different versions of ``OS/2`` table (#1865, #1952).
+- [subset] Fixed ``AttributeError`` while subsetting ``ContextSubst`` and ``ContextPos``
+  Format 3 subtable (#1879, #1944).
+- [ttLib.table._m_e_t_a] if data happens to be ascii, emit comment in TTX (#1938).
+- [feaLib] Support multiple lookups per glyph position (#1905).
+- [psCharStrings] Use inheritance to avoid repeated code in initializer (#1932).
+- [Doc] Improved documentation for the following modules: ``afmLib`` (#1933), ``agl``
+  (#1934), ``cffLib`` (#1935), ``cu2qu`` (#1937), ``encodings`` (#1940), ``feaLib``
+  (#1941), ``merge`` (#1949).
+- [Doc] Split off developer-centric info to new page, making front page of docs more
+  user-focused. List all utilities and sub-modules with brief descriptions.
+  Make README more concise and focused (#1914).
+- [otlLib] Add function to build STAT table from high-level description (#1926).
+- [ttLib._n_a_m_e] Add ``findMultilingualName()`` method (#1921).
+- [unicodedata] Update ``RTL_SCRIPTS`` for Unicode 13.0 (#1925).
+- [gvar] Sort ``gvar`` XML output by glyph name, not glyph order (#1907, #1908).
+- [Doc] Added help options to ``fonttools`` command line tool (#1913, #1920).
+  Ensure all fonttools CLI tools have help documentation (#1948).
+- [ufoLib] Only write fontinfo.plist when there actually is content (#1911).
+
+4.9.0 (released 2020-04-29)
+---------------------------
+
+- [subset] Fixed subsetting of FeatureVariations table. The subsetter no longer drops
+  FeatureVariationRecords that have empty substitutions as that will keep the search
+  going and thus change the logic. It will only drop empty records that occur at the
+  end of the FeatureVariationRecords array (#1881).
+- [subset] Remove FeatureVariations table and downgrade GSUB/GPOS to version 0x10000
+  when FeatureVariations contain no FeatureVariationRecords after subsetting (#1903).
+- [agl] Add support for legacy Adobe Glyph List of glyph names in ``fontTools.agl``
+  (#1895).
+- [feaLib] Ignore superfluous script statements (#1883).
+- [feaLib] Hide traceback by default on ``fonttools feaLib`` command line.
+  Use ``--traceback`` option to show (#1898).
+- [feaLib] Check lookup index in chaining sub/pos lookups and print better error
+  message (#1896, #1897).
+- [feaLib] Fix building chained alt substitutions (#1902).
+- [Doc] Included all fontTools modules in the sphinx-generated documentation, and
+  published it to ReadTheDocs for continuous documentation of the fontTools project
+  (#1333). Check it out at https://fonttools.readthedocs.io/. Thanks to Chris Simpkins!
+- [transform] The ``Transform`` class is now subclass of ``typing.NamedTuple``. No
+  change in functionality (#1904).
+
+
+4.8.1 (released 2020-04-17)
+---------------------------
+
+- [feaLib] Fixed ``AttributeError: 'NoneType' has no attribute 'getAlternateGlyphs'``
+  when ``aalt`` feature references a chain contextual substitution lookup
+  (googlefonts/fontmake#648, #1878).
+
+4.8.0 (released 2020-04-16)
+---------------------------
+
+- [feaLib] If Parser is initialized without a ``glyphNames`` parameter, it cannot
+  distinguish between a glyph name containing an hyphen, or a range of glyph names;
+  instead of raising an error, it now interprets them as literal glyph names, while
+  also outputting a logging warning to alert user about the ambiguity (#1768, #1870).
+- [feaLib] When serializing AST to string, emit spaces around hyphens that denote
+  ranges. Also, fixed an issue with CID ranges when round-tripping AST->string->AST
+  (#1872).
+- [Snippets/otf2ttf] In otf2ttf.py script update LSB in hmtx to match xMin (#1873).
+- [colorLib] Added experimental support for building ``COLR`` v1 tables as per
+  the `colr-gradients-spec <https://github.com/googlefonts/colr-gradients-spec/blob/main/colr-gradients-spec.md>`__
+  draft proposal. **NOTE**: both the API and the XML dump of ``COLR`` v1 are
+  susceptible to change while the proposal is being discussed and formalized (#1822).
+
+4.7.0 (released 2020-04-03)
+---------------------------
+
+- [cu2qu] Added ``fontTools.cu2qu`` package, imported from the original
+  `cu2qu <https://github.com/googlefonts/cu2qu>`__ project. The ``cu2qu.pens`` module
+  was moved to ``fontTools.pens.cu2quPen``. The optional cu2qu extension module
+  can be compiled by installing `Cython <https://cython.org/>`__ before installing
+  fonttools from source (i.e. git repo or sdist tarball). The wheel package that
+  is published on PyPI (i.e. the one ``pip`` downloads, unless ``--no-binary``
+  option is used), will continue to be pure-Python for now (#1868).
+
+4.6.0 (released 2020-03-24)
+---------------------------
+
+- [varLib] Added support for building variable ``BASE`` table version 1.1 (#1858).
+- [CPAL] Added ``fromRGBA`` method to ``Color`` class (#1861).
+
+
+4.5.0 (released 2020-03-20)
+---------------------------
+
+- [designspaceLib] Added ``add{Axis,Source,Instance,Rule}Descriptor`` methods to
+  ``DesignSpaceDocument`` class, to initialize new descriptor objects using keyword
+  arguments, and at the same time append them to the current document (#1860).
+- [unicodedata] Update to Unicode 13.0 (#1859).
+
+4.4.3 (released 2020-03-13)
+---------------------------
+
+- [varLib] Always build ``gvar`` table for TrueType-flavored Variable Fonts,
+  even if it contains no variation data. The table is required according to
+  the OpenType spec (#1855, #1857).
+
+4.4.2 (released 2020-03-12)
+---------------------------
+
+- [ttx] Annotate ``LookupFlag`` in XML dump with comment explaining what bits
+  are set and what they mean (#1850).
+- [feaLib] Added more descriptive message to ``IncludedFeaNotFound`` error (#1842).
+
+4.4.1 (released 2020-02-26)
+---------------------------
+
+- [woff2] Skip normalizing ``glyf`` and ``loca`` tables if these are missing from
+  a font (e.g. in NotoColorEmoji using ``CBDT/CBLC`` tables).
+- [timeTools] Use non-localized date parsing in ``timestampFromString``, to fix
+  error when non-English ``LC_TIME`` locale is set (#1838, #1839).
+- [fontBuilder] Make sure the CFF table generated by fontBuilder can be used by varLib
+  without having to compile and decompile the table first. This was breaking in
+  converting the CFF table to CFF2 due to some unset attributes (#1836).
+
+4.4.0 (released 2020-02-18)
+---------------------------
+
+- [colorLib] Added ``fontTools.colorLib.builder`` module, initially with ``buildCOLR``
+  and ``buildCPAL`` public functions. More color font formats will follow (#1827).
+- [fontBuilder] Added ``setupCOLR`` and ``setupCPAL`` methods (#1826).
+- [ttGlyphPen] Quantize ``GlyphComponent.transform`` floats to ``F2Dot14`` to fix
+  round-trip issue when computing bounding boxes of transformed components (#1830).
+- [glyf] If a component uses reference points (``firstPt`` and ``secondPt``) for
+  alignment (instead of X and Y offsets), compute the effective translation offset
+  *after* having applied any transform (#1831).
+- [glyf] When all glyphs have zero contours, compile ``glyf`` table data as a single
+  null byte in order to pass validation by OTS and Windows (#1829).
+- [feaLib] Parsing feature code now ensures that referenced glyph names are part of
+  the known glyph set, unless a glyph set was not provided.
+- [varLib] When filling in the default axis value for a missing location of a source or
+  instance, correctly map the value forward.
+- [varLib] The avar table can now contain mapping output values that are greater than
+  OR EQUAL to the preceeding value, as the avar specification allows this.
+- [varLib] The errors of the module are now ordered hierarchically below VarLibError.
+  See #1821.
+
+4.3.0 (released 2020-02-03)
+---------------------------
+
+- [EBLC/CBLC] Fixed incorrect padding length calculation for Format 3 IndexSubTable
+  (#1817, #1818).
+- [varLib] Fixed error when merging OTL tables and TTFonts were loaded as ``lazy=True``
+  (#1808, #1809).
+- [varLib] Allow to use master fonts containing ``CFF2`` table when building VF (#1816).
+- [ttLib] Make ``recalcBBoxes`` option work also with ``CFF2`` table (#1816).
+- [feaLib] Don't reset ``lookupflag`` in lookups defined inside feature blocks.
+  They will now inherit the current ``lookupflag`` of the feature. This is what
+  Adobe ``makeotf`` also does in this case (#1815).
+- [feaLib] Fixed bug with mixed single/multiple substitutions. If a single substitution
+  involved a glyph class, we were incorrectly using only the first glyph in the class
+  (#1814).
+
+4.2.5 (released 2020-01-29)
+---------------------------
+
+- [feaLib] Do not fail on duplicate multiple substitutions, only warn (#1811).
+- [subset] Optimize SinglePos subtables to Format 1 if all ValueRecords are the same
+  (#1802).
+
+4.2.4 (released 2020-01-09)
+---------------------------
+
+- [unicodedata] Update RTL_SCRIPTS for Unicode 11 and 12.
+
+4.2.3 (released 2020-01-07)
+---------------------------
+
+- [otTables] Fixed bug when splitting `MarkBasePos` subtables as offsets overflow.
+  The mark class values in the split subtable were not being updated, leading to
+  invalid mark-base attachments (#1797, googlefonts/noto-source#145).
+- [feaLib] Only log a warning instead of error when features contain duplicate
+  substitutions (#1767).
+- [glifLib] Strip XML comments when parsing with lxml (#1784, #1785).
+
+4.2.2 (released 2019-12-12)
+---------------------------
+
+- [subset] Fixed issue with subsetting FeatureVariations table when the index
+  of features changes as features get dropped. The feature index need to be
+  remapped to point to index of the remaining features (#1777, #1782).
+- [fontBuilder] Added `addFeatureVariations` method to `FontBuilder` class. This
+  is a shorthand for calling `featureVars.addFeatureVariations` on the builder's
+  TTFont object (#1781).
+- [glyf] Fixed the flags bug in glyph.drawPoints() like we did for glyph.draw()
+  (#1771, #1774).
+
+4.2.1 (released 2019-12-06)
+---------------------------
+
+- [glyf] Use the ``flagOnCurve`` bit mask in ``glyph.draw()``, so that we ignore
+  the ``overlap`` flag that may be set when instantiating variable fonts (#1771).
+
+4.2.0 (released 2019-11-28)
+---------------------------
+
+- [pens] Added the following pens:
+
+  * ``roundingPen.RoundingPen``: filter pen that rounds coordinates and components'
+    offsets to integer;
+  * ``roundingPen.RoundingPointPen``: like the above, but using PointPen protocol.
+  * ``filterPen.FilterPointPen``: base class for filter point pens;
+  * ``transformPen.TransformPointPen``: filter point pen to apply affine transform;
+  * ``recordingPen.RecordingPointPen``: records and replays point-pen commands.
+
+- [ttGlyphPen] Always round float coordinates and component offsets to integers
+  (#1763).
+- [ufoLib] When converting kerning groups from UFO2 to UFO3, avoid confusing
+  groups with the same name as one of the glyphs (#1761, #1762,
+  unified-font-object/ufo-spec#98).
+
+4.1.0 (released 2019-11-18)
+---------------------------
+
+- [instancer] Implemented restricting axis ranges (level 3 partial instancing).
+  You can now pass ``{axis_tag: (min, max)}`` tuples as input to the
+  ``instantiateVariableFont`` function. Note that changing the default axis
+  position is not supported yet. The command-line script also accepts axis ranges
+  in the form of colon-separated float values, e.g. ``wght=400:700`` (#1753, #1537).
+- [instancer] Never drop STAT ``DesignAxis`` records, but only prune out-of-range
+  ``AxisValue`` records.
+- [otBase/otTables] Enforce that VarStore.RegionAxisCount == fvar.axisCount, even
+  when regions list is empty to appease OTS < v8.0 (#1752).
+- [designspaceLib] Defined new ``processing`` attribute for ``<rules>`` element,
+  with values "first" or "last", plus other editorial changes to DesignSpace
+  specification. Bumped format version to 4.1 (#1750).
+- [varLib] Improved error message when masters' glyph orders do not match (#1758,
+  #1759).
+- [featureVars] Allow to specify custom feature tag in ``addFeatureVariations``;
+  allow said feature to already exist, in which case we append new lookup indices
+  to existing features. Implemented ``<rules>`` attribute ``processing`` according to
+  DesignSpace specification update in #1750. Depending on this flag, we generate
+  either an 'rvrn' (always processed first) or a 'rclt' feature (follows lookup order,
+  therefore last) (#1747, #1625, #1371).
+- [ttCollection] Added support for context manager auto-closing via ``with`` statement
+  like with ``TTFont`` (#1751).
+- [unicodedata] Require unicodedata2 >= 12.1.0.
+- [py2.py3] Removed yet more PY2 vestiges (#1743).
+- [_n_a_m_e] Fixed issue when comparing NameRecords with different string types (#1742).
+- [fixedTools] Changed ``fixedToFloat`` to not do any rounding but simply return
+  ``value / (1 << precisionBits)``. Added ``floatToFixedToStr`` and
+  ``strToFixedToFloat`` functions to be used when loading from or dumping to XML.
+  Fixed values (e.g. fvar axes and instance coordinates, avar mappings, etc.) are
+  are now stored as un-rounded decimal floats upon decompiling (#1740, #737).
+- [feaLib] Fixed handling of multiple ``LigatureCaret`` statements for the same glyph.
+  Only the first rule per glyph is used, additional ones are ignored (#1733).
+
+4.0.2 (released 2019-09-26)
+---------------------------
+
+- [voltLib] Added support for ``ALL`` and ``NONE`` in ``PROCESS_MARKS`` (#1732).
+- [Silf] Fixed issue in ``Silf`` table compilation and decompilation regarding str vs
+  bytes in python3 (#1728).
+- [merge] Handle duplicate glyph names better: instead of appending font index to
+  all glyph names, use similar code like we use in ``post`` and ``CFF`` tables (#1729).
+
+4.0.1 (released 2019-09-11)
+---------------------------
+
+- [otTables] Support fixing offset overflows in ``MultipleSubst`` lookup subtables
+  (#1706).
+- [subset] Prune empty strikes in ``EBDT`` and ``CBDT`` table data (#1698, #1633).
+- [pens] Fixed issue in ``PointToSegmentPen`` when last point of closed contour has
+  same coordinates as the starting point and was incorrectly dropped (#1720).
+- [Graphite] Fixed ``Sill`` table output to pass OTS (#1705).
+- [name] Added ``removeNames`` method to ``table__n_a_m_e`` class (#1719).
+- [ttLib] Added aliases for renamed entries ``ascender`` and ``descender`` in
+  ``hhea`` table (#1715).
+
+4.0.0 (released 2019-08-22)
+---------------------------
+
+- NOTE: The v4.x version series only supports Python 3.6 or greater. You can keep
+  using fonttools 3.x if you need support for Python 2.
+- [py23] Removed all the python2-only code since it is no longer reachable, thus
+  unused; only the Python3 symbols were kept, but these are no-op. The module is now
+  DEPRECATED and will removed in the future.
+- [ttLib] Fixed UnboundLocalError for empty loca/glyph tables (#1680). Also, allow
+  the glyf table to be incomplete when dumping to XML (#1681).
+- [varLib.models] Fixed KeyError while sorting masters and there are no on-axis for
+  a given axis (38a8eb0e).
+- [cffLib] Make sure glyph names are unique (#1699).
+- [feaLib] Fix feature parser to correctly handle octal numbers (#1700).
+
+3.44.0 (released 2019-08-02)
+----------------------------
+
+- NOTE: This is the last scheduled release to support Python 2.7. The upcoming fonttools
+  v4.x series is going to require Python 3.6 or greater.
+- [varLib] Added new ``varLib.instancer`` module for partially instantiating variable
+  fonts. This extends (and will eventually replace) ``varLib.mutator`` module, as
+  it allows to create not just full static instances from a variable font, but also
+  "partial" or "less variable" fonts where some of the axes are dropped or
+  instantiated at a particular value.
+  Also available from the command-line as `fonttools varLib.instancer --help`
+  (#1537, #1628).
+- [cffLib] Added support for ``FDSelect`` format 4 (#1677).
+- [subset] Added support for subsetting ``sbix`` (Apple bitmap color font) table.
+- [t1Lib] Fixed issue parsing ``eexec`` section in Type1 fonts when whitespace
+  characters are interspersed among the trailing zeros (#1676).
+- [cffLib.specializer] Fixed bug in ``programToCommands`` with CFF2 charstrings (#1669).
+
+3.43.2 (released 2019-07-10)
+----------------------------
+
+- [featureVars] Fixed region-merging code on python3 (#1659).
+- [varLib.cff] Fixed merging of sparse PrivateDict items (#1653).
+
+3.43.1 (released 2019-06-19)
+----------------------------
+
+- [subset] Fixed regression when passing ``--flavor=woff2`` option with an input font
+  that was already compressed as WOFF 1.0 (#1650).
+
+3.43.0 (released 2019-06-18)
+----------------------------
+
+- [woff2] Added support for compressing/decompressing WOFF2 fonts with non-transformed
+  ``glyf`` and ``loca`` tables, as well as with transformed ``hmtx`` table.
+  Removed ``Snippets/woff2_compress.py`` and ``Snippets/woff2_decompress.py`` scripts,
+  and replaced them with a new console entry point ``fonttools ttLib.woff2``
+  that provides two sub-commands ``compress`` and ``decompress``.
+- [varLib.cff] Fixed bug when merging CFF2 ``PrivateDicts``. The ``PrivateDict``
+  data from the first region font was incorrecty used for all subsequent fonts.
+  The bug would only affect variable CFF2 fonts with hinting (#1643, #1644).
+  Also, fixed a merging bug when VF masters have no blends or marking glyphs (#1632,
+  #1642).
+- [loggingTools] Removed unused backport of ``LastResortLogger`` class.
+- [subset] Gracefully handle partial MATH table (#1635).
+- [featureVars] Avoid duplicate references to ``rvrn`` feature record in
+  ``DefaultLangSys`` tables when calling ``addFeatureVariations`` on a font that
+  does not already have a ``GSUB`` table (aa8a5bc6).
+- [varLib] Fixed merging of class-based kerning. Before, the process could introduce
+  rogue kerning values and variations for random classes against class zero (everything
+  not otherwise classed).
+- [varLib] Fixed merging GPOS tables from master fonts with different number of
+  ``SinglePos`` subtables (#1621, #1641).
+- [unicodedata] Updated Blocks, Scripts and ScriptExtensions to Unicode 12.1.
+
+3.42.0 (released 2019-05-28)
+----------------------------
+
+- [OS/2] Fixed sign of ``fsType``: it should be ``uint16``, not ``int16`` (#1619).
+- [subset] Skip out-of-range class values in mark attachment (#1478).
+- [fontBuilder] Add an empty ``DSIG`` table with ``setupDummyDSIG`` method (#1621).
+- [varLib.merger] Fixed bug whereby ``GDEF.GlyphClassDef`` were being dropped
+  when generating instance via ``varLib.mutator`` (#1614).
+- [varLib] Added command-line options ``-v`` and ``-q`` to configure logging (#1613).
+- [subset] Update font extents in head table (#1612).
+- [subset] Make --retain-gids truncate empty glyphs after the last non-empty glyph
+  (#1611).
+- [requirements] Updated ``unicodedata2`` backport for Unicode 12.0.
+
+3.41.2 (released 2019-05-13)
+----------------------------
+
+- [cffLib] Fixed issue when importing a ``CFF2`` variable font from XML, whereby
+  the VarStore state was not propagated to PrivateDict (#1598).
+- [varLib] Don't drop ``post`` glyph names when building CFF2 variable font (#1609).
+
+
+3.41.1 (released 2019-05-13)
+----------------------------
+
+- [designspaceLib] Added ``loadSourceFonts`` method to load source fonts using
+  custom opener function (#1606).
+- [head] Round font bounding box coordinates to integers to fix compile error
+  if CFF font has float coordinates (#1604, #1605).
+- [feaLib] Don't write ``None`` in ``ast.ValueRecord.asFea()`` (#1599).
+- [subset] Fixed issue ``AssertionError`` when using ``--desubroutinize`` option
+  (#1590, #1594).
+- [graphite] Fixed bug in ``Silf`` table's ``decompile`` method unmasked by
+  previous typo fix (#1597). Decode languange code as UTF-8 in ``Sill`` table's
+  ``decompile`` method (#1600).
+
+3.41.0 (released 2019-04-29)
+----------------------------
+
+- [varLib/cffLib] Added support for building ``CFF2`` variable font from sparse
+  masters, or masters with more than one model (multiple ``VarStore.VarData``).
+  In ``cffLib.specializer``, added support for ``CFF2`` CharStrings with
+  ``blend`` operators (#1547, #1591).
+- [subset] Fixed subsetting ``HVAR`` and ``VVAR`` with ``--retain-gids`` option,
+  and when advances mapping is null while sidebearings mappings are non-null
+  (#1587, #1588).
+- Added ``otlLib.maxContextCalc`` module to compute ``OS/2.usMaxContext`` value.
+  Calculate it automatically when compiling features with feaLib. Added option
+  ``--recalc-max-context`` to ``subset`` module (#1582).
+- [otBase/otTables] Fixed ``AttributeError`` on missing OT table fields after
+  importing font from TTX (#1584).
+- [graphite] Fixed typo ``Silf`` table's ``decompile`` method (#1586).
+- [otlLib] Better compress ``GPOS`` SinglePos (LookupType 1) subtables (#1539).
+
+3.40.0 (released 2019-04-08)
+----------------------------
+
+- [subset] Fixed error while subsetting ``VVAR`` with ``--retain-gids``
+  option (#1552).
+- [designspaceLib] Use up-to-date default location in ``findDefault`` method
+  (#1554).
+- [voltLib] Allow passing file-like object to Parser.
+- [arrayTools/glyf] ``calcIntBounds`` (used to compute bounding boxes of glyf
+  table's glyphs) now uses ``otRound`` instead of ``round3`` (#1566).
+- [svgLib] Added support for converting more SVG shapes to path ``d`` strings
+  (ellipse, line, polyline), as well as support for ``transform`` attributes.
+  Only ``matrix`` transformations are currently supported (#1564, #1564).
+- [varLib] Added support for building ``VVAR`` table from ``vmtx`` and ``VORG``
+  tables (#1551).
+- [fontBuilder] Enable making CFF2 fonts with ``post`` table format 2 (#1557).
+- Fixed ``DeprecationWarning`` on invalid escape sequences (#1562).
+
+3.39.0 (released 2019-03-19)
+----------------------------
+
+- [ttLib/glyf] Raise more specific error when encountering recursive
+  component references (#1545, #1546).
+- [Doc/designspaceLib] Defined new ``public.skipExportGlyphs`` lib key (#1534,
+  unified-font-object/ufo-spec#84).
+- [varLib] Use ``vmtx`` to compute vertical phantom points; or ``hhea.ascent``
+  and ``head.unitsPerEM`` if ``vmtx`` is missing (#1528).
+- [gvar/cvar] Sort XML element's min/value/max attributes in TupleVariation
+  toXML to improve readability of TTX dump (#1527).
+- [varLib.plot] Added support for 2D plots with only 1 variation axis (#1522).
+- [designspaceLib] Use axes maps when normalizing locations in
+  DesignSpaceDocument (#1226, #1521), and when finding default source (#1535).
+- [mutator] Set ``OVERLAP_SIMPLE`` and ``OVERLAP_COMPOUND`` glyf flags by
+  default in ``instantiateVariableFont``. Added ``--no-overlap`` cli option
+  to disable this (#1518).
+- [subset] Fixed subsetting ``VVAR`` table (#1516, #1517).
+  Fixed subsetting an ``HVAR`` table that has an ``AdvanceWidthMap`` when the
+  option ``--retain-gids`` is used.
+- [feaLib] Added ``forceChained`` in MultipleSubstStatement (#1511).
+  Fixed double indentation of ``subtable`` statement (#1512).
+  Added support for ``subtable`` statement in more places than just PairPos
+  lookups (#1520).
+  Handle lookupflag 0 and lookupflag without a value (#1540).
+- [varLib] In ``load_designspace``, provide a default English name for the
+  ``ital`` axis tag.
+- Remove pyftinspect because it is unmaintained and bitrotted.
+
+3.38.0 (released 2019-02-18)
+----------------------------
+
+- [cffLib] Fixed RecursionError when unpickling or deepcopying TTFont with
+  CFF table (#1488, 649dc49).
+- [subset] Fixed AttributeError when using --desubroutinize option (#1490).
+  Also, fixed desubroutinizing bug when subrs contain hints (#1499).
+- [CPAL] Make Color a subclass of namedtuple (173a0f5).
+- [feaLib] Allow hyphen in glyph class names.
+- [feaLib] Added 'tables' option to __main__.py (#1497).
+- [feaLib] Add support for special-case contextual positioning formatting
+  (#1501).
+- [svgLib] Support converting SVG basic shapes (rect, circle, etc.) into
+  equivalent SVG paths (#1500, #1508).
+- [Snippets] Added name-viewer.ipynb Jupyter notebook.
+
+
+3.37.3 (released 2019-02-05)
+----------------------------
+
+- The previous release accidentally changed several files from Unix to DOS
+  line-endings. Fix that.
+
+3.37.2 (released 2019-02-05)
+----------------------------
+
+- [varLib] Temporarily revert the fix to ``load_masters()``, which caused a
+  crash in ``interpolate_layout()`` when ``deepcopy``-ing OTFs.
+
+3.37.1 (released 2019-02-05)
+----------------------------
+
+- [varLib] ``load_masters()`` now actually assigns the fonts it loads to the
+  source.font attributes.
+- [varLib] Fixed an MVAR table generation crash when sparse masters were
+  involved.
+- [voltLib] ``parse_coverage_()`` returns a tuple instead of an ast.Enum.
+- [feaLib] A MarkClassDefinition inside a block is no longer doubly indented
+  compared to the rest of the block.
+
+3.37.0 (released 2019-01-28)
+----------------------------
+
+- [svgLib] Added support for converting elliptical arcs to cubic bezier curves
+  (#1464).
+- [py23] Added backport for ``math.isfinite``.
+- [varLib] Apply HIDDEN flag to fvar axis if designspace axis has attribute
+  ``hidden=1``.
+- Fixed "DeprecationWarning: invalid escape sequence" in Python 3.7.
+- [voltLib] Fixed parsing glyph groups. Distinguish different PROCESS_MARKS.
+  Accept COMPONENT glyph type.
+- [feaLib] Distinguish missing value and explicit ``<NULL>`` for PairPos2
+  format A (#1459). Round-trip ``useExtension`` keyword. Implemented
+  ``ValueRecord.asFea`` method.
+- [subset] Insert empty widths into hdmx when retaining gids (#1458).
+
+3.36.0 (released 2019-01-17)
+----------------------------
+
+- [ttx] Added ``--no-recalc-timestamp`` option to keep the original font's
+  ``head.modified`` timestamp (#1455, #46).
+- [ttx/psCharStrings] Fixed issues while dumping and round-tripping CFF2 table
+  with ttx (#1451, #1452, #1456).
+- [voltLib] Fixed check for duplicate anchors (#1450). Don't try to read past
+  the ``END`` operator in .vtp file (#1453).
+- [varLib] Use sentinel value -0x8000 (-32768) to ignore post.underlineThickness
+  and post.underlinePosition when generating MVAR deltas (#1449,
+  googlei18n/ufo2ft#308).
+- [subset] Added ``--retain-gids`` option to subset font without modifying the
+  current glyph indices (#1443, #1447).
+- [ufoLib] Replace deprecated calls to ``getbytes`` and ``setbytes`` with new
+  equivalent ``readbytes`` and ``writebytes`` calls. ``fs`` >= 2.2 no required.
+- [varLib] Allow loading masters from TTX files as well (#1441).
+
+3.35.2 (released 2019-01-14)
+----------------------------
+
+- [hmtx/vmtx]: Allow to compile/decompile ``hmtx`` and ``vmtx`` tables even
+  without the corresponding (required) metrics header tables, ``hhea`` and
+  ``vhea`` (#1439).
+- [varLib] Added support for localized axes' ``labelname`` and named instances'
+  ``stylename`` (#1438).
+
+3.35.1 (released 2019-01-09)
+----------------------------
+
+- [_m_a_x_p] Include ``maxComponentElements`` in ``maxp`` table's recalculation.
+
+3.35.0 (released 2019-01-07)
+----------------------------
+
+- [psCharStrings] In ``encodeFloat`` function, use float's "general format" with
+  8 digits of precision (i.e. ``%8g``) instead of ``str()``. This works around
+  a macOS rendering issue when real numbers in CFF table are too long, and
+  also makes sure that floats are encoded with the same precision in python 2.7
+  and 3.x (#1430, googlei18n/ufo2ft#306).
+- [_n_a_m_e/fontBuilder] Make ``_n_a_m_e_table.addMultilingualName`` also add
+  Macintosh (platformID=1) names by default. Added options to ``FontBuilder``
+  ``setupNameTable`` method to optionally disable Macintosh or Windows names.
+  (#1359, #1431).
+- [varLib] Make ``build`` optionally accept a ``DesignSpaceDocument`` object,
+  instead of a designspace file path. The caller can now set the ``font``
+  attribute of designspace's sources to a TTFont object, thus allowing to
+  skip filenames manipulation altogether (#1416, #1425).
+- [sfnt] Allow SFNTReader objects to be deep-copied.
+- Require typing>=3.6.4 on py27 to fix issue with singledispatch (#1423).
+- [designspaceLib/t1Lib/macRes] Fixed some cases where pathlib.Path objects were
+  not accepted (#1421).
+- [varLib] Fixed merging of multiple PairPosFormat2 subtables (#1411).
+- [varLib] The default STAT table version is now set to 1.1, to improve
+  compatibility with legacy applications (#1413).
+
+3.34.2 (released 2018-12-17)
+----------------------------
+
+- [merge] Fixed AssertionError when none of the script tables in GPOS/GSUB have
+  a DefaultLangSys record (#1408, 135a4a1).
+
+3.34.1 (released 2018-12-17)
+----------------------------
+
+- [varLib] Work around macOS rendering issue for composites without gvar entry (#1381).
+
+3.34.0 (released 2018-12-14)
+----------------------------
+
+- [varLib] Support generation of CFF2 variable fonts. ``model.reorderMasters()``
+  now supports arbitrary mapping. Fix handling of overlapping ranges for feature
+  variations (#1400).
+- [cffLib, subset] Code clean-up and fixing related to CFF2 support.
+- [ttLib.tables.ttProgram] Use raw strings for regex patterns (#1389).
+- [fontbuilder] Initial support for building CFF2 fonts. Set CFF's
+  ``FontMatrix`` automatically from unitsPerEm.
+- [plistLib] Accept the more general ``collections.Mapping`` instead of the
+  specific ``dict`` class to support custom data classes that should serialize
+  to dictionaries.
+
+3.33.0 (released 2018-11-30)
+----------------------------
+- [subset] subsetter bug fix with variable fonts.
+- [varLib.featureVar] Improve FeatureVariations generation with many rules.
+- [varLib] Enable sparse masters when building variable fonts:
+  https://github.com/fonttools/fonttools/pull/1368#issuecomment-437257368
+- [varLib.mutator] Add IDEF for GETVARIATION opcode, for handling hints in an
+  instance.
+- [ttLib] Ignore the length of kern table subtable format 0
+
+3.32.0 (released 2018-11-01)
+----------------------------
+
+- [ufoLib] Make ``UFOWriter`` a subclass of ``UFOReader``, and use mixins
+  for shared methods (#1344).
+- [featureVars] Fixed normalization error when a condition's minimum/maximum
+  attributes are missing in designspace ``<rule>`` (#1366).
+- [setup.py] Added ``[plot]`` to extras, to optionally install ``matplotlib``,
+  needed to use the ``fonTools.varLib.plot`` module.
+- [varLib] Take total bounding box into account when resolving model (7ee81c8).
+  If multiple axes have the same range ratio, cut across both (62003f4).
+- [subset] Don't error if ``STAT`` has no ``AxisValue`` tables.
+- [fontBuilder] Added a new submodule which contains a ``FontBuilder`` wrapper
+  class around ``TTFont`` that makes it easier to create a working TTF or OTF
+  font from scratch with code. NOTE: the API is still experimental and may
+  change in future versions.
+
+3.31.0 (released 2018-10-21)
+----------------------------
+
+- [ufoLib] Merged the `ufoLib <https://github.com/unified-font-objects/ufoLib>`__
+  master branch into a new ``fontTools.ufoLib`` package (#1335, #1095).
+  Moved ``ufoLib.pointPen`` module to ``fontTools.pens.pointPen``.
+  Moved ``ufoLib.etree`` module to ``fontTools.misc.etree``.
+  Moved ``ufoLib.plistlib`` module to ``fontTools.misc.plistlib``.
+  To use the new ``fontTools.ufoLib`` module you need to install fonttools
+  with the ``[ufo]`` extra, or you can manually install the required additional
+  dependencies (cf. README.rst).
+- [morx] Support AAT action type to insert glyphs and clean up compilation
+  of AAT action tables (4a1871f, 2011ccf).
+- [subset] The ``--no-hinting`` on a CFF font now also drops the optional
+  hinting keys in Private dict: ``ForceBold``, ``LanguageGroup``, and
+  ``ExpansionFactor`` (#1322).
+- [subset] Include nameIDs referenced by STAT table (#1327).
+- [loggingTools] Added ``msg=None`` argument to
+  ``CapturingLogHandler.assertRegex`` (0245f2c).
+- [varLib.mutator] Implemented ``FeatureVariations`` instantiation (#1244).
+- [g_l_y_f] Added PointPen support to ``_TTGlyph`` objects (#1334).
+
+3.30.0 (released 2018-09-18)
+----------------------------
+
+- [feaLib] Skip building noop class PairPos subtables when Coverage is NULL
+  (#1318).
+- [ttx] Expose the previously reserved bit flag ``OVERLAP_SIMPLE`` of
+  glyf table's contour points in the TTX dump. This is used in some
+  implementations to specify a non-zero fill with overlapping contours (#1316).
+- [ttLib] Added support for decompiling/compiling ``TS1C`` tables containing
+  VTT sources for ``cvar`` variation table (#1310).
+- [varLib] Use ``fontTools.designspaceLib`` to read DesignSpaceDocument. The
+  ``fontTools.varLib.designspace`` module is now deprecated and will be removed
+  in future versions. The presence of an explicit ``axes`` element is now
+  required in order to build a variable font (#1224, #1313).
+- [varLib] Implemented building GSUB FeatureVariations table from the ``rules``
+  element of DesignSpace document (#1240, #713, #1314).
+- [subset] Added ``--no-layout-closure`` option to not expand the subset with
+  the glyphs produced by OpenType layout features. Instead, OpenType features
+  will be subset to only rules that are relevant to the otherwise-specified
+  glyph set (#43, #1121).
+
+3.29.1 (released 2018-09-10)
+----------------------------
+
+- [feaLib] Fixed issue whereby lookups from DFLT/dflt were not included in the
+  DFLT/non-dflt language systems (#1307).
+- [graphite] Fixed issue on big-endian architectures (e.g. ppc64) (#1311).
+- [subset] Added ``--layout-scripts`` option to add/exclude set of OpenType
+  layout scripts that will be preserved. By default all scripts are retained
+  (``'*'``) (#1303).
+
+3.29.0 (released 2018-07-26)
+----------------------------
+
+- [feaLib] In the OTL table builder, when the ``name`` table is excluded
+  from the list of tables to be build, skip compiling ``featureNames`` blocks,
+  as the records referenced in ``FeatureParams`` table don't exist (68951b7).
+- [otBase] Try ``ExtensionLookup`` if other offset-overflow methods fail
+  (05f95f0).
+- [feaLib] Added support for explicit ``subtable;`` break statements in
+  PairPos lookups; previously these were ignored (#1279, #1300, #1302).
+- [cffLib.specializer] Make sure the stack depth does not exceed maxstack - 1,
+  so that a subroutinizer can insert subroutine calls (#1301,
+  https://github.com/googlei18n/ufo2ft/issues/266).
+- [otTables] Added support for fixing offset overflow errors occurring inside
+  ``MarkBasePos`` subtables (#1297).
+- [subset] Write the default output file extension based on ``--flavor`` option,
+  or the value of ``TTFont.sfntVersion`` (d7ac0ad).
+- [unicodedata] Updated Blocks, Scripts and ScriptExtensions for Unicode 11
+  (452c85e).
+- [xmlWriter] Added context manager to XMLWriter class to autoclose file
+  descriptor on exit (#1290).
+- [psCharStrings] Optimize the charstring's bytecode by encoding as integers
+  all float values that have no decimal portion (8d7774a).
+- [ttFont] Fixed missing import of ``TTLibError`` exception (#1285).
+- [feaLib] Allow any languages other than ``dflt`` under ``DFLT`` script
+  (#1278, #1292).
+
+3.28.0 (released 2018-06-19)
+----------------------------
+
+- [featureVars] Added experimental module to build ``FeatureVariations``
+  tables. Still needs to be hooked up to ``varLib.build`` (#1240).
+- [fixedTools] Added ``otRound`` to round floats to nearest integer towards
+  positive Infinity. This is now used where we deal with visual data like X/Y
+  coordinates, advance widths/heights, variation deltas, and similar (#1274,
+  #1248).
+- [subset] Improved GSUB closure memoize algorithm.
+- [varLib.models] Fixed regression in model resolution (180124, #1269).
+- [feaLib.ast] Fixed error when converting ``SubtableStatement`` to string
+  (#1275).
+- [varLib.mutator] Set ``OS/2.usWeightClass`` and ``usWidthClass``, and
+  ``post.italicAngle`` based on the 'wght', 'wdth' and 'slnt' axis values
+  (#1276, #1264).
+- [py23/loggingTools] Don't automatically set ``logging.lastResort`` handler
+  on py27. Moved ``LastResortLogger`` to the ``loggingTools`` module (#1277).
+
+3.27.1 (released 2018-06-11)
+----------------------------
+
+- [ttGlyphPen] Issue a warning and skip building non-existing components
+  (https://github.com/googlei18n/fontmake/issues/411).
+- [tests] Fixed issue running ttx_test.py from a tagged commit.
+
+3.27.0 (released 2018-06-11)
+----------------------------
+
+- [designspaceLib] Added new ``conditionSet`` element to ``rule`` element in
+  designspace document. Bumped ``format`` attribute to ``4.0`` (previously,
+  it was formatted as an integer). Removed ``checkDefault``, ``checkAxes``
+  methods, and any kind of guessing about the axes when the ``<axes>`` element
+  is missing. The default master is expected at the intersection of all default
+  values for each axis (#1254, #1255, #1267).
+- [cffLib] Fixed issues when compiling CFF2 or converting from CFF when the
+  font has an FDArray (#1211, #1271).
+- [varLib] Avoid attempting to build ``cvar`` table when ``glyf`` table is not
+  present, as is the case for CFF2 fonts.
+- [subset] Handle None coverages in MarkGlyphSets; revert commit 02616ab that
+  sets empty Coverage tables in MarkGlyphSets to None, to make OTS happy.
+- [ttFont] Allow to build glyph order from ``maxp.numGlyphs`` when ``post`` or
+  ``cmap`` are missing.
+- [ttFont] Added ``__len__`` method to ``_TTGlyphSet``.
+- [glyf] Ensure ``GlyphCoordinates`` never overflow signed shorts (#1230).
+- [py23] Added alias for ``itertools.izip`` shadowing the built-in ``zip``.
+- [loggingTools] Memoize ``log`` property of ``LogMixin`` class (fbab12).
+- [ttx] Impoved test coverage (#1261).
+- [Snippets] Addded script to append a suffix to all family names in a font.
+- [varLib.plot] Make it work with matplotlib >= 2.1 (b38e2b).
+
+3.26.0 (released 2018-05-03)
+----------------------------
+
+- [designspace] Added a new optional ``layer`` attribute to the source element,
+  and a corresponding ``layerName`` attribute to the ``SourceDescriptor``
+  object (#1253).
+  Added ``conditionset`` element to the ``rule`` element to the spec, but not
+  implemented in designspace reader/writer yet (#1254).
+- [varLib.models] Refine modeling one last time (0ecf5c5).
+- [otBase] Fixed sharing of tables referred to by different offset sizes
+  (795f2f9).
+- [subset] Don't drop a GDEF that only has VarStore (fc819d6). Set to None
+  empty Coverage tables in MarkGlyphSets (02616ab).
+- [varLib]: Added ``--master-finder`` command-line option (#1249).
+- [varLib.mutator] Prune fvar nameIDs from instance's name table (#1245).
+- [otTables] Allow decompiling bad ClassDef tables with invalid format, with
+  warning (#1236).
+- [varLib] Make STAT v1.2 and reuse nameIDs from fvar table (#1242).
+- [varLib.plot] Show master locations. Set axis limits to -1, +1.
+- [subset] Handle HVAR direct mapping. Passthrough 'cvar'.
+  Added ``--font-number`` command-line option for collections.
+- [t1Lib] Allow a text encoding to be specified when parsing a Type 1 font
+  (#1234). Added ``kind`` argument to T1Font constructor (c5c161c).
+- [ttLib] Added context manager API to ``TTFont`` class, so it can be used in
+  ``with`` statements to auto-close the file when exiting the context (#1232).
+
+3.25.0 (released 2018-04-03)
+----------------------------
+
+- [varLib] Improved support-resolution algorithm. Previously, the on-axis
+  masters would always cut the space. They don't anymore. That's more
+  consistent, and fixes the main issue Erik showed at TYPO Labs 2017.
+  Any varfont built that had an unusual master configuration will change
+  when rebuilt (42bef17, a523a697,
+  https://github.com/googlei18n/fontmake/issues/264).
+- [varLib.models] Added a ``main()`` entry point, that takes positions and
+  prints model results.
+- [varLib.plot] Added new module to plot a designspace's
+  VariationModel. Requires ``matplotlib``.
+- [varLib.mutator] Added -o option to specify output file path (2ef60fa).
+- [otTables] Fixed IndexError while pruning of HVAR pre-write (6b6c34a).
+- [varLib.models] Convert delta array to floats if values overflows signed
+  short integer (0055f94).
+
+3.24.2 (released 2018-03-26)
+----------------------------
+
+- [otBase] Don't fail during ``ValueRecord`` copy if src has more items.
+  We drop hinting in the subsetter by simply changing ValueFormat, without
+  cleaning up the actual ValueRecords. This was causing assertion error if
+  a variable font was subsetted without hinting and then passed directly to
+  the mutator for instantiation without first it saving to disk.
+
+3.24.1 (released 2018-03-06)
+----------------------------
+
+- [varLib] Don't remap the same ``DeviceTable`` twice in VarStore optimizer
+  (#1206).
+- [varLib] Add ``--disable-iup`` option to ``fonttools varLib`` script,
+  and a ``optimize=True`` keyword argument to ``varLib.build`` function,
+  to optionally disable IUP optimization while building varfonts.
+- [ttCollection] Fixed issue while decompiling ttc with python3 (#1207).
+
+3.24.0 (released 2018-03-01)
+----------------------------
+
+- [ttGlyphPen] Decompose composite glyphs if any components' transform is too
+  large to fit a ``F2Dot14`` value, or clamp transform values that are
+  (almost) equal to +2.0 to make them fit and avoid decomposing (#1200,
+  #1204, #1205).
+- [ttx] Added new ``-g`` option to dump glyphs from the ``glyf`` table
+  splitted as individual ttx files (#153, #1035, #1132, #1202).
+- Copied ``ufoLib.filenames`` module to ``fontTools.misc.filenames``, used
+  for the ttx split-glyphs option (#1202).
+- [feaLib] Added support for ``cvParameters`` blocks in Character Variant
+  feautures ``cv01-cv99`` (#860, #1169).
+- [Snippets] Added ``checksum.py`` script to generate/check SHA1 hash of
+  ttx files (#1197).
+- [varLib.mutator] Fixed issue while instantiating some variable fonts
+  whereby the horizontal advance width computed from ``gvar`` phantom points
+  could turn up to be negative (#1198).
+- [varLib/subset] Fixed issue with subsetting GPOS variation data not
+  picking up ``ValueRecord`` ``Device`` objects (54fd71f).
+- [feaLib/voltLib] In all AST elements, the ``location`` is no longer a
+  required positional argument, but an optional kewyord argument (defaults
+  to ``None``). This will make it easier to construct feature AST from
+  code (#1201).
+
+
+3.23.0 (released 2018-02-26)
+----------------------------
+
+- [designspaceLib] Added an optional ``lib`` element to the designspace as a
+  whole, as well as to the instance elements, to store arbitrary data in a
+  property list dictionary, similar to the UFO's ``lib``. Added an optional
+  ``font`` attribute to the ``SourceDescriptor``, to allow operating on
+  in-memory font objects (#1175).
+- [cffLib] Fixed issue with lazy-loading of attributes when attempting to
+  set the CFF TopDict.Encoding (#1177, #1187).
+- [ttx] Fixed regression introduced in 3.22.0 that affected the split tables
+  ``-s`` option (#1188).
+- [feaLib] Added ``IncludedFeaNotFound`` custom exception subclass, raised
+  when an included feature file cannot be found (#1186).
+- [otTables] Changed ``VarIdxMap`` to use glyph names internally instead of
+  glyph indexes. The old ttx dumps of HVAR/VVAR tables that contain indexes
+  can still be imported (21cbab8, 38a0ffb).
+- [varLib] Implemented VarStore optimizer (#1184).
+- [subset] Implemented pruning of GDEF VarStore, HVAR and MVAR (#1179).
+- [sfnt] Restore backward compatiblity with ``numFonts`` attribute of
+  ``SFNTReader`` object (#1181).
+- [merge] Initial support for merging ``LangSysRecords`` (#1180).
+- [ttCollection] don't seek(0) when writing to possibly unseekable strems.
+- [subset] Keep all ``--name-IDs`` from 0 to 6 by default (#1170, #605, #114).
+- [cffLib] Added ``width`` module to calculate optimal CFF default and
+  nominal glyph widths.
+- [varLib] Don’t fail if STAT already in the master fonts (#1166).
+
+3.22.0 (released 2018-02-04)
+----------------------------
+
+- [subset] Support subsetting ``endchar`` acting as ``seac``-like components
+  in ``CFF`` (fixes #1162).
+- [feaLib] Allow to build from pre-parsed ``ast.FeatureFile`` object.
+  Added ``tables`` argument to only build some tables instead of all (#1159,
+  #1163).
+- [textTools] Replaced ``safeEval`` with ``ast.literal_eval`` (#1139).
+- [feaLib] Added option to the parser to not resolve ``include`` statements
+  (#1154).
+- [ttLib] Added new ``ttCollection`` module to read/write TrueType and
+  OpenType Collections. Exports a ``TTCollection`` class with a ``fonts``
+  attribute containing a list of ``TTFont`` instances, the methods ``save``
+  and ``saveXML``, plus some list-like methods. The ``importXML`` method is
+  not implemented yet (#17).
+- [unicodeadata] Added ``ot_tag_to_script`` function that converts from
+  OpenType script tag to Unicode script code.
+- Added new ``designspaceLib`` subpackage, originally from Erik Van Blokland's
+  ``designSpaceDocument``: https://github.com/LettError/designSpaceDocument
+  NOTE: this is not yet used internally by varLib, and the API may be subject
+  to changes (#911, #1110, LettError/designSpaceDocument#28).
+- Added new FontTools icon images (8ee7c32).
+- [unicodedata] Added ``script_horizontal_direction`` function that returns
+  either "LTR" or "RTL" given a unicode script code.
+- [otConverters] Don't write descriptive name string as XML comment if the
+  NameID value is 0 (== NULL) (#1151, #1152).
+- [unicodedata] Add ``ot_tags_from_script`` function to get the list of
+  OpenType script tags associated with unicode script code (#1150).
+- [feaLib] Don't error when "enumerated" kern pairs conflict with preceding
+  single pairs; emit warning and chose the first value (#1147, #1148).
+- [loggingTools] In ``CapturingLogHandler.assertRegex`` method, match the
+  fully formatted log message.
+- [sbix] Fixed TypeError when concatenating str and bytes (#1154).
+- [bezierTools] Implemented cusp support and removed ``approximate_fallback``
+  arg in ``calcQuadraticArcLength``. Added ``calcCubicArcLength`` (#1142).
+
+3.21.2 (released 2018-01-08)
+----------------------------
+
+- [varLib] Fixed merging PairPos Format1/2 with missing subtables (#1125).
+
+3.21.1 (released 2018-01-03)
+----------------------------
+
+- [feaLib] Allow mixed single/multiple substitutions (#612)
+- Added missing ``*.afm`` test assets to MAINFEST.in (#1137).
+- Fixed dumping ``SVG`` tables containing color palettes (#1124).
+
+3.21.0 (released 2017-12-18)
+----------------------------
+
+- [cmap] when compiling format6 subtable, don't assume gid0 is always called
+  '.notdef' (1e42224).
+- [ot] Allow decompiling fonts with bad Coverage format number (1aafae8).
+- Change FontTools licence to MIT (#1127).
+- [post] Prune extra names already in standard Mac set (df1e8c7).
+- [subset] Delete empty SubrsIndex after subsetting (#994, #1118).
+- [varLib] Don't share points in cvar by default, as it currently fails on
+  some browsers (#1113).
+- [afmLib] Make poor old afmLib work on python3.
+
+3.20.1 (released 2017-11-22)
+----------------------------
+
+- [unicodedata] Fixed issue with ``script`` and ``script_extension`` functions
+  returning inconsistent short vs long names. They both return the short four-
+  letter script codes now. Added ``script_name`` and ``script_code`` functions
+  to look up the long human-readable script name from the script code, and
+  viceversa (#1109, #1111).
+
+3.20.0 (released 2017-11-21)
+----------------------------
+
+- [unicodedata] Addded new module ``fontTools.unicodedata`` which exports the
+  same interface as the built-in ``unicodedata`` module, with the addition of
+  a few functions that are missing from the latter, such as ``script``,
+  ``script_extension`` and ``block``. Added a ``MetaTools/buildUCD.py`` script
+  to download and parse data files from the Unicode Character Database and
+  generate python modules containing lists of ranges and property values.
+- [feaLib] Added ``__str__`` method to all ``ast`` elements (delegates to the
+  ``asFea`` method).
+- [feaLib] ``Parser`` constructor now accepts a ``glyphNames`` iterable
+  instead of ``glyphMap`` dict. The latter still works but with a pending
+  deprecation warning (#1104).
+- [bezierTools] Added arc length calculation functions originally from
+  ``pens.perimeterPen`` module (#1101).
+- [varLib] Started generating STAT table (8af4309). Right now it just reflects
+  the axes, and even that with certain limitations:
+  * AxisOrdering is set to the order axes are defined,
+  * Name-table entries are not shared with fvar.
+- [py23] Added backports for ``redirect_stdout`` and ``redirect_stderr``
+  context managers (#1097).
+- [Graphite] Fixed some round-trip bugs (#1093).
+
+3.19.0 (released 2017-11-06)
+----------------------------
+
+- [varLib] Try set of used points instead of all points when testing whether to
+  share points between tuples (#1090).
+- [CFF2] Fixed issue with reading/writing PrivateDict BlueValues to TTX file.
+  Read the commit message 8b02b5a and issue #1030 for more details.
+  NOTE: this change invalidates all the TTX files containing CFF2 tables
+  that where dumped with previous verisons of fonttools.
+  CFF2 Subr items can have values on the stack after the last operator, thus
+  a ``CFF2Subr`` class was added to accommodate this (#1091).
+- [_k_e_r_n] Fixed compilation of AAT kern version=1.0 tables (#1089, #1094)
+- [ttLib] Added getBestCmap() convenience method to TTFont class and cmap table
+  class that returns a preferred Unicode cmap subtable given a list of options
+  (#1092).
+- [morx] Emit more meaningful subtable flags. Implement InsertionMorphAction
+
+3.18.0 (released 2017-10-30)
+----------------------------
+
+- [feaLib] Fixed writing back nested glyph classes (#1086).
+- [TupleVariation] Reactivated shared points logic, bugfixes (#1009).
+- [AAT] Implemented ``morx`` ligature subtables (#1082).
+- [reverseContourPen] Keep duplicate lineTo following a moveTo (#1080,
+  https://github.com/googlei18n/cu2qu/issues/51).
+- [varLib.mutator] Suport instantiation of GPOS, GDEF and MVAR (#1079).
+- [sstruct] Fixed issue with ``unicode_literals`` and ``struct`` module in
+  old versions of python 2.7 (#993).
+
+3.17.0 (released 2017-10-16)
+----------------------------
+
+- [svgPathPen] Added an ``SVGPathPen`` that translates segment pen commands
+  into SVG path descriptions. Copied from Tal Leming's ``ufo2svg.svgPathPen``
+  https://github.com/typesupply/ufo2svg/blob/d69f992/Lib/ufo2svg/svgPathPen.py
+- [reverseContourPen] Added ``ReverseContourPen``, a filter pen that draws
+  contours with the winding direction reversed, while keeping the starting
+  point (#1071).
+- [filterPen] Added ``ContourFilterPen`` to manipulate contours as a whole
+  rather than segment by segment.
+- [arrayTools] Added ``Vector`` class to apply math operations on an array
+  of numbers, and ``pairwise`` function to loop over pairs of items in an
+  iterable.
+- [varLib] Added support for building and interpolation of ``cvar`` table
+  (f874cf6, a25a401).
+
+3.16.0 (released 2017-10-03)
+----------------------------
+
+- [head] Try using ``SOURCE_DATE_EPOCH`` environment variable when setting
+  the ``head`` modified timestamp to ensure reproducible builds (#1063).
+  See https://reproducible-builds.org/specs/source-date-epoch/
+- [VTT] Decode VTT's ``TSI*`` tables text as UTF-8 (#1060).
+- Added support for Graphite font tables: Feat, Glat, Gloc, Silf and Sill.
+  Thanks @mhosken! (#1054).
+- [varLib] Default to using axis "name" attribute if "labelname" element
+  is missing (588f524).
+- [merge] Added support for merging Script records. Remove unused features
+  and lookups after merge (d802580, 556508b).
+- Added ``fontTools.svgLib`` package. Includes a parser for SVG Paths that
+  supports the Pen protocol (#1051). Also, added a snippet to convert SVG
+  outlines to UFO GLIF (#1053).
+- [AAT] Added support for ``ankr``, ``bsln``, ``mort``, ``morx``, ``gcid``,
+  and ``cidg``.
+- [subset] Implemented subsetting of ``prop``, ``opbd``, ``bsln``, ``lcar``.
+
+3.15.1 (released 2017-08-18)
+----------------------------
+
+- [otConverters] Implemented ``__add__`` and ``__radd__`` methods on
+  ``otConverters._LazyList`` that decompile a lazy list before adding
+  it to another list or ``_LazyList`` instance. Fixes an ``AttributeError``
+  in the ``subset`` module when attempting to sum ``_LazyList`` objects
+  (6ef48bd2, 1aef1683).
+- [AAT] Support the `opbd` table with optical bounds (a47f6588).
+- [AAT] Support `prop` table with glyph properties (d05617b4).
+
+
+3.15.0 (released 2017-08-17)
+----------------------------
+
+- [AAT] Added support for AAT lookups. The ``lcar`` table can be decompiled
+  and recompiled; futher work needed to handle ``morx`` table (#1025).
+- [subset] Keep (empty) DefaultLangSys for Script 'DFLT' (6eb807b5).
+- [subset] Support GSUB/GPOS.FeatureVariations (fe01d87b).
+- [varLib] In ``models.supportScalars``, ignore an axis when its peak value
+  is 0 (fixes #1020).
+- [varLib] Add default mappings to all axes in avar to fix rendering issue
+  in some rasterizers (19c4b377, 04eacf13).
+- [varLib] Flatten multiple tail PairPosFormat2 subtables before merging
+  (c55ef525).
+- [ttLib] Added support for recalculating font bounding box in ``CFF`` and
+  ``head`` tables, and min/max values in ``hhea`` and ``vhea`` tables (#970).
+
+3.14.0 (released 2017-07-31)
+----------------------------
+
+- [varLib.merger] Remove Extensions subtables before merging (f7c20cf8).
+- [varLib] Initialize the avar segment map with required default entries
+  (#1014).
+- [varLib] Implemented optimal IUP optmiziation (#1019).
+- [otData] Add ``AxisValueFormat4`` for STAT table v1.2 from OT v1.8.2
+  (#1015).
+- [name] Fixed BCP46 language tag for Mac langID=9: 'si' -> 'sl'.
+- [subset] Return value from ``_DehintingT2Decompiler.op_hintmask``
+  (c0d672ba).
+- [cffLib] Allow to get TopDict by index as well as by name (dca96c9c).
+- [cffLib] Removed global ``isCFF2`` state; use one set of classes for
+  both CFF and CFF2, maintaining backward compatibility existing code (#1007).
+- [cffLib] Deprecated maxstack operator, per OpenType spec update 1.8.1.
+- [cffLib] Added missing default (-100) for UnderlinePosition (#983).
+- [feaLib] Enable setting nameIDs greater than 255 (#1003).
+- [varLib] Recalculate ValueFormat when merging SinglePos (#996).
+- [varLib] Do not emit MVAR if there are no entries in the variation store
+  (#987).
+- [ttx] For ``-x`` option, pad with space if table tag length is < 4.
+
+3.13.1 (released 2017-05-30)
+----------------------------
+
+- [feaLib.builder] Removed duplicate lookups optimization. The original
+  lookup order and semantics of the feature file are preserved (#976).
+
+3.13.0 (released 2017-05-24)
+----------------------------
+
+- [varLib.mutator] Implement IUP optimization (#969).
+- [_g_l_y_f.GlyphCoordinates] Changed ``__bool__()`` semantics to match those
+  of other iterables (e46f949). Removed ``__abs__()`` (3db5be2).
+- [varLib.interpolate_layout] Added ``mapped`` keyword argument to
+  ``interpolate_layout`` to allow disabling avar mapping: if False (default),
+  the location is mapped using the map element of the axes in designspace file;
+  if True, it is assumed that location is in designspace's internal space and
+  no mapping is performed (#950, #975).
+- [varLib.interpolate_layout] Import designspace-loading logic from varLib.
+- [varLib] Fixed bug with recombining PairPosClass2 subtables (81498e5, #914).
+- [cffLib.specializer] When copying iterables, cast to list (462b7f86).
+
+3.12.1 (released 2017-05-18)
+----------------------------
+
+- [pens.t2CharStringPen] Fixed AttributeError when calling addComponent in
+  T2CharStringPen (#965).
+
+3.12.0 (released 2017-05-17)
+----------------------------
+
+- [cffLib.specializer] Added new ``specializer`` module to optimize CFF
+  charstrings, used by the T2CharStringPen (#948).
+- [varLib.mutator] Sort glyphs by component depth before calculating composite
+  glyphs' bounding boxes to ensure deltas are correctly caclulated (#945).
+- [_g_l_y_f] Fixed loss of precision in GlyphCoordinates by using 'd' (double)
+  instead of 'f' (float) as ``array.array`` typecode (#963, #964).
+
+3.11.0 (released 2017-05-03)
+----------------------------
+
+- [t2CharStringPen] Initial support for specialized Type2 path operators:
+  vmoveto, hmoveto, vlineto, hlineto, vvcurveto, hhcurveto, vhcurveto and
+  hvcurveto. This should produce more compact charstrings (#940, #403).
+- [Doc] Added Sphinx sources for the documentation. Thanks @gferreira (#935).
+- [fvar] Expose flags in XML (#932)
+- [name] Add helper function for building multi-lingual names (#921)
+- [varLib] Fixed kern merging when a PairPosFormat2 has ClassDef1 with glyphs
+  that are NOT present in the Coverage (1b5e1c4, #939).
+- [varLib] Fixed non-deterministic ClassDef order with PY3 (f056c12, #927).
+- [feLib] Throw an error when the same glyph is defined in multiple mark
+  classes within the same lookup (3e3ff00, #453).
+
+3.10.0 (released 2017-04-14)
+----------------------------
+
+- [varLib] Added support for building ``avar`` table, using the designspace
+  ``<map>`` elements.
+- [varLib] Removed unused ``build(..., axisMap)`` argument. Axis map should
+  be specified in designspace file now. We do not accept nonstandard axes
+  if ``<axes>`` element is not present.
+- [varLib] Removed "custom" axis from the ``standard_axis_map``. This was
+  added before when glyphsLib was always exporting the (unused) custom axis.
+- [varLib] Added partial support for building ``MVAR`` table; does not
+  implement ``gasp`` table variations yet.
+- [pens] Added FilterPen base class, for pens that control another pen;
+  factored out ``addComponent`` method from BasePen into a separate abstract
+  DecomposingPen class; added DecomposingRecordingPen, which records
+  components decomposed as regular contours.
+- [TSI1] Fixed computation of the textLength of VTT private tables (#913).
+- [loggingTools] Added ``LogMixin`` class providing a ``log`` property to
+  subclasses, which returns a ``logging.Logger`` named after the latter.
+- [loggingTools] Added ``assertRegex`` method to ``CapturingLogHandler``.
+- [py23] Added backport for python 3's ``types.SimpleNamespace`` class.
+- [EBLC] Fixed issue with python 3 ``zip`` iterator.
+
+3.9.2 (released 2017-04-08)
+---------------------------
+
+- [pens] Added pen to draw glyphs using WxPython ``GraphicsPath`` class:
+  https://wxpython.org/docs/api/wx.GraphicsPath-class.html
+- [varLib.merger] Fixed issue with recombining multiple PairPosFormat2
+  subtables (#888)
+- [varLib] Do not encode gvar deltas that are all zeroes, or if all values
+  are smaller than tolerance.
+- [ttLib] _TTGlyphSet glyphs now also have ``height`` and ``tsb`` (top
+  side bearing) attributes from the ``vmtx`` table, if present.
+- [glyf] In ``GlyphCoordintes`` class, added ``__bool__`` / ``__nonzero__``
+  methods, and ``array`` property to get raw array.
+- [ttx] Support reading TTX files with BOM (#896)
+- [CFF2] Fixed the reporting of the number of regions in the font.
+
+3.9.1 (released 2017-03-20)
+---------------------------
+
+- [varLib.merger] Fixed issue while recombining multiple PairPosFormat2
+  subtables if they were split because of offset overflows (9798c30).
+- [varLib.merger] Only merge multiple PairPosFormat1 subtables if there is
+  at least one of the fonts with a non-empty Format1 subtable (0f5a46b).
+- [varLib.merger] Fixed IndexError with empty ClassDef1 in PairPosFormat2
+  (aad0d46).
+- [varLib.merger] Avoid reusing Class2Record (mutable) objects (e6125b3).
+- [varLib.merger] Calculate ClassDef1 and ClassDef2's Format when merging
+  PairPosFormat2 (23511fd).
+- [macUtils] Added missing ttLib import (b05f203).
+
+3.9.0 (released 2017-03-13)
+---------------------------
+
+- [feaLib] Added (partial) support for parsing feature file comments ``# ...``
+  appearing in between statements (#879).
+- [feaLib] Cleaned up syntax tree for FeatureNames.
+- [ttLib] Added support for reading/writing ``CFF2`` table (thanks to
+  @readroberts at Adobe), and ``TTFA`` (ttfautohint) table.
+- [varLib] Fixed regression introduced with 3.8.0 in the calculation of
+  ``NumShorts``, i.e. the number of deltas in ItemVariationData's delta sets
+  that use a 16-bit representation (b2825ff).
+
+3.8.0 (released 2017-03-05)
+---------------------------
+
+- New pens: MomentsPen, StatisticsPen, RecordingPen, and TeePen.
+- [misc] Added new ``fontTools.misc.symfont`` module, for symbolic font
+  statistical analysis; requires ``sympy`` (http://www.sympy.org/en/index.html)
+- [varLib] Added experimental ``fontTools.varLib.interpolatable`` module for
+  finding wrong contour order between different masters
+- [varLib] designspace.load() now returns a dictionary, instead of a tuple,
+  and supports <axes> element (#864); the 'masters' item was renamed 'sources',
+  like the <sources> element in the designspace document
+- [ttLib] Fixed issue with recalculating ``head`` modified timestamp when
+  saving CFF fonts
+- [ttLib] In TupleVariation, round deltas before compiling (#861, fixed #592)
+- [feaLib] Ignore duplicate glyphs in classes used as MarkFilteringSet and
+  MarkAttachmentType (#863)
+- [merge] Changed the ``gasp`` table merge logic so that only the one from
+  the first font is retained, similar to other hinting tables (#862)
+- [Tests] Added tests for the ``varLib`` package, as well as test fonts
+  from the "Annotated OpenType Specification" (AOTS) to exercise ``ttLib``'s
+  table readers/writers (<https://github.com/adobe-type-tools/aots>)
+
+3.7.2 (released 2017-02-17)
+---------------------------
+
+- [subset] Keep advance widths when stripping ".notdef" glyph outline in
+  CID-keyed CFF fonts (#845)
+- [feaLib] Zero values now produce the same results as makeotf (#633, #848)
+- [feaLib] More compact encoding for “Contextual positioning with in-line
+  single positioning rules” (#514)
+
+3.7.1 (released 2017-02-15)
+---------------------------
+
+- [subset] Fixed issue with ``--no-hinting`` option whereby advance widths in
+  Type 2 charstrings were also being stripped (#709, #343)
+- [feaLib] include statements now resolve relative paths like makeotf (#838)
+- [feaLib] table ``name`` now handles Unicode codepoints beyond the Basic
+  Multilingual Plane, also supports old-style MacOS platform encodings (#842)
+- [feaLib] correctly escape string literals when emitting feature syntax (#780)
+
+3.7.0 (released 2017-02-11)
+---------------------------
+
+- [ttx, mtiLib] Preserve ordering of glyph alternates in GSUB type 3 (#833).
+- [feaLib] Glyph names can have dashes, as per new AFDKO syntax v1.20 (#559).
+- [feaLib] feaLib.Parser now needs the font's glyph map for parsing.
+- [varLib] Fix regression where GPOS values were stored as 0.
+- [varLib] Allow merging of class-based kerning when ClassDefs are different
+
+3.6.3 (released 2017-02-06)
+---------------------------
+
+- [varLib] Fix building variation of PairPosFormat2 (b5c34ce).
+- Populate defaults even for otTables that have postRead (e45297b).
+- Fix compiling of MultipleSubstFormat1 with zero 'out' glyphs (b887860).
+
+3.6.2 (released 2017-01-30)
+---------------------------
+
+- [varLib.merger] Fixed "TypeError: reduce() of empty sequence with no
+  initial value" (3717dc6).
+
+3.6.1 (released 2017-01-28)
+---------------------------
+
+-  [py23] Fixed unhandled exception occurring at interpreter shutdown in
+   the "last resort" logging handler (972b3e6).
+-  [agl] Ensure all glyph names are of native 'str' type; avoid mixing
+   'str' and 'unicode' in TTFont.glyphOrder (d8c4058).
+-  Fixed inconsistent title levels in README.rst that caused PyPI to
+   incorrectly render the reStructuredText page.
+
+3.6.0 (released 2017-01-26)
+---------------------------
+
+-  [varLib] Refactored and improved the variation-font-building process.
+-  Assembly code in the fpgm, prep, and glyf tables is now indented in
+   XML output for improved readability. The ``instruction`` element is
+   written as a simple tag if empty (#819).
+-  [ttx] Fixed 'I/O operation on closed file' error when dumping
+   multiple TTXs to standard output with the '-o -' option.
+-  The unit test modules (``*_test.py``) have been moved outside of the
+   fontTools package to the Tests folder, thus they are no longer
+   installed (#811).
+
+3.5.0 (released 2017-01-14)
+---------------------------
+
+-  Font tables read from XML can now be written back to XML with no
+   loss.
+-  GSUB/GPOS LookupType is written out in XML as an element, not
+   comment. (#792)
+-  When parsing cmap table, do not store items mapped to glyph id 0.
+   (#790)
+-  [otlLib] Make ClassDef sorting deterministic. Fixes #766 (7d1ddb2)
+-  [mtiLib] Added unit tests (#787)
+-  [cvar] Implemented cvar table
+-  [gvar] Renamed GlyphVariation to TupleVariation to match OpenType
+   terminology.
+-  [otTables] Handle gracefully empty VarData.Item array when compiling
+   XML. (#797)
+-  [varLib] Re-enabled generation of ``HVAR`` table for fonts with
+   TrueType outlines; removed ``--build-HVAR`` command-line option.
+-  [feaLib] The parser can now be extended to support non-standard
+   statements in FEA code by using a customized Abstract Syntax Tree.
+   See, for example, ``feaLib.builder_test.test_extensions`` and
+   baseClass.feax (#794, fixes #773).
+-  [feaLib] Added ``feaLib`` command to the 'fonttools' command-line
+   tool; applies a feature file to a font. ``fonttools feaLib -h`` for
+   help.
+-  [pens] The ``T2CharStringPen`` now takes an optional
+   ``roundTolerance`` argument to control the rounding of coordinates
+   (#804, fixes #769).
+-  [ci] Measure test coverage on all supported python versions and OSes,
+   combine coverage data and upload to
+   https://codecov.io/gh/fonttools/fonttools (#786)
+-  [ci] Configured Travis and Appveyor for running tests on Python 3.6
+   (#785, 55c03bc)
+-  The manual pages installation directory can be customized through
+   ``FONTTOOLS_MANPATH`` environment variable (#799, fixes #84).
+-  [Snippets] Added otf2ttf.py, for converting fonts from CFF to
+   TrueType using the googlei18n/cu2qu module (#802)
+
+3.4.0 (released 2016-12-21)
+---------------------------
+
+-  [feaLib] Added support for generating FEA text from abstract syntax
+   tree (AST) objects (#776). Thanks @mhosken
+-  Added ``agl.toUnicode`` function to convert AGL-compliant glyph names
+   to Unicode strings (#774)
+-  Implemented MVAR table (b4d5381)
+
+3.3.1 (released 2016-12-15)
+---------------------------
+
+-  [setup] We no longer use versioneer.py to compute fonttools version
+   from git metadata, as this has caused issues for some users (#767).
+   Now we bump the version strings manually with a custom ``release``
+   command of setup.py script.
+
+3.3.0 (released 2016-12-06)
+---------------------------
+
+-  [ttLib] Implemented STAT table from OpenType 1.8 (#758)
+-  [cffLib] Fixed decompilation of CFF fonts containing non-standard
+   key/value pairs in FontDict (issue #740; PR #744)
+-  [py23] minor: in ``round3`` function, allow the second argument to be
+   ``None`` (#757)
+-  The standalone ``sstruct`` and ``xmlWriter`` modules, deprecated
+   since vesion 3.2.0, have been removed. They can be imported from the
+   ``fontTools.misc`` package.
+
+3.2.3 (released 2016-12-02)
+---------------------------
+
+-  [py23] optimized performance of round3 function; added backport for
+   py35 math.isclose() (9d8dacb)
+-  [subset] fixed issue with 'narrow' (UCS-2) Python 2 builds and
+   ``--text``/``--text-file`` options containing non-BMP chararcters
+   (16d0e5e)
+-  [varLib] fixed issuewhen normalizing location values (8fa2ee1, #749)
+-  [inspect] Made it compatible with both python2 and python3 (167ee60,
+   #748). Thanks @pnemade
+
+3.2.2 (released 2016-11-24)
+---------------------------
+
+-  [varLib] Do not emit null axes in fvar (1bebcec). Thanks @robmck-ms
+-  [varLib] Handle fonts without GPOS (7915a45)
+-  [merge] Ignore LangSys if None (a11bc56)
+-  [subset] Fix subsetting MathVariants (78d3cbe)
+-  [OS/2] Fix "Private Use (plane 15)" range (08a0d55). Thanks @mashabow
+
+3.2.1 (released 2016-11-03)
+---------------------------
+
+-  [OS/2] fix checking ``fsSelection`` bits matching ``head.macStyle``
+   bits
+-  [varLib] added ``--build-HVAR`` option to generate ``HVAR`` table for
+   fonts with TrueType outlines. For ``CFF2``, it is enabled by default.
+
+3.2.0 (released 2016-11-02)
+---------------------------
+
+-  [varLib] Improve support for OpenType 1.8 Variable Fonts:
+-  Implement GDEF's VariationStore
+-  Implement HVAR/VVAR tables
+-  Partial support for loading MutatorMath .designspace files with
+   varLib.designspace module
+-  Add varLib.models with Variation fonts interpolation models
+-  Implement GSUB/GPOS FeatureVariations
+-  Initial support for interpolating and merging OpenType Layout tables
+   (see ``varLib.interpolate_layout`` and ``varLib.merger`` modules)
+-  [API change] Change version to be an integer instead of a float in
+   XML output for GSUB, GPOS, GDEF, MATH, BASE, JSTF, HVAR, VVAR, feat,
+   hhea and vhea tables. Scripts that set the Version for those to 1.0
+   or other float values also need fixing. A warning is emitted when
+   code or XML needs fix.
+-  several bug fixes to the cffLib module, contributed by Adobe's
+   @readroberts
+-  The XML output for CFF table now has a 'major' and 'minor' elements
+   for specifying whether it's version 1.0 or 2.0 (support for CFF2 is
+   coming soon)
+-  [setup.py] remove undocumented/deprecated ``extra_path`` Distutils
+   argument. This means that we no longer create a "FontTools" subfolder
+   in site-packages containing the actual fontTools package, as well as
+   the standalone xmlWriter and sstruct modules. The latter modules are
+   also deprecated, and scheduled for removal in upcoming releases.
+   Please change your import statements to point to from fontTools.misc
+   import xmlWriter and from fontTools.misc import sstruct.
+-  [scripts] Add a 'fonttools' command-line tool that simply runs
+   ``fontTools.*`` sub-modules: e.g. ``fonttools ttx``,
+   ``fonttools subset``, etc.
+-  [hmtx/vmts] Read advance width/heights as unsigned short (uint16);
+   automatically round float values to integers.
+-  [ttLib/xmlWriter] add 'newlinestr=None' keyword argument to
+   ``TTFont.saveXML`` for overriding os-specific line endings (passed on
+   to ``XMLWriter`` instances).
+-  [versioning] Use versioneer instead of ``setuptools_scm`` to
+   dynamically load version info from a git checkout at import time.
+-  [feaLib] Support backslash-prefixed glyph names.
+
+3.1.2 (released 2016-09-27)
+---------------------------
+
+-  restore Makefile as an alternative way to build/check/install
+-  README.md: update instructions for installing package from source,
+   and for running test suite
+-  NEWS: Change log was out of sync with tagged release
+
+3.1.1 (released 2016-09-27)
+---------------------------
+
+-  Fix ``ttLibVersion`` attribute in TTX files still showing '3.0'
+   instead of '3.1'.
+-  Use ``setuptools_scm`` to manage package versions.
+
+3.1.0 (released 2016-09-26)
+---------------------------
+
+-  [feaLib] New library to parse and compile Adobe FDK OpenType Feature
+   files.
+-  [mtiLib] New library to parse and compile Monotype 'FontDame'
+   OpenType Layout Tables files.
+-  [voltLib] New library to parse Microsoft VOLT project files.
+-  [otlLib] New library to work with OpenType Layout tables.
+-  [varLib] New library to work with OpenType Font Variations.
+-  [pens] Add ttGlyphPen to draw to TrueType glyphs, and t2CharStringPen
+   to draw to Type 2 Charstrings (CFF); add areaPen and perimeterPen.
+-  [ttLib.tables] Implement 'meta' and 'trak' tables.
+-  [ttx] Add --flavor option for compiling to 'woff' or 'woff2'; add
+   ``--with-zopfli`` option to use Zopfli to compress WOFF 1.0 fonts.
+-  [subset] Support subsetting 'COLR'/'CPAL' and 'CBDT'/'CBLC' color
+   fonts tables, and 'gvar' table for variation fonts.
+-  [Snippets] Add ``symfont.py``, for symbolic font statistics analysis;
+   interpolatable.py, a preliminary script for detecting interpolation
+   errors; ``{merge,dump}_woff_metadata.py``.
+-  [classifyTools] Helpers to classify things into classes.
+-  [CI] Run tests on Windows, Linux and macOS using Appveyor and Travis
+   CI; check unit test coverage with Coverage.py/Coveralls; automatic
+   deployment to PyPI on tags.
+-  [loggingTools] Use Python built-in logging module to print messages.
+-  [py23] Make round() behave like Python 3 built-in round(); define
+   round2() and round3().
+
+3.0 (released 2015-09-01)
+-------------------------
+
+-  Add Snippet scripts for cmap subtable format conversion, printing
+   GSUB/GPOS features, building a GX font from two masters
+-  TTX WOFF2 support and a ``-f`` option to overwrite output file(s)
+-  Support GX tables: ``avar``, ``gvar``, ``fvar``, ``meta``
+-  Support ``feat`` and gzip-compressed SVG tables
+-  Upgrade Mac East Asian encodings to native implementation if
+   available
+-  Add Roman Croatian and Romanian encodings, codecs for mac-extended
+   East Asian encodings
+-  Implement optimal GLYF glyph outline packing; disabled by default
+
+2.5 (released 2014-09-24)
+-------------------------
+
+-  Add a Qt pen
+-  Add VDMX table converter
+-  Load all OpenType sub-structures lazily
+-  Add support for cmap format 13.
+-  Add pyftmerge tool
+-  Update to Unicode 6.3.0d3
+-  Add pyftinspect tool
+-  Add support for Google CBLC/CBDT color bitmaps, standard EBLC/EBDT
+   embedded bitmaps, and ``SVG`` table (thanks to Read Roberts at Adobe)
+-  Add support for loading, saving and ttx'ing WOFF file format
+-  Add support for Microsoft COLR/CPAL layered color glyphs
+-  Support PyPy
+-  Support Jython, by replacing numpy with array/lists modules and
+   removed it, pure-Python StringIO, not cStringIO
+-  Add pyftsubset and Subsetter object, supporting CFF and TTF
+-  Add to ttx args for -q for quiet mode, -z to choose a bitmap dump
+   format
+
+2.4 (released 2013-06-22)
+-------------------------
+
+-  Option to write to arbitrary files
+-  Better dump format for DSIG
+-  Better detection of OTF XML
+-  Fix issue with Apple's kern table format
+-  Fix mangling of TT glyph programs
+-  Fix issues related to mona.ttf
+-  Fix Windows Installer instructions
+-  Fix some modern MacOS issues
+-  Fix minor issues and typos
+
+2.3 (released 2009-11-08)
+-------------------------
+
+-  TrueType Collection (TTC) support
+-  Python 2.6 support
+-  Update Unicode data to 5.2.0
+-  Couple of bug fixes
+
+2.2 (released 2008-05-18)
+-------------------------
+
+-  ClearType support
+-  cmap format 1 support
+-  PFA font support
+-  Switched from Numeric to numpy
+-  Update Unicode data to 5.1.0
+-  Update AGLFN data to 1.6
+-  Many bug fixes
+
+2.1 (released 2008-01-28)
+-------------------------
+
+-  Many years worth of fixes and features
+
+2.0b2 (released 2002-??-??)
+---------------------------
+
+-  Be "forgiving" when interpreting the maxp table version field:
+   interpret any value as 1.0 if it's not 0.5. Fixes dumping of these
+   GPL fonts: http://www.freebsd.org/cgi/pds.cgi?ports/chinese/wangttf
+-  Fixed ttx -l: it turned out this part of the code didn't work with
+   Python 2.2.1 and earlier. My bad to do most of my testing with a
+   different version than I shipped TTX with :-(
+-  Fixed bug in ClassDef format 1 subtable (Andreas Seidel bumped into
+   this one).
+
+2.0b1 (released 2002-09-10)
+---------------------------
+
+-  Fixed embarrassing bug: the master checksum in the head table is now
+   calculated correctly even on little-endian platforms (such as Intel).
+-  Made the cmap format 4 compiler smarter: the binary data it creates
+   is now more or less as compact as possible. TTX now makes more
+   compact data than in any shipping font I've tested it with.
+-  Dump glyph names as a separate "GlyphOrder" pseudo table as opposed
+   to as part of the glyf table (obviously needed for CFF-OTF's).
+-  Added proper support for the CFF table.
+-  Don't barf on empty tables (questionable, but "there are font out
+   there...")
+-  When writing TT glyf data, align glyphs on 4-byte boundaries. This
+   seems to be the current recommendation by MS. Also: don't barf on
+   fonts which are already 4-byte aligned.
+-  Windows installer contributed bu Adam Twardoch! Yay!
+-  Changed the command line interface again, now by creating one new
+   tool replacing the old ones: ttx It dumps and compiles, depending on
+   input file types. The options have changed somewhat.
+-  The -d option is back (output dir)
+-  ttcompile's -i options is now called -m (as in "merge"), to avoid
+   clash with dump's -i.
+-  The -s option ("split tables") no longer creates a directory, but
+   instead outputs a small .ttx file containing references to the
+   individual table files. This is not a true link, it's a simple file
+   name, and the referenced file should be in the same directory so
+   ttcompile can find them.
+-  compile no longer accepts a directory as input argument. Instead it
+   can parse the new "mini-ttx" format as output by "ttx -s".
+-  all arguments are input files
+-  Renamed the command line programs and moved them to the Tools
+   subdirectory. They are now installed by the setup.py install script.
+-  Added OpenType support. BASE, GDEF, GPOS, GSUB and JSTF are (almost)
+   fully supported. The XML output is not yet final, as I'm still
+   considering to output certain subtables in a more human-friendly
+   manner.
+-  Fixed 'kern' table to correctly accept subtables it doesn't know
+   about, as well as interpreting Apple's definition of the 'kern' table
+   headers correctly.
+-  Fixed bug where glyphnames were not calculated from 'cmap' if it was
+   (one of the) first tables to be decompiled. More specifically: it
+   cmap was the first to ask for a glyphID -> glyphName mapping.
+-  Switched XML parsers: use expat instead of xmlproc. Should be faster.
+-  Removed my UnicodeString object: I now require Python 2.0 or up,
+   which has unicode support built in.
+-  Removed assert in glyf table: redundant data at the end of the table
+   is now ignored instead of raising an error. Should become a warning.
+-  Fixed bug in hmtx/vmtx code that only occured if all advances were
+   equal.
+-  Fixed subtle bug in TT instruction disassembler.
+-  Couple of fixes to the 'post' table.
+-  Updated OS/2 table to latest spec.
+
+1.0b1 (released 2001-08-10)
+---------------------------
+
+-  Reorganized the command line interface for ttDump.py and
+   ttCompile.py, they now behave more like "normal" command line tool,
+   in that they accept multiple input files for batch processing.
+-  ttDump.py and ttCompile.py don't silently override files anymore, but
+   ask before doing so. Can be overridden by -f.
+-  Added -d option to both ttDump.py and ttCompile.py.
+-  Installation is now done with distutils. (Needs work for environments
+   without compilers.)
+-  Updated installation instructions.
+-  Added some workarounds so as to handle certain buggy fonts more
+   gracefully.
+-  Updated Unicode table to Unicode 3.0 (Thanks Antoine!)
+-  Included a Python script by Adam Twardoch that adds some useful stuff
+   to the Windows registry.
+-  Moved the project to SourceForge.
+
+1.0a6 (released 2000-03-15)
+---------------------------
+
+-  Big reorganization: made ttLib a subpackage of the new fontTools
+   package, changed several module names. Called the entire suite
+   "FontTools"
+-  Added several submodules to fontTools, some new, some older.
+-  Added experimental CFF/GPOS/GSUB support to ttLib, read-only (but XML
+   dumping of GPOS/GSUB is for now disabled)
+-  Fixed hdmx endian bug
+-  Added -b option to ttCompile.py, it disables recalculation of
+   bounding boxes, as requested by Werner Lemberg.
+-  Renamed tt2xml.pt to ttDump.py and xml2tt.py to ttCompile.py
+-  Use ".ttx" as file extension instead of ".xml".
+-  TTX is now the name of the XML-based *format* for TT fonts, and not
+   just an application.
+
+1.0a5
+-----
+
+Never released
+
+-  More tables supported: hdmx, vhea, vmtx
+
+1.0a3 & 1.0a4
+-------------
+
+Never released
+
+-  fixed most portability issues
+-  retracted the "Euro_or_currency" change from 1.0a2: it was
+   nonsense!
+
+1.0a2 (released 1999-05-02)
+---------------------------
+
+-  binary release for MacOS
+-  genenates full FOND resources: including width table, PS font name
+   info and kern table if applicable.
+-  added cmap format 4 support. Extra: dumps Unicode char names as XML
+   comments!
+-  added cmap format 6 support
+-  now accepts true type files starting with "true" (instead of just
+   0x00010000 and "OTTO")
+-  'glyf' table support is now complete: I added support for composite
+   scale, xy-scale and two-by-two for the 'glyf' table. For now,
+   component offset scale behaviour defaults to Apple-style. This only
+   affects the (re)calculation of the glyph bounding box.
+-  changed "Euro" to "Euro_or_currency" in the Standard Apple Glyph
+   order list, since we cannot tell from the 'post' table which is
+   meant. I should probably doublecheck with a Unicode encoding if
+   available. (This does not affect the output!)
+
+Fixed bugs: - 'hhea' table is now recalculated correctly - fixed wrong
+assumption about sfnt resource names
+
+1.0a1 (released 1999-04-27)
+---------------------------
+
+-  initial binary release for MacOS

二进制
static/pyodide/kiwisolver-1.4.5-cp312-cp312-emscripten_3_1_52_wasm32.whl


+ 122 - 0
static/pyodide/kiwisolver-1.4.5-cp312-cp312-emscripten_3_1_52_wasm32.whl.metadata

@@ -0,0 +1,122 @@
+Metadata-Version: 2.1
+Name: kiwisolver
+Version: 1.4.5
+Summary: A fast implementation of the Cassowary constraint solver
+Author-email: The Nucleic Development Team <sccolbert@gmail.com>
+Maintainer-email: "Matthieu C. Dartiailh" <m.dartiailh@gmail.com>
+License: =========================
+         The Kiwi licensing terms
+        =========================
+        Kiwi is licensed under the terms of the Modified BSD License (also known as
+        New or Revised BSD), as follows:
+        
+        Copyright (c) 2013, Nucleic Development Team
+        
+        All rights reserved.
+        
+        Redistribution and use in source and binary forms, with or without
+        modification, are permitted provided that the following conditions are met:
+        
+        Redistributions of source code must retain the above copyright notice, this
+        list of conditions and the following disclaimer.
+        
+        Redistributions in binary form must reproduce the above copyright notice, this
+        list of conditions and the following disclaimer in the documentation and/or
+        other materials provided with the distribution.
+        
+        Neither the name of the Nucleic Development Team nor the names of its
+        contributors may be used to endorse or promote products derived from this
+        software without specific prior written permission.
+        
+        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+        ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+        WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+        DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+        FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+        DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+        SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+        CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+        OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        
+        About Kiwi
+        ----------
+        Chris Colbert began the Kiwi project in December 2013 in an effort to
+        create a blisteringly fast UI constraint solver. Chris is still the
+        project lead.
+        
+        The Nucleic Development Team is the set of all contributors to the Nucleic
+        project and its subprojects.
+        
+        The core team that coordinates development on GitHub can be found here:
+        http://github.com/nucleic. The current team consists of:
+        
+        * Chris Colbert
+        
+        Our Copyright Policy
+        --------------------
+        Nucleic uses a shared copyright model. Each contributor maintains copyright
+        over their contributions to Nucleic. But, it is important to note that these
+        contributions are typically only changes to the repositories. Thus, the Nucleic
+        source code, in its entirety is not the copyright of any single person or
+        institution. Instead, it is the collective copyright of the entire Nucleic
+        Development Team. If individual contributors want to maintain a record of what
+        changes/contributions they have specific copyright on, they should indicate
+        their copyright in the commit message of the change, when they commit the
+        change to one of the Nucleic repositories.
+        
+        With this in mind, the following banner should be used in any source code file
+        to indicate the copyright and license terms:
+        
+        #------------------------------------------------------------------------------
+        # Copyright (c) 2013, Nucleic Development Team.
+        #
+        # Distributed under the terms of the Modified BSD License.
+        #
+        # The full license is in the file LICENSE, distributed with this software.
+        #------------------------------------------------------------------------------
+        
+Project-URL: homepage, https://github.com/nucleic/kiwi
+Project-URL: documentation, https://kiwisolver.readthedocs.io/en/latest/
+Project-URL: repository, https://github.com/nucleic/kiwi
+Project-URL: changelog, https://github.com/nucleic/kiwi/blob/main/releasenotes.rst
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: typing-extensions ; python_version < "3.8"
+
+Welcome to Kiwi
+===============
+
+.. image:: https://travis-ci.org/nucleic/kiwi.svg?branch=main
+    :target: https://travis-ci.org/nucleic/kiwi
+.. image:: https://github.com/nucleic/kiwi/workflows/Continuous%20Integration/badge.svg
+    :target: https://github.com/nucleic/kiwi/actions
+.. image:: https://github.com/nucleic/kiwi/workflows/Documentation%20building/badge.svg
+    :target: https://github.com/nucleic/kiwi/actions
+.. image:: https://codecov.io/gh/nucleic/kiwi/branch/main/graph/badge.svg
+  :target: https://codecov.io/gh/nucleic/kiwi
+.. image:: https://readthedocs.org/projects/kiwisolver/badge/?version=latest
+    :target: https://kiwisolver.readthedocs.io/en/latest/?badge=latest
+    :alt: Documentation Status
+
+Kiwi is an efficient C++ implementation of the Cassowary constraint solving
+algorithm. Kiwi is an implementation of the algorithm based on the
+`seminal Cassowary paper <https://constraints.cs.washington.edu/solvers/cassowary-tochi.pdf>`_.
+It is *not* a refactoring of the original C++ solver. Kiwi has been designed
+from the ground up to be lightweight and fast. Kiwi ranges from 10x to 500x
+faster than the original Cassowary solver with typical use cases gaining a 40x
+improvement. Memory savings are consistently > 5x.
+
+In addition to the C++ solver, Kiwi ships with hand-rolled Python bindings for
+Python 3.7+.

二进制
static/pyodide/matplotlib-3.5.2-cp312-cp312-emscripten_3_1_52_wasm32.whl


+ 167 - 0
static/pyodide/matplotlib-3.5.2-cp312-cp312-emscripten_3_1_52_wasm32.whl.metadata

@@ -0,0 +1,167 @@
+Metadata-Version: 2.1
+Name: matplotlib
+Version: 3.5.2
+Summary: Python plotting package
+Home-page: https://matplotlib.org
+Download-URL: https://matplotlib.org/users/installing.html
+Author: John D. Hunter, Michael Droettboom
+Author-email: matplotlib-users@python.org
+License: PSF
+Project-URL: Documentation, https://matplotlib.org
+Project-URL: Source Code, https://github.com/matplotlib/matplotlib
+Project-URL: Bug Tracker, https://github.com/matplotlib/matplotlib/issues
+Project-URL: Forum, https://discourse.matplotlib.org/
+Project-URL: Donate, https://numfocus.org/donate-to-matplotlib
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Framework :: Matplotlib
+Classifier: Intended Audience :: Science/Research
+Classifier: Intended Audience :: Education
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Topic :: Scientific/Engineering :: Visualization
+Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
+License-File: LICENSE/LICENSE
+License-File: LICENSE/LICENSE_AMSFONTS
+License-File: LICENSE/LICENSE_BAKOMA
+License-File: LICENSE/LICENSE_CARLOGO
+License-File: LICENSE/LICENSE_COLORBREWER
+License-File: LICENSE/LICENSE_JSXTOOLS_RESIZE_OBSERVER
+License-File: LICENSE/LICENSE_QT4_EDITOR
+License-File: LICENSE/LICENSE_SOLARIZED
+License-File: LICENSE/LICENSE_STIX
+License-File: LICENSE/LICENSE_YORICK
+Requires-Dist: cycler >=0.10
+Requires-Dist: fonttools >=4.22.0
+Requires-Dist: kiwisolver >=1.0.1
+Requires-Dist: numpy >=1.17
+Requires-Dist: packaging >=20.0
+Requires-Dist: pillow >=6.2.0
+Requires-Dist: pyparsing >=2.2.1
+Requires-Dist: python-dateutil >=2.7
+
+|PyPi|_ |Downloads|_ |NUMFocus|_
+
+|DiscourseBadge|_ |Gitter|_ |GitHubIssues|_ |GitTutorial|_
+
+|GitHubActions|_ |AzurePipelines|_ |AppVeyor|_ |Codecov|_ |LGTM|_
+
+.. |GitHubActions| image:: https://github.com/matplotlib/matplotlib/workflows/Tests/badge.svg
+.. _GitHubActions: https://github.com/matplotlib/matplotlib/actions?query=workflow%3ATests
+
+.. |AzurePipelines| image:: https://dev.azure.com/matplotlib/matplotlib/_apis/build/status/matplotlib.matplotlib?branchName=master
+.. _AzurePipelines: https://dev.azure.com/matplotlib/matplotlib/_build/latest?definitionId=1&branchName=master
+
+.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/github/matplotlib/matplotlib?branch=master&svg=true
+.. _AppVeyor: https://ci.appveyor.com/project/matplotlib/matplotlib
+
+.. |Codecov| image:: https://codecov.io/github/matplotlib/matplotlib/badge.svg?branch=master&service=github
+.. _Codecov: https://codecov.io/github/matplotlib/matplotlib?branch=master
+
+.. |LGTM| image:: https://img.shields.io/lgtm/grade/python/github/matplotlib/matplotlib.svg?logo=lgtm&logoWidth=18
+.. _LGTM: https://lgtm.com/projects/g/matplotlib/matplotlib
+
+.. |DiscourseBadge| image:: https://img.shields.io/badge/help_forum-discourse-blue.svg
+.. _DiscourseBadge: https://discourse.matplotlib.org
+
+.. |Gitter| image:: https://badges.gitter.im/matplotlib/matplotlib.svg
+.. _Gitter: https://gitter.im/matplotlib/matplotlib
+
+.. |GitHubIssues| image:: https://img.shields.io/badge/issue_tracking-github-blue.svg
+.. _GitHubIssues: https://github.com/matplotlib/matplotlib/issues
+
+.. |GitTutorial| image:: https://img.shields.io/badge/PR-Welcome-%23FF8300.svg?
+.. _GitTutorial: https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project
+
+.. |PyPi| image:: https://badge.fury.io/py/matplotlib.svg
+.. _PyPi: https://badge.fury.io/py/matplotlib
+
+.. |Downloads| image:: https://pepy.tech/badge/matplotlib/month
+.. _Downloads: https://pepy.tech/project/matplotlib
+
+.. |NUMFocus| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A
+.. _NUMFocus: https://numfocus.org
+
+.. image:: https://matplotlib.org/_static/logo2.svg
+
+Matplotlib is a comprehensive library for creating static, animated, and
+interactive visualizations in Python.
+
+Check out our `home page <https://matplotlib.org/>`_ for more information.
+
+.. image:: https://matplotlib.org/_static/readme_preview.png
+
+Matplotlib produces publication-quality figures in a variety of hardcopy
+formats and interactive environments across platforms. Matplotlib can be used
+in Python scripts, the Python and IPython shell, web application servers, and
+various graphical user interface toolkits.
+
+
+Install
+=======
+
+For installation instructions and requirements, see the `install documentation
+<https://matplotlib.org/stable/users/installing/index.html>`_ or
+`installing.rst <doc/users/installing/index.rst>`_ in the source.
+
+Contribute
+==========
+
+You've discovered a bug or something else you want to change - excellent!
+
+You've worked out a way to fix it – even better!
+
+You want to tell us about it – best of all!
+
+Start at the `contributing guide
+<https://matplotlib.org/devdocs/devel/contributing.html>`_!
+
+Contact
+=======
+
+`Discourse <https://discourse.matplotlib.org/>`_ is the discussion forum for
+general questions and discussions and our recommended starting point.
+
+Our active mailing lists (which are mirrored on Discourse) are:
+
+* `Users <https://mail.python.org/mailman/listinfo/matplotlib-users>`_ mailing
+  list: matplotlib-users@python.org
+* `Announcement
+  <https://mail.python.org/mailman/listinfo/matplotlib-announce>`_ mailing
+  list: matplotlib-announce@python.org
+* `Development <https://mail.python.org/mailman/listinfo/matplotlib-devel>`_
+  mailing list: matplotlib-devel@python.org
+
+Gitter_ is for coordinating development and asking questions directly related
+to contributing to matplotlib.
+
+
+Citing Matplotlib
+=================
+If Matplotlib contributes to a project that leads to publication, please
+acknowledge this by citing Matplotlib.
+
+`A ready-made citation entry <https://matplotlib.org/stable/users/project/citing.html>`_ is
+available.
+
+Research notice
+~~~~~~~~~~~~~~~
+
+Please note that this repository is participating in a study into
+sustainability of open source projects. Data will be gathered about this
+repository for approximately the next 12 months, starting from June 2021.
+
+Data collected will include number of contributors, number of PRs, time taken
+to close/merge these PRs, and issues closed.
+
+For more information, please visit `the informational page
+<https://sustainable-open-science-and-software.github.io/>`__ or download the
+`participant information sheet
+<https://sustainable-open-science-and-software.github.io/assets/PIS_sustainable_software.pdf>`__.
+

二进制
static/pyodide/matplotlib_pyodide-0.2.1-py3-none-any.whl


+ 440 - 0
static/pyodide/matplotlib_pyodide-0.2.1-py3-none-any.whl.metadata

@@ -0,0 +1,440 @@
+Metadata-Version: 2.1
+Name: matplotlib-pyodide
+Version: 0.2.1
+Summary: HTML5 backends for Matplotlib compatible with Pyodide
+Author: Pyodide developers
+License: Mozilla Public License Version 2.0
+        ==================================
+        
+        1. Definitions
+        --------------
+        
+        1.1. "Contributor"
+            means each individual or legal entity that creates, contributes to
+            the creation of, or owns Covered Software.
+        
+        1.2. "Contributor Version"
+            means the combination of the Contributions of others (if any) used
+            by a Contributor and that particular Contributor's Contribution.
+        
+        1.3. "Contribution"
+            means Covered Software of a particular Contributor.
+        
+        1.4. "Covered Software"
+            means Source Code Form to which the initial Contributor has attached
+            the notice in Exhibit A, the Executable Form of such Source Code
+            Form, and Modifications of such Source Code Form, in each case
+            including portions thereof.
+        
+        1.5. "Incompatible With Secondary Licenses"
+            means
+        
+            (a) that the initial Contributor has attached the notice described
+                in Exhibit B to the Covered Software; or
+        
+            (b) that the Covered Software was made available under the terms of
+                version 1.1 or earlier of the License, but not also under the
+                terms of a Secondary License.
+        
+        1.6. "Executable Form"
+            means any form of the work other than Source Code Form.
+        
+        1.7. "Larger Work"
+            means a work that combines Covered Software with other material, in
+            a separate file or files, that is not Covered Software.
+        
+        1.8. "License"
+            means this document.
+        
+        1.9. "Licensable"
+            means having the right to grant, to the maximum extent possible,
+            whether at the time of the initial grant or subsequently, any and
+            all of the rights conveyed by this License.
+        
+        1.10. "Modifications"
+            means any of the following:
+        
+            (a) any file in Source Code Form that results from an addition to,
+                deletion from, or modification of the contents of Covered
+                Software; or
+        
+            (b) any new file in Source Code Form that contains any Covered
+                Software.
+        
+        1.11. "Patent Claims" of a Contributor
+            means any patent claim(s), including without limitation, method,
+            process, and apparatus claims, in any patent Licensable by such
+            Contributor that would be infringed, but for the grant of the
+            License, by the making, using, selling, offering for sale, having
+            made, import, or transfer of either its Contributions or its
+            Contributor Version.
+        
+        1.12. "Secondary License"
+            means either the GNU General Public License, Version 2.0, the GNU
+            Lesser General Public License, Version 2.1, the GNU Affero General
+            Public License, Version 3.0, or any later versions of those
+            licenses.
+        
+        1.13. "Source Code Form"
+            means the form of the work preferred for making modifications.
+        
+        1.14. "You" (or "Your")
+            means an individual or a legal entity exercising rights under this
+            License. For legal entities, "You" includes any entity that
+            controls, is controlled by, or is under common control with You. For
+            purposes of this definition, "control" means (a) the power, direct
+            or indirect, to cause the direction or management of such entity,
+            whether by contract or otherwise, or (b) ownership of more than
+            fifty percent (50%) of the outstanding shares or beneficial
+            ownership of such entity.
+        
+        2. License Grants and Conditions
+        --------------------------------
+        
+        2.1. Grants
+        
+        Each Contributor hereby grants You a world-wide, royalty-free,
+        non-exclusive license:
+        
+        (a) under intellectual property rights (other than patent or trademark)
+            Licensable by such Contributor to use, reproduce, make available,
+            modify, display, perform, distribute, and otherwise exploit its
+            Contributions, either on an unmodified basis, with Modifications, or
+            as part of a Larger Work; and
+        
+        (b) under Patent Claims of such Contributor to make, use, sell, offer
+            for sale, have made, import, and otherwise transfer either its
+            Contributions or its Contributor Version.
+        
+        2.2. Effective Date
+        
+        The licenses granted in Section 2.1 with respect to any Contribution
+        become effective for each Contribution on the date the Contributor first
+        distributes such Contribution.
+        
+        2.3. Limitations on Grant Scope
+        
+        The licenses granted in this Section 2 are the only rights granted under
+        this License. No additional rights or licenses will be implied from the
+        distribution or licensing of Covered Software under this License.
+        Notwithstanding Section 2.1(b) above, no patent license is granted by a
+        Contributor:
+        
+        (a) for any code that a Contributor has removed from Covered Software;
+            or
+        
+        (b) for infringements caused by: (i) Your and any other third party's
+            modifications of Covered Software, or (ii) the combination of its
+            Contributions with other software (except as part of its Contributor
+            Version); or
+        
+        (c) under Patent Claims infringed by Covered Software in the absence of
+            its Contributions.
+        
+        This License does not grant any rights in the trademarks, service marks,
+        or logos of any Contributor (except as may be necessary to comply with
+        the notice requirements in Section 3.4).
+        
+        2.4. Subsequent Licenses
+        
+        No Contributor makes additional grants as a result of Your choice to
+        distribute the Covered Software under a subsequent version of this
+        License (see Section 10.2) or under the terms of a Secondary License (if
+        permitted under the terms of Section 3.3).
+        
+        2.5. Representation
+        
+        Each Contributor represents that the Contributor believes its
+        Contributions are its original creation(s) or it has sufficient rights
+        to grant the rights to its Contributions conveyed by this License.
+        
+        2.6. Fair Use
+        
+        This License is not intended to limit any rights You have under
+        applicable copyright doctrines of fair use, fair dealing, or other
+        equivalents.
+        
+        2.7. Conditions
+        
+        Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+        in Section 2.1.
+        
+        3. Responsibilities
+        -------------------
+        
+        3.1. Distribution of Source Form
+        
+        All distribution of Covered Software in Source Code Form, including any
+        Modifications that You create or to which You contribute, must be under
+        the terms of this License. You must inform recipients that the Source
+        Code Form of the Covered Software is governed by the terms of this
+        License, and how they can obtain a copy of this License. You may not
+        attempt to alter or restrict the recipients' rights in the Source Code
+        Form.
+        
+        3.2. Distribution of Executable Form
+        
+        If You distribute Covered Software in Executable Form then:
+        
+        (a) such Covered Software must also be made available in Source Code
+            Form, as described in Section 3.1, and You must inform recipients of
+            the Executable Form how they can obtain a copy of such Source Code
+            Form by reasonable means in a timely manner, at a charge no more
+            than the cost of distribution to the recipient; and
+        
+        (b) You may distribute such Executable Form under the terms of this
+            License, or sublicense it under different terms, provided that the
+            license for the Executable Form does not attempt to limit or alter
+            the recipients' rights in the Source Code Form under this License.
+        
+        3.3. Distribution of a Larger Work
+        
+        You may create and distribute a Larger Work under terms of Your choice,
+        provided that You also comply with the requirements of this License for
+        the Covered Software. If the Larger Work is a combination of Covered
+        Software with a work governed by one or more Secondary Licenses, and the
+        Covered Software is not Incompatible With Secondary Licenses, this
+        License permits You to additionally distribute such Covered Software
+        under the terms of such Secondary License(s), so that the recipient of
+        the Larger Work may, at their option, further distribute the Covered
+        Software under the terms of either this License or such Secondary
+        License(s).
+        
+        3.4. Notices
+        
+        You may not remove or alter the substance of any license notices
+        (including copyright notices, patent notices, disclaimers of warranty,
+        or limitations of liability) contained within the Source Code Form of
+        the Covered Software, except that You may alter any license notices to
+        the extent required to remedy known factual inaccuracies.
+        
+        3.5. Application of Additional Terms
+        
+        You may choose to offer, and to charge a fee for, warranty, support,
+        indemnity or liability obligations to one or more recipients of Covered
+        Software. However, You may do so only on Your own behalf, and not on
+        behalf of any Contributor. You must make it absolutely clear that any
+        such warranty, support, indemnity, or liability obligation is offered by
+        You alone, and You hereby agree to indemnify every Contributor for any
+        liability incurred by such Contributor as a result of warranty, support,
+        indemnity or liability terms You offer. You may include additional
+        disclaimers of warranty and limitations of liability specific to any
+        jurisdiction.
+        
+        4. Inability to Comply Due to Statute or Regulation
+        ---------------------------------------------------
+        
+        If it is impossible for You to comply with any of the terms of this
+        License with respect to some or all of the Covered Software due to
+        statute, judicial order, or regulation then You must: (a) comply with
+        the terms of this License to the maximum extent possible; and (b)
+        describe the limitations and the code they affect. Such description must
+        be placed in a text file included with all distributions of the Covered
+        Software under this License. Except to the extent prohibited by statute
+        or regulation, such description must be sufficiently detailed for a
+        recipient of ordinary skill to be able to understand it.
+        
+        5. Termination
+        --------------
+        
+        5.1. The rights granted under this License will terminate automatically
+        if You fail to comply with any of its terms. However, if You become
+        compliant, then the rights granted under this License from a particular
+        Contributor are reinstated (a) provisionally, unless and until such
+        Contributor explicitly and finally terminates Your grants, and (b) on an
+        ongoing basis, if such Contributor fails to notify You of the
+        non-compliance by some reasonable means prior to 60 days after You have
+        come back into compliance. Moreover, Your grants from a particular
+        Contributor are reinstated on an ongoing basis if such Contributor
+        notifies You of the non-compliance by some reasonable means, this is the
+        first time You have received notice of non-compliance with this License
+        from such Contributor, and You become compliant prior to 30 days after
+        Your receipt of the notice.
+        
+        5.2. If You initiate litigation against any entity by asserting a patent
+        infringement claim (excluding declaratory judgment actions,
+        counter-claims, and cross-claims) alleging that a Contributor Version
+        directly or indirectly infringes any patent, then the rights granted to
+        You by any and all Contributors for the Covered Software under Section
+        2.1 of this License shall terminate.
+        
+        5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+        end user license agreements (excluding distributors and resellers) which
+        have been validly granted by You or Your distributors under this License
+        prior to termination shall survive termination.
+        
+        ************************************************************************
+        *                                                                      *
+        *  6. Disclaimer of Warranty                                           *
+        *  -------------------------                                           *
+        *                                                                      *
+        *  Covered Software is provided under this License on an "as is"       *
+        *  basis, without warranty of any kind, either expressed, implied, or  *
+        *  statutory, including, without limitation, warranties that the       *
+        *  Covered Software is free of defects, merchantable, fit for a        *
+        *  particular purpose or non-infringing. The entire risk as to the     *
+        *  quality and performance of the Covered Software is with You.        *
+        *  Should any Covered Software prove defective in any respect, You     *
+        *  (not any Contributor) assume the cost of any necessary servicing,   *
+        *  repair, or correction. This disclaimer of warranty constitutes an   *
+        *  essential part of this License. No use of any Covered Software is   *
+        *  authorized under this License except under this disclaimer.         *
+        *                                                                      *
+        ************************************************************************
+        
+        ************************************************************************
+        *                                                                      *
+        *  7. Limitation of Liability                                          *
+        *  --------------------------                                          *
+        *                                                                      *
+        *  Under no circumstances and under no legal theory, whether tort      *
+        *  (including negligence), contract, or otherwise, shall any           *
+        *  Contributor, or anyone who distributes Covered Software as          *
+        *  permitted above, be liable to You for any direct, indirect,         *
+        *  special, incidental, or consequential damages of any character      *
+        *  including, without limitation, damages for lost profits, loss of    *
+        *  goodwill, work stoppage, computer failure or malfunction, or any    *
+        *  and all other commercial damages or losses, even if such party      *
+        *  shall have been informed of the possibility of such damages. This   *
+        *  limitation of liability shall not apply to liability for death or   *
+        *  personal injury resulting from such party's negligence to the       *
+        *  extent applicable law prohibits such limitation. Some               *
+        *  jurisdictions do not allow the exclusion or limitation of           *
+        *  incidental or consequential damages, so this exclusion and          *
+        *  limitation may not apply to You.                                    *
+        *                                                                      *
+        ************************************************************************
+        
+        8. Litigation
+        -------------
+        
+        Any litigation relating to this License may be brought only in the
+        courts of a jurisdiction where the defendant maintains its principal
+        place of business and such litigation shall be governed by laws of that
+        jurisdiction, without reference to its conflict-of-law provisions.
+        Nothing in this Section shall prevent a party's ability to bring
+        cross-claims or counter-claims.
+        
+        9. Miscellaneous
+        ----------------
+        
+        This License represents the complete agreement concerning the subject
+        matter hereof. If any provision of this License is held to be
+        unenforceable, such provision shall be reformed only to the extent
+        necessary to make it enforceable. Any law or regulation which provides
+        that the language of a contract shall be construed against the drafter
+        shall not be used to construe this License against a Contributor.
+        
+        10. Versions of the License
+        ---------------------------
+        
+        10.1. New Versions
+        
+        Mozilla Foundation is the license steward. Except as provided in Section
+        10.3, no one other than the license steward has the right to modify or
+        publish new versions of this License. Each version will be given a
+        distinguishing version number.
+        
+        10.2. Effect of New Versions
+        
+        You may distribute the Covered Software under the terms of the version
+        of the License under which You originally received the Covered Software,
+        or under the terms of any subsequent version published by the license
+        steward.
+        
+        10.3. Modified Versions
+        
+        If you create software not governed by this License, and you want to
+        create a new license for such software, you may create and use a
+        modified version of this License if you rename the license and remove
+        any references to the name of the license steward (except to note that
+        such modified license differs from this License).
+        
+        10.4. Distributing Source Code Form that is Incompatible With Secondary
+        Licenses
+        
+        If You choose to distribute Source Code Form that is Incompatible With
+        Secondary Licenses under the terms of this version of the License, the
+        notice described in Exhibit B of this License must be attached.
+        
+        Exhibit A - Source Code Form License Notice
+        -------------------------------------------
+        
+          This Source Code Form is subject to the terms of the Mozilla Public
+          License, v. 2.0. If a copy of the MPL was not distributed with this
+          file, You can obtain one at http://mozilla.org/MPL/2.0/.
+        
+        If it is not possible or desirable to put the notice in a particular
+        file, then You may include the notice in a location (such as a LICENSE
+        file in a relevant directory) where a recipient would be likely to look
+        for such a notice.
+        
+        You may add additional accurate notices of copyright ownership.
+        
+        Exhibit B - "Incompatible With Secondary Licenses" Notice
+        ---------------------------------------------------------
+        
+          This Source Code Form is "Incompatible With Secondary Licenses", as
+          defined by the Mozilla Public License, v. 2.0.
+        
+Project-URL: Homepage, https://github.com/pyodide/matplotlib-pyodide
+Project-URL: Bug Tracker, https://github.com/pyodide/matplotlib-pyodide/issues
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
+Classifier: Operating System :: OS Independent
+Requires-Python: >=3.10
+Description-Content-Type: text/markdown
+License-File: LICENSE
+Provides-Extra: test
+Requires-Dist: pytest-pyodide ==0.52.2 ; extra == 'test'
+Requires-Dist: pytest-cov ; extra == 'test'
+Requires-Dist: build ==0.10 ; extra == 'test'
+
+# matplotlib-pyodide
+
+[![PyPI Latest Release](https://img.shields.io/pypi/v/matplotlib-pyodide.svg)](https://pypi.org/project/matplotlib-pyodide/)
+![GHA](https://github.com/pyodide/matplotlib-pyodide/actions/workflows/main.yml/badge.svg)
+[![codecov](https://codecov.io/gh/pyodide/matplotlib-pyodide/branch/main/graph/badge.svg)](https://codecov.io/gh/pyodide/matplotlib-pyodide)
+
+
+HTML5 backends for Matplotlib compatible with Pyodide
+
+This package includes two matplotlib backends,
+
+ - the `wasm_backend` which from allows rendering the Agg buffer as static images into an HTML canvas
+ - an interactive HTML5 canvas backend `html5_canvas_backend` described in
+   [this blog post](https://blog.pyodide.org/posts/canvas-renderer-matplotlib-in-pyodide/)
+
+
+## Installation
+
+This package will be installed as a dependency when you load `matplotlib` in Pyodide.
+
+## Usage
+
+To change the backend in matplotlib,
+ - for the wasm backend,
+   ```py
+   import matplotlib
+   matplotlib.use("module://matplotlib_pyodide.wasm_backend")
+   ```
+ - for the interactive HTML5 backend;
+   ```py
+   import matplotlib
+   matplotlib.use("module://matplotlib_pyodide.html5_canvas_backend")
+   ```
+
+By default, matplotlib figures will be rendered inside a div that's appended to the end of `document.body`.
+You can override this behavior by setting `document.pyodideMplTarget` to an HTML element. If you had an HTML
+element with id "target", you could configure the backend to render visualizations inside it with this code:
+
+```py
+document.pyodideMplTarget = document.getElementById('target')
+```
+
+For more information see the [matplotlib documentation](https://matplotlib.org/stable/users/explain/backends.html).
+
+## License
+
+pyodide-cli uses the [Mozilla Public License Version
+2.0](https://choosealicense.com/licenses/mpl-2.0/).

二进制
static/pyodide/pillow-10.2.0-cp312-cp312-emscripten_3_1_52_wasm32.whl


+ 182 - 0
static/pyodide/pillow-10.2.0-cp312-cp312-emscripten_3_1_52_wasm32.whl.metadata

@@ -0,0 +1,182 @@
+Metadata-Version: 2.1
+Name: pillow
+Version: 10.2.0
+Summary: Python Imaging Library (Fork)
+Author-email: "Jeffrey A. Clark (Alex)" <aclark@aclark.net>
+License: HPND
+Project-URL: Changelog, https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst
+Project-URL: Documentation, https://pillow.readthedocs.io
+Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi
+Project-URL: Homepage, https://python-pillow.org
+Project-URL: Mastodon, https://fosstodon.org/@pillow
+Project-URL: Release notes, https://pillow.readthedocs.io/en/stable/releasenotes/index.html
+Project-URL: Source, https://github.com/python-pillow/Pillow
+Project-URL: Twitter, https://twitter.com/PythonPillow
+Keywords: Imaging
+Classifier: Development Status :: 6 - Mature
+Classifier: License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Classifier: Topic :: Multimedia :: Graphics :: Viewers
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+License-File: LICENSE
+Provides-Extra: docs
+Requires-Dist: furo ; extra == 'docs'
+Requires-Dist: olefile ; extra == 'docs'
+Requires-Dist: sphinx >=2.4 ; extra == 'docs'
+Requires-Dist: sphinx-copybutton ; extra == 'docs'
+Requires-Dist: sphinx-inline-tabs ; extra == 'docs'
+Requires-Dist: sphinx-removed-in ; extra == 'docs'
+Requires-Dist: sphinxext-opengraph ; extra == 'docs'
+Provides-Extra: fpx
+Requires-Dist: olefile ; extra == 'fpx'
+Provides-Extra: mic
+Requires-Dist: olefile ; extra == 'mic'
+Provides-Extra: tests
+Requires-Dist: check-manifest ; extra == 'tests'
+Requires-Dist: coverage ; extra == 'tests'
+Requires-Dist: defusedxml ; extra == 'tests'
+Requires-Dist: markdown2 ; extra == 'tests'
+Requires-Dist: olefile ; extra == 'tests'
+Requires-Dist: packaging ; extra == 'tests'
+Requires-Dist: pyroma ; extra == 'tests'
+Requires-Dist: pytest ; extra == 'tests'
+Requires-Dist: pytest-cov ; extra == 'tests'
+Requires-Dist: pytest-timeout ; extra == 'tests'
+Provides-Extra: typing
+Requires-Dist: typing-extensions ; (python_version < "3.10") and extra == 'typing'
+Provides-Extra: xmp
+Requires-Dist: defusedxml ; extra == 'xmp'
+
+<p align="center">
+    <img width="248" height="250" src="https://raw.githubusercontent.com/python-pillow/pillow-logo/main/pillow-logo-248x250.png" alt="Pillow logo">
+</p>
+
+# Pillow
+
+## Python Imaging Library (Fork)
+
+Pillow is the friendly PIL fork by [Jeffrey A. Clark (Alex) and
+contributors](https://github.com/python-pillow/Pillow/graphs/contributors).
+PIL is the Python Imaging Library by Fredrik Lundh and Contributors.
+As of 2019, Pillow development is
+[supported by Tidelift](https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=readme&utm_campaign=enterprise).
+
+<table>
+    <tr>
+        <th>docs</th>
+        <td>
+            <a href="https://pillow.readthedocs.io/?badge=latest"><img
+                alt="Documentation Status"
+                src="https://readthedocs.org/projects/pillow/badge/?version=latest"></a>
+        </td>
+    </tr>
+    <tr>
+        <th>tests</th>
+        <td>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/lint.yml"><img
+                alt="GitHub Actions build status (Lint)"
+                src="https://github.com/python-pillow/Pillow/workflows/Lint/badge.svg"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test.yml"><img
+                alt="GitHub Actions build status (Test Linux and macOS)"
+                src="https://github.com/python-pillow/Pillow/workflows/Test/badge.svg"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-windows.yml"><img
+                alt="GitHub Actions build status (Test Windows)"
+                src="https://github.com/python-pillow/Pillow/workflows/Test%20Windows/badge.svg"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-mingw.yml"><img
+                alt="GitHub Actions build status (Test MinGW)"
+                src="https://github.com/python-pillow/Pillow/workflows/Test%20MinGW/badge.svg"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-cygwin.yml"><img
+                alt="GitHub Actions build status (Test Cygwin)"
+                src="https://github.com/python-pillow/Pillow/workflows/Test%20Cygwin/badge.svg"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-docker.yml"><img
+                alt="GitHub Actions build status (Test Docker)"
+                src="https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg"></a>
+            <a href="https://ci.appveyor.com/project/python-pillow/Pillow"><img
+                alt="AppVeyor CI build status (Windows)"
+                src="https://img.shields.io/appveyor/build/python-pillow/Pillow/main.svg?label=Windows%20build"></a>
+            <a href="https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml"><img
+                alt="GitHub Actions build status (Wheels)"
+                src="https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg"></a>
+            <a href="https://app.travis-ci.com/github/python-pillow/Pillow"><img
+                alt="Travis CI wheels build status (aarch64)"
+                src="https://img.shields.io/travis/com/python-pillow/Pillow/main.svg?label=aarch64%20wheels"></a>
+            <a href="https://app.codecov.io/gh/python-pillow/Pillow"><img
+                alt="Code coverage"
+                src="https://codecov.io/gh/python-pillow/Pillow/branch/main/graph/badge.svg"></a>
+            <a href="https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:pillow"><img
+                alt="Fuzzing Status"
+                src="https://oss-fuzz-build-logs.storage.googleapis.com/badges/pillow.svg"></a>
+        </td>
+    </tr>
+    <tr>
+        <th>package</th>
+        <td>
+            <a href="https://zenodo.org/badge/latestdoi/17549/python-pillow/Pillow"><img
+                alt="Zenodo"
+                src="https://zenodo.org/badge/17549/python-pillow/Pillow.svg"></a>
+            <a href="https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=badge"><img
+                alt="Tidelift"
+                src="https://tidelift.com/badges/package/pypi/Pillow?style=flat"></a>
+            <a href="https://pypi.org/project/Pillow/"><img
+                alt="Newest PyPI version"
+                src="https://img.shields.io/pypi/v/pillow.svg"></a>
+            <a href="https://pypi.org/project/Pillow/"><img
+                alt="Number of PyPI downloads"
+                src="https://img.shields.io/pypi/dm/pillow.svg"></a>
+            <a href="https://www.bestpractices.dev/projects/6331"><img
+                alt="OpenSSF Best Practices"
+                src="https://www.bestpractices.dev/projects/6331/badge"></a>
+        </td>
+    </tr>
+    <tr>
+        <th>social</th>
+        <td>
+            <a href="https://gitter.im/python-pillow/Pillow?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img
+                alt="Join the chat at https://gitter.im/python-pillow/Pillow"
+                src="https://badges.gitter.im/python-pillow/Pillow.svg"></a>
+            <a href="https://twitter.com/PythonPillow"><img
+                alt="Follow on https://twitter.com/PythonPillow"
+                src="https://img.shields.io/badge/tweet-on%20Twitter-00aced.svg"></a>
+            <a href="https://fosstodon.org/@pillow"><img
+                alt="Follow on https://fosstodon.org/@pillow"
+                src="https://img.shields.io/badge/publish-on%20Mastodon-595aff.svg"
+                rel="me"></a>
+        </td>
+    </tr>
+</table>
+
+## Overview
+
+The Python Imaging Library adds image processing capabilities to your Python interpreter.
+
+This library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities.
+
+The core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool.
+
+## More Information
+
+- [Documentation](https://pillow.readthedocs.io/)
+  - [Installation](https://pillow.readthedocs.io/en/latest/installation.html)
+  - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html)
+- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md)
+  - [Issues](https://github.com/python-pillow/Pillow/issues)
+  - [Pull requests](https://github.com/python-pillow/Pillow/pulls)
+- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html)
+- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
+  - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork)
+
+## Report a Vulnerability
+
+To report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security).

二进制
static/pyodide/pyparsing-3.1.1-py3-none-any.whl


+ 126 - 0
static/pyodide/pyparsing-3.1.1-py3-none-any.whl.metadata

@@ -0,0 +1,126 @@
+Metadata-Version: 2.1
+Name: pyparsing
+Version: 3.1.1
+Summary: pyparsing module - Classes and methods to define and execute parsing grammars
+Author-email: Paul McGuire <ptmcg.gm+pyparsing@gmail.com>
+Requires-Python: >=3.6.8
+Description-Content-Type: text/x-rst
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Information Technology
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Compilers
+Classifier: Topic :: Text Processing
+Classifier: Typing :: Typed
+Requires-Dist: railroad-diagrams ; extra == "diagrams"
+Requires-Dist: jinja2 ; extra == "diagrams"
+Project-URL: Homepage, https://github.com/pyparsing/pyparsing/
+Provides-Extra: diagrams
+
+PyParsing -- A Python Parsing Module
+====================================
+
+|Version| |Build Status| |Coverage| |License| |Python Versions| |Snyk Score|
+
+Introduction
+============
+
+The pyparsing module is an alternative approach to creating and
+executing simple grammars, vs. the traditional lex/yacc approach, or the
+use of regular expressions. The pyparsing module provides a library of
+classes that client code uses to construct the grammar directly in
+Python code.
+
+*[Since first writing this description of pyparsing in late 2003, this
+technique for developing parsers has become more widespread, under the
+name Parsing Expression Grammars - PEGs. See more information on PEGs*
+`here <https://en.wikipedia.org/wiki/Parsing_expression_grammar>`__
+*.]*
+
+Here is a program to parse ``"Hello, World!"`` (or any greeting of the form
+``"salutation, addressee!"``):
+
+.. code:: python
+
+    from pyparsing import Word, alphas
+    greet = Word(alphas) + "," + Word(alphas) + "!"
+    hello = "Hello, World!"
+    print(hello, "->", greet.parseString(hello))
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the
+self-explanatory class names, and the use of '+', '|' and '^' operator
+definitions.
+
+The parsed results returned from ``parseString()`` is a collection of type
+``ParseResults``, which can be accessed as a
+nested list, a dictionary, or an object with named attributes.
+
+The pyparsing module handles some of the problems that are typically
+vexing when writing text parsers:
+
+- extra or missing whitespace (the above program will also handle ``"Hello,World!"``, ``"Hello , World !"``, etc.)
+- quoted strings
+- embedded comments
+
+The examples directory includes a simple SQL parser, simple CORBA IDL
+parser, a config file parser, a chemical formula parser, and a four-
+function algebraic notation parser, among many others.
+
+Documentation
+=============
+
+There are many examples in the online docstrings of the classes
+and methods in pyparsing. You can find them compiled into `online docs <https://pyparsing-docs.readthedocs.io/en/latest/>`__. Additional
+documentation resources and project info are listed in the online
+`GitHub wiki <https://github.com/pyparsing/pyparsing/wiki>`__. An
+entire directory of examples can be found `here <https://github.com/pyparsing/pyparsing/tree/master/examples>`__.
+
+License
+=======
+
+MIT License. See header of the `pyparsing __init__.py <https://github.com/pyparsing/pyparsing/blob/master/pyparsing/__init__.py#L1-L23>`__ file.
+
+History
+=======
+
+See `CHANGES <https://github.com/pyparsing/pyparsing/blob/master/CHANGES>`__ file.
+
+.. |Build Status| image:: https://github.com/pyparsing/pyparsing/actions/workflows/ci.yml/badge.svg
+   :target: https://github.com/pyparsing/pyparsing/actions/workflows/ci.yml
+
+.. |Coverage| image:: https://codecov.io/gh/pyparsing/pyparsing/branch/master/graph/badge.svg
+  :target: https://codecov.io/gh/pyparsing/pyparsing
+
+.. |Version| image:: https://img.shields.io/pypi/v/pyparsing?style=flat-square
+    :target: https://pypi.org/project/pyparsing/
+    :alt: Version
+
+.. |License| image:: https://img.shields.io/pypi/l/pyparsing.svg?style=flat-square
+    :target: https://pypi.org/project/pyparsing/
+    :alt: License
+
+.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pyparsing.svg?style=flat-square
+    :target: https://pypi.org/project/python-liquid/
+    :alt: Python versions
+
+.. |Snyk Score| image:: https://snyk.io//advisor/python/pyparsing/badge.svg
+   :target: https://snyk.io//advisor/python/pyparsing
+   :alt: pyparsing
+